@gnggln/ng-ui-system 1.0.0-alpha.21 → 1.0.0-alpha.22

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 (45) hide show
  1. package/crud-table/lib/components/form-builder/types/schema.types.d.ts +20 -0
  2. package/crud-table/lib/core/logging/logger.service.d.ts +1 -1
  3. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +1 -1
  4. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +1 -1
  5. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +1 -1
  6. package/esm2022/crud-table/lib/components/form-builder/types/schema.types.mjs +1 -1
  7. package/esm2022/crud-table/lib/core/logging/logger.service.mjs +1 -1
  8. package/esm2022/form-builder/lib/components/form-builder/form-wizard.component.mjs +105 -18
  9. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +1 -1
  10. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +1 -1
  11. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +1 -1
  12. package/esm2022/form-builder/lib/components/form-builder/types/index.mjs +1 -1
  13. package/esm2022/form-builder/lib/components/form-builder/types/schema.types.mjs +1 -1
  14. package/esm2022/form-builder/lib/core/logging/logger.service.mjs +1 -1
  15. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +1 -1
  16. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +1 -1
  17. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +1 -1
  18. package/esm2022/form-builder-editor/lib/components/form-builder/types/index.mjs +1 -1
  19. package/esm2022/form-builder-editor/lib/components/form-builder/types/schema.types.mjs +1 -1
  20. package/esm2022/form-builder-editor/lib/core/logging/logger.service.mjs +1 -1
  21. package/esm2022/lib/components/form-builder/form-wizard.component.mjs +105 -18
  22. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +1 -1
  23. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +1 -1
  24. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +1 -1
  25. package/esm2022/lib/components/form-builder/types/index.mjs +1 -1
  26. package/esm2022/lib/components/form-builder/types/schema.types.mjs +1 -1
  27. package/esm2022/lib/core/logging/logger.service.mjs +1 -1
  28. package/fesm2022/gnggln-ng-ui-system-crud-table.mjs.map +1 -1
  29. package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs.map +1 -1
  30. package/fesm2022/gnggln-ng-ui-system-form-builder.mjs +104 -17
  31. package/fesm2022/gnggln-ng-ui-system-form-builder.mjs.map +1 -1
  32. package/fesm2022/gnggln-ng-ui-system.mjs +104 -17
  33. package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -1
  34. package/form-builder/lib/components/form-builder/form-wizard.component.d.ts +10 -1
  35. package/form-builder/lib/components/form-builder/types/index.d.ts +1 -1
  36. package/form-builder/lib/components/form-builder/types/schema.types.d.ts +20 -0
  37. package/form-builder/lib/core/logging/logger.service.d.ts +1 -1
  38. package/form-builder-editor/lib/components/form-builder/types/index.d.ts +1 -1
  39. package/form-builder-editor/lib/components/form-builder/types/schema.types.d.ts +20 -0
  40. package/form-builder-editor/lib/core/logging/logger.service.d.ts +1 -1
  41. package/lib/components/form-builder/form-wizard.component.d.ts +10 -1
  42. package/lib/components/form-builder/types/index.d.ts +1 -1
  43. package/lib/components/form-builder/types/schema.types.d.ts +20 -0
  44. package/lib/core/logging/logger.service.d.ts +1 -1
  45. package/package.json +30 -30
@@ -1 +1 @@
1
- {"version":3,"file":"gnggln-ng-ui-system-form-builder-editor.mjs","sources":["../../../packages/ng-ui-system/src/lib/components/form-builder-editor/services/field-factory.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/services/editor-state.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/services/editor-persistence.service.ts","../../../packages/ng-ui-system/src/lib/components/button/button.component.ts","../../../packages/ng-ui-system/src/lib/components/blackbox/blackbox.types.ts","../../../packages/ng-ui-system/src/lib/components/blackbox/blackbox-fingerprint.service.ts","../../../packages/ng-ui-system/src/lib/components/blackbox/blackbox-storage.service.ts","../../../packages/ng-ui-system/src/lib/components/blackbox/blackbox.service.ts","../../../packages/ng-ui-system/src/lib/components/button/button-area.component.ts","../../../packages/ng-ui-system/src/lib/components/button/index.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.ts","../../../packages/ng-ui-system/src/lib/components/accordion/accordion.component.ts","../../../packages/ng-ui-system/src/lib/core/logging/logger.config.ts","../../../packages/ng-ui-system/src/lib/core/logging/logger.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/types/validation.types.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/services/form-condition.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/services/form-validation.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/services/form-field-error.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/file-input/file-input.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/services/location.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/services/nominatim-geocoding.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/services/form-error-state.matcher.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-text-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-text-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/directives/currency-input.directive.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-number-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-number-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-select-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-select-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/adapters/it-date-adapter.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/form-builder.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/form-builder.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/form-builder-editor.component.ts","../../../packages/ng-ui-system/src/lib/components/modal/modal.component.ts","../../../packages/ng-ui-system/src/lib/components/modal/confirm-dialog.component.ts","../../../packages/ng-ui-system/src/lib/components/modal/modal.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/form-builder-editor.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/types/editor.types.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/presets/editor-presets.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/index.ts","../../../packages/ng-ui-system/src/entry-form-builder-editor.ts","../../../packages/ng-ui-system/src/gnggln-ng-ui-system-form-builder-editor.ts"],"sourcesContent":["/**\r\n * @module ng-ui-system/form-builder-editor\r\n * Factory per la creazione di field descriptor con valori di default.\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { UiFormFieldDescriptor, UiFieldType } from '../../form-builder/types/index';\r\n\r\n/**\r\n * Servizio factory per creare field descriptor con configurazioni\r\n * di default appropriate per ogni tipo di campo.\r\n */\r\n@Injectable()\r\nexport class UiEditorFieldFactoryService {\r\n /** @internal Contatore per generare chiavi univoche. */\r\n private fieldCounter = 0;\r\n\r\n /**\r\n * Crea un field descriptor di default per il tipo specificato.\r\n *\r\n * @param type - Tipo di campo da creare\r\n * @param key - Chiave opzionale (se omessa viene generata automaticamente)\r\n * @returns Field descriptor con valori di default\r\n */\r\n createDefaultField(type: UiFieldType, key?: string): UiFormFieldDescriptor {\r\n const generatedKey = key || this.generateUniqueKey(type);\r\n\r\n const baseField: UiFormFieldDescriptor = {\r\n key: generatedKey,\r\n type,\r\n label: this.getDefaultLabel(type),\r\n placeholder: this.getDefaultPlaceholder(type),\r\n required: false,\r\n disabled: false,\r\n readonly: false,\r\n };\r\n\r\n switch (type) {\r\n case 'select':\r\n case 'radio':\r\n return {\r\n ...baseField,\r\n options: [\r\n { value: 'option1', label: 'Opzione 1' },\r\n { value: 'option2', label: 'Opzione 2' },\r\n ],\r\n hideEmptyOption: false,\r\n };\r\n\r\n case 'multiselect':\r\n case 'freemultiselect':\r\n return {\r\n ...baseField,\r\n options: [\r\n { value: 'option1', label: 'Opzione 1' },\r\n { value: 'option2', label: 'Opzione 2' },\r\n { value: 'option3', label: 'Opzione 3' },\r\n ],\r\n };\r\n\r\n case 'checkbox':\r\n case 'switch':\r\n return {\r\n ...baseField,\r\n defaultValue: false,\r\n appearance: {\r\n style: type === 'switch' ? 'switch' : 'default',\r\n color: 'primary',\r\n },\r\n };\r\n\r\n case 'number':\r\n return {\r\n ...baseField,\r\n defaultValue: 0,\r\n validation: [{ type: 'min', value: 0, message: 'Il valore deve essere maggiore o uguale a 0' }],\r\n };\r\n\r\n case 'email':\r\n return {\r\n ...baseField,\r\n validation: [{ type: 'email', message: 'Inserire un indirizzo email valido' }],\r\n };\r\n\r\n case 'date':\r\n case 'datetime':\r\n return {\r\n ...baseField,\r\n placeholder: type === 'date' ? 'gg/mm/aaaa' : 'gg/mm/aaaa hh:mm',\r\n };\r\n\r\n case 'file':\r\n return {\r\n ...baseField,\r\n fileConfig: {\r\n maxFileSize: 5242880,\r\n multiple: false,\r\n showPreview: true,\r\n enableDragDrop: true,\r\n acceptedTypes: ['image/*', 'application/pdf'],\r\n },\r\n };\r\n\r\n case 'textarea':\r\n return {\r\n ...baseField,\r\n validation: [{ type: 'maxLength', value: 500, message: 'Massimo 500 caratteri' }],\r\n };\r\n\r\n case 'password':\r\n return {\r\n ...baseField,\r\n validation: [{ type: 'minLength', value: 8, message: 'La password deve contenere almeno 8 caratteri' }],\r\n };\r\n\r\n case 'text':\r\n return {\r\n ...baseField,\r\n validation: [{ type: 'maxLength', value: 255, message: 'Massimo 255 caratteri' }],\r\n };\r\n\r\n case 'custom':\r\n return {\r\n ...baseField,\r\n customConfig: {\r\n component: 'custom-component-selector',\r\n inputs: {},\r\n config: {},\r\n },\r\n };\r\n\r\n case 'divider':\r\n return { ...baseField, label: 'Separatore' };\r\n\r\n case 'flag':\r\n return { ...baseField, defaultValue: false };\r\n\r\n default:\r\n return baseField;\r\n }\r\n }\r\n\r\n /** Duplica un campo generando una nuova chiave univoca. */\r\n duplicateField(field: UiFormFieldDescriptor): UiFormFieldDescriptor {\r\n const newKey = this.generateUniqueKey(field.type);\r\n return {\r\n ...JSON.parse(JSON.stringify(field)),\r\n key: newKey,\r\n label: `${field.label} (Copia)`,\r\n };\r\n }\r\n\r\n // ─── Private ─────────────────────────────────────────────────\r\n\r\n /** @internal Genera una chiave univoca per un campo. */\r\n private generateUniqueKey(type: UiFieldType): string {\r\n this.fieldCounter++;\r\n return `${type}_${this.fieldCounter}_${Date.now()}`;\r\n }\r\n\r\n /** @internal Mappa tipo -> label di default. */\r\n private getDefaultLabel(type: UiFieldType): string {\r\n const labels: Record<string, string> = {\r\n text: 'Campo Testo',\r\n email: 'Email',\r\n password: 'Password', // NOSONAR - UI label for password field type, not a credential\r\n number: 'Numero',\r\n textarea: 'Area Testo',\r\n select: 'Selezione',\r\n multiselect: 'Selezione Multipla',\r\n freemultiselect: 'Selezione Multipla Libera',\r\n checkbox: 'Checkbox',\r\n switch: 'Switch',\r\n radio: 'Radio Button',\r\n date: 'Data',\r\n datetime: 'Data e Ora',\r\n file: 'File',\r\n custom: 'Campo Personalizzato',\r\n divider: 'Separatore',\r\n flag: 'Flag',\r\n location: 'Localita',\r\n 'location-table': 'Tabella Localita',\r\n };\r\n return labels[type] || 'Campo';\r\n }\r\n\r\n /** @internal Mappa tipo -> placeholder di default. */\r\n private getDefaultPlaceholder(type: UiFieldType): string {\r\n const placeholders: Record<string, string> = {\r\n text: 'Inserisci il testo',\r\n email: 'nome@esempio.it',\r\n password: 'Inserisci la password', // NOSONAR - UI placeholder text for password field, not a credential\r\n number: 'Inserisci un numero',\r\n textarea: 'Inserisci il testo...',\r\n select: \"Seleziona un'opzione\",\r\n multiselect: 'Seleziona una o piu opzioni',\r\n freemultiselect: 'Seleziona o inserisci valori',\r\n date: 'gg/mm/aaaa',\r\n datetime: 'gg/mm/aaaa hh:mm',\r\n file: 'Seleziona un file',\r\n };\r\n return placeholders[type] || '';\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder-editor\r\n * Servizio per la gestione centralizzata dello stato dell'editor.\r\n */\r\n\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { UiFormSchema, UiFormSection, UiFormFieldDescriptor } from '../../form-builder/types/index';\r\nimport {\r\n UiEditorState,\r\n UiEditorSchemaValidationResult,\r\n UiEditorSchemaValidationError,\r\n UiEditorSchemaValidationWarning,\r\n} from '../types/editor.types';\r\nimport { UiEditorFieldFactoryService } from './field-factory.service';\r\n\r\n/**\r\n * Servizio per la gestione reattiva dello stato dell'editor visuale.\r\n *\r\n * Espone lo stato come Observable e fornisce metodi immutabili\r\n * per tutte le operazioni CRUD su sezioni e campi.\r\n */\r\n@Injectable()\r\nexport class UiEditorStateService {\r\n /** @internal Factory per la creazione dei campi. */\r\n private readonly fieldFactory = inject(UiEditorFieldFactoryService);\r\n\r\n /** @internal Stato iniziale dell'editor. */\r\n private readonly initialState: UiEditorState = {\r\n schema: {\r\n id: `form_${Date.now()}`,\r\n title: 'Nuovo Form',\r\n description: '',\r\n sections: [],\r\n },\r\n selectedSectionId: null,\r\n selectedFieldKey: null,\r\n isDirty: false,\r\n lastSaved: null,\r\n };\r\n\r\n /** @internal Subject per lo stato dell'editor. */\r\n private readonly _state$ = new BehaviorSubject<UiEditorState>(this.initialState);\r\n\r\n /** Stream reattivo dello stato dell'editor. */\r\n readonly state$: Observable<UiEditorState> = this._state$.asObservable();\r\n\r\n // ─── Lettura stato ───────────────────────────────────────────\r\n\r\n /** Restituisce un snapshot dello stato corrente. */\r\n getCurrentState(): UiEditorState {\r\n return this._state$.value;\r\n }\r\n\r\n /** Restituisce lo schema corrente. */\r\n getSchema(): UiFormSchema {\r\n return this.getCurrentState().schema;\r\n }\r\n\r\n // ─── Aggiornamento stato ─────────────────────────────────────\r\n\r\n /** @internal Aggiorna lo stato e marca come dirty. */\r\n private updateState(updates: Partial<UiEditorState>): void {\r\n this._state$.next({\r\n ...this.getCurrentState(),\r\n ...updates,\r\n isDirty: true,\r\n });\r\n }\r\n\r\n /** Imposta uno schema completo (es. da import). */\r\n setSchema(schema: UiFormSchema): void {\r\n this.updateState({ schema });\r\n }\r\n\r\n /** Marca lo stato come salvato. */\r\n markAsSaved(): void {\r\n this._state$.next({\r\n ...this.getCurrentState(),\r\n isDirty: false,\r\n lastSaved: new Date(),\r\n });\r\n }\r\n\r\n /** Reset allo stato iniziale. */\r\n reset(): void {\r\n this._state$.next({\r\n ...this.initialState,\r\n schema: {\r\n id: `form_${Date.now()}`,\r\n title: 'Nuovo Form',\r\n description: '',\r\n sections: [],\r\n },\r\n });\r\n }\r\n\r\n /** Pulisce lo schema mantenendo l'ID. */\r\n clearSchema(): void {\r\n const currentId = this.getSchema().id;\r\n this.updateState({\r\n schema: { id: currentId, sections: [] },\r\n selectedSectionId: null,\r\n selectedFieldKey: null,\r\n });\r\n }\r\n\r\n // ─── Operazioni su sezioni ───────────────────────────────────\r\n\r\n /** Aggiunge una nuova sezione e la seleziona. */\r\n addSection(section?: Partial<UiFormSection>): string {\r\n const schema = { ...this.getSchema() };\r\n const sectionId = section?.id || `section_${Date.now()}`;\r\n\r\n const newSection: UiFormSection = {\r\n id: sectionId,\r\n title: section?.title || `Sezione ${schema.sections.length + 1}`,\r\n description: section?.description || '',\r\n fields: section?.fields || [],\r\n collapsible: false,\r\n collapsed: false,\r\n };\r\n\r\n schema.sections = [...schema.sections, newSection];\r\n this.updateState({ schema, selectedSectionId: sectionId });\r\n return sectionId;\r\n }\r\n\r\n /** Rimuove una sezione per ID. */\r\n removeSection(sectionId: string): void {\r\n const schema = { ...this.getSchema() };\r\n schema.sections = schema.sections.filter((s) => s.id !== sectionId);\r\n\r\n const current = this.getCurrentState();\r\n const updates: Partial<UiEditorState> = { schema };\r\n\r\n if (current.selectedSectionId === sectionId) {\r\n updates.selectedSectionId = null;\r\n updates.selectedFieldKey = null;\r\n }\r\n\r\n this.updateState(updates);\r\n }\r\n\r\n /** Aggiorna proprieta di una sezione. */\r\n updateSection(sectionId: string, updates: Partial<UiFormSection>): void {\r\n const schema = { ...this.getSchema() };\r\n schema.sections = schema.sections.map((s) => (s.id === sectionId ? { ...s, ...updates } : s));\r\n this.updateState({ schema });\r\n }\r\n\r\n /** Duplica una sezione con nuovi ID per sezione e campi. */\r\n duplicateSection(sectionId: string): string | null {\r\n const schema = { ...this.getSchema() };\r\n const section = schema.sections.find((s) => s.id === sectionId);\r\n if (!section) return null;\r\n\r\n const newSectionId = `section_${Date.now()}`;\r\n const duplicated: UiFormSection = {\r\n ...JSON.parse(JSON.stringify(section)),\r\n id: newSectionId,\r\n title: `${section.title} (Copia)`,\r\n fields: section.fields.map((f) => this.fieldFactory.duplicateField(f)),\r\n };\r\n\r\n const index = schema.sections.findIndex((s) => s.id === sectionId);\r\n schema.sections = [...schema.sections.slice(0, index + 1), duplicated, ...schema.sections.slice(index + 1)];\r\n\r\n this.updateState({ schema, selectedSectionId: newSectionId });\r\n return newSectionId;\r\n }\r\n\r\n // ─── Operazioni su campi ─────────────────────────────────────\r\n\r\n /** Aggiunge un campo a una sezione in una posizione specifica. */\r\n addFieldAtIndex(sectionId: string, field: UiFormFieldDescriptor, index: number): void {\r\n const schema = { ...this.getSchema() };\r\n schema.sections = schema.sections.map((s) => {\r\n if (s.id !== sectionId) return s;\r\n const fields = [...s.fields];\r\n fields.splice(index, 0, field);\r\n return { ...s, fields };\r\n });\r\n this.updateState({ schema, selectedFieldKey: field.key });\r\n }\r\n\r\n /** Rimuove un campo da una sezione. */\r\n removeField(sectionId: string, fieldKey: string): void {\r\n const schema = { ...this.getSchema() };\r\n schema.sections = schema.sections.map((s) => {\r\n if (s.id !== sectionId) return s;\r\n return { ...s, fields: s.fields.filter((f) => f.key !== fieldKey) };\r\n });\r\n\r\n const current = this.getCurrentState();\r\n const updates: Partial<UiEditorState> = { schema };\r\n if (current.selectedFieldKey === fieldKey) {\r\n updates.selectedFieldKey = null;\r\n }\r\n this.updateState(updates);\r\n }\r\n\r\n /** Aggiorna proprieta di un campo. */\r\n updateField(sectionId: string, fieldKey: string, fieldUpdates: Partial<UiFormFieldDescriptor>): void {\r\n const schema = { ...this.getSchema() };\r\n schema.sections = schema.sections.map((s) => {\r\n if (s.id !== sectionId) return s;\r\n return {\r\n ...s,\r\n fields: s.fields.map((f) => (f.key === fieldKey ? { ...f, ...fieldUpdates } : f)),\r\n };\r\n });\r\n this.updateState({ schema });\r\n }\r\n\r\n /** Duplica un campo nella stessa sezione. */\r\n duplicateField(sectionId: string, fieldKey: string): void {\r\n const schema = { ...this.getSchema() };\r\n schema.sections = schema.sections.map((s) => {\r\n if (s.id !== sectionId) return s;\r\n const field = s.fields.find((f) => f.key === fieldKey);\r\n if (!field) return s;\r\n\r\n const duplicated = this.fieldFactory.duplicateField(field);\r\n const index = s.fields.findIndex((f) => f.key === fieldKey);\r\n const fields = [...s.fields];\r\n fields.splice(index + 1, 0, duplicated);\r\n return { ...s, fields };\r\n });\r\n this.updateState({ schema });\r\n }\r\n\r\n /** Riordina un campo all'interno della stessa sezione. */\r\n moveFieldInSection(sectionId: string, fromIndex: number, toIndex: number): void {\r\n const schema = { ...this.getSchema() };\r\n schema.sections = schema.sections.map((s) => {\r\n if (s.id !== sectionId) return s;\r\n const fields = [...s.fields];\r\n const [moved] = fields.splice(fromIndex, 1);\r\n fields.splice(toIndex, 0, moved);\r\n return { ...s, fields };\r\n });\r\n this.updateState({ schema });\r\n }\r\n\r\n /** Sposta un campo tra due sezioni diverse. */\r\n moveFieldBetweenSections(fromSectionId: string, toSectionId: string, fieldKey: string, toIndex: number): void {\r\n const schema = { ...this.getSchema() };\r\n let movedField: UiFormFieldDescriptor | undefined;\r\n\r\n schema.sections = schema.sections.map((s) => {\r\n if (s.id === fromSectionId) {\r\n const idx = s.fields.findIndex((f) => f.key === fieldKey);\r\n if (idx !== -1) {\r\n const fields = [...s.fields];\r\n [movedField] = fields.splice(idx, 1);\r\n return { ...s, fields };\r\n }\r\n }\r\n return s;\r\n });\r\n\r\n if (movedField) {\r\n schema.sections = schema.sections.map((s) => {\r\n if (s.id === toSectionId) {\r\n const fields = [...s.fields];\r\n fields.splice(toIndex, 0, movedField!);\r\n return { ...s, fields };\r\n }\r\n return s;\r\n });\r\n }\r\n\r\n this.updateState({ schema });\r\n }\r\n\r\n // ─── Selezione ───────────────────────────────────────────────\r\n\r\n /** Seleziona una sezione (deseleziona il campo). */\r\n selectSection(sectionId: string | null): void {\r\n this._state$.next({\r\n ...this.getCurrentState(),\r\n selectedSectionId: sectionId,\r\n selectedFieldKey: null,\r\n });\r\n }\r\n\r\n /** Seleziona un campo (e la sua sezione). */\r\n selectField(sectionId: string, fieldKey: string | null): void {\r\n this._state$.next({\r\n ...this.getCurrentState(),\r\n selectedSectionId: sectionId,\r\n selectedFieldKey: fieldKey,\r\n });\r\n }\r\n\r\n // ─── Ricerca ─────────────────────────────────────────────────\r\n\r\n /** Trova la sezione che contiene un campo. */\r\n findSectionByFieldKey(fieldKey: string): UiFormSection | null {\r\n return this.getSchema().sections.find((s) => s.fields.some((f) => f.key === fieldKey)) || null;\r\n }\r\n\r\n /** Trova un campo per chiave attraverso tutte le sezioni. */\r\n findFieldByKey(fieldKey: string): UiFormFieldDescriptor | null {\r\n const section = this.findSectionByFieldKey(fieldKey);\r\n return section?.fields.find((f) => f.key === fieldKey) || null;\r\n }\r\n\r\n // ─── Validazione ─────────────────────────────────────────────\r\n\r\n /** Valida lo schema corrente cercando errori e warning strutturali. */\r\n validateSchema(): UiEditorSchemaValidationResult {\r\n const schema = this.getSchema();\r\n const errors: UiEditorSchemaValidationError[] = [];\r\n const warnings: UiEditorSchemaValidationWarning[] = [];\r\n const allKeys = new Set<string>();\r\n\r\n schema.sections.forEach((section, si) => {\r\n section.fields.forEach((field, fi) => {\r\n // Chiavi duplicate\r\n if (allKeys.has(field.key)) {\r\n errors.push({\r\n type: 'duplicate_key',\r\n message: `Chiave duplicata: ${field.key}`,\r\n path: `sections[${si}].fields[${fi}].key`,\r\n });\r\n }\r\n allKeys.add(field.key);\r\n\r\n // Label mancante\r\n if (!field.label?.trim()) {\r\n warnings.push({\r\n type: 'missing_label',\r\n message: `Campo senza label: ${field.key}`,\r\n path: `sections[${si}].fields[${fi}].label`,\r\n });\r\n }\r\n\r\n // Opzioni vuote per campi di scelta\r\n if (['select', 'radio', 'multiselect'].includes(field.type)) {\r\n if (!field.options || (Array.isArray(field.options) && field.options.length === 0)) {\r\n warnings.push({\r\n type: 'empty_options',\r\n message: `Campo ${field.key} di tipo ${field.type} senza opzioni`,\r\n path: `sections[${si}].fields[${fi}].options`,\r\n });\r\n }\r\n }\r\n\r\n // Riferimenti nelle condizioni\r\n if (field.conditions) {\r\n field.conditions.forEach((cond, ci) => {\r\n if (cond.field && !allKeys.has(cond.field)) {\r\n errors.push({\r\n type: 'invalid_reference',\r\n message: `Riferimento a campo inesistente: ${cond.field} in ${field.key}`,\r\n path: `sections[${si}].fields[${fi}].conditions[${ci}].field`,\r\n });\r\n }\r\n });\r\n }\r\n });\r\n });\r\n\r\n return { valid: errors.length === 0, errors, warnings };\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder-editor\r\n * Servizio per la persistenza dello schema (localStorage, import/export JSON).\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { UiFormSchema } from '../../form-builder/types/index';\r\nimport { UiEditorStorageData } from '../types/editor.types';\r\n\r\n/**\r\n * Gestisce il salvataggio e il recupero degli schemi dell'editor.\r\n *\r\n * Supporta:\r\n * - Auto-save e recupero da localStorage\r\n * - Import/export da/verso file JSON\r\n * - Backup automatici con rotazione (max 5)\r\n */\r\n@Injectable()\r\nexport class UiEditorPersistenceService {\r\n /** @internal Chiave localStorage per l'auto-save. */\r\n private readonly STORAGE_KEY = 'ui-form-editor-autosave';\r\n\r\n /** @internal Versione dello storage per migrazioni future. */\r\n private readonly STORAGE_VERSION = '1.0.0';\r\n\r\n /** @internal Durata massima di un salvataggio (24 ore). */\r\n private readonly MAX_AGE_MS = 24 * 60 * 60 * 1000;\r\n\r\n // ─── localStorage ────────────────────────────────────────────\r\n\r\n /** Salva lo schema nel localStorage. */\r\n saveToLocalStorage(schema: UiFormSchema): void {\r\n const data: UiEditorStorageData = {\r\n schema,\r\n timestamp: Date.now(),\r\n version: this.STORAGE_VERSION,\r\n };\r\n try {\r\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(data));\r\n } catch (error) {\r\n throw new Error('Impossibile salvare nel localStorage. Spazio disponibile esaurito.');\r\n }\r\n }\r\n\r\n /** Carica lo schema dal localStorage (null se scaduto o assente). */\r\n loadFromLocalStorage(): UiFormSchema | null {\r\n try {\r\n const raw = localStorage.getItem(this.STORAGE_KEY);\r\n if (!raw) return null;\r\n\r\n const data: UiEditorStorageData = JSON.parse(raw);\r\n if (Date.now() - data.timestamp > this.MAX_AGE_MS) {\r\n this.clearLocalStorage();\r\n return null;\r\n }\r\n return data.schema;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /** Verifica se esiste un salvataggio valido. */\r\n hasLocalStorageData(): boolean {\r\n try {\r\n const raw = localStorage.getItem(this.STORAGE_KEY);\r\n if (!raw) return false;\r\n const data: UiEditorStorageData = JSON.parse(raw);\r\n return Date.now() - data.timestamp <= this.MAX_AGE_MS;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /** Restituisce la data dell'ultimo salvataggio. */\r\n getLocalStorageAge(): Date | null {\r\n try {\r\n const raw = localStorage.getItem(this.STORAGE_KEY);\r\n if (!raw) return null;\r\n const data: UiEditorStorageData = JSON.parse(raw);\r\n return new Date(data.timestamp);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /** Rimuove il salvataggio dal localStorage. */\r\n clearLocalStorage(): void {\r\n localStorage.removeItem(this.STORAGE_KEY);\r\n }\r\n\r\n // ─── Export ──────────────────────────────────────────────────\r\n\r\n /** Esporta lo schema come file JSON scaricabile. */\r\n exportToJSON(schema: UiFormSchema, filename?: string): void {\r\n const json = JSON.stringify(schema, null, 2);\r\n const blob = new Blob([json], { type: 'application/json' });\r\n const defaultName = filename || `form-schema-${schema.id}-${Date.now()}.json`;\r\n this.downloadBlob(blob, defaultName);\r\n }\r\n\r\n // ─── Import ──────────────────────────────────────────────────\r\n\r\n /** Importa lo schema da un file JSON. */\r\n async importFromJSON(file: File): Promise<UiFormSchema> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n try {\r\n const content = e.target?.result as string;\r\n const schema: UiFormSchema = JSON.parse(content);\r\n if (!this.isValidSchema(schema)) {\r\n reject(new Error('Schema non valido: struttura non corretta'));\r\n return;\r\n }\r\n resolve(schema);\r\n } catch {\r\n reject(new Error('Errore durante la lettura del file JSON: formato non valido'));\r\n }\r\n };\r\n reader.onerror = () => reject(new Error('Errore durante la lettura del file'));\r\n reader.readAsText(file);\r\n });\r\n }\r\n\r\n // ─── Backup ──────────────────────────────────────────────────\r\n\r\n /** Crea un backup dello schema prima di operazioni distruttive. */\r\n createBackup(schema: UiFormSchema): void {\r\n const backupKey = `${this.STORAGE_KEY}_backup_${Date.now()}`;\r\n const data: UiEditorStorageData = {\r\n schema,\r\n timestamp: Date.now(),\r\n version: this.STORAGE_VERSION,\r\n };\r\n try {\r\n localStorage.setItem(backupKey, JSON.stringify(data));\r\n this.cleanOldBackups();\r\n } catch {\r\n // Silenzioso: il backup non e critico\r\n }\r\n }\r\n\r\n // ─── Private ─────────────────────────────────────────────────\r\n\r\n /** @internal Validazione strutturale minima dello schema. */\r\n private isValidSchema(schema: unknown): schema is UiFormSchema {\r\n const s = schema as any;\r\n return (\r\n s &&\r\n typeof s === 'object' &&\r\n typeof s.id === 'string' &&\r\n Array.isArray(s.sections) &&\r\n s.sections.every(\r\n (sec: any) =>\r\n sec &&\r\n typeof sec.id === 'string' &&\r\n Array.isArray(sec.fields) &&\r\n sec.fields.every(\r\n (f: any) => f && typeof f.key === 'string' && typeof f.type === 'string' && typeof f.label === 'string',\r\n ),\r\n )\r\n );\r\n }\r\n\r\n /** @internal Scarica un blob come file. */\r\n private downloadBlob(blob: Blob, filename: string): void {\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = filename;\r\n link.style.display = 'none';\r\n document.body.appendChild(link);\r\n link.click();\r\n setTimeout(() => {\r\n document.body.removeChild(link);\r\n URL.revokeObjectURL(url);\r\n }, 100);\r\n }\r\n\r\n /** @internal Mantiene solo gli ultimi 5 backup. */\r\n private cleanOldBackups(): void {\r\n try {\r\n const keys: string[] = [];\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key?.startsWith(`${this.STORAGE_KEY}_backup_`)) {\r\n keys.push(key);\r\n }\r\n }\r\n keys\r\n .sort((a, b) => {\r\n const tsA = parseInt(a.split('_').pop() || '0', 10);\r\n const tsB = parseInt(b.split('_').pop() || '0', 10);\r\n return tsB - tsA;\r\n })\r\n .slice(5)\r\n .forEach((key) => localStorage.removeItem(key));\r\n } catch {\r\n // Silenzioso\r\n }\r\n }\r\n}\r\n","import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiVariant, UiSize, UiIconName } from '../../core/types';\r\nimport { UiIconPosition } from './button.types';\r\n\r\n/** @internal Size-to-icon-pixel mapping for consistent icon sizing. */\r\nconst ICON_SIZE_MAP: Record<UiSize, number> = {\r\n xs: 14,\r\n sm: 16,\r\n md: 18,\r\n lg: 20,\r\n xl: 22,\r\n};\r\n\r\n/**\r\n * Standalone button component with design-token-driven theming,\r\n * variant/size system, Lucide icon support, loading states, and WCAG 2.1 AA accessibility.\r\n *\r\n * Uses native `<button>` click events — listen with `(click)` on the host element.\r\n *\r\n * @selector ui-button\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Basic -->\r\n * <ui-button label=\"Save\" variant=\"primary\" icon=\"save\" (click)=\"save()\" />\r\n *\r\n * <!-- Loading -->\r\n * <ui-button label=\"Submitting...\" variant=\"primary\" [loading]=\"true\" />\r\n *\r\n * <!-- Icon-only: tooltip o ariaLabel forniscono il nome accessibile -->\r\n * <ui-button icon=\"trash-2\" variant=\"warn\" tooltip=\"Elimina\" (click)=\"delete()\" />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-button',\r\n standalone: true,\r\n imports: [MatTooltipModule, LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'ui-button-host',\r\n '[class.ui-button-host--full-width]': 'fullWidth',\r\n },\r\n template: `\r\n <button\r\n [type]=\"type\"\r\n [class]=\"buttonClasses\"\r\n [disabled]=\"disabled || loading\"\r\n [attr.aria-label]=\"effectiveAriaLabel || null\"\r\n [attr.aria-busy]=\"loading || null\"\r\n [matTooltip]=\"tooltip\"\r\n >\r\n <span class=\"ui-button__content\" [class.ui-button__content--hidden]=\"loading\">\r\n @if (icon && iconPosition === 'leading') {\r\n <lucide-icon [name]=\"icon!\" [size]=\"iconSize\" aria-hidden=\"true\" />\r\n }\r\n @if (label) {\r\n <span class=\"ui-button__label\">{{ label }}</span>\r\n }\r\n <ng-content />\r\n @if (icon && iconPosition === 'trailing') {\r\n <lucide-icon [name]=\"icon!\" [size]=\"iconSize\" aria-hidden=\"true\" />\r\n }\r\n </span>\r\n @if (loading) {\r\n <span class=\"ui-button__spinner-overlay\">\r\n <span class=\"ui-button__spinner\" aria-hidden=\"true\"></span>\r\n <span class=\"ui-button__sr-only\">Loading</span>\r\n </span>\r\n }\r\n </button>\r\n `,\r\n styleUrl: './button.component.scss',\r\n})\r\nexport class UiButtonComponent {\r\n /** Button label text. */\r\n @Input() label = '';\r\n\r\n /** Tooltip text shown on hover (uses Angular Material tooltip). */\r\n @Input() tooltip = '';\r\n\r\n /** Visual style variant. */\r\n @Input() variant: UiVariant = 'primary';\r\n\r\n /** Size variant. */\r\n @Input() size: UiSize = 'md';\r\n\r\n /** Lucide icon name. @see https://lucide.dev/icons */\r\n @Input() icon?: UiIconName;\r\n\r\n /** Icon position relative to the label. */\r\n @Input() iconPosition: UiIconPosition = 'trailing';\r\n\r\n /** Whether the button is in a loading state. Disables interaction and shows spinner. */\r\n @Input() loading = false;\r\n\r\n /** Whether the button is disabled. */\r\n @Input() disabled = false;\r\n\r\n /** Expand button to full container width. */\r\n @Input() fullWidth = false;\r\n\r\n /** HTML button type attribute. */\r\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\r\n\r\n /** Accessible label override (required for icon-only buttons). */\r\n @Input() ariaLabel?: string;\r\n\r\n /** Additional CSS class for edge cases. */\r\n @Input() customClass?: string;\r\n\r\n /**\r\n * Nome accessibile risolto per il pulsante nativo.\r\n * Usa `ariaLabel` se impostato; per pulsanti solo icona senza testo visibile\r\n * ricade sul `tooltip` (il tooltip Material non sostituisce il nome accessibile).\r\n */\r\n get effectiveAriaLabel(): string | undefined {\r\n const explicit = this.ariaLabel?.trim();\r\n if (explicit) return explicit;\r\n\r\n if (this.label?.trim()) return undefined;\r\n\r\n const tip = this.tooltip?.trim();\r\n if (this.icon && tip) return tip;\r\n\r\n return undefined;\r\n }\r\n\r\n /** Computed icon pixel size based on button size. */\r\n get iconSize(): number {\r\n return ICON_SIZE_MAP[this.size] ?? 18;\r\n }\r\n\r\n /** Assembled CSS class string for the native button element. */\r\n get buttonClasses(): string {\r\n return [\r\n 'ui-button',\r\n `ui-button--${this.variant}`,\r\n `ui-button--${this.size}`,\r\n this.loading ? 'ui-button--loading' : '',\r\n this.fullWidth ? 'ui-button--full-width' : '',\r\n !this.label && this.icon ? 'ui-button--icon-only' : '',\r\n this.customClass ?? '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/blackbox\r\n * Types and interfaces for the BlackBox observability service.\r\n *\r\n * The BlackBox service acts as a \"black box recorder\" for user sessions,\r\n * capturing navigation, UI interactions, form events and HTTP calls\r\n * in a compressed, opaque format stored in IndexedDB.\r\n */\r\n\r\n// ─── Configuration ───────────────────────────────────────────────────\r\n\r\n/**\r\n * Form tracking granularity flags.\r\n *\r\n * Controls which form events are captured by the BlackBox service.\r\n * All flags default to `true` except `trackValues` which defaults to `false`\r\n * for privacy reasons.\r\n */\r\nexport interface UiBlackboxFormTrackingConfig {\r\n /**\r\n * When `true`, the actual field values are stored in form events.\r\n * When `false`, only the fact that a change occurred is recorded.\r\n * @default false\r\n */\r\n trackValues: boolean;\r\n\r\n /** Track focus events on form fields. @default true */\r\n trackFocus: boolean;\r\n\r\n /** Track blur events on form fields. @default true */\r\n trackBlur: boolean;\r\n\r\n /** Track value change events on form fields. @default true */\r\n trackValueChanges: boolean;\r\n\r\n /** Track validation error events on form fields. @default true */\r\n trackValidation: boolean;\r\n\r\n /**\r\n * Debounce interval (ms) for `valueChanges` subscriptions.\r\n * Higher values reduce noise but increase latency.\r\n * @default 500\r\n */\r\n debounceMs: number;\r\n}\r\n\r\n/**\r\n * Root configuration for the BlackBox service.\r\n *\r\n * All properties are optional — sensible defaults are applied when omitted.\r\n *\r\n * @example\r\n * ```typescript\r\n * blackboxService.configure({\r\n * maxStorageMb: 30,\r\n * formTracking: { trackValues: true, debounceMs: 1000 },\r\n * });\r\n * ```\r\n */\r\nexport interface UiBlackboxConfig {\r\n /**\r\n * Maximum IndexedDB storage quota in megabytes.\r\n * Oldest sessions are pruned when the quota is exceeded.\r\n * @default 50\r\n */\r\n maxStorageMb: number;\r\n\r\n /**\r\n * Interval (ms) at which the in-memory buffer is flushed to IndexedDB.\r\n * @default 5000\r\n */\r\n flushIntervalMs: number;\r\n\r\n /**\r\n * Number of buffered events that trigger an immediate flush.\r\n * @default 20\r\n */\r\n flushThreshold: number;\r\n\r\n /**\r\n * Centralised debounce (ms) applied to the event buffer.\r\n * @default 500\r\n */\r\n bufferDebounceMs: number;\r\n\r\n /** Per-field form tracking configuration. */\r\n formTracking: UiBlackboxFormTrackingConfig;\r\n}\r\n\r\n// ─── Fingerprint ─────────────────────────────────────────────────────\r\n\r\n/**\r\n * Stable device/browser fingerprint generated by FingerprintJS (open-source).\r\n * Persists across sessions and incognito mode.\r\n */\r\nexport type UiBlackboxFingerprint = string;\r\n\r\n// ─── Session ─────────────────────────────────────────────────────────\r\n\r\n/**\r\n * A single recording session, corresponding to one browser tab lifecycle.\r\n *\r\n * Sessions are associated to a stable `fingerprint` so that multiple\r\n * sessions from the same device can be grouped together.\r\n */\r\nexport interface UiBlackboxSession {\r\n /** Unique session identifier (UUID v4). */\r\n sessionId: string;\r\n\r\n /** Stable device/browser fingerprint. */\r\n fingerprint: UiBlackboxFingerprint;\r\n\r\n /** Timestamp (ms since epoch) when the session started. */\r\n startedAt: number;\r\n\r\n /** Timestamp (ms since epoch) when the session ended (tab closed). */\r\n endedAt?: number;\r\n\r\n /** Raw `navigator.userAgent` string captured at session start. */\r\n userAgent: string;\r\n\r\n /**\r\n * Ordered list of navigation steps (route changes).\r\n * Each step contains the actions performed on that page.\r\n */\r\n steps: UiBlackboxStep[];\r\n\r\n /**\r\n * Parallel stream of form interaction events.\r\n * Ordered by timestamp, correlated to routes via `route` field.\r\n */\r\n formEvents: UiBlackboxFormEvent[];\r\n\r\n /**\r\n * Intercepted HTTP calls, ordered by timestamp.\r\n * Only requests explicitly marked with the `X-Ui-Blackbox` header.\r\n */\r\n calls: UiBlackboxHttpCall[];\r\n}\r\n\r\n// ─── Step (Route Change) ─────────────────────────────────────────────\r\n\r\n/**\r\n * A single navigation step created on every `NavigationEnd` event.\r\n * Contains all UI actions performed during this route.\r\n */\r\nexport interface UiBlackboxStep {\r\n /** Timestamp (ms) of the navigation event. */\r\n timestamp: number;\r\n\r\n /** The route URL navigated to. */\r\n route: string;\r\n\r\n /** The previous route URL (undefined for the first step). */\r\n previousRoute?: string;\r\n\r\n /**\r\n * Ordered list of UI actions (clicks) performed on this page.\r\n */\r\n actions: UiBlackboxAction[];\r\n}\r\n\r\n// ─── Action (UI Click) ──────────────────────────────────────────────\r\n\r\n/**\r\n * A single tracked UI action, typically a click.\r\n */\r\nexport interface UiBlackboxAction {\r\n /** Timestamp (ms) of the action. */\r\n timestamp: number;\r\n\r\n /** Type discriminator. Currently only `click` is supported. */\r\n type: 'click';\r\n\r\n /** Information about the clicked element. */\r\n target: UiBlackboxActionTarget;\r\n}\r\n\r\n/**\r\n * Minimal information about the element that was interacted with.\r\n */\r\nexport interface UiBlackboxActionTarget {\r\n /** HTML tag name (lowercase). */\r\n tag: string;\r\n\r\n /** Element `id` attribute, if present. */\r\n id?: string;\r\n\r\n /**\r\n * Custom tracking identifier, set via `data-track-id` attribute\r\n * or the `[uiTrack]` directive value.\r\n */\r\n trackId?: string;\r\n\r\n /** First 50 characters of `innerText` (trimmed). */\r\n text?: string;\r\n}\r\n\r\n// ─── Form Event ──────────────────────────────────────────────────────\r\n\r\n/** Discriminator for form event types. */\r\nexport type UiBlackboxFormEventType =\r\n | 'focus'\r\n | 'blur'\r\n | 'valueChange'\r\n | 'validationError';\r\n\r\n/**\r\n * A single form interaction event from the parallel form stream.\r\n *\r\n * Each event is timestamped and tagged with the current route, allowing\r\n * correlation with navigation steps on a shared timeline.\r\n */\r\nexport interface UiBlackboxFormEvent {\r\n /** Timestamp (ms) of the event. */\r\n timestamp: number;\r\n\r\n /** Route URL where the event occurred. */\r\n route: string;\r\n\r\n /** Schema `id` of the `UiFormBuilderComponent` that owns the field. */\r\n formId: string;\r\n\r\n /** `key` of the field descriptor from the form schema. */\r\n fieldKey: string;\r\n\r\n /** Type of form interaction. */\r\n eventType: UiBlackboxFormEventType;\r\n\r\n /** Optional metadata depending on event type and config. */\r\n metadata?: UiBlackboxFormEventMetadata;\r\n}\r\n\r\n/**\r\n * Optional metadata attached to a `UiBlackboxFormEvent`.\r\n */\r\nexport interface UiBlackboxFormEventMetadata {\r\n /** Field value (only captured when `config.formTracking.trackValues` is `true`). */\r\n value?: any;\r\n\r\n /** Whether the field is currently valid. */\r\n valid?: boolean;\r\n\r\n /** List of active validation error keys. */\r\n errors?: string[];\r\n\r\n /**\r\n * Full form values snapshot at the moment of the event.\r\n * Only captured when `config.formTracking.trackValues` is `true`.\r\n */\r\n formValues?: Record<string, any>;\r\n}\r\n\r\n// ─── HTTP Call ────────────────────────────────────────────────────────\r\n\r\n/**\r\n * A single intercepted HTTP call.\r\n *\r\n * Only requests bearing the `X-Ui-Blackbox` header are captured.\r\n */\r\nexport interface UiBlackboxHttpCall {\r\n /** Timestamp (ms) when the request was initiated. */\r\n timestamp: number;\r\n\r\n /** HTTP method (GET, POST, PUT, DELETE, …). */\r\n method: string;\r\n\r\n /** Request URL. */\r\n url: string;\r\n\r\n /** HTTP status code of the response (undefined if the request failed). */\r\n status?: number;\r\n\r\n /** Round-trip duration in milliseconds. */\r\n durationMs?: number;\r\n\r\n /** Request body payload (serialisable). */\r\n requestPayload?: any;\r\n\r\n /** Response headers filtered by the `X-Ui-Blackbox-Headers` regex. */\r\n responseHeaders?: Record<string, string>;\r\n\r\n /** The regex pattern used to filter response headers. */\r\n headerFilter?: string;\r\n}\r\n\r\n// ─── Internal Buffer Event ───────────────────────────────────────────\r\n\r\n/**\r\n * Union type for all events flowing through the centralised buffer.\r\n * @internal\r\n */\r\nexport type UiBlackboxBufferEvent =\r\n | { kind: 'action'; payload: UiBlackboxAction & { route: string } }\r\n | { kind: 'formEvent'; payload: UiBlackboxFormEvent }\r\n | { kind: 'httpCall'; payload: UiBlackboxHttpCall }\r\n | { kind: 'step'; payload: UiBlackboxStep };\r\n\r\n// ─── Defaults ────────────────────────────────────────────────────────\r\n\r\n/** Default configuration values. */\r\nexport const UI_BLACKBOX_DEFAULTS: UiBlackboxConfig = {\r\n maxStorageMb: 50,\r\n flushIntervalMs: 5000,\r\n flushThreshold: 20,\r\n bufferDebounceMs: 500,\r\n formTracking: {\r\n trackValues: false,\r\n trackFocus: true,\r\n trackBlur: true,\r\n trackValueChanges: true,\r\n trackValidation: true,\r\n debounceMs: 500,\r\n },\r\n};\r\n","/**\r\n * @module ng-ui-system/blackbox\r\n * Fingerprint service — generates a stable device/browser hash\r\n * using the open-source FingerprintJS library (MIT, no API key required).\r\n *\r\n * The fingerprint is computed once and cached in `localStorage` under\r\n * the key `__ui_bb_fp` to avoid redundant recalculations.\r\n */\r\n\r\nimport { Injectable, inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport type { UiBlackboxFingerprint } from './blackbox.types';\r\n\r\n/** localStorage key for the cached fingerprint. */\r\nconst FP_CACHE_KEY = '__ui_bb_fp';\r\n\r\n/**\r\n * Generates and caches a stable browser/device fingerprint.\r\n *\r\n * Uses `@fingerprintjs/fingerprintjs` (open-source, MIT) which analyses\r\n * canvas rendering, WebGL, audio context, screen properties, timezone,\r\n * user-agent, and other browser signals to produce a stable hash.\r\n *\r\n * @usageNotes\r\n * ```typescript\r\n * const fp = inject(UiBlackboxFingerprintService);\r\n * const hash = await fp.getFingerprint();\r\n * // => \"a1b2c3d4e5f6...\" (stable across sessions)\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiBlackboxFingerprintService {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private cached: UiBlackboxFingerprint | null = null;\r\n\r\n /**\r\n * Returns the stable fingerprint for this device/browser.\r\n *\r\n * On first call, loads FingerprintJS dynamically, computes the hash,\r\n * and caches it in both memory and `localStorage`.\r\n * Subsequent calls return the cached value immediately.\r\n */\r\n async getFingerprint(): Promise<UiBlackboxFingerprint> {\r\n // Return cached value if available\r\n if (this.cached) {\r\n return this.cached;\r\n }\r\n\r\n // SSR guard\r\n if (!isPlatformBrowser(this.platformId)) {\r\n return 'ssr-placeholder';\r\n }\r\n\r\n // Try localStorage cache first\r\n try {\r\n const stored = localStorage.getItem(FP_CACHE_KEY);\r\n if (stored) {\r\n this.cached = stored;\r\n return stored;\r\n }\r\n } catch {\r\n // localStorage may be unavailable (privacy mode, quota exceeded)\r\n }\r\n\r\n // Compute fingerprint via FingerprintJS\r\n try {\r\n const FingerprintJS = await import('@fingerprintjs/fingerprintjs');\r\n const agent = await FingerprintJS.load();\r\n const result = await agent.get();\r\n this.cached = result.visitorId;\r\n\r\n // Persist to localStorage\r\n try {\r\n localStorage.setItem(FP_CACHE_KEY, this.cached);\r\n } catch {\r\n // Silently ignore storage errors\r\n }\r\n\r\n return this.cached;\r\n } catch {\r\n // Fallback: generate a pseudo-fingerprint from available signals\r\n const fallback = this.generateFallbackFingerprint();\r\n this.cached = fallback;\r\n\r\n try {\r\n localStorage.setItem(FP_CACHE_KEY, fallback);\r\n } catch {\r\n // Silently ignore\r\n }\r\n\r\n return fallback;\r\n }\r\n }\r\n\r\n /**\r\n * Fallback fingerprint when FingerprintJS is unavailable.\r\n * Combines basic browser signals into a hash.\r\n * @internal\r\n */\r\n private generateFallbackFingerprint(): string {\r\n const signals = [\r\n navigator.userAgent,\r\n navigator.language,\r\n screen.width + 'x' + screen.height,\r\n screen.colorDepth?.toString() ?? '',\r\n Intl.DateTimeFormat().resolvedOptions().timeZone,\r\n navigator.hardwareConcurrency?.toString() ?? '',\r\n ].join('|');\r\n\r\n // Simple string hash (djb2)\r\n let hash = 5381;\r\n for (let i = 0; i < signals.length; i++) {\r\n hash = ((hash << 5) + hash + signals.charCodeAt(i)) >>> 0;\r\n }\r\n return hash.toString(36).padStart(12, '0');\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/blackbox\r\n * IndexedDB storage adapter for BlackBox sessions.\r\n *\r\n * Handles persistence, compression (via native CompressionStream gzip),\r\n * quota enforcement, and JSONL export.\r\n *\r\n * Design notes:\r\n * - DB name: `ui-blackbox`, object store: `sessions`\r\n * - Each session is gzip-compressed before storage for both size\r\n * reduction and inherent obfuscation\r\n * - Quota enforced by total stored size; oldest sessions are pruned first\r\n */\r\n\r\nimport { Injectable, inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport type { UiBlackboxSession, UiBlackboxConfig } from './blackbox.types';\r\nimport { UI_BLACKBOX_DEFAULTS } from './blackbox.types';\r\n\r\nconst DB_NAME = 'ui-blackbox';\r\nconst DB_VERSION = 1;\r\nconst STORE_NAME = 'sessions';\r\n\r\n/**\r\n * Low-level IndexedDB adapter for reading/writing compressed BlackBox sessions.\r\n *\r\n * @usageNotes\r\n * This service is used internally by `UiBlackboxService`.\r\n * Consumers should interact with the higher-level `UiBlackboxService` API.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiBlackboxStorageService {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private db: IDBDatabase | null = null;\r\n private maxStorageMb = UI_BLACKBOX_DEFAULTS.maxStorageMb;\r\n\r\n // ─── Configuration ─────────────────────────────────────────────────\r\n\r\n /** Update the storage quota from the parent service config. */\r\n setMaxStorageMb(mb: number): void {\r\n this.maxStorageMb = mb;\r\n }\r\n\r\n // ─── Database lifecycle ────────────────────────────────────────────\r\n\r\n /** Open (or create) the IndexedDB database. */\r\n private async openDb(): Promise<IDBDatabase> {\r\n if (this.db) return this.db;\r\n if (!isPlatformBrowser(this.platformId)) {\r\n throw new Error('IndexedDB is not available in SSR');\r\n }\r\n\r\n return new Promise<IDBDatabase>((resolve, reject) => {\r\n const request = indexedDB.open(DB_NAME, DB_VERSION);\r\n\r\n request.onupgradeneeded = () => {\r\n const db = request.result;\r\n if (!db.objectStoreNames.contains(STORE_NAME)) {\r\n const store = db.createObjectStore(STORE_NAME, { keyPath: 'sessionId' });\r\n store.createIndex('fingerprint', 'fingerprint', { unique: false });\r\n store.createIndex('startedAt', 'startedAt', { unique: false });\r\n }\r\n };\r\n\r\n request.onsuccess = () => {\r\n this.db = request.result;\r\n resolve(this.db);\r\n };\r\n\r\n request.onerror = () => reject(request.error);\r\n });\r\n }\r\n\r\n // ─── Compression helpers ───────────────────────────────────────────\r\n\r\n /** Compress a string to a gzip Uint8Array using native CompressionStream. */\r\n private async compress(data: string): Promise<Uint8Array> {\r\n const encoder = new TextEncoder();\r\n const stream = new Blob([encoder.encode(data) as BlobPart])\r\n .stream()\r\n .pipeThrough(new CompressionStream('gzip'));\r\n\r\n const reader = stream.getReader();\r\n const chunks: Uint8Array[] = [];\r\n let done = false;\r\n\r\n while (!done) {\r\n const result = await reader.read();\r\n done = result.done;\r\n if (result.value) {\r\n chunks.push(result.value);\r\n }\r\n }\r\n\r\n // Merge chunks into a single ArrayBuffer-backed Uint8Array\r\n const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);\r\n const buffer = new ArrayBuffer(totalLength);\r\n const merged = new Uint8Array(buffer);\r\n let offset = 0;\r\n for (const chunk of chunks) {\r\n merged.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n return merged;\r\n }\r\n\r\n /** Decompress a gzip Uint8Array back to a string. */\r\n private async decompress(data: Uint8Array): Promise<string> {\r\n const stream = new Blob([data as BlobPart])\r\n .stream()\r\n .pipeThrough(new DecompressionStream('gzip'));\r\n\r\n const reader = stream.getReader();\r\n const decoder = new TextDecoder();\r\n let result = '';\r\n let done = false;\r\n\r\n while (!done) {\r\n const chunk = await reader.read();\r\n done = chunk.done;\r\n if (chunk.value) {\r\n result += decoder.decode(chunk.value, { stream: !done });\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n // ─── CRUD ──────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Persist a session to IndexedDB (gzip-compressed).\r\n * Enforces quota after saving.\r\n */\r\n async saveSession(session: UiBlackboxSession): Promise<void> {\r\n const db = await this.openDb();\r\n const json = JSON.stringify(session);\r\n const compressed = await this.compress(json);\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const store = tx.objectStore(STORE_NAME);\r\n\r\n // Store as { sessionId, fingerprint, startedAt, data: Uint8Array }\r\n store.put({\r\n sessionId: session.sessionId,\r\n fingerprint: session.fingerprint,\r\n startedAt: session.startedAt,\r\n sizeBytes: compressed.byteLength,\r\n data: compressed,\r\n });\r\n\r\n tx.oncomplete = () => {\r\n this.enforceQuota().then(resolve).catch(resolve);\r\n };\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n\r\n /**\r\n * Read and decompress a single session by ID.\r\n */\r\n async getSession(sessionId: string): Promise<UiBlackboxSession | null> {\r\n const db = await this.openDb();\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readonly');\r\n const store = tx.objectStore(STORE_NAME);\r\n const req = store.get(sessionId);\r\n\r\n req.onsuccess = async () => {\r\n if (!req.result) {\r\n resolve(null);\r\n return;\r\n }\r\n try {\r\n const json = await this.decompress(req.result.data);\r\n resolve(JSON.parse(json));\r\n } catch (e) {\r\n reject(e);\r\n }\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n /**\r\n * Get all stored sessions (decompressed).\r\n */\r\n async getAllSessions(): Promise<UiBlackboxSession[]> {\r\n const db = await this.openDb();\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readonly');\r\n const store = tx.objectStore(STORE_NAME);\r\n const req = store.getAll();\r\n\r\n req.onsuccess = async () => {\r\n try {\r\n const sessions: UiBlackboxSession[] = [];\r\n for (const record of req.result) {\r\n const json = await this.decompress(record.data);\r\n sessions.push(JSON.parse(json));\r\n }\r\n resolve(sessions);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n /**\r\n * Get all sessions for a given fingerprint.\r\n */\r\n async getSessionsByFingerprint(fingerprint: string): Promise<UiBlackboxSession[]> {\r\n const db = await this.openDb();\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readonly');\r\n const store = tx.objectStore(STORE_NAME);\r\n const index = store.index('fingerprint');\r\n const req = index.getAll(fingerprint);\r\n\r\n req.onsuccess = async () => {\r\n try {\r\n const sessions: UiBlackboxSession[] = [];\r\n for (const record of req.result) {\r\n const json = await this.decompress(record.data);\r\n sessions.push(JSON.parse(json));\r\n }\r\n resolve(sessions);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n /**\r\n * Generate a downloadable JSONL Blob of all sessions.\r\n * Each line is one JSON-serialised session (decompressed).\r\n */\r\n async exportDump(): Promise<Blob> {\r\n const sessions = await this.getAllSessions();\r\n const lines = sessions.map((s) => JSON.stringify(s)).join('\\n');\r\n return new Blob([lines], { type: 'application/x-ndjson' });\r\n }\r\n\r\n /**\r\n * Delete all stored sessions.\r\n */\r\n async clearAll(): Promise<void> {\r\n const db = await this.openDb();\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const store = tx.objectStore(STORE_NAME);\r\n store.clear();\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n\r\n // ─── Quota enforcement ─────────────────────────────────────────────\r\n\r\n /**\r\n * Prune oldest sessions until total stored size is under `maxStorageMb`.\r\n * @internal\r\n */\r\n async enforceQuota(): Promise<void> {\r\n const db = await this.openDb();\r\n const maxBytes = this.maxStorageMb * 1024 * 1024;\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const store = tx.objectStore(STORE_NAME);\r\n const index = store.index('startedAt');\r\n\r\n // Collect all records sorted by startedAt (ascending = oldest first)\r\n const cursorReq = index.openCursor();\r\n const records: { key: IDBValidKey; size: number }[] = [];\r\n let totalSize = 0;\r\n\r\n cursorReq.onsuccess = () => {\r\n const cursor = cursorReq.result;\r\n if (cursor) {\r\n const size: number = cursor.value.sizeBytes || 0;\r\n totalSize += size;\r\n records.push({ key: cursor.primaryKey, size });\r\n cursor.continue();\r\n } else {\r\n // Cursor exhausted — prune if over quota\r\n if (totalSize <= maxBytes) {\r\n resolve();\r\n return;\r\n }\r\n\r\n let freed = 0;\r\n const target = totalSize - maxBytes;\r\n for (const record of records) {\r\n if (freed >= target) break;\r\n store.delete(record.key);\r\n freed += record.size;\r\n }\r\n resolve();\r\n }\r\n };\r\n\r\n cursorReq.onerror = () => reject(cursorReq.error);\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/blackbox\r\n * Core BlackBox observability service — the main entry point for session\r\n * recording, event buffering, and export.\r\n *\r\n * Architecture:\r\n * - Root singleton (`providedIn: 'root'`)\r\n * - On first inject: generates fingerprint, creates session, subscribes to Router events\r\n * - Centralised in-memory buffer with periodic/threshold-based flush to IndexedDB\r\n * - `window:beforeunload` triggers a final best-effort async flush\r\n */\r\n\r\nimport {\r\n Injectable,\r\n inject,\r\n PLATFORM_ID,\r\n OnDestroy,\r\n NgZone,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Router, NavigationEnd } from '@angular/router';\r\nimport { Subject } from 'rxjs';\r\nimport { filter, takeUntil } from 'rxjs/operators';\r\n\r\nimport {\r\n UiBlackboxConfig,\r\n UiBlackboxFormTrackingConfig,\r\n UiBlackboxSession,\r\n UiBlackboxStep,\r\n UiBlackboxAction,\r\n UiBlackboxFormEvent,\r\n UiBlackboxHttpCall,\r\n UiBlackboxBufferEvent,\r\n UI_BLACKBOX_DEFAULTS,\r\n} from './blackbox.types';\r\nimport { UiBlackboxFingerprintService } from './blackbox-fingerprint.service';\r\nimport { UiBlackboxStorageService } from './blackbox-storage.service';\r\n\r\n/**\r\n * Central BlackBox observability service.\r\n *\r\n * Records navigation, UI interactions, form events, and HTTP calls\r\n * into compressed sessions stored in IndexedDB.\r\n *\r\n * @usageNotes\r\n * The service activates automatically when injected. Provide it at root level\r\n * and it will start recording immediately.\r\n *\r\n * ```typescript\r\n * // app.config.ts — just importing the service is enough\r\n * import { UiBlackboxService } from '@gnggln/ng-ui-system';\r\n *\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * // The service is providedIn: 'root', so it's auto-provided.\r\n * // To force eager initialisation:\r\n * { provide: APP_INITIALIZER, useFactory: () => () => inject(UiBlackboxService), multi: true },\r\n * ],\r\n * };\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiBlackboxService implements OnDestroy {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private readonly router = inject(Router);\r\n private readonly zone = inject(NgZone);\r\n private readonly fingerprint = inject(UiBlackboxFingerprintService);\r\n private readonly storage = inject(UiBlackboxStorageService);\r\n\r\n private readonly destroy$ = new Subject<void>();\r\n private config: UiBlackboxConfig = { ...UI_BLACKBOX_DEFAULTS };\r\n\r\n // ─── Session state ─────────────────────────────────────────────────\r\n private session!: UiBlackboxSession;\r\n private currentStep: UiBlackboxStep | null = null;\r\n private initialised = false;\r\n\r\n // ─── Centralised event buffer ──────────────────────────────────────\r\n private buffer: UiBlackboxBufferEvent[] = [];\r\n private flushTimerId: ReturnType<typeof setInterval> | null = null;\r\n private beforeUnloadHandler: (() => void) | null = null;\r\n\r\n constructor() {\r\n if (isPlatformBrowser(this.platformId)) {\r\n this.init();\r\n }\r\n }\r\n\r\n // ─── Initialisation ────────────────────────────────────────────────\r\n\r\n private async init(): Promise<void> {\r\n // Generate session ID\r\n const sessionId = this.generateUuid();\r\n const fp = await this.fingerprint.getFingerprint();\r\n\r\n this.session = {\r\n sessionId,\r\n fingerprint: fp,\r\n startedAt: Date.now(),\r\n userAgent: navigator.userAgent,\r\n steps: [],\r\n formEvents: [],\r\n calls: [],\r\n };\r\n\r\n // Create initial step from current URL\r\n this.currentStep = {\r\n timestamp: Date.now(),\r\n route: this.router.url,\r\n actions: [],\r\n };\r\n this.session.steps.push(this.currentStep);\r\n\r\n // Subscribe to router navigation\r\n this.router.events\r\n .pipe(\r\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe((event) => {\r\n const previousRoute = this.currentStep?.route;\r\n this.currentStep = {\r\n timestamp: Date.now(),\r\n route: event.urlAfterRedirects,\r\n previousRoute,\r\n actions: [],\r\n };\r\n this.pushBufferEvent({ kind: 'step', payload: this.currentStep });\r\n });\r\n\r\n // Setup periodic flush (outside Angular zone to avoid triggering CD)\r\n this.zone.runOutsideAngular(() => {\r\n this.flushTimerId = setInterval(\r\n () => this.flush(),\r\n this.config.flushIntervalMs,\r\n );\r\n\r\n // Best-effort flush on tab close (IndexedDB is async, no sync fallback)\r\n this.beforeUnloadHandler = () => {\r\n this.session.endedAt = Date.now();\r\n void this.flush();\r\n };\r\n window.addEventListener('beforeunload', this.beforeUnloadHandler);\r\n });\r\n\r\n this.initialised = true;\r\n }\r\n\r\n // ─── Public API: Configuration ─────────────────────────────────────\r\n\r\n /**\r\n * Update the BlackBox configuration.\r\n * Can be called at any time; changes take effect immediately.\r\n */\r\n configure(config: Partial<Omit<UiBlackboxConfig, 'formTracking'>> & { formTracking?: Partial<UiBlackboxFormTrackingConfig> }): void {\r\n this.config = {\r\n ...this.config,\r\n ...config,\r\n formTracking: {\r\n ...this.config.formTracking,\r\n ...(config.formTracking ?? {}),\r\n },\r\n };\r\n this.storage.setMaxStorageMb(this.config.maxStorageMb);\r\n\r\n // Restart flush timer with new interval\r\n if (this.flushTimerId !== null) {\r\n clearInterval(this.flushTimerId);\r\n this.zone.runOutsideAngular(() => {\r\n this.flushTimerId = setInterval(\r\n () => this.flush(),\r\n this.config.flushIntervalMs,\r\n );\r\n });\r\n }\r\n }\r\n\r\n /** Returns the current configuration (readonly snapshot). */\r\n getConfig(): Readonly<UiBlackboxConfig> {\r\n return { ...this.config };\r\n }\r\n\r\n // ─── Public API: Tracking ──────────────────────────────────────────\r\n\r\n /**\r\n * Manually track a UI action (click).\r\n *\r\n * Called automatically by `UiButtonAreaComponent` and the `[uiTrack]` directive.\r\n * Can also be called programmatically for custom interactions.\r\n *\r\n * @param trackId - Identifier for the action (e.g. button id, link name).\r\n * @param meta - Optional metadata: `tag`, `text`, `id` of the element.\r\n */\r\n trackAction(\r\n trackId: string,\r\n meta?: { tag?: string; text?: string; id?: string },\r\n ): void {\r\n if (!this.initialised) return;\r\n\r\n const action: UiBlackboxAction = {\r\n timestamp: Date.now(),\r\n type: 'click',\r\n target: {\r\n tag: meta?.tag ?? 'unknown',\r\n id: meta?.id,\r\n trackId,\r\n text: meta?.text?.substring(0, 50),\r\n },\r\n };\r\n\r\n // Add to current step immediately (for in-memory session access)\r\n this.currentStep?.actions.push(action);\r\n\r\n // Also push to buffer for persistence\r\n this.pushBufferEvent({\r\n kind: 'action',\r\n payload: { ...action, route: this.currentStep?.route ?? this.router.url },\r\n });\r\n }\r\n\r\n /**\r\n * Track a form interaction event.\r\n *\r\n * Called automatically by `UiFormBuilderComponent` when the BlackBox\r\n * service is available.\r\n */\r\n trackFormEvent(event: UiBlackboxFormEvent): void {\r\n if (!this.initialised) return;\r\n\r\n this.session.formEvents.push(event);\r\n this.pushBufferEvent({ kind: 'formEvent', payload: event });\r\n }\r\n\r\n /**\r\n * Track an intercepted HTTP call.\r\n * Called by `UiBlackboxInterceptor`.\r\n * @internal\r\n */\r\n trackHttpCall(call: UiBlackboxHttpCall): void {\r\n if (!this.initialised) return;\r\n\r\n this.session.calls.push(call);\r\n this.pushBufferEvent({ kind: 'httpCall', payload: call });\r\n }\r\n\r\n // ─── Public API: Session access ────────────────────────────────────\r\n\r\n /**\r\n * Returns the current in-memory session (live, not yet flushed).\r\n * Useful for debugging or real-time inspection.\r\n */\r\n getCurrentSession(): UiBlackboxSession {\r\n return this.session;\r\n }\r\n\r\n /**\r\n * Retrieve all sessions stored in IndexedDB (decompressed).\r\n */\r\n async getSessionHistory(): Promise<UiBlackboxSession[]> {\r\n return this.storage.getAllSessions();\r\n }\r\n\r\n /**\r\n * Retrieve sessions for the current device fingerprint.\r\n */\r\n async getSessionsForDevice(): Promise<UiBlackboxSession[]> {\r\n const fp = await this.fingerprint.getFingerprint();\r\n return this.storage.getSessionsByFingerprint(fp);\r\n }\r\n\r\n // ─── Public API: Export ────────────────────────────────────────────\r\n\r\n /**\r\n * Export all sessions as a downloadable JSONL Blob.\r\n *\r\n * @returns A Blob containing JSONL data (one session per line).\r\n *\r\n * @example\r\n * ```typescript\r\n * const blob = await blackbox.exportSessions();\r\n * const url = URL.createObjectURL(blob);\r\n * const a = document.createElement('a');\r\n * a.href = url;\r\n * a.download = 'blackbox-sessions.jsonl';\r\n * a.click();\r\n * ```\r\n */\r\n async exportSessions(): Promise<Blob> {\r\n // Flush current session first\r\n await this.flush();\r\n return this.storage.exportDump();\r\n }\r\n\r\n // ─── Public API: Lifecycle ─────────────────────────────────────────\r\n\r\n /**\r\n * Explicitly end the current session.\r\n * Flushes all buffered events and marks the session as ended.\r\n */\r\n async endSession(): Promise<void> {\r\n if (!this.initialised) return;\r\n this.session.endedAt = Date.now();\r\n await this.flush();\r\n }\r\n\r\n /**\r\n * Clear all stored sessions from IndexedDB.\r\n */\r\n async clearHistory(): Promise<void> {\r\n return this.storage.clearAll();\r\n }\r\n\r\n // ─── Buffer management ─────────────────────────────────────────────\r\n\r\n /**\r\n * Push an event into the centralised buffer.\r\n * Triggers an immediate flush if the buffer exceeds the threshold.\r\n * @internal\r\n */\r\n private pushBufferEvent(event: UiBlackboxBufferEvent): void {\r\n this.buffer.push(event);\r\n if (this.buffer.length >= this.config.flushThreshold) {\r\n this.flush();\r\n }\r\n }\r\n\r\n /**\r\n * Flush buffered events to IndexedDB asynchronously.\r\n * @internal\r\n */\r\n private async flush(): Promise<void> {\r\n if (!this.initialised || this.buffer.length === 0) return;\r\n\r\n // Drain buffer\r\n const events = this.buffer.splice(0);\r\n\r\n // Apply step events to the session\r\n for (const event of events) {\r\n if (event.kind === 'step') {\r\n // Steps are already pushed in real-time; ensure they're in the session\r\n if (!this.session.steps.includes(event.payload)) {\r\n this.session.steps.push(event.payload);\r\n }\r\n }\r\n // Actions, formEvents, httpCalls are already pushed in real-time\r\n // to the in-memory session by trackAction/trackFormEvent/trackHttpCall\r\n }\r\n\r\n // Save the full session snapshot\r\n try {\r\n await this.storage.saveSession(this.session);\r\n } catch (e) {\r\n // storage error — re-enqueue events for next flush\r\n console.warn('[UiBlackbox] Storage flush failed:', e);\r\n }\r\n }\r\n\r\n // ─── Utilities ─────────────────────────────────────────────────────\r\n\r\n /** Generate a UUID v4. */\r\n private generateUuid(): string {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n // Fallback for older browsers\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n }\r\n\r\n // ─── Cleanup ───────────────────────────────────────────────────────\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n if (this.flushTimerId !== null) {\r\n clearInterval(this.flushTimerId);\r\n }\r\n\r\n if (this.beforeUnloadHandler) {\r\n window.removeEventListener('beforeunload', this.beforeUnloadHandler);\r\n }\r\n\r\n // Final flush\r\n void this.flush();\r\n }\r\n}\r\n","import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation, inject } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { UiSize } from '../../core/types';\r\nimport { UiButtonComponent } from './button.component';\r\nimport { UiButtonDescriptor, UiButtonAreaAlign } from './button.types';\r\nimport { UiBlackboxService } from '../blackbox/blackbox.service';\r\n\r\n/**\r\n * Standalone button-group component driven by a `UiButtonDescriptor[]` configuration.\r\n *\r\n * Renders a group of `UiButton` instances from declarative descriptors.\r\n * Supports per-button loading/disabled states, dynamic visibility,\r\n * alignment control, and optional navigation via Angular Router.\r\n *\r\n * When the `UiBlackboxService` is provided, button clicks are\r\n * automatically tracked in the active session.\r\n *\r\n * @selector ui-button-area\r\n *\r\n * @example\r\n * ```html\r\n * <ui-button-area\r\n * [buttons]=\"actions\"\r\n * align=\"end\"\r\n * gap=\"sm\"\r\n * [loadingIds]=\"currentlyLoading\"\r\n * />\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // Dynamic configuration\r\n * actions: UiButtonDescriptor[] = [\r\n * { id: 'export', label: 'Export Excel', icon: 'file-spreadsheet', variant: 'primary',\r\n * action: () => this.exportExcel() },\r\n * { id: 'delete', label: 'Delete', icon: 'trash-2', variant: 'warn',\r\n * action: () => this.deleteSelected(), hidden: !this.hasSelection },\r\n * ];\r\n *\r\n * // Set loading state from outside:\r\n * currentlyLoading: string | string[] | null = 'export';\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-button-area',\r\n standalone: true,\r\n imports: [UiButtonComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'ui-button-area-host',\r\n },\r\n template: `\r\n <div\r\n [class]=\"areaClasses\"\r\n role=\"group\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n >\r\n @for (button of visibleButtons; track trackButton($index, button)) {\r\n <ui-button\r\n [attr.data-button-id]=\"button.id || null\"\r\n [label]=\"button.label\"\r\n [tooltip]=\"button.tooltip ?? ''\"\r\n [ariaLabel]=\"button.ariaLabel\"\r\n [icon]=\"button.icon\"\r\n [iconPosition]=\"button.iconPosition ?? 'trailing'\"\r\n [variant]=\"button.variant ?? 'primary'\"\r\n [size]=\"button.size ?? 'md'\"\r\n [loading]=\"isButtonLoading(button)\"\r\n [disabled]=\"isButtonDisabled(button)\"\r\n [customClass]=\"button.customClass\"\r\n (click)=\"handleButtonClick(button, $event)\"\r\n />\r\n }\r\n </div>\r\n `,\r\n styleUrl: './button-area.component.scss',\r\n})\r\nexport class UiButtonAreaComponent {\r\n /**\r\n * Array of button descriptors to render.\r\n * Buttons with `hidden: true` are filtered out.\r\n */\r\n @Input() buttons: UiButtonDescriptor[] = [];\r\n\r\n /** Horizontal alignment of the button group. */\r\n @Input() align: UiButtonAreaAlign = 'end';\r\n\r\n /** Accessible group label for screen readers. */\r\n @Input() ariaLabel = 'Actions';\r\n\r\n /** Gap between buttons (maps to design token spacing). */\r\n @Input() gap: UiSize = 'sm';\r\n\r\n /** Stack buttons vertically on mobile viewports (<600px). */\r\n @Input() stackOnMobile = true;\r\n\r\n /**\r\n * When `true`, all buttons are disabled while any button is in a loading state.\r\n * Useful to prevent double-actions during async operations.\r\n */\r\n @Input() disableWhileLoading = false;\r\n\r\n /**\r\n * Set one or more buttons to a loading state by their `id`.\r\n * Accepts a single string, an array of strings, or `null` to clear.\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Single -->\r\n * <ui-button-area [loadingIds]=\"'save'\" />\r\n *\r\n * <!-- Multiple -->\r\n * <ui-button-area [loadingIds]=\"['save', 'export']\" />\r\n * ```\r\n */\r\n @Input()\r\n set loadingIds(value: string | string[] | null | undefined) {\r\n if (value === null || value === undefined) {\r\n this._loadingIds = new Set();\r\n } else if (Array.isArray(value)) {\r\n this._loadingIds = new Set(value);\r\n } else {\r\n this._loadingIds = new Set([value]);\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _loadingIds = new Set<string>();\r\n\r\n /** @internal Optional router for href navigation. */\r\n private router = inject(Router, { optional: true });\r\n\r\n /** @internal Optional BlackBox service — auto-tracks button clicks when available. */\r\n private blackbox = inject(UiBlackboxService, { optional: true });\r\n\r\n /** Buttons filtered to visible (non-hidden) entries. */\r\n get visibleButtons(): UiButtonDescriptor[] {\r\n return this.buttons.filter((b) => !b.hidden);\r\n }\r\n\r\n /** Assembled CSS class string for the button area container. */\r\n get areaClasses(): string {\r\n return [\r\n 'ui-button-area',\r\n `ui-button-area--align-${this.align}`,\r\n `ui-button-area--gap-${this.gap}`,\r\n this.stackOnMobile ? 'ui-button-area--stack-mobile' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n /** @internal Track function for @for loop. */\r\n trackButton(index: number, button: UiButtonDescriptor): string {\r\n return button.id ?? `idx-${index}`;\r\n }\r\n\r\n /** Whether a specific button is in a loading state. */\r\n isButtonLoading(button: UiButtonDescriptor): boolean {\r\n return !!button.loading || (!!button.id && this._loadingIds.has(button.id));\r\n }\r\n\r\n /** Whether a specific button is disabled (includes loading logic). */\r\n isButtonDisabled(button: UiButtonDescriptor): boolean {\r\n if (button.disabled) return true;\r\n if (this.isButtonLoading(button)) return true;\r\n if (this.disableWhileLoading && this._loadingIds.size > 0) return true;\r\n return false;\r\n }\r\n\r\n /** @internal Handles button click: tracks action, calls callback and/or navigates. */\r\n handleButtonClick(button: UiButtonDescriptor, event: MouseEvent): void {\r\n // BlackBox auto-tracking (no-op if service is not provided)\r\n this.blackbox?.trackAction(button.id ?? button.label, {\r\n tag: 'ui-button',\r\n id: button.id,\r\n text: button.label,\r\n });\r\n\r\n if (button.action) {\r\n button.action(event);\r\n }\r\n if (button.href && this.router) {\r\n this.router.navigateByUrl(button.href);\r\n }\r\n }\r\n}\r\n\r\n","/**\r\n * ng-ui-system — Button entry point.\r\n *\r\n * @example\r\n * ```typescript\r\n * import {\r\n * UiButtonComponent,\r\n * UiButtonAreaComponent,\r\n * UiButtonDescriptor,\r\n * } from 'ng-ui-system';\r\n * ```\r\n */\r\n\r\n// Components\r\nexport { UiButtonComponent } from './button.component';\r\nexport { UiButtonAreaComponent } from './button-area.component';\r\n\r\n// Types\r\nexport {\r\n UiButtonDescriptor,\r\n UiButtonAreaAlign,\r\n UiIconPosition,\r\n} from './button.types';\r\n","import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\n\r\nimport { UiEditorBreadcrumbItem } from '../../types/editor.types';\r\nimport { UiButtonComponent } from '../../../button/index';\r\n\r\n/**\r\n * Toolbar principale dell'editor di form.\r\n *\r\n * Contiene:\r\n * - Sezione sinistra: icona, titolo e breadcrumb di navigazione\r\n * - Centro: indicatore dello stato di salvataggio\r\n * - Destra: pulsanti azione (aggiungi sezione, salva, file, altro)\r\n *\r\n * @selector ui-editor-toolbar\r\n */\r\n@Component({\r\n selector: 'ui-editor-toolbar',\r\n standalone: true,\r\n imports: [MatToolbarModule, MatButtonModule, MatMenuModule, MatTooltipModule, LucideAngularModule, UiButtonComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <mat-toolbar color=\"primary\" class=\"editor-toolbar\">\r\n <!-- Sezione sinistra: icona, titolo e breadcrumb -->\r\n <div class=\"editor-toolbar__left\">\r\n <lucide-icon name=\"pencil\" [size]=\"20\" aria-hidden=\"true\" />\r\n <span class=\"editor-toolbar__title\">Form Builder Editor</span>\r\n\r\n <!-- Breadcrumb di navigazione -->\r\n @if (breadcrumb.length) {\r\n <nav class=\"editor-toolbar__breadcrumb\" aria-label=\"Navigazione editor\">\r\n @for (item of breadcrumb; track item.id; let last = $last) {\r\n <span\r\n class=\"editor-toolbar__breadcrumb-item\"\r\n [class.editor-toolbar__breadcrumb-item--active]=\"item.active\"\r\n >\r\n {{ item.label }}\r\n </span>\r\n @if (!last) {\r\n <lucide-icon\r\n name=\"chevron-right\"\r\n [size]=\"14\"\r\n class=\"editor-toolbar__breadcrumb-sep\"\r\n aria-hidden=\"true\"\r\n />\r\n }\r\n }\r\n </nav>\r\n }\r\n </div>\r\n\r\n <!-- Centro: stato di salvataggio -->\r\n <div class=\"editor-toolbar__center\">\r\n @if (isDirty) {\r\n <lucide-icon name=\"pencil\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span class=\"editor-toolbar__save-status editor-toolbar__save-status--dirty\">\r\n Modifiche non salvate\r\n </span>\r\n } @else {\r\n <lucide-icon name=\"check-circle\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span class=\"editor-toolbar__save-status editor-toolbar__save-status--saved\">\r\n {{ formatLastSaved(lastSaved) }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <!-- Sezione destra: pulsanti azione -->\r\n <div class=\"editor-toolbar__right\">\r\n <!-- Aggiungi sezione -->\r\n <ui-button\r\n icon=\"plus\"\r\n variant=\"ghost\"\r\n size=\"md\"\r\n ariaLabel=\"Aggiungi sezione\"\r\n tooltip=\"Aggiungi sezione\"\r\n (click)=\"addSection.emit()\"\r\n />\r\n\r\n <!-- Salva -->\r\n <ui-button\r\n icon=\"save\"\r\n variant=\"ghost\"\r\n size=\"md\"\r\n ariaLabel=\"Salva\"\r\n tooltip=\"Salva\"\r\n (click)=\"save.emit()\"\r\n />\r\n\r\n <!-- Menu file -->\r\n <button\r\n mat-icon-button\r\n matTooltip=\"Menu file\"\r\n aria-label=\"Menu file\"\r\n [matMenuTriggerFor]=\"fileMenu\"\r\n >\r\n <lucide-icon name=\"folder\" [size]=\"20\" />\r\n </button>\r\n\r\n <mat-menu #fileMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"newForm.emit()\">\r\n <lucide-icon name=\"file-text\" [size]=\"18\" />\r\n <span>Nuovo Form</span>\r\n </button>\r\n <button mat-menu-item (click)=\"importJson.emit()\">\r\n <lucide-icon name=\"download\" [size]=\"18\" />\r\n <span>Importa JSON</span>\r\n </button>\r\n <button mat-menu-item (click)=\"exportJson.emit()\">\r\n <lucide-icon name=\"upload\" [size]=\"18\" />\r\n <span>Esporta JSON</span>\r\n </button>\r\n </mat-menu>\r\n\r\n <!-- Menu altro -->\r\n <button\r\n mat-icon-button\r\n matTooltip=\"Altre azioni\"\r\n aria-label=\"Altre azioni\"\r\n [matMenuTriggerFor]=\"moreMenu\"\r\n >\r\n <lucide-icon name=\"more-vertical\" [size]=\"20\" />\r\n </button>\r\n\r\n <mat-menu #moreMenu=\"matMenu\">\r\n <button mat-menu-item class=\"editor-toolbar__menu-warn\" (click)=\"clear.emit()\">\r\n <lucide-icon name=\"trash-2\" [size]=\"18\" />\r\n <span>Pulisci Tutto</span>\r\n </button>\r\n </mat-menu>\r\n </div>\r\n </mat-toolbar>\r\n `,\r\n styles: [\r\n `\r\n /* Contenitore principale della toolbar */\r\n .editor-toolbar {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--ui-spacing-3, 12px);\r\n padding: 0 var(--ui-spacing-4, 16px);\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n }\r\n\r\n /* ── Sezione sinistra ── */\r\n .editor-toolbar__left {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n min-width: 0;\r\n flex: 1 1 auto;\r\n }\r\n\r\n .editor-toolbar__title {\r\n font-weight: 600;\r\n font-size: var(--ui-font-size-md, 1rem);\r\n white-space: nowrap;\r\n }\r\n\r\n /* ── Breadcrumb ── */\r\n .editor-toolbar__breadcrumb {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1, 4px);\r\n margin-left: var(--ui-spacing-2, 8px);\r\n min-width: 0;\r\n overflow: hidden;\r\n }\r\n\r\n .editor-toolbar__breadcrumb-item {\r\n white-space: nowrap;\r\n opacity: 0.75;\r\n font-size: var(--ui-font-size-xs, 0.75rem);\r\n cursor: default;\r\n transition: opacity var(--ui-transition-fast, 150ms);\r\n }\r\n\r\n .editor-toolbar__breadcrumb-item--active {\r\n opacity: 1;\r\n font-weight: 600;\r\n }\r\n\r\n .editor-toolbar__breadcrumb-sep {\r\n opacity: 0.5;\r\n flex-shrink: 0;\r\n }\r\n\r\n /* ── Stato di salvataggio (centro) ── */\r\n .editor-toolbar__center {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1, 4px);\r\n flex-shrink: 0;\r\n }\r\n\r\n .editor-toolbar__save-status {\r\n font-size: var(--ui-font-size-xs, 0.75rem);\r\n white-space: nowrap;\r\n }\r\n\r\n .editor-toolbar__save-status--dirty {\r\n opacity: 0.85;\r\n }\r\n\r\n .editor-toolbar__save-status--saved {\r\n opacity: 0.7;\r\n }\r\n\r\n /* ── Sezione destra ── */\r\n .editor-toolbar__right {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1, 4px);\r\n flex-shrink: 0;\r\n }\r\n\r\n /* ── Voce menu con colore di avviso ── */\r\n .editor-toolbar__menu-warn {\r\n color: var(--ui-color-warn, #f44336) !important;\r\n }\r\n\r\n /* ── Menu item: icona + testo allineati ── */\r\n [mat-menu-item] {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n }\r\n\r\n /* ── Responsive: nasconde titolo e breadcrumb su schermi piccoli ── */\r\n @media (max-width: 768px) {\r\n .editor-toolbar__title,\r\n .editor-toolbar__breadcrumb {\r\n display: none;\r\n }\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiEditorToolbarComponent {\r\n /** Elementi del breadcrumb di navigazione. */\r\n @Input() breadcrumb: UiEditorBreadcrumbItem[] = [];\r\n\r\n /** Indica se ci sono modifiche non salvate. */\r\n @Input() isDirty = false;\r\n\r\n /** Data dell'ultimo salvataggio riuscito. */\r\n @Input() lastSaved: Date | null = null;\r\n\r\n /** Emesso alla richiesta di creare un nuovo form. */\r\n @Output() newForm = new EventEmitter<void>();\r\n\r\n /** Emesso alla richiesta di importare un JSON. */\r\n @Output() importJson = new EventEmitter<void>();\r\n\r\n /** Emesso alla richiesta di esportare il JSON. */\r\n @Output() exportJson = new EventEmitter<void>();\r\n\r\n /** Emesso alla richiesta di salvataggio. */\r\n @Output() save = new EventEmitter<void>();\r\n\r\n /** Emesso alla richiesta di pulizia completa. */\r\n @Output() clear = new EventEmitter<void>();\r\n\r\n /** Emesso alla richiesta di aggiungere una nuova sezione. */\r\n @Output() addSection = new EventEmitter<void>();\r\n\r\n /**\r\n * Formatta la data dell'ultimo salvataggio in testo leggibile.\r\n * Restituisce descrizioni relative come \"pochi secondi fa\", \"5 minuti fa\", ecc.\r\n *\r\n * @param date - Data dell'ultimo salvataggio oppure null\r\n * @returns Stringa descrittiva dello stato di salvataggio\r\n */\r\n formatLastSaved(date: Date | null): string {\r\n if (!date) return 'Mai salvato';\r\n\r\n const now = Date.now();\r\n const diff = now - date.getTime();\r\n const seconds = Math.floor(diff / 1000);\r\n const minutes = Math.floor(seconds / 60);\r\n const hours = Math.floor(minutes / 60);\r\n\r\n if (seconds < 30) return 'Salvato pochi secondi fa';\r\n if (seconds < 60) return 'Salvato meno di un minuto fa';\r\n if (minutes === 1) return 'Salvato 1 minuto fa';\r\n if (minutes < 60) return `Salvato ${minutes} minuti fa`;\r\n if (hours === 1) return 'Salvato 1 ora fa';\r\n return `Salvato ${hours} ore fa`;\r\n }\r\n}\r\n","import { Component, ChangeDetectionStrategy, Input } from '@angular/core';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { CdkDrag, CdkDragPlaceholder, CdkDropList } from '@angular/cdk/drag-drop';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\n\r\nimport { UiEditorFieldPaletteItem, UiEditorFieldCategory } from '../../types/editor.types';\r\nimport { UiFieldType } from '../../../form-builder/types/index';\r\nimport { UiIconName } from '../../../../core/types';\r\n\r\n/**\r\n * Interfaccia interna per una categoria della palette.\r\n * Raggruppa un insieme di elementi sotto un'etichetta comune.\r\n */\r\ninterface PaletteCategory {\r\n /** Identificativo della categoria. */\r\n key: UiEditorFieldCategory;\r\n /** Etichetta visualizzata nell'intestazione dell'accordion. */\r\n label: string;\r\n /** Icona Lucide della categoria. */\r\n icon: UiIconName;\r\n /** Elementi trascinabili appartenenti alla categoria. */\r\n items: UiEditorFieldPaletteItem[];\r\n}\r\n\r\n/**\r\n * Palette laterale dei tipi di campo disponibili.\r\n *\r\n * Mostra i campi raggruppati per categoria tramite pannelli espandibili.\r\n * Ogni elemento e trascinabile (CDK drag-drop) verso le sezioni del form.\r\n *\r\n * @selector ui-field-palette\r\n */\r\n@Component({\r\n selector: 'ui-field-palette',\r\n standalone: true,\r\n imports: [MatExpansionModule, CdkDropList, CdkDrag, CdkDragPlaceholder, LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"field-palette\">\r\n <h3 class=\"field-palette__header\">Campi disponibili</h3>\r\n\r\n <mat-accordion multi>\r\n @for (category of categories; track category.key) {\r\n <mat-expansion-panel [expanded]=\"category.key === 'basic'\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon [name]=\"category.icon\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>{{ category.label }}</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <div\r\n cdkDropList\r\n [id]=\"'palette-' + category.key\"\r\n [cdkDropListData]=\"category.items\"\r\n [cdkDropListSortingDisabled]=\"true\"\r\n [cdkDropListEnterPredicate]=\"noDrop\"\r\n class=\"field-palette__list\"\r\n >\r\n @for (item of category.items; track item.type) {\r\n <div\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n class=\"field-palette__item\"\r\n >\r\n <!-- Placeholder visualizzato nella lista di destinazione durante il drag -->\r\n <div class=\"field-palette__drag-placeholder\" *cdkDragPlaceholder></div>\r\n\r\n <!-- Icona handle di trascinamento (decorativa, l'intero elemento e draggabile) -->\r\n <lucide-icon\r\n name=\"grip-vertical\"\r\n [size]=\"14\"\r\n class=\"field-palette__drag-handle\"\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <!-- Icona del tipo di campo -->\r\n <lucide-icon\r\n [name]=\"item.icon\"\r\n [size]=\"18\"\r\n class=\"field-palette__item-icon\"\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <!-- Informazioni sul campo -->\r\n <div class=\"field-palette__item-info\">\r\n <span class=\"field-palette__item-label\">{{ item.label }}</span>\r\n <span class=\"field-palette__item-desc\">{{ item.description }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mat-expansion-panel>\r\n }\r\n </mat-accordion>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n /* Contenitore principale della palette */\r\n .field-palette {\r\n padding: var(--ui-spacing-3, 12px);\r\n height: 100%;\r\n overflow-y: auto;\r\n background: var(--ui-color-surface, #fff);\r\n }\r\n\r\n /* Intestazione della palette */\r\n .field-palette__header {\r\n margin: 0 0 var(--ui-spacing-3, 12px);\r\n font-size: var(--ui-font-size-md, 1rem);\r\n font-weight: 600;\r\n color: var(--ui-color-text, #212121);\r\n }\r\n\r\n /* Titolo del pannello: icona + testo */\r\n mat-panel-title {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n font-weight: 500;\r\n }\r\n\r\n /* Lista di campi all'interno del pannello */\r\n .field-palette__list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ui-spacing-1, 4px);\r\n min-height: 24px;\r\n }\r\n\r\n /* Singolo elemento trascinabile */\r\n .field-palette__item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n padding: var(--ui-spacing-2, 8px);\r\n border: 1px solid var(--ui-color-border, #e0e0e0);\r\n border-radius: var(--ui-radius-sm, 4px);\r\n background: var(--ui-color-surface, #fff);\r\n cursor: grab;\r\n transition: box-shadow var(--ui-transition-fast, 150ms),\r\n border-color var(--ui-transition-fast, 150ms);\r\n user-select: none;\r\n }\r\n\r\n .field-palette__item:hover {\r\n border-color: var(--ui-color-primary, #3f51b5);\r\n box-shadow: var(--ui-shadow-sm, 0 1px 3px rgba(0,0,0,.1));\r\n }\r\n\r\n /* Handle di trascinamento */\r\n .field-palette__drag-handle {\r\n color: var(--ui-color-text-muted, #9e9e9e);\r\n flex-shrink: 0;\r\n cursor: grab;\r\n }\r\n\r\n /* Icona tipo campo */\r\n .field-palette__item-icon {\r\n color: var(--ui-color-primary, #3f51b5);\r\n flex-shrink: 0;\r\n }\r\n\r\n /* Blocco info (label + descrizione) */\r\n .field-palette__item-info {\r\n display: flex;\r\n flex-direction: column;\r\n min-width: 0;\r\n }\r\n\r\n .field-palette__item-label {\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n font-weight: 500;\r\n color: var(--ui-color-text, #212121);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n .field-palette__item-desc {\r\n font-size: var(--ui-font-size-xs, 0.75rem);\r\n color: var(--ui-color-text-secondary, #616161);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n /* Placeholder mostrato nella zona di destinazione */\r\n .field-palette__drag-placeholder {\r\n height: 40px;\r\n border: 2px dashed var(--ui-color-primary, #3f51b5);\r\n border-radius: var(--ui-radius-sm, 4px);\r\n background: var(--ui-color-primary-bg, rgba(63, 81, 181, 0.08));\r\n transition: transform var(--ui-transition-fast, 150ms);\r\n }\r\n\r\n /* Stile dell'elemento durante il trascinamento (CDK) */\r\n .cdk-drag-preview {\r\n box-shadow: var(--ui-shadow-md, 0 4px 12px rgba(0,0,0,.15));\r\n border-radius: var(--ui-radius-sm, 4px);\r\n background: var(--ui-color-surface, #fff);\r\n padding: var(--ui-spacing-2, 8px);\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n }\r\n\r\n /* Animazione di spostamento degli elementi CDK */\r\n .cdk-drag-animating {\r\n transition: transform var(--ui-transition-normal, 250ms) cubic-bezier(0, 0, 0.2, 1);\r\n }\r\n\r\n /* Pannelli espandibili: spaziatura */\r\n mat-expansion-panel {\r\n margin-bottom: var(--ui-spacing-1, 4px) !important;\r\n box-shadow: none !important;\r\n border: 1px solid var(--ui-color-border, #e0e0e0);\r\n border-radius: var(--ui-radius-sm, 4px) !important;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiFieldPaletteComponent {\r\n /**\r\n * Predicato che impedisce il drop di elementi dentro la palette.\r\n * La palette e solo una sorgente di drag, non una destinazione.\r\n */\r\n noDrop = (): boolean => false;\r\n\r\n /**\r\n * Catalogo completo degli elementi della palette,\r\n * organizzato per categorie con i rispettivi metadati.\r\n */\r\n readonly categories: PaletteCategory[] = [\r\n {\r\n key: 'basic',\r\n label: 'Campi base',\r\n icon: 'type',\r\n items: [\r\n { type: 'text', label: 'Testo', icon: 'type', description: 'Campo di testo singola riga', category: 'basic' },\r\n { type: 'email', label: 'Email', icon: 'mail', description: 'Campo email con validazione', category: 'basic' },\r\n {\r\n type: 'password',\r\n label: 'Password',\r\n icon: 'lock',\r\n description: 'Campo password mascherato',\r\n category: 'basic',\r\n },\r\n { type: 'number', label: 'Numero', icon: 'hash', description: 'Campo numerico', category: 'basic' },\r\n {\r\n type: 'textarea',\r\n label: 'Area testo',\r\n icon: 'text',\r\n description: 'Campo di testo multilinea',\r\n category: 'basic',\r\n },\r\n ],\r\n },\r\n {\r\n key: 'choice',\r\n label: 'Campi scelta',\r\n icon: 'list',\r\n items: [\r\n {\r\n type: 'select',\r\n label: 'Select',\r\n icon: 'chevron-down',\r\n description: 'Menu a tendina singola scelta',\r\n category: 'choice',\r\n },\r\n {\r\n type: 'multiselect',\r\n label: 'Multiselect',\r\n icon: 'list',\r\n description: 'Selezione multipla',\r\n category: 'choice',\r\n },\r\n {\r\n type: 'freemultiselect',\r\n label: 'Multiselect libera',\r\n icon: 'list-plus',\r\n description: 'Selezione multipla con valori liberi',\r\n category: 'choice',\r\n },\r\n {\r\n type: 'radio',\r\n label: 'Radio',\r\n icon: 'circle-dot',\r\n description: 'Gruppo di opzioni radio',\r\n category: 'choice',\r\n },\r\n {\r\n type: 'checkbox',\r\n label: 'Checkbox',\r\n icon: 'check-square',\r\n description: 'Casella di spunta',\r\n category: 'choice',\r\n },\r\n {\r\n type: 'switch',\r\n label: 'Switch',\r\n icon: 'toggle-left',\r\n description: 'Interruttore on/off',\r\n category: 'choice',\r\n },\r\n ],\r\n },\r\n {\r\n key: 'datetime',\r\n label: 'Data e ora',\r\n icon: 'calendar',\r\n items: [\r\n { type: 'date', label: 'Data', icon: 'calendar', description: 'Selettore di data', category: 'datetime' },\r\n {\r\n type: 'datetime',\r\n label: 'Data e ora',\r\n icon: 'clock',\r\n description: 'Selettore data e ora',\r\n category: 'datetime',\r\n },\r\n ],\r\n },\r\n {\r\n key: 'advanced',\r\n label: 'Avanzati',\r\n icon: 'settings',\r\n items: [\r\n { type: 'file', label: 'File', icon: 'upload', description: 'Caricamento file', category: 'advanced' },\r\n { type: 'flag', label: 'Flag', icon: 'flag', description: 'Campo flag booleano', category: 'advanced' },\r\n ],\r\n },\r\n {\r\n key: 'custom',\r\n label: 'Personalizzati',\r\n icon: 'settings',\r\n items: [\r\n {\r\n type: 'custom',\r\n label: 'Custom',\r\n icon: 'settings',\r\n description: 'Componente personalizzato',\r\n category: 'custom',\r\n },\r\n { type: 'divider', label: 'Separatore', icon: 'minus', description: 'Divisore visuale', category: 'custom' },\r\n ],\r\n },\r\n ];\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder-editor\r\n * Componente editor di sezione per il form builder.\r\n *\r\n * Renderizza una singola sezione del form come card, con supporto\r\n * per espansione/collasso, editing inline del titolo, drag & drop\r\n * dei campi e azioni CRUD su sezione e campi.\r\n */\r\n\r\nimport { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\n\r\nimport { UiButtonComponent } from '../../../button/index';\r\nimport { UiFormSection } from '../../../form-builder/types/index';\r\nimport { UiFieldType } from '../../../form-builder/types/index';\r\n\r\n/**\r\n * Mappa tipo di campo -> nome icona Lucide.\r\n * Usata per visualizzare l'icona corretta accanto a ciascun campo.\r\n */\r\nconst FIELD_ICON_MAP: Record<UiFieldType, string> = {\r\n text: 'type',\r\n email: 'mail',\r\n password: 'lock', // NOSONAR - Icon name for password field type, not a credential\r\n number: 'hash',\r\n textarea: 'text',\r\n select: 'chevron-down',\r\n multiselect: 'list',\r\n freemultiselect: 'list-plus',\r\n radio: 'circle-dot',\r\n checkbox: 'check-square',\r\n switch: 'toggle-left',\r\n date: 'calendar',\r\n datetime: 'clock',\r\n file: 'upload',\r\n flag: 'flag',\r\n custom: 'settings',\r\n divider: 'minus',\r\n location: 'map-pin',\r\n 'location-geocoded': 'globe',\r\n 'location-table': 'map',\r\n};\r\n\r\n/**\r\n * Editor visuale di una singola sezione del form.\r\n *\r\n * Supporta:\r\n * - Header espandibile/collassabile con editing inline del titolo\r\n * - Pulsanti azione: modifica titolo, duplica, elimina\r\n * - Drop list CDK per ricevere campi dalla palette o da altre sezioni\r\n * - Ogni campo mostra: handle di trascinamento, icona tipo, label, chiave, badge tipo, asterisco required\r\n * - Azioni campo (al passaggio mouse): duplica, elimina\r\n * - Stato vuoto quando non ci sono campi\r\n */\r\n@Component({\r\n selector: 'ui-section-editor',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n FormsModule,\r\n MatCardModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n DragDropModule,\r\n LucideAngularModule,\r\n UiButtonComponent,\r\n ],\r\n template: `\r\n <!-- Card della sezione -->\r\n <mat-card\r\n class=\"section-card\"\r\n [class.section-card--selected]=\"isSelected\"\r\n >\r\n <!-- Header della sezione -->\r\n <div class=\"section-header\" (click)=\"toggleExpand()\">\r\n <!-- Indicatore espansione -->\r\n <ui-button\r\n [icon]=\"isExpanded ? 'chevron-down' : 'chevron-right'\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n [tooltip]=\"isExpanded ? 'Comprimi sezione' : 'Espandi sezione'\"\r\n ariaLabel=\"Espandi/Comprimi sezione\"\r\n />\r\n\r\n <!-- Titolo della sezione (doppio click per modificare) -->\r\n @if (isEditingTitle) {\r\n <mat-form-field class=\"section-header__title-field\" appearance=\"outline\">\r\n <input\r\n matInput\r\n [(ngModel)]=\"tempTitle\"\r\n (blur)=\"confirmTitleEdit()\"\r\n (keydown.enter)=\"confirmTitleEdit()\"\r\n (keydown.escape)=\"cancelTitleEdit()\"\r\n (click)=\"$event.stopPropagation()\"\r\n autofocus\r\n />\r\n </mat-form-field>\r\n } @else {\r\n <span\r\n class=\"section-header__title\"\r\n (dblclick)=\"startTitleEdit($event)\"\r\n >\r\n {{ section.title || 'Sezione senza titolo' }}\r\n </span>\r\n }\r\n\r\n <!-- Badge conteggio campi -->\r\n <span class=\"section-header__badge\">\r\n {{ section.fields.length }} {{ section.fields.length === 1 ? 'campo' : 'campi' }}\r\n </span>\r\n\r\n <!-- Azioni sezione -->\r\n <div class=\"section-header__actions\" (click)=\"$event.stopPropagation()\">\r\n <ui-button\r\n icon=\"pencil\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n ariaLabel=\"Modifica titolo\"\r\n tooltip=\"Modifica titolo\"\r\n (click)=\"startTitleEdit($event)\"\r\n />\r\n\r\n <ui-button\r\n icon=\"copy\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n ariaLabel=\"Duplica sezione\"\r\n tooltip=\"Duplica sezione\"\r\n (click)=\"sectionDuplicate.emit()\"\r\n />\r\n\r\n <ui-button\r\n icon=\"trash-2\"\r\n variant=\"warn\"\r\n size=\"sm\"\r\n ariaLabel=\"Elimina sezione\"\r\n tooltip=\"Elimina sezione\"\r\n (click)=\"sectionDelete.emit()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Corpo della sezione (espandibile) -->\r\n @if (isExpanded) {\r\n <div class=\"section-body\">\r\n <!-- Drop list CDK per i campi -->\r\n <div\r\n cdkDropList\r\n [cdkDropListData]=\"section\"\r\n [id]=\"'section-' + section.id\"\r\n (cdkDropListDropped)=\"onFieldDrop($event)\"\r\n class=\"field-drop-list\"\r\n >\r\n @for (field of section.fields; track field.key) {\r\n <div\r\n class=\"field-item\"\r\n cdkDrag\r\n [cdkDragData]=\"field\"\r\n [class.field-item--selected]=\"field.key === selectedFieldKey\"\r\n (click)=\"fieldSelect.emit(field.key)\"\r\n >\r\n <!-- Handle di trascinamento -->\r\n <div class=\"field-item__handle\" cdkDragHandle>\r\n <lucide-icon name=\"grip-vertical\" [size]=\"16\" />\r\n </div>\r\n\r\n <!-- Icona tipo campo -->\r\n <div class=\"field-item__icon\">\r\n <lucide-icon [name]=\"getFieldIcon(field.type)\" [size]=\"16\" />\r\n </div>\r\n\r\n <!-- Informazioni campo -->\r\n <div class=\"field-item__info\">\r\n <span class=\"field-item__label\">\r\n {{ field.label || 'Senza etichetta' }}\r\n @if (field.required) {\r\n <span class=\"field-item__required\">*</span>\r\n }\r\n </span>\r\n <span class=\"field-item__key\">{{ field.key }}</span>\r\n </div>\r\n\r\n <!-- Badge tipo campo -->\r\n <span class=\"field-item__type-badge\">{{ field.type }}</span>\r\n\r\n <!-- Azioni campo (visibili al passaggio del mouse) -->\r\n <div class=\"field-item__actions\" (click)=\"$event.stopPropagation()\">\r\n <ui-button\r\n icon=\"copy\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n ariaLabel=\"Duplica campo\"\r\n tooltip=\"Duplica campo\"\r\n (click)=\"fieldDuplicate.emit(field.key)\"\r\n />\r\n\r\n <ui-button\r\n icon=\"trash-2\"\r\n variant=\"warn\"\r\n size=\"xs\"\r\n ariaLabel=\"Elimina campo\"\r\n tooltip=\"Elimina campo\"\r\n (click)=\"fieldDelete.emit(field.key)\"\r\n />\r\n </div>\r\n </div>\r\n } @empty {\r\n <!-- Stato vuoto -->\r\n <div class=\"field-drop-list__empty\">\r\n <lucide-icon name=\"mouse-pointer-click\" [size]=\"24\" />\r\n <span>Trascina qui i campi dalla palette</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </mat-card>\r\n `,\r\n styles: [\r\n `\r\n /* ─── Card sezione ──────────────────────────────────────── */\r\n\r\n :host {\r\n display: block;\r\n }\r\n\r\n .section-card {\r\n border: 2px solid var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n overflow: hidden;\r\n transition: border-color var(--ui-transition-fast),\r\n box-shadow var(--ui-transition-fast);\r\n }\r\n\r\n .section-card:hover {\r\n box-shadow: var(--ui-shadow-sm);\r\n }\r\n\r\n .section-card--selected {\r\n border-color: var(--ui-color-primary);\r\n box-shadow: var(--ui-shadow-md);\r\n }\r\n\r\n /* ─── Header sezione ────────────────────────────────────── */\r\n\r\n .section-header {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2);\r\n padding: var(--ui-spacing-3) var(--ui-spacing-4);\r\n background: var(--ui-color-bg-subtle);\r\n cursor: pointer;\r\n user-select: none;\r\n transition: background var(--ui-transition-fast);\r\n }\r\n\r\n .section-header:hover {\r\n background: var(--ui-color-surface);\r\n }\r\n\r\n .section-header__title {\r\n flex: 1;\r\n font-size: var(--ui-font-size-md);\r\n font-weight: 600;\r\n color: var(--ui-color-text);\r\n cursor: pointer;\r\n }\r\n\r\n .section-header__title-field {\r\n flex: 1;\r\n }\r\n\r\n /* Riduce il padding del form field inline */\r\n .section-header__title-field ::ng-deep .mat-mdc-form-field-infix {\r\n padding-top: var(--ui-spacing-1) !important;\r\n padding-bottom: var(--ui-spacing-1) !important;\r\n min-height: unset;\r\n }\r\n\r\n .section-header__badge {\r\n font-size: var(--ui-font-size-xs);\r\n color: var(--ui-color-text-muted);\r\n background: var(--ui-color-surface);\r\n padding: var(--ui-spacing-1) var(--ui-spacing-2);\r\n border-radius: var(--ui-radius-sm);\r\n white-space: nowrap;\r\n }\r\n\r\n .section-header__actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1);\r\n opacity: 0;\r\n transition: opacity var(--ui-transition-fast);\r\n }\r\n\r\n .section-header:hover .section-header__actions {\r\n opacity: 1;\r\n }\r\n\r\n /* ─── Corpo sezione ─────────────────────────────────────── */\r\n\r\n .section-body {\r\n padding: var(--ui-spacing-3);\r\n }\r\n\r\n /* ─── Drop list campi ───────────────────────────────────── */\r\n\r\n .field-drop-list {\r\n min-height: 48px;\r\n border: 2px dashed var(--ui-color-border);\r\n border-radius: var(--ui-radius-sm);\r\n transition: border-color var(--ui-transition-fast),\r\n background var(--ui-transition-fast);\r\n }\r\n\r\n .field-drop-list.cdk-drop-list-dragging {\r\n border-color: var(--ui-color-primary);\r\n background: var(--ui-color-primary-bg);\r\n }\r\n\r\n .field-drop-list__empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--ui-spacing-2);\r\n padding: var(--ui-spacing-6) var(--ui-spacing-4);\r\n color: var(--ui-color-text-muted);\r\n font-size: var(--ui-font-size-sm);\r\n }\r\n\r\n /* ─── Elemento campo ────────────────────────────────────── */\r\n\r\n .field-item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2);\r\n padding: var(--ui-spacing-2) var(--ui-spacing-3);\r\n background: var(--ui-color-surface);\r\n border-bottom: 1px solid var(--ui-color-border);\r\n cursor: pointer;\r\n transition: background var(--ui-transition-fast);\r\n }\r\n\r\n .field-item:first-child {\r\n border-top-left-radius: var(--ui-radius-sm);\r\n border-top-right-radius: var(--ui-radius-sm);\r\n }\r\n\r\n .field-item:last-child {\r\n border-bottom: none;\r\n border-bottom-left-radius: var(--ui-radius-sm);\r\n border-bottom-right-radius: var(--ui-radius-sm);\r\n }\r\n\r\n .field-item:hover {\r\n background: var(--ui-color-bg-subtle);\r\n }\r\n\r\n .field-item--selected {\r\n background: var(--ui-color-primary-bg);\r\n border-left: 3px solid var(--ui-color-primary);\r\n }\r\n\r\n /* Handle di trascinamento */\r\n .field-item__handle {\r\n display: flex;\r\n align-items: center;\r\n cursor: grab;\r\n color: var(--ui-color-text-muted);\r\n transition: color var(--ui-transition-fast);\r\n }\r\n\r\n .field-item__handle:active {\r\n cursor: grabbing;\r\n }\r\n\r\n .field-item:hover .field-item__handle {\r\n color: var(--ui-color-text-secondary);\r\n }\r\n\r\n /* Icona tipo campo */\r\n .field-item__icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n border-radius: var(--ui-radius-sm);\r\n background: var(--ui-color-bg-subtle);\r\n color: var(--ui-color-primary);\r\n }\r\n\r\n /* Informazioni campo */\r\n .field-item__info {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n min-width: 0;\r\n }\r\n\r\n .field-item__label {\r\n font-size: var(--ui-font-size-sm);\r\n font-weight: 500;\r\n color: var(--ui-color-text);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n .field-item__required {\r\n color: var(--ui-color-warn);\r\n margin-left: var(--ui-spacing-1);\r\n }\r\n\r\n .field-item__key {\r\n font-size: var(--ui-font-size-xs);\r\n color: var(--ui-color-text-muted);\r\n font-family: monospace;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n /* Badge tipo campo */\r\n .field-item__type-badge {\r\n font-size: var(--ui-font-size-xs);\r\n color: var(--ui-color-primary);\r\n background: var(--ui-color-primary-bg);\r\n padding: 2px var(--ui-spacing-2);\r\n border-radius: var(--ui-radius-sm);\r\n white-space: nowrap;\r\n font-weight: 500;\r\n }\r\n\r\n /* Azioni campo */\r\n .field-item__actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1);\r\n opacity: 0;\r\n transition: opacity var(--ui-transition-fast);\r\n }\r\n\r\n .field-item:hover .field-item__actions {\r\n opacity: 1;\r\n }\r\n\r\n /* ─── CDK Drag & Drop ───────────────────────────────────── */\r\n\r\n .cdk-drag-preview {\r\n box-sizing: border-box;\r\n border-radius: var(--ui-radius-sm);\r\n box-shadow: var(--ui-shadow-md);\r\n background: var(--ui-color-surface);\r\n padding: var(--ui-spacing-2) var(--ui-spacing-3);\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2);\r\n }\r\n\r\n .cdk-drag-placeholder {\r\n opacity: 0.3;\r\n }\r\n\r\n .cdk-drag-animating {\r\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiSectionEditorComponent {\r\n /** Sezione del form da renderizzare. */\r\n @Input({ required: true }) section!: UiFormSection;\r\n\r\n /** Indica se la sezione e attualmente selezionata. */\r\n @Input() isSelected = false;\r\n\r\n /** Chiave del campo attualmente selezionato (o null). */\r\n @Input() selectedFieldKey: string | null = null;\r\n\r\n /** Emette aggiornamenti parziali alla sezione. */\r\n @Output() sectionUpdate = new EventEmitter<Partial<UiFormSection>>();\r\n\r\n /** Emette richiesta di eliminazione della sezione. */\r\n @Output() sectionDelete = new EventEmitter<void>();\r\n\r\n /** Emette richiesta di duplicazione della sezione. */\r\n @Output() sectionDuplicate = new EventEmitter<void>();\r\n\r\n /** Emette la chiave del campo selezionato. */\r\n @Output() fieldSelect = new EventEmitter<string>();\r\n\r\n /** Emette la chiave del campo da duplicare. */\r\n @Output() fieldDuplicate = new EventEmitter<string>();\r\n\r\n /** Emette la chiave del campo da eliminare. */\r\n @Output() fieldDelete = new EventEmitter<string>();\r\n\r\n /** Emette l'evento di drop del CDK drag & drop. */\r\n @Output() fieldDrop = new EventEmitter<CdkDragDrop<any>>();\r\n\r\n /** Stato di espansione della sezione. */\r\n isExpanded = true;\r\n\r\n /** Indica se il titolo e in fase di modifica inline. */\r\n isEditingTitle = false;\r\n\r\n /** Titolo temporaneo durante la modifica inline. */\r\n tempTitle = '';\r\n\r\n /**\r\n * Alterna lo stato di espansione/collasso della sezione.\r\n */\r\n toggleExpand(): void {\r\n this.isExpanded = !this.isExpanded;\r\n }\r\n\r\n /**\r\n * Avvia la modifica inline del titolo della sezione.\r\n * @param event - Evento del mouse per prevenire la propagazione.\r\n */\r\n startTitleEdit(event: Event): void {\r\n event.stopPropagation();\r\n this.tempTitle = this.section.title || '';\r\n this.isEditingTitle = true;\r\n }\r\n\r\n /**\r\n * Conferma la modifica del titolo ed emette l'aggiornamento.\r\n */\r\n confirmTitleEdit(): void {\r\n if (this.isEditingTitle) {\r\n this.isEditingTitle = false;\r\n const trimmed = this.tempTitle.trim();\r\n if (trimmed && trimmed !== this.section.title) {\r\n this.sectionUpdate.emit({ title: trimmed });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Annulla la modifica del titolo, ripristinando il valore originale.\r\n */\r\n cancelTitleEdit(): void {\r\n this.isEditingTitle = false;\r\n this.tempTitle = '';\r\n }\r\n\r\n /**\r\n * Restituisce il nome dell'icona Lucide associata al tipo di campo.\r\n * @param type - Tipo di campo del form.\r\n * @returns Nome dell'icona Lucide.\r\n */\r\n getFieldIcon(type: UiFieldType): string {\r\n return FIELD_ICON_MAP[type] || 'help-circle';\r\n }\r\n\r\n /**\r\n * Gestisce l'evento di drop del CDK drag & drop e lo propaga al parent.\r\n * @param event - Evento CdkDragDrop.\r\n */\r\n onFieldDrop(event: CdkDragDrop<any>): void {\r\n this.fieldDrop.emit(event);\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiButtonComponent } from '../../../button/index';\r\nimport { UiValidationRule, UiValidationType, UiCrossFieldOperator } from '../../../form-builder/types/index';\r\n\r\n/**\r\n * Interfaccia per le opzioni dei tipi di validazione nella select.\r\n */\r\ninterface ValidationTypeOption {\r\n /** Valore del tipo di validazione. */\r\n value: UiValidationType;\r\n /** Etichetta visualizzata nella select. */\r\n label: string;\r\n}\r\n\r\n/**\r\n * Interfaccia per le opzioni degli operatori cross-field nella select.\r\n */\r\ninterface CrossFieldOperatorOption {\r\n /** Valore dell'operatore. */\r\n value: UiCrossFieldOperator;\r\n /** Etichetta visualizzata nella select. */\r\n label: string;\r\n}\r\n\r\n/**\r\n * Editor per le regole di validazione dei campi.\r\n *\r\n * Permette di aggiungere, modificare e rimuovere regole di validazione\r\n * per un campo del form builder. Supporta validazioni standard,\r\n * cross-field, date e file.\r\n *\r\n * @selector ui-validation-editor\r\n */\r\n@Component({\r\n selector: 'ui-validation-editor',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n MatCardModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n LucideAngularModule,\r\n UiButtonComponent,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <!-- Intestazione con titolo e pulsante aggiungi -->\r\n <div class=\"ui-validation-editor__header\">\r\n <h4 class=\"ui-validation-editor__title\">Regole di Validazione</h4>\r\n <ui-button\r\n icon=\"plus\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n tooltip=\"Aggiungi regola di validazione\"\r\n ariaLabel=\"Aggiungi regola di validazione\"\r\n (click)=\"addValidation()\"\r\n />\r\n </div>\r\n\r\n <!-- Lista delle regole di validazione -->\r\n @if (validations.length > 0) {\r\n <div class=\"ui-validation-editor__list\">\r\n @for (rule of validations; track $index) {\r\n <mat-card class=\"ui-validation-editor__card\" appearance=\"outlined\">\r\n <mat-card-content>\r\n <!-- Riga principale: tipo + elimina -->\r\n <div class=\"ui-validation-editor__card-row\">\r\n <mat-form-field class=\"ui-validation-editor__field ui-validation-editor__field--type\" appearance=\"outline\">\r\n <mat-label>Tipo</mat-label>\r\n <mat-select\r\n [ngModel]=\"rule.type\"\r\n (ngModelChange)=\"onTypeChange($index, $event)\"\r\n >\r\n @for (opt of validationTypes; track opt.value) {\r\n <mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <ui-button\r\n icon=\"trash-2\"\r\n variant=\"warn\"\r\n size=\"sm\"\r\n tooltip=\"Elimina regola\"\r\n ariaLabel=\"Elimina regola\"\r\n (click)=\"removeValidation($index)\"\r\n />\r\n </div>\r\n\r\n <!-- Campo valore (se il tipo lo richiede) -->\r\n @if (requiresValue(rule.type)) {\r\n <mat-form-field class=\"ui-validation-editor__field ui-validation-editor__field--full\" appearance=\"outline\">\r\n <mat-label>Valore</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"rule.value\"\r\n (ngModelChange)=\"onValueChange($index, $event)\"\r\n [placeholder]=\"getValuePlaceholder(rule.type)\"\r\n />\r\n </mat-form-field>\r\n }\r\n\r\n <!-- Configurazione cross-field -->\r\n @if (rule.type === 'crossField') {\r\n <div class=\"ui-validation-editor__cross-field\">\r\n <span class=\"ui-validation-editor__cross-field-label\">\r\n <lucide-icon name=\"git-compare\" [size]=\"14\" />\r\n Configurazione cross-field\r\n </span>\r\n\r\n <mat-form-field class=\"ui-validation-editor__field ui-validation-editor__field--full\" appearance=\"outline\">\r\n <mat-label>Campo di confronto</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"rule.crossField?.targetField || ''\"\r\n (ngModelChange)=\"onCrossFieldTargetChange($index, $event)\"\r\n placeholder=\"Chiave del campo target\"\r\n />\r\n </mat-form-field>\r\n\r\n <div class=\"ui-validation-editor__card-row\">\r\n <mat-form-field class=\"ui-validation-editor__field\" appearance=\"outline\">\r\n <mat-label>Operatore</mat-label>\r\n <mat-select\r\n [ngModel]=\"rule.crossField?.operator || 'greater_than'\"\r\n (ngModelChange)=\"onCrossFieldOperatorChange($index, $event)\"\r\n >\r\n @for (op of crossFieldOperators; track op.value) {\r\n <mat-option [value]=\"op.value\">{{ op.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"ui-validation-editor__field\" appearance=\"outline\">\r\n <mat-label>Tipo dato</mat-label>\r\n <mat-select\r\n [ngModel]=\"rule.crossField?.dataType || 'number'\"\r\n (ngModelChange)=\"onCrossFieldDataTypeChange($index, $event)\"\r\n >\r\n <mat-option value=\"date\">Data</mat-option>\r\n <mat-option value=\"number\">Numero</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Messaggio di errore personalizzato -->\r\n <mat-form-field class=\"ui-validation-editor__field ui-validation-editor__field--full\" appearance=\"outline\">\r\n <mat-label>Messaggio di errore</mat-label>\r\n <textarea\r\n matInput\r\n [ngModel]=\"rule.message || ''\"\r\n (ngModelChange)=\"onMessageChange($index, $event)\"\r\n placeholder=\"Messaggio personalizzato...\"\r\n rows=\"2\"\r\n ></textarea>\r\n </mat-form-field>\r\n </mat-card-content>\r\n </mat-card>\r\n }\r\n </div>\r\n } @else {\r\n <!-- Stato vuoto -->\r\n <div class=\"ui-validation-editor__empty\">\r\n <lucide-icon name=\"ruler\" [size]=\"32\" class=\"ui-validation-editor__empty-icon\" />\r\n <p class=\"ui-validation-editor__empty-text\">Nessuna regola di validazione configurata.</p>\r\n <p class=\"ui-validation-editor__empty-hint\">\r\n Clicca il pulsante \"+\" per aggiungere una regola.\r\n </p>\r\n </div>\r\n }\r\n `,\r\n styles: [\r\n `\r\n :host {\r\n display: block;\r\n }\r\n\r\n .ui-validation-editor__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: var(--ui-spacing-3);\r\n }\r\n\r\n .ui-validation-editor__title {\r\n margin: 0;\r\n font-size: var(--ui-font-size-sm);\r\n font-weight: 600;\r\n color: var(--ui-color-text);\r\n }\r\n\r\n .ui-validation-editor__list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ui-spacing-3);\r\n }\r\n\r\n .ui-validation-editor__card {\r\n background: var(--ui-color-surface);\r\n border: 1px solid var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n box-shadow: var(--ui-shadow-sm);\r\n }\r\n\r\n .ui-validation-editor__card-row {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: var(--ui-spacing-2);\r\n }\r\n\r\n .ui-validation-editor__field {\r\n flex: 1;\r\n width: 100%;\r\n }\r\n\r\n .ui-validation-editor__field--type {\r\n flex: 1;\r\n }\r\n\r\n .ui-validation-editor__field--full {\r\n width: 100%;\r\n }\r\n\r\n .ui-validation-editor__cross-field {\r\n border: 1px dashed var(--ui-color-border);\r\n border-radius: var(--ui-radius-sm);\r\n padding: var(--ui-spacing-3);\r\n margin-bottom: var(--ui-spacing-2);\r\n background: var(--ui-color-bg-subtle);\r\n }\r\n\r\n .ui-validation-editor__cross-field-label {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1);\r\n font-size: var(--ui-font-size-xs);\r\n font-weight: 600;\r\n color: var(--ui-color-text-secondary);\r\n margin-bottom: var(--ui-spacing-2);\r\n }\r\n\r\n .ui-validation-editor__empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--ui-spacing-6) var(--ui-spacing-4);\r\n border: 1px dashed var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n background: var(--ui-color-bg-subtle);\r\n text-align: center;\r\n }\r\n\r\n .ui-validation-editor__empty-icon {\r\n color: var(--ui-color-text-muted);\r\n margin-bottom: var(--ui-spacing-2);\r\n }\r\n\r\n .ui-validation-editor__empty-text {\r\n margin: 0;\r\n font-size: var(--ui-font-size-sm);\r\n color: var(--ui-color-text-secondary);\r\n }\r\n\r\n .ui-validation-editor__empty-hint {\r\n margin: var(--ui-spacing-1) 0 0;\r\n font-size: var(--ui-font-size-xs);\r\n color: var(--ui-color-text-muted);\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiValidationEditorComponent {\r\n /** Lista delle regole di validazione da editare. */\r\n @Input() validations: UiValidationRule[] = [];\r\n\r\n /** Emesso quando la lista di regole viene modificata. */\r\n @Output() validationsChange = new EventEmitter<UiValidationRule[]>();\r\n\r\n /** Opzioni disponibili per il tipo di validazione. */\r\n readonly validationTypes: ValidationTypeOption[] = [\r\n { value: 'required', label: 'Obbligatorio' },\r\n { value: 'email', label: 'Email' },\r\n { value: 'min', label: 'Valore minimo' },\r\n { value: 'max', label: 'Valore massimo' },\r\n { value: 'minLength', label: 'Lunghezza minima' },\r\n { value: 'maxLength', label: 'Lunghezza massima' },\r\n { value: 'pattern', label: 'Pattern (regex)' },\r\n { value: 'crossField', label: 'Cross-field' },\r\n { value: 'date-min', label: 'Data minima' },\r\n { value: 'date-max', label: 'Data massima' },\r\n { value: 'fileSize', label: 'Dimensione file' },\r\n { value: 'fileType', label: 'Tipo file' },\r\n { value: 'fileCount', label: 'Numero file' },\r\n ];\r\n\r\n /** Opzioni per gli operatori di confronto cross-field. */\r\n readonly crossFieldOperators: CrossFieldOperatorOption[] = [\r\n { value: 'greater_than', label: 'Maggiore di' },\r\n { value: 'greater_equal', label: 'Maggiore o uguale' },\r\n { value: 'less_than', label: 'Minore di' },\r\n { value: 'less_equal', label: 'Minore o uguale' },\r\n { value: 'not_equal', label: 'Diverso da' },\r\n ];\r\n\r\n /**\r\n * Verifica se il tipo di validazione richiede un campo valore.\r\n * @param type - Tipo di validazione da verificare\r\n * @returns true se il tipo richiede un valore\r\n */\r\n requiresValue(type: UiValidationType): boolean {\r\n return ['min', 'max', 'minLength', 'maxLength', 'pattern', 'fileSize', 'fileCount'].includes(type);\r\n }\r\n\r\n /**\r\n * Restituisce il placeholder appropriato per il campo valore\r\n * in base al tipo di validazione selezionato.\r\n * @param type - Tipo di validazione\r\n * @returns Stringa placeholder\r\n */\r\n getValuePlaceholder(type: UiValidationType): string {\r\n const placeholders: Partial<Record<UiValidationType, string>> = {\r\n min: 'Valore numerico minimo',\r\n max: 'Valore numerico massimo',\r\n minLength: 'Lunghezza minima (numero)',\r\n maxLength: 'Lunghezza massima (numero)',\r\n pattern: 'Espressione regolare (regex)',\r\n fileSize: 'Dimensione massima in bytes',\r\n fileCount: 'Numero massimo di file',\r\n };\r\n return placeholders[type] || 'Inserisci valore';\r\n }\r\n\r\n /**\r\n * Aggiunge una nuova regola di validazione con valori predefiniti.\r\n */\r\n addValidation(): void {\r\n const updated: UiValidationRule[] = [...this.validations, { type: 'required', message: '' }];\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Rimuove la regola di validazione all'indice specificato.\r\n * @param index - Indice della regola da rimuovere\r\n */\r\n removeValidation(index: number): void {\r\n const updated = this.validations.filter((_, i) => i !== index);\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del tipo di validazione.\r\n * Se il tipo diventa 'crossField', inizializza la configurazione cross-field.\r\n * @param index - Indice della regola\r\n * @param type - Nuovo tipo di validazione\r\n */\r\n onTypeChange(index: number, type: UiValidationType): void {\r\n const updated = this.cloneValidations();\r\n updated[index] = { ...updated[index], type };\r\n\r\n // Inizializza la configurazione cross-field se necessario\r\n if (type === 'crossField' && !updated[index].crossField) {\r\n updated[index].crossField = {\r\n targetField: '',\r\n operator: 'greater_than',\r\n dataType: 'number',\r\n };\r\n }\r\n\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del valore della regola.\r\n * @param index - Indice della regola\r\n * @param value - Nuovo valore\r\n */\r\n onValueChange(index: number, value: any): void {\r\n const updated = this.cloneValidations();\r\n updated[index] = { ...updated[index], value };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del messaggio di errore.\r\n * @param index - Indice della regola\r\n * @param message - Nuovo messaggio\r\n */\r\n onMessageChange(index: number, message: string): void {\r\n const updated = this.cloneValidations();\r\n updated[index] = { ...updated[index], message };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del campo target nella configurazione cross-field.\r\n * @param index - Indice della regola\r\n * @param targetField - Nuova chiave del campo target\r\n */\r\n onCrossFieldTargetChange(index: number, targetField: string): void {\r\n const updated = this.cloneValidations();\r\n updated[index] = {\r\n ...updated[index],\r\n crossField: {\r\n ...updated[index].crossField!,\r\n targetField,\r\n },\r\n };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio dell'operatore nella configurazione cross-field.\r\n * @param index - Indice della regola\r\n * @param operator - Nuovo operatore\r\n */\r\n onCrossFieldOperatorChange(index: number, operator: UiCrossFieldOperator): void {\r\n const updated = this.cloneValidations();\r\n updated[index] = {\r\n ...updated[index],\r\n crossField: {\r\n ...updated[index].crossField!,\r\n operator,\r\n },\r\n };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del tipo di dato nella configurazione cross-field.\r\n * @param index - Indice della regola\r\n * @param dataType - Nuovo tipo di dato ('date' | 'number')\r\n */\r\n onCrossFieldDataTypeChange(index: number, dataType: 'date' | 'number'): void {\r\n const updated = this.cloneValidations();\r\n updated[index] = {\r\n ...updated[index],\r\n crossField: {\r\n ...updated[index].crossField!,\r\n dataType,\r\n },\r\n };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Clona l'array delle validazioni per garantire immutabilita.\r\n * @returns Copia superficiale dell'array di validazioni\r\n */\r\n private cloneValidations(): UiValidationRule[] {\r\n return this.validations.map((v) => ({ ...v }));\r\n }\r\n\r\n /**\r\n * Emette l'evento di cambio validazioni.\r\n * @param validations - Nuova lista di validazioni\r\n */\r\n private emitChange(validations: UiValidationRule[]): void {\r\n this.validations = validations;\r\n this.validationsChange.emit(validations);\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder-editor\r\n * Componente editor delle opzioni per campi di tipo select, radio e multiselect.\r\n *\r\n * Permette di aggiungere, modificare, riordinare e rimuovere le opzioni\r\n * di un campo di scelta, con supporto per valore, etichetta e stato disabilitato.\r\n */\r\n\r\nimport { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\n\r\nimport { UiButtonComponent } from '../../../button/index';\r\nimport { UiFieldOption } from '../../../form-builder/types/index';\r\n\r\n/**\r\n * Editor per le opzioni di un campo di scelta (select, radio, multiselect).\r\n *\r\n * Mostra una lista di opzioni con:\r\n * - Header con titolo e pulsante per aggiungere nuove opzioni\r\n * - Per ogni opzione: input valore, input etichetta, checkbox disabilitato,\r\n * frecce per spostamento su/giu, pulsante elimina\r\n * - Stato vuoto quando non ci sono opzioni configurate\r\n */\r\n@Component({\r\n selector: 'ui-options-editor',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n FormsModule,\r\n MatCardModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatCheckboxModule,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n UiButtonComponent,\r\n ],\r\n template: `\r\n <mat-card class=\"options-card\">\r\n <!-- Header -->\r\n <div class=\"options-header\">\r\n <span class=\"options-header__title\">\r\n <lucide-icon name=\"list\" [size]=\"16\" />\r\n Opzioni del Campo\r\n </span>\r\n <ui-button\r\n icon=\"plus\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n ariaLabel=\"Aggiungi opzione\"\r\n tooltip=\"Aggiungi opzione\"\r\n (click)=\"addOption()\"\r\n />\r\n </div>\r\n\r\n <!-- Lista opzioni -->\r\n <div class=\"options-list\">\r\n @for (option of normalizedOptions; track $index) {\r\n <div class=\"option-row\">\r\n <!-- Indice opzione -->\r\n <span class=\"option-row__index\">{{ $index + 1 }}</span>\r\n\r\n <!-- Input valore -->\r\n <mat-form-field class=\"option-row__field\" appearance=\"outline\">\r\n <mat-label>Valore</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"option.value\"\r\n (ngModelChange)=\"updateOption($index, 'value', $event)\"\r\n placeholder=\"Valore\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- Input etichetta -->\r\n <mat-form-field class=\"option-row__field\" appearance=\"outline\">\r\n <mat-label>Etichetta</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"option.label\"\r\n (ngModelChange)=\"updateOption($index, 'label', $event)\"\r\n placeholder=\"Etichetta\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- Checkbox disabilitato -->\r\n <mat-checkbox\r\n [checked]=\"!!option.disabled\"\r\n (change)=\"updateOption($index, 'disabled', $event.checked)\"\r\n matTooltip=\"Opzione disabilitata\"\r\n class=\"option-row__checkbox\"\r\n >\r\n <span class=\"option-row__checkbox-label\">Disab.</span>\r\n </mat-checkbox>\r\n\r\n <!-- Azioni di riordino e rimozione -->\r\n <div class=\"option-row__actions\">\r\n <ui-button\r\n icon=\"arrow-up\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n ariaLabel=\"Sposta su\"\r\n tooltip=\"Sposta su\"\r\n [disabled]=\"$index === 0\"\r\n (click)=\"moveOption($index, -1)\"\r\n />\r\n\r\n <ui-button\r\n icon=\"arrow-down\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n ariaLabel=\"Sposta giu\"\r\n tooltip=\"Sposta giu\"\r\n [disabled]=\"$index === normalizedOptions.length - 1\"\r\n (click)=\"moveOption($index, 1)\"\r\n />\r\n\r\n <ui-button\r\n icon=\"trash-2\"\r\n variant=\"warn\"\r\n size=\"xs\"\r\n ariaLabel=\"Elimina opzione\"\r\n tooltip=\"Elimina opzione\"\r\n (click)=\"removeOption($index)\"\r\n />\r\n </div>\r\n </div>\r\n } @empty {\r\n <!-- Stato vuoto -->\r\n <div class=\"options-empty\">\r\n <lucide-icon name=\"inbox\" [size]=\"24\" />\r\n <span>Nessuna opzione configurata</span>\r\n </div>\r\n }\r\n </div>\r\n </mat-card>\r\n `,\r\n styles: [\r\n `\r\n /* ─── Card opzioni ──────────────────────────────────────── */\r\n\r\n :host {\r\n display: block;\r\n }\r\n\r\n .options-card {\r\n border: 1px solid var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n overflow: hidden;\r\n }\r\n\r\n /* ─── Header ────────────────────────────────────────────── */\r\n\r\n .options-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: var(--ui-spacing-3) var(--ui-spacing-4);\r\n background: var(--ui-color-bg-subtle);\r\n border-bottom: 1px solid var(--ui-color-border);\r\n }\r\n\r\n .options-header__title {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2);\r\n font-size: var(--ui-font-size-sm);\r\n font-weight: 600;\r\n color: var(--ui-color-text);\r\n }\r\n\r\n /* ─── Lista opzioni ─────────────────────────────────────── */\r\n\r\n .options-list {\r\n padding: var(--ui-spacing-3);\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ui-spacing-2);\r\n }\r\n\r\n /* ─── Riga opzione ──────────────────────────────────────── */\r\n\r\n .option-row {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2);\r\n padding: var(--ui-spacing-2);\r\n background: var(--ui-color-surface);\r\n border: 1px solid var(--ui-color-border);\r\n border-radius: var(--ui-radius-sm);\r\n transition: border-color var(--ui-transition-fast),\r\n box-shadow var(--ui-transition-fast);\r\n }\r\n\r\n .option-row:hover {\r\n border-color: var(--ui-color-primary);\r\n box-shadow: var(--ui-shadow-sm);\r\n }\r\n\r\n .option-row__index {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 24px;\r\n height: 24px;\r\n border-radius: 50%;\r\n background: var(--ui-color-bg-subtle);\r\n color: var(--ui-color-text-muted);\r\n font-size: var(--ui-font-size-xs);\r\n font-weight: 600;\r\n flex-shrink: 0;\r\n }\r\n\r\n .option-row__field {\r\n flex: 1;\r\n min-width: 0;\r\n }\r\n\r\n /* Riduce l'altezza dei form field inline */\r\n .option-row__field ::ng-deep .mat-mdc-form-field-infix {\r\n padding-top: var(--ui-spacing-1) !important;\r\n padding-bottom: var(--ui-spacing-1) !important;\r\n min-height: unset;\r\n }\r\n\r\n .option-row__field ::ng-deep .mat-mdc-form-field-subscript-wrapper {\r\n display: none;\r\n }\r\n\r\n .option-row__checkbox {\r\n flex-shrink: 0;\r\n }\r\n\r\n .option-row__checkbox-label {\r\n font-size: var(--ui-font-size-xs);\r\n color: var(--ui-color-text-secondary);\r\n }\r\n\r\n .option-row__actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1);\r\n flex-shrink: 0;\r\n }\r\n\r\n /* ─── Stato vuoto ───────────────────────────────────────── */\r\n\r\n .options-empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--ui-spacing-2);\r\n padding: var(--ui-spacing-6) var(--ui-spacing-4);\r\n color: var(--ui-color-text-muted);\r\n font-size: var(--ui-font-size-sm);\r\n }\r\n\r\n `,\r\n ],\r\n})\r\nexport class UiOptionsEditorComponent {\r\n /**\r\n * Opzioni del campo da modificare.\r\n * Accetta sia un array di UiFieldOption che un valore generico\r\n * (per gestire campi non ancora configurati).\r\n */\r\n @Input() options: UiFieldOption[] | any = [];\r\n\r\n /** Emette l'array aggiornato delle opzioni ad ogni modifica. */\r\n @Output() optionsChange = new EventEmitter<UiFieldOption[]>();\r\n\r\n /**\r\n * Normalizza l'input per garantire che sia sempre un array valido.\r\n * Gestisce il caso in cui le opzioni siano null, undefined o di tipo inatteso.\r\n */\r\n get normalizedOptions(): UiFieldOption[] {\r\n if (Array.isArray(this.options)) {\r\n return this.options;\r\n }\r\n return [];\r\n }\r\n\r\n /**\r\n * Aggiunge una nuova opzione vuota alla lista e notifica il parent.\r\n */\r\n addOption(): void {\r\n const newOption: UiFieldOption = {\r\n value: '',\r\n label: '',\r\n disabled: false,\r\n };\r\n const updated = [...this.normalizedOptions, newOption];\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Aggiorna una proprieta specifica di un'opzione.\r\n * @param index - Indice dell'opzione da aggiornare.\r\n * @param field - Nome della proprieta da modificare.\r\n * @param value - Nuovo valore della proprieta.\r\n */\r\n updateOption(index: number, field: keyof UiFieldOption, value: any): void {\r\n const updated = this.normalizedOptions.map((opt, i) => (i === index ? { ...opt, [field]: value } : opt));\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Rimuove un'opzione dalla lista.\r\n * @param index - Indice dell'opzione da rimuovere.\r\n */\r\n removeOption(index: number): void {\r\n const updated = this.normalizedOptions.filter((_, i) => i !== index);\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Sposta un'opzione in alto o in basso nella lista.\r\n * @param index - Indice corrente dell'opzione.\r\n * @param direction - Direzione dello spostamento: -1 (su) o +1 (giu).\r\n */\r\n moveOption(index: number, direction: -1 | 1): void {\r\n const newIndex = index + direction;\r\n if (newIndex < 0 || newIndex >= this.normalizedOptions.length) {\r\n return;\r\n }\r\n const updated = [...this.normalizedOptions];\r\n const [moved] = updated.splice(index, 1);\r\n updated.splice(newIndex, 0, moved);\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Emette l'array aggiornato delle opzioni.\r\n * @param options - Nuovo array di opzioni.\r\n */\r\n private emitChange(options: UiFieldOption[]): void {\r\n this.optionsChange.emit(options);\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiButtonComponent } from '../../../button/index';\r\nimport { UiFieldCondition, UiConditionalOperator } from '../../../form-builder/types/index';\r\nimport { UiEditorAvailableField } from '../../types/editor.types';\r\n\r\n/**\r\n * Interfaccia per le opzioni degli operatori condizionali nella select.\r\n */\r\ninterface OperatorOption {\r\n /** Valore dell'operatore. */\r\n value: UiConditionalOperator;\r\n /** Etichetta visualizzata nella select. */\r\n label: string;\r\n}\r\n\r\n/**\r\n * Editor per le condizioni di visibilita/disabilitazione dei campi.\r\n *\r\n * Permette di configurare condizioni con editor visuale o JSON.\r\n * Supporta operatori di confronto multipli, logica AND/OR\r\n * e selezione dei valori dalle opzioni dei campi disponibili.\r\n *\r\n * @selector ui-condition-editor\r\n */\r\n@Component({\r\n selector: 'ui-condition-editor',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n MatCardModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n LucideAngularModule,\r\n UiButtonComponent,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <!-- Intestazione con titolo, statistiche e controlli -->\r\n <div class=\"ui-condition-editor__header\">\r\n <div class=\"ui-condition-editor__header-left\">\r\n <h4 class=\"ui-condition-editor__title\">{{ title }}</h4>\r\n @if (conditions.length > 0) {\r\n <span class=\"ui-condition-editor__badge\">{{ conditions.length }}</span>\r\n }\r\n </div>\r\n <div class=\"ui-condition-editor__header-actions\">\r\n <!-- Pulsante formattazione JSON (solo in modalita JSON) -->\r\n @if (jsonMode) {\r\n <ui-button\r\n icon=\"braces\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n tooltip=\"Formatta JSON\"\r\n ariaLabel=\"Formatta JSON\"\r\n (click)=\"formatJson()\"\r\n />\r\n }\r\n\r\n <!-- Toggle modalita JSON/visuale -->\r\n <ui-button\r\n [icon]=\"jsonMode ? 'eye' : 'code'\"\r\n [variant]=\"jsonMode ? 'primary' : 'ghost'\"\r\n size=\"xs\"\r\n [tooltip]=\"jsonMode ? 'Editor visuale' : 'Editor JSON'\"\r\n [ariaLabel]=\"jsonMode ? 'Editor visuale' : 'Editor JSON'\"\r\n (click)=\"toggleJsonMode()\"\r\n />\r\n\r\n <!-- Pulsante pulisci tutto -->\r\n @if (conditions.length > 0) {\r\n <ui-button\r\n icon=\"x\"\r\n variant=\"warn\"\r\n size=\"xs\"\r\n tooltip=\"Rimuovi tutte le condizioni\"\r\n ariaLabel=\"Rimuovi tutte le condizioni\"\r\n (click)=\"clearAll()\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Editor JSON -->\r\n @if (jsonMode) {\r\n <div class=\"ui-condition-editor__json\">\r\n <textarea\r\n class=\"ui-condition-editor__json-textarea\"\r\n [ngModel]=\"jsonText\"\r\n (ngModelChange)=\"onJsonChange($event)\"\r\n rows=\"8\"\r\n placeholder='[{ \"field\": \"...\", \"operator\": \"equals\", \"value\": \"...\" }]'\r\n spellcheck=\"false\"\r\n ></textarea>\r\n @if (jsonError) {\r\n <div class=\"ui-condition-editor__json-error\">\r\n <lucide-icon name=\"alert-triangle\" [size]=\"14\" />\r\n <span>{{ jsonError }}</span>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <!-- Editor visuale -->\r\n @if (availableFields.length === 0) {\r\n <div class=\"ui-condition-editor__warning\">\r\n <lucide-icon name=\"alert-triangle\" [size]=\"16\" />\r\n <span>Nessun campo disponibile per le condizioni.</span>\r\n </div>\r\n }\r\n\r\n @if (conditions.length > 0) {\r\n <div class=\"ui-condition-editor__list\">\r\n @for (cond of conditions; track $index) {\r\n <div class=\"ui-condition-editor__condition-wrapper\">\r\n <!-- Selettore logica AND/OR (dal secondo elemento) -->\r\n @if ($index > 0) {\r\n <div class=\"ui-condition-editor__logic-row\">\r\n <ui-button\r\n label=\"AND\"\r\n [variant]=\"(cond.logic || 'AND') === 'AND' ? 'primary' : 'outline'\"\r\n size=\"xs\"\r\n (click)=\"onLogicChange($index, 'AND')\"\r\n />\r\n <ui-button\r\n label=\"OR\"\r\n [variant]=\"cond.logic === 'OR' ? 'primary' : 'outline'\"\r\n size=\"xs\"\r\n (click)=\"onLogicChange($index, 'OR')\"\r\n />\r\n </div>\r\n }\r\n\r\n <mat-card class=\"ui-condition-editor__card\" appearance=\"outlined\">\r\n <mat-card-content>\r\n <div class=\"ui-condition-editor__card-grid\">\r\n <!-- Selezione campo -->\r\n <mat-form-field class=\"ui-condition-editor__field\" appearance=\"outline\">\r\n <mat-label>Campo</mat-label>\r\n <mat-select\r\n [ngModel]=\"cond.field\"\r\n (ngModelChange)=\"onFieldChange($index, $event)\"\r\n >\r\n @for (f of availableFields; track f.key) {\r\n <mat-option [value]=\"f.key\">{{ f.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- Selezione operatore -->\r\n <mat-form-field class=\"ui-condition-editor__field\" appearance=\"outline\">\r\n <mat-label>Operatore</mat-label>\r\n <mat-select\r\n [ngModel]=\"cond.operator\"\r\n (ngModelChange)=\"onOperatorChange($index, $event)\"\r\n >\r\n @for (op of operators; track op.value) {\r\n <mat-option [value]=\"op.value\">{{ op.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- Campo valore (se l'operatore lo richiede) -->\r\n @if (!isNoValueOperator(cond.operator)) {\r\n <!-- Select multipla per in_array/not_in_array con opzioni disponibili -->\r\n @if (isArrayOperator(cond.operator) && getFieldOptions(cond.field).length > 0) {\r\n <mat-form-field class=\"ui-condition-editor__field\" appearance=\"outline\">\r\n <mat-label>Valori</mat-label>\r\n <mat-select\r\n [ngModel]=\"ensureArray(cond.value)\"\r\n (ngModelChange)=\"onValueChange($index, $event)\"\r\n multiple\r\n >\r\n @for (opt of getFieldOptions(cond.field); track opt.value) {\r\n <mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n } @else if (getFieldOptions(cond.field).length > 0 && !isArrayOperator(cond.operator)) {\r\n <!-- Select singola se il campo ha opzioni -->\r\n <mat-form-field class=\"ui-condition-editor__field\" appearance=\"outline\">\r\n <mat-label>Valore</mat-label>\r\n <mat-select\r\n [ngModel]=\"cond.value\"\r\n (ngModelChange)=\"onValueChange($index, $event)\"\r\n >\r\n @for (opt of getFieldOptions(cond.field); track opt.value) {\r\n <mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n } @else {\r\n <!-- Input testo libero -->\r\n <mat-form-field class=\"ui-condition-editor__field\" appearance=\"outline\">\r\n <mat-label>Valore</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"cond.value\"\r\n (ngModelChange)=\"onValueChange($index, $event)\"\r\n placeholder=\"Inserisci valore\"\r\n />\r\n </mat-form-field>\r\n }\r\n }\r\n\r\n <!-- Pulsante rimuovi -->\r\n <ui-button\r\n icon=\"trash-2\"\r\n variant=\"warn\"\r\n size=\"xs\"\r\n tooltip=\"Rimuovi condizione\"\r\n ariaLabel=\"Rimuovi condizione\"\r\n (click)=\"removeCondition($index)\"\r\n />\r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <!-- Stato vuoto (editor visuale) -->\r\n <div class=\"ui-condition-editor__empty\">\r\n <lucide-icon name=\"git-branch\" [size]=\"28\" class=\"ui-condition-editor__empty-icon\" />\r\n <p class=\"ui-condition-editor__empty-text\">Nessuna condizione configurata.</p>\r\n </div>\r\n }\r\n\r\n <!-- Pulsante aggiungi condizione -->\r\n <ui-button\r\n label=\"Aggiungi condizione\"\r\n icon=\"plus\"\r\n variant=\"outline\"\r\n size=\"sm\"\r\n [disabled]=\"availableFields.length === 0\"\r\n (click)=\"addCondition()\"\r\n />\r\n }\r\n `,\r\n styles: [\r\n `\r\n :host {\r\n display: block;\r\n }\r\n\r\n .ui-condition-editor__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: var(--ui-spacing-3);\r\n }\r\n\r\n .ui-condition-editor__header-left {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2);\r\n }\r\n\r\n .ui-condition-editor__title {\r\n margin: 0;\r\n font-size: var(--ui-font-size-sm);\r\n font-weight: 600;\r\n color: var(--ui-color-text);\r\n }\r\n\r\n .ui-condition-editor__badge {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 20px;\r\n height: 20px;\r\n padding: 0 var(--ui-spacing-1);\r\n border-radius: 10px;\r\n background: var(--ui-color-primary);\r\n color: var(--ui-color-surface);\r\n font-size: var(--ui-font-size-xs);\r\n font-weight: 600;\r\n line-height: 1;\r\n }\r\n\r\n .ui-condition-editor__header-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1);\r\n }\r\n\r\n /* --- Editor JSON --- */\r\n\r\n .ui-condition-editor__json {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ui-spacing-2);\r\n }\r\n\r\n .ui-condition-editor__json-textarea {\r\n width: 100%;\r\n min-height: 120px;\r\n padding: var(--ui-spacing-3);\r\n border: 1px solid var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n background: var(--ui-color-bg-subtle);\r\n color: var(--ui-color-text);\r\n font-family: 'Fira Code', 'Consolas', monospace;\r\n font-size: var(--ui-font-size-xs);\r\n line-height: 1.5;\r\n resize: vertical;\r\n box-sizing: border-box;\r\n\r\n &:focus {\r\n outline: none;\r\n border-color: var(--ui-color-primary);\r\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--ui-color-primary) 20%, transparent);\r\n }\r\n }\r\n\r\n .ui-condition-editor__json-error {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1);\r\n padding: var(--ui-spacing-2);\r\n border-radius: var(--ui-radius-sm);\r\n background: color-mix(in srgb, var(--ui-color-warn) 10%, transparent);\r\n color: var(--ui-color-warn);\r\n font-size: var(--ui-font-size-xs);\r\n }\r\n\r\n /* --- Avviso nessun campo disponibile --- */\r\n\r\n .ui-condition-editor__warning {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2);\r\n padding: var(--ui-spacing-3);\r\n margin-bottom: var(--ui-spacing-3);\r\n border-radius: var(--ui-radius-sm);\r\n background: color-mix(in srgb, var(--ui-color-warn) 10%, transparent);\r\n color: var(--ui-color-warn);\r\n font-size: var(--ui-font-size-xs);\r\n }\r\n\r\n /* --- Lista condizioni --- */\r\n\r\n .ui-condition-editor__list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0;\r\n margin-bottom: var(--ui-spacing-3);\r\n }\r\n\r\n .ui-condition-editor__condition-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .ui-condition-editor__logic-row {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--ui-spacing-1);\r\n padding: var(--ui-spacing-2) 0;\r\n }\r\n\r\n .ui-condition-editor__card {\r\n background: var(--ui-color-surface);\r\n border: 1px solid var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n box-shadow: var(--ui-shadow-sm);\r\n }\r\n\r\n .ui-condition-editor__card-grid {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: var(--ui-spacing-2);\r\n flex-wrap: wrap;\r\n }\r\n\r\n .ui-condition-editor__field {\r\n flex: 1;\r\n min-width: 140px;\r\n }\r\n\r\n /* --- Stato vuoto --- */\r\n\r\n .ui-condition-editor__empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--ui-spacing-5) var(--ui-spacing-4);\r\n margin-bottom: var(--ui-spacing-3);\r\n border: 1px dashed var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n background: var(--ui-color-bg-subtle);\r\n text-align: center;\r\n }\r\n\r\n .ui-condition-editor__empty-icon {\r\n color: var(--ui-color-text-muted);\r\n margin-bottom: var(--ui-spacing-2);\r\n }\r\n\r\n .ui-condition-editor__empty-text {\r\n margin: 0;\r\n font-size: var(--ui-font-size-sm);\r\n color: var(--ui-color-text-secondary);\r\n }\r\n\r\n `,\r\n ],\r\n})\r\nexport class UiConditionEditorComponent {\r\n /** Lista delle condizioni da editare. */\r\n @Input() conditions: UiFieldCondition[] = [];\r\n\r\n /** Titolo visualizzato nell'intestazione. */\r\n @Input() title = 'Condizioni';\r\n\r\n /** Campi disponibili per la selezione nelle condizioni. */\r\n @Input() availableFields: UiEditorAvailableField[] = [];\r\n\r\n /** Emesso quando la lista di condizioni viene modificata. */\r\n @Output() conditionsChange = new EventEmitter<UiFieldCondition[]>();\r\n\r\n /** Indica se l'editor e in modalita JSON. */\r\n jsonMode = false;\r\n\r\n /** Testo JSON corrente nell'editor. */\r\n jsonText = '';\r\n\r\n /** Errore di parsing del JSON. */\r\n jsonError = '';\r\n\r\n /** Opzioni disponibili per gli operatori condizionali. */\r\n readonly operators: OperatorOption[] = [\r\n { value: 'equals', label: 'Uguale a' },\r\n { value: 'not_equals', label: 'Diverso da' },\r\n { value: 'contains', label: 'Contiene' },\r\n { value: 'not_contains', label: 'Non contiene' },\r\n { value: 'greater_than', label: 'Maggiore di' },\r\n { value: 'less_than', label: 'Minore di' },\r\n { value: 'greater_equal', label: 'Maggiore o uguale' },\r\n { value: 'less_equal', label: 'Minore o uguale' },\r\n { value: 'is_empty', label: 'Vuoto' },\r\n { value: 'is_not_empty', label: 'Non vuoto' },\r\n { value: 'in_array', label: 'Presente in lista' },\r\n { value: 'not_in_array', label: 'Non presente in lista' },\r\n ];\r\n\r\n /**\r\n * Verifica se l'operatore non richiede un campo valore.\r\n * @param operator - Operatore da verificare\r\n * @returns true se l'operatore non necessita di valore\r\n */\r\n isNoValueOperator(operator: UiConditionalOperator): boolean {\r\n return operator === 'is_empty' || operator === 'is_not_empty';\r\n }\r\n\r\n /**\r\n * Verifica se l'operatore opera su array di valori.\r\n * @param operator - Operatore da verificare\r\n * @returns true se l'operatore richiede un array di valori\r\n */\r\n isArrayOperator(operator: UiConditionalOperator): boolean {\r\n return operator === 'in_array' || operator === 'not_in_array';\r\n }\r\n\r\n /**\r\n * Restituisce le opzioni disponibili per un campo specifico.\r\n * @param fieldKey - Chiave del campo\r\n * @returns Array di opzioni del campo, vuoto se non disponibili\r\n */\r\n getFieldOptions(fieldKey: string): { value: any; label: string }[] {\r\n const field = this.availableFields.find((f) => f.key === fieldKey);\r\n return field?.options || [];\r\n }\r\n\r\n /**\r\n * Garantisce che il valore sia un array (per select multiple).\r\n * @param value - Valore da normalizzare\r\n * @returns Il valore come array\r\n */\r\n ensureArray(value: any): any[] {\r\n if (Array.isArray(value)) return value;\r\n if (value == null || value === '') return [];\r\n return [value];\r\n }\r\n\r\n /**\r\n * Attiva/disattiva la modalita editor JSON.\r\n * In apertura serializza le condizioni, in chiusura le deserializza.\r\n */\r\n toggleJsonMode(): void {\r\n if (!this.jsonMode) {\r\n // Passa a modalita JSON: serializza condizioni\r\n this.jsonText = this.conditions.length > 0 ? JSON.stringify(this.conditions, null, 2) : '[]';\r\n this.jsonError = '';\r\n } else {\r\n // Torna a modalita visuale: prova a parsare il JSON\r\n this.applyJson();\r\n }\r\n this.jsonMode = !this.jsonMode;\r\n }\r\n\r\n /**\r\n * Formatta il JSON nell'editor con indentazione.\r\n */\r\n formatJson(): void {\r\n try {\r\n const parsed = JSON.parse(this.jsonText);\r\n this.jsonText = JSON.stringify(parsed, null, 2);\r\n this.jsonError = '';\r\n } catch {\r\n this.jsonError = 'JSON non valido: impossibile formattare.';\r\n }\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del testo JSON nell'editor.\r\n * Tenta il parsing e aggiorna le condizioni se valido.\r\n * @param text - Testo JSON inserito dall'utente\r\n */\r\n onJsonChange(text: string): void {\r\n this.jsonText = text;\r\n this.applyJson();\r\n }\r\n\r\n /**\r\n * Aggiunge una nuova condizione con valori predefiniti.\r\n */\r\n addCondition(): void {\r\n const firstField = this.availableFields.length > 0 ? this.availableFields[0].key : '';\r\n const newCondition: UiFieldCondition = {\r\n field: firstField,\r\n operator: 'equals',\r\n value: '',\r\n };\r\n const updated = [...this.conditions, newCondition];\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Rimuove la condizione all'indice specificato.\r\n * @param index - Indice della condizione da rimuovere\r\n */\r\n removeCondition(index: number): void {\r\n const updated = this.conditions.filter((_, i) => i !== index);\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Rimuove tutte le condizioni.\r\n */\r\n clearAll(): void {\r\n this.emitChange([]);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio della logica di combinazione (AND/OR).\r\n * @param index - Indice della condizione\r\n * @param logic - Nuova logica ('AND' | 'OR')\r\n */\r\n onLogicChange(index: number, logic: 'AND' | 'OR'): void {\r\n const updated = this.cloneConditions();\r\n updated[index] = { ...updated[index], logic };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del campo selezionato in una condizione.\r\n * Resetta il valore quando il campo cambia.\r\n * @param index - Indice della condizione\r\n * @param field - Nuova chiave campo\r\n */\r\n onFieldChange(index: number, field: string): void {\r\n const updated = this.cloneConditions();\r\n updated[index] = { ...updated[index], field, value: '' };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio dell'operatore in una condizione.\r\n * Resetta il valore per operatori senza valore.\r\n * @param index - Indice della condizione\r\n * @param operator - Nuovo operatore\r\n */\r\n onOperatorChange(index: number, operator: UiConditionalOperator): void {\r\n const updated = this.cloneConditions();\r\n const condition = { ...updated[index], operator };\r\n\r\n // Resetta il valore per operatori che non lo richiedono\r\n if (this.isNoValueOperator(operator)) {\r\n condition.value = undefined;\r\n } else if (this.isArrayOperator(operator) && !Array.isArray(condition.value)) {\r\n // Converti a array per operatori su array\r\n condition.value = condition.value ? [condition.value] : [];\r\n }\r\n\r\n updated[index] = condition;\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del valore in una condizione.\r\n * @param index - Indice della condizione\r\n * @param value - Nuovo valore\r\n */\r\n onValueChange(index: number, value: any): void {\r\n const updated = this.cloneConditions();\r\n updated[index] = { ...updated[index], value };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Tenta di applicare il JSON corrente come array di condizioni.\r\n * Aggiorna l'errore in caso di JSON non valido.\r\n */\r\n private applyJson(): void {\r\n try {\r\n const parsed = JSON.parse(this.jsonText);\r\n if (!Array.isArray(parsed)) {\r\n this.jsonError = 'Il JSON deve essere un array di condizioni.';\r\n return;\r\n }\r\n this.jsonError = '';\r\n this.emitChange(parsed);\r\n } catch {\r\n this.jsonError = 'JSON non valido: controlla la sintassi.';\r\n }\r\n }\r\n\r\n /**\r\n * Clona l'array delle condizioni per garantire immutabilita.\r\n * @returns Copia superficiale dell'array di condizioni\r\n */\r\n private cloneConditions(): UiFieldCondition[] {\r\n return this.conditions.map((c) => ({ ...c }));\r\n }\r\n\r\n /**\r\n * Emette l'evento di cambio condizioni.\r\n * @param conditions - Nuova lista di condizioni\r\n */\r\n private emitChange(conditions: UiFieldCondition[]): void {\r\n this.conditions = conditions;\r\n this.conditionsChange.emit(conditions);\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n inject,\r\n} from '@angular/core';\r\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { Subject } from 'rxjs';\r\nimport { debounceTime, takeUntil } from 'rxjs/operators';\r\n\r\nimport { UiFormFieldDescriptor, UiFieldType } from '../../../form-builder/types/index';\r\nimport { UiEditorAvailableField } from '../../types/editor.types';\r\nimport { UiValidationEditorComponent } from '../validation-editor/validation-editor.component';\r\nimport { UiOptionsEditorComponent } from '../options-editor/options-editor.component';\r\nimport { UiConditionEditorComponent } from '../condition-editor/condition-editor.component';\r\n\r\n/**\r\n * Tutti i tipi di campo supportati dal form builder.\r\n * Utilizzati per popolare la select del tipo nella configurazione campo.\r\n */\r\nconst FIELD_TYPES: { value: UiFieldType; label: string }[] = [\r\n { value: 'text', label: 'Testo' },\r\n { value: 'email', label: 'Email' },\r\n { value: 'password', label: 'Password' },\r\n { value: 'number', label: 'Numero' },\r\n { value: 'textarea', label: 'Area di testo' },\r\n { value: 'select', label: 'Select' },\r\n { value: 'multiselect', label: 'Multiselect' },\r\n { value: 'freemultiselect', label: 'Multiselect libero' },\r\n { value: 'checkbox', label: 'Checkbox' },\r\n { value: 'switch', label: 'Switch' },\r\n { value: 'radio', label: 'Radio' },\r\n { value: 'date', label: 'Data' },\r\n { value: 'datetime', label: 'Data e ora' },\r\n { value: 'file', label: 'File' },\r\n { value: 'custom', label: 'Custom' },\r\n { value: 'divider', label: 'Separatore' },\r\n { value: 'flag', label: 'Flag' },\r\n { value: 'location', label: 'Location' },\r\n { value: 'location-table', label: 'Location Table' },\r\n];\r\n\r\n/**\r\n * Tipi di campo che supportano la configurazione delle opzioni.\r\n * Per questi tipi viene mostrato il pannello opzioni nell'editor.\r\n */\r\nconst OPTIONS_FIELD_TYPES: UiFieldType[] = ['select', 'multiselect', 'freemultiselect', 'radio'];\r\n\r\n/**\r\n * Pannello laterale destro per la configurazione di un campo selezionato.\r\n *\r\n * Mostra un form reattivo suddiviso in pannelli espandibili per gestire\r\n * proprieta base, stato, layout, validazioni, opzioni e condizioni.\r\n * Emette aggiornamenti parziali con debounce di 300ms.\r\n *\r\n * @selector ui-editor-field-config-panel\r\n */\r\n@Component({\r\n selector: 'ui-editor-field-config-panel',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatCheckboxModule,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n UiValidationEditorComponent,\r\n UiOptionsEditorComponent,\r\n UiConditionEditorComponent,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"field-config-panel\">\r\n <!-- Intestazione del pannello -->\r\n <div class=\"field-config-panel__header\">\r\n <lucide-icon name=\"settings\" [size]=\"18\" aria-hidden=\"true\" />\r\n <span class=\"field-config-panel__title\">Configurazione Campo</span>\r\n </div>\r\n\r\n <!-- Stato vuoto: nessun campo selezionato -->\r\n @if (!field) {\r\n <div class=\"field-config-panel__empty\">\r\n <lucide-icon name=\"mouse-pointer-click\" [size]=\"32\" aria-hidden=\"true\" />\r\n <p class=\"field-config-panel__empty-text\">\r\n Seleziona un campo per configurarlo\r\n </p>\r\n </div>\r\n }\r\n\r\n <!-- Form di configurazione del campo -->\r\n @if (field && configForm) {\r\n <div class=\"field-config-panel__content\">\r\n <mat-accordion multi>\r\n\r\n <!-- Pannello 1: Proprieta base -->\r\n <mat-expansion-panel [expanded]=\"true\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon name=\"file-text\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>Proprieta base</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <div class=\"field-config-panel__fields\" [formGroup]=\"configForm\">\r\n <!-- Chiave univoca -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Chiave (key)</mat-label>\r\n <input matInput formControlName=\"key\" placeholder=\"campo_univoco\" />\r\n <mat-hint>Identificativo univoco del campo</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- Tipo di campo -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Tipo</mat-label>\r\n <mat-select formControlName=\"type\">\r\n @for (ft of fieldTypes; track ft.value) {\r\n <mat-option [value]=\"ft.value\">{{ ft.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- Label visualizzata -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Label</mat-label>\r\n <input matInput formControlName=\"label\" placeholder=\"Etichetta del campo\" />\r\n </mat-form-field>\r\n\r\n <!-- Placeholder -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Placeholder</mat-label>\r\n <input matInput formControlName=\"placeholder\" placeholder=\"Testo segnaposto\" />\r\n </mat-form-field>\r\n\r\n <!-- Tooltip -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Tooltip</mat-label>\r\n <input matInput formControlName=\"tooltip\" placeholder=\"Testo di aiuto\" />\r\n </mat-form-field>\r\n\r\n <!-- Valore di default -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Valore di default</mat-label>\r\n <input matInput formControlName=\"defaultValue\" placeholder=\"Valore iniziale\" />\r\n </mat-form-field>\r\n </div>\r\n </mat-expansion-panel>\r\n\r\n <!-- Pannello 2: Stato del campo -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon name=\"toggle-left\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>Stato campo</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <div class=\"field-config-panel__fields\" [formGroup]=\"configForm\">\r\n <mat-checkbox formControlName=\"required\" color=\"primary\">\r\n Obbligatorio\r\n </mat-checkbox>\r\n\r\n <mat-checkbox formControlName=\"disabled\" color=\"primary\">\r\n Disabilitato\r\n </mat-checkbox>\r\n\r\n <mat-checkbox formControlName=\"readonly\" color=\"primary\">\r\n Sola lettura\r\n </mat-checkbox>\r\n\r\n @if (isOptionsField) {\r\n <mat-checkbox formControlName=\"hideEmptyOption\" color=\"primary\">\r\n Nascondi opzione vuota\r\n </mat-checkbox>\r\n }\r\n </div>\r\n </mat-expansion-panel>\r\n\r\n <!-- Pannello 3: Layout -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon name=\"layout-grid\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>Layout</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <div class=\"field-config-panel__fields\" [formGroup]=\"configForm\">\r\n <!-- Colonne -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Colonne (1-12)</mat-label>\r\n <input matInput type=\"number\" formControlName=\"columns\" min=\"1\" max=\"12\" />\r\n <mat-hint>Numero di colonne nel grid</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- Ordine -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Ordine</mat-label>\r\n <input matInput type=\"number\" formControlName=\"order\" />\r\n <mat-hint>Posizione nel grid</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n </mat-expansion-panel>\r\n\r\n <!-- Pannello 4: Validazioni -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon name=\"shield-check\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>Validazioni</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ui-validation-editor\r\n [validations]=\"field.validation || []\"\r\n (validationsChange)=\"onValidationsChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n\r\n <!-- Pannello 5: Opzioni (solo per campi con opzioni) -->\r\n @if (isOptionsField) {\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon name=\"list\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>Opzioni</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ui-options-editor\r\n [options]=\"getFieldOptions()\"\r\n (optionsChange)=\"onOptionsChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n }\r\n\r\n <!-- Pannello 6: Condizioni di visibilita -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon name=\"eye\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>Condizioni di visibilita</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ui-condition-editor\r\n [conditions]=\"field.conditions || []\"\r\n [availableFields]=\"availableFields\"\r\n (conditionsChange)=\"onVisibilityConditionsChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n\r\n <!-- Pannello 7: Condizioni di disabilitazione -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon name=\"ban\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>Condizioni di disabilitazione</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ui-condition-editor\r\n [conditions]=\"field.disableConditions || []\"\r\n [availableFields]=\"availableFields\"\r\n (conditionsChange)=\"onDisableConditionsChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n\r\n </mat-accordion>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n /* Contenitore principale del pannello di configurazione */\r\n .field-config-panel {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n background: var(--ui-color-surface, #fff);\r\n border-left: 1px solid var(--ui-color-border, #e0e0e0);\r\n overflow-y: auto;\r\n }\r\n\r\n /* Intestazione del pannello */\r\n .field-config-panel__header {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n padding: var(--ui-spacing-3, 12px) var(--ui-spacing-4, 16px);\r\n border-bottom: 1px solid var(--ui-color-border, #e0e0e0);\r\n background: var(--ui-color-bg-subtle, #fafafa);\r\n }\r\n\r\n .field-config-panel__title {\r\n font-weight: 600;\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n color: var(--ui-color-text, #212121);\r\n }\r\n\r\n /* Stato vuoto: nessun campo selezionato */\r\n .field-config-panel__empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--ui-spacing-3, 12px);\r\n padding: var(--ui-spacing-8, 64px) var(--ui-spacing-4, 16px);\r\n text-align: center;\r\n color: var(--ui-color-text-muted, #9e9e9e);\r\n }\r\n\r\n .field-config-panel__empty-text {\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n margin: 0;\r\n }\r\n\r\n /* Contenuto scrollabile */\r\n .field-config-panel__content {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: var(--ui-spacing-2, 8px);\r\n }\r\n\r\n /* Gruppo di campi dentro un pannello */\r\n .field-config-panel__fields {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ui-spacing-2, 8px);\r\n padding: var(--ui-spacing-1, 4px) 0;\r\n }\r\n\r\n /* Singolo campo del form di configurazione */\r\n .field-config-panel__field {\r\n width: 100%;\r\n }\r\n\r\n /* Stili per i titoli dei pannelli espandibili */\r\n mat-panel-title {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n font-weight: 500;\r\n color: var(--ui-color-text, #212121);\r\n }\r\n\r\n /* Checkbox con margine superiore */\r\n mat-checkbox {\r\n margin: var(--ui-spacing-1, 4px) 0;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiEditorFieldConfigPanelComponent implements OnChanges, OnDestroy {\r\n /** @internal Servizio per la costruzione del FormGroup. */\r\n private readonly fb = inject(FormBuilder);\r\n\r\n /** @internal Subject per la distruzione e pulizia delle sottoscrizioni. */\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n /** Campo attualmente selezionato per la configurazione. */\r\n @Input() field: UiFormFieldDescriptor | null = null;\r\n\r\n /** Lista dei campi disponibili per le condizioni. */\r\n @Input() availableFields: UiEditorAvailableField[] = [];\r\n\r\n /** Emesso quando il campo viene aggiornato dall'utente. */\r\n @Output() fieldUpdate = new EventEmitter<Partial<UiFormFieldDescriptor>>();\r\n\r\n /** Form reattivo per la configurazione del campo. */\r\n configForm: FormGroup | null = null;\r\n\r\n /** Lista dei tipi di campo per la select. */\r\n readonly fieldTypes = FIELD_TYPES;\r\n\r\n /**\r\n * Indica se il campo selezionato supporta le opzioni.\r\n * Viene utilizzato per mostrare/nascondere il pannello opzioni.\r\n */\r\n get isOptionsField(): boolean {\r\n if (!this.field) return false;\r\n return OPTIONS_FIELD_TYPES.includes(this.field.type);\r\n }\r\n\r\n /**\r\n * Rileva cambiamenti sugli input e ricostruisce il form\r\n * quando cambia il campo selezionato.\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['field']) {\r\n this.buildForm();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * Restituisce le opzioni del campo come array statico.\r\n * Ignora opzioni osservabili poiche non gestibili nell'editor.\r\n */\r\n getFieldOptions(): { value: any; label: string }[] {\r\n if (!this.field?.options || !Array.isArray(this.field.options)) return [];\r\n return this.field.options.map((o) => ({ value: o.value, label: o.label }));\r\n }\r\n\r\n /**\r\n * Gestisce l'aggiornamento delle validazioni dal sotto-componente.\r\n * @param validations - Nuova lista di regole di validazione\r\n */\r\n onValidationsChange(validations: any[]): void {\r\n this.fieldUpdate.emit({ validation: validations });\r\n }\r\n\r\n /**\r\n * Gestisce l'aggiornamento delle opzioni dal sotto-componente.\r\n * @param options - Nuova lista di opzioni\r\n */\r\n onOptionsChange(options: { value: any; label: string }[]): void {\r\n this.fieldUpdate.emit({ options });\r\n }\r\n\r\n /**\r\n * Gestisce l'aggiornamento delle condizioni di visibilita.\r\n * @param conditions - Nuova lista di condizioni\r\n */\r\n onVisibilityConditionsChange(conditions: any[]): void {\r\n this.fieldUpdate.emit({ conditions });\r\n }\r\n\r\n /**\r\n * Gestisce l'aggiornamento delle condizioni di disabilitazione.\r\n * @param conditions - Nuova lista di condizioni\r\n */\r\n onDisableConditionsChange(conditions: any[]): void {\r\n this.fieldUpdate.emit({ disableConditions: conditions });\r\n }\r\n\r\n /**\r\n * @internal\r\n * Costruisce il FormGroup a partire dal campo selezionato.\r\n * Si sottoscrive ai valueChanges con debounce per emettere aggiornamenti.\r\n */\r\n private buildForm(): void {\r\n this.destroy$.next();\r\n\r\n if (!this.field) {\r\n this.configForm = null;\r\n return;\r\n }\r\n\r\n this.configForm = this.fb.group({\r\n key: [this.field.key],\r\n type: [this.field.type],\r\n label: [this.field.label],\r\n placeholder: [this.field.placeholder || ''],\r\n tooltip: [this.field.tooltip || ''],\r\n defaultValue: [this.field.defaultValue ?? ''],\r\n required: [this.field.required || false],\r\n disabled: [this.field.disabled || false],\r\n readonly: [this.field.readonly || false],\r\n hideEmptyOption: [this.field.hideEmptyOption || false],\r\n columns: [this.field.layout?.columns ?? null],\r\n order: [this.field.layout?.order ?? null],\r\n });\r\n\r\n this.configForm.valueChanges.pipe(debounceTime(300), takeUntil(this.destroy$)).subscribe((values) => {\r\n /** Mappa i valori del form nel formato di aggiornamento parziale del campo */\r\n const update: Partial<UiFormFieldDescriptor> = {\r\n key: values.key,\r\n type: values.type,\r\n label: values.label,\r\n placeholder: values.placeholder || undefined,\r\n tooltip: values.tooltip || undefined,\r\n defaultValue: values.defaultValue || undefined,\r\n required: values.required,\r\n disabled: values.disabled,\r\n readonly: values.readonly,\r\n hideEmptyOption: values.hideEmptyOption,\r\n layout: {\r\n columns: values.columns ?? undefined,\r\n order: values.order ?? undefined,\r\n },\r\n };\r\n this.fieldUpdate.emit(update);\r\n });\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n ViewEncapsulation,\r\n DoCheck,\r\n TemplateRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiAccordionDescriptor, UiAccordionToggleEvent, UiAccordionMode } from './accordion.types';\r\n\r\n/**\r\n * Accordion configurabile, data-driven, con supporto multi/single expand,\r\n * animazioni CSS, icone Lucide e template personalizzabili.\r\n *\r\n * Il contenuto dei pannelli viene fornito tramite un `itemTemplate`\r\n * che riceve il descriptor del pannello come contesto.\r\n *\r\n * @selector ui-accordion\r\n *\r\n * @example\r\n * ```html\r\n * <ui-accordion\r\n * [items]=\"sections\"\r\n * [itemTemplate]=\"panelTpl\"\r\n * mode=\"single\"\r\n * >\r\n * <ng-template #panelTpl let-item>\r\n * @switch (item.id) {\r\n * @case ('info') { <app-info-panel /> }\r\n * @case ('address') { <app-address-form /> }\r\n * }\r\n * </ng-template>\r\n * </ui-accordion>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * sections: UiAccordionDescriptor[] = [\r\n * { id: 'info', title: 'Informazioni', icon: 'info', expanded: true },\r\n * { id: 'address', title: 'Indirizzo', icon: 'map-pin' },\r\n * ];\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-accordion',\r\n standalone: true,\r\n imports: [NgTemplateOutlet, LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: { class: 'ui-accordion-host' },\r\n template: `\r\n @for (item of visibleItems; track item.id) {\r\n <div\r\n [class]=\"getPanelClasses(item)\"\r\n [id]=\"'ui-accordion-' + item.id\"\r\n >\r\n <!-- Header: div wrapper per ospitare trigger + azioni + chevron -->\r\n <div\r\n class=\"ui-accordion__header\"\r\n [class.ui-accordion__header--expanded]=\"item.expanded\"\r\n [class.ui-accordion__header--disabled]=\"item.disabled\"\r\n (click)=\"!item.disabled && toggle(item)\"\r\n >\r\n <button\r\n class=\"ui-accordion__trigger\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-expanded]=\"item.expanded\"\r\n [attr.aria-controls]=\"'ui-accordion-body-' + item.id\"\r\n [attr.id]=\"'ui-accordion-header-' + item.id\"\r\n type=\"button\"\r\n (keydown.home)=\"focusFirst($event)\"\r\n (keydown.end)=\"focusLast($event)\"\r\n >\r\n <div class=\"ui-accordion__header-content\">\r\n @if (item.icon) {\r\n <lucide-icon\r\n class=\"ui-accordion__icon\"\r\n [name]=\"item.icon\"\r\n [size]=\"18\"\r\n aria-hidden=\"true\"\r\n />\r\n }\r\n <span class=\"ui-accordion__title\">{{ item.title }}</span>\r\n @if (item.subtitle) {\r\n <span class=\"ui-accordion__subtitle\">{{ item.subtitle }}</span>\r\n }\r\n </div>\r\n\r\n @if (headerTemplate) {\r\n <div class=\"ui-accordion__header-extra\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"headerTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\r\n />\r\n </div>\r\n }\r\n </button>\r\n\r\n @if (actionsTemplate) {\r\n <div\r\n class=\"ui-accordion__actions\"\r\n role=\"group\"\r\n aria-label=\"Azioni pannello\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"actionsTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\r\n />\r\n </div>\r\n }\r\n\r\n <lucide-icon\r\n class=\"ui-accordion__chevron\"\r\n [class.ui-accordion__chevron--rotated]=\"item.expanded\"\r\n name=\"chevron-down\"\r\n [size]=\"16\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n\r\n <!-- Body (animazione CSS grid) -->\r\n <div\r\n class=\"ui-accordion__body-wrapper\"\r\n [class.ui-accordion__body-wrapper--open]=\"item.expanded\"\r\n role=\"region\"\r\n [attr.id]=\"'ui-accordion-body-' + item.id\"\r\n [attr.aria-labelledby]=\"'ui-accordion-header-' + item.id\"\r\n >\r\n <div class=\"ui-accordion__body\">\r\n @if (item.expanded && itemTemplate) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"itemTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n `,\r\n styleUrl: './accordion.component.scss',\r\n})\r\nexport class UiAccordionComponent implements DoCheck {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n /**\r\n * Fingerprint dell'ultimo stato dei descriptor.\r\n * Usato da DoCheck per rilevare mutazioni in-place sulle proprieta\r\n * degli item senza richiedere un nuovo riferimento dell'array.\r\n */\r\n private _lastFingerprint = '';\r\n\r\n /**\r\n * Array di descriptor dei pannelli.\r\n * Pannelli con `hidden: true` vengono filtrati automaticamente.\r\n *\r\n * Supporta sia aggiornamenti immutabili (nuovo array) sia\r\n * mutazioni in-place delle proprieta dei descriptor.\r\n */\r\n @Input() items: UiAccordionDescriptor[] = [];\r\n\r\n /**\r\n * Template per il contenuto di ogni pannello.\r\n * Il contesto fornisce il descriptor come `$implicit`.\r\n *\r\n * @example\r\n * ```html\r\n * <ng-template #tpl let-item>\r\n * <p>Contenuto per: {{ item.title }}</p>\r\n * </ng-template>\r\n * ```\r\n */\r\n @Input() itemTemplate: TemplateRef<unknown> | null = null;\r\n\r\n /**\r\n * Template opzionale per contenuto aggiuntivo nell'header.\r\n * Il contesto fornisce il descriptor come `$implicit`.\r\n * Viene renderizzato all'interno del trigger, tra il titolo e il chevron.\r\n */\r\n @Input() headerTemplate: TemplateRef<unknown> | null = null;\r\n\r\n /**\r\n * Template opzionale per azioni nell'header del pannello.\r\n * Posizionato tra il trigger e il chevron, al di fuori del button\r\n * per consentire elementi interattivi (es. pulsanti duplica/elimina).\r\n * Il contesto fornisce il descriptor come `$implicit`.\r\n */\r\n @Input() actionsTemplate: TemplateRef<unknown> | null = null;\r\n\r\n /**\r\n * Modalita di espansione.\r\n * - `multi`: piu pannelli aperti contemporaneamente\r\n * - `single`: un solo pannello aperto alla volta\r\n */\r\n @Input() mode: UiAccordionMode = 'multi';\r\n\r\n /** Label accessibile per il gruppo accordion. */\r\n @Input() ariaLabel = 'Accordion';\r\n\r\n /** Emesso quando un pannello viene aperto o chiuso. */\r\n @Output() itemToggled = new EventEmitter<UiAccordionToggleEvent>();\r\n\r\n /**\r\n * Rileva mutazioni in-place sulle proprieta dei descriptor.\r\n * Confronta un fingerprint leggero dello stato corrente con quello\r\n * precedente e, se diverso, forza un ciclo di change detection.\r\n *\r\n * Questo permette al consumatore di fare sia:\r\n * - `items[2].hidden = true` (mutazione in-place)\r\n * - `items = [...newItems]` (nuovo riferimento)\r\n */\r\n ngDoCheck(): void {\r\n const fp = this.computeFingerprint();\r\n if (fp !== this._lastFingerprint) {\r\n this._lastFingerprint = fp;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n /** Pannelli visibili (non hidden). */\r\n get visibleItems(): UiAccordionDescriptor[] {\r\n return this.items.filter((i) => !i.hidden);\r\n }\r\n\r\n /** Alterna l'espansione di un pannello. */\r\n toggle(item: UiAccordionDescriptor): void {\r\n if (item.disabled) return;\r\n\r\n const willExpand = !item.expanded;\r\n\r\n // In modalita single, chiudi tutti gli altri\r\n if (willExpand && this.mode === 'single') {\r\n this.items.forEach((i) => {\r\n if (i !== item && i.expanded) {\r\n i.expanded = false;\r\n this.itemToggled.emit({ item: i, expanded: false });\r\n }\r\n });\r\n }\r\n\r\n item.expanded = willExpand;\r\n this.itemToggled.emit({ item, expanded: willExpand });\r\n }\r\n\r\n /** Apre un pannello specifico per id. */\r\n open(id: string): void {\r\n const item = this.items.find((i) => i.id === id);\r\n if (item && !item.expanded && !item.disabled) {\r\n this.toggle(item);\r\n }\r\n }\r\n\r\n /** Chiude un pannello specifico per id. */\r\n close(id: string): void {\r\n const item = this.items.find((i) => i.id === id);\r\n if (item && item.expanded) {\r\n item.expanded = false;\r\n this.itemToggled.emit({ item, expanded: false });\r\n }\r\n }\r\n\r\n /** Apre tutti i pannelli (solo in modalita multi). */\r\n openAll(): void {\r\n if (this.mode === 'single') return;\r\n this.items.forEach((item) => {\r\n if (!item.expanded && !item.disabled && !item.hidden) {\r\n item.expanded = true;\r\n this.itemToggled.emit({ item, expanded: true });\r\n }\r\n });\r\n }\r\n\r\n /** Chiude tutti i pannelli. */\r\n closeAll(): void {\r\n this.items.forEach((item) => {\r\n if (item.expanded) {\r\n item.expanded = false;\r\n this.itemToggled.emit({ item, expanded: false });\r\n }\r\n });\r\n }\r\n\r\n /** @internal Classi CSS per il pannello. */\r\n getPanelClasses(item: UiAccordionDescriptor): string {\r\n return [\r\n 'ui-accordion__panel',\r\n item.expanded ? 'ui-accordion__panel--expanded' : '',\r\n item.disabled ? 'ui-accordion__panel--disabled' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n /** @internal Sposta il focus al primo header. */\r\n focusFirst(event: Event): void {\r\n event.preventDefault();\r\n const headers = this.getHeaders();\r\n headers[0]?.focus();\r\n }\r\n\r\n /** @internal Sposta il focus all'ultimo header. */\r\n focusLast(event: Event): void {\r\n event.preventDefault();\r\n const headers = this.getHeaders();\r\n headers[headers.length - 1]?.focus();\r\n }\r\n\r\n /** @internal Recupera tutti i trigger button del DOM. */\r\n private getHeaders(): HTMLButtonElement[] {\r\n return Array.from(document.querySelectorAll<HTMLButtonElement>('.ui-accordion__trigger:not(:disabled)'));\r\n }\r\n\r\n /**\r\n * @internal Calcola un fingerprint leggero basato sulle proprieta\r\n * reattive dei descriptor (quelle che influenzano il rendering).\r\n */\r\n private computeFingerprint(): string {\r\n return this.items.map((i) => `${i.id}:${i.hidden ?? 0}:${i.disabled ?? 0}:${i.expanded ?? 0}:${i.title}`).join('|');\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/core/logging\r\n * Configurazione IndexedDB per UiLoggerService.\r\n * Pattern omologato a action-logger.config.ts del progetto Siform-PAL.\r\n */\r\n\r\nimport type { UiLogLevel } from './logger.types';\r\n\r\n/** Durata default retention log (7 giorni). */\r\nexport const UI_LOGGER_DEFAULT_TTL_MS = 7 * 24 * 60 * 60 * 1000;\r\n\r\n/** Nome database IndexedDB. */\r\nexport const UI_LOGGER_IDB_NAME = 'ng-ui-system-logs';\r\n\r\n/** Versione database (incrementare su schema change). */\r\nexport const UI_LOGGER_IDB_VERSION = 1;\r\n\r\n/** Nome object store. */\r\nexport const UI_LOGGER_IDB_STORE = 'entries';\r\n\r\n/** Max entry totali per cleanup automatico. */\r\nexport const UI_LOGGER_MAX_ENTRIES = 10000;\r\n\r\n/** Livelli di log ordinati per severità crescente. */\r\nexport const UI_LOGGER_LEVELS: readonly UiLogLevel[] = ['debug', 'info', 'warn', 'error'];\r\n","/**\r\n * @module ng-ui-system/core/logging\r\n * Logger centralizzato con persistenza IndexedDB.\r\n * Pattern omologato a ActionLoggerService del progetto Siform-PAL.\r\n *\r\n * @example\r\n * const logger = inject(UiLoggerService);\r\n * logger.logFormAction('form_submit', { schemaId: 'user-form', values: data });\r\n * logger.logWizardAction('step_change', { from: 0, to: 1 });\r\n */\r\n\r\nimport { inject, Injectable, signal, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\nimport type { UiLogCategory, UiLogEntry, UiLogFilter, UiLogLevel, UiLogSummary, UiLoggerConfig } from './logger.types';\r\nimport {\r\n UI_LOGGER_DEFAULT_TTL_MS,\r\n UI_LOGGER_IDB_NAME,\r\n UI_LOGGER_IDB_STORE,\r\n UI_LOGGER_IDB_VERSION,\r\n UI_LOGGER_MAX_ENTRIES,\r\n UI_LOGGER_LEVELS,\r\n} from './logger.config';\r\n\r\n/**\r\n * Logger centralizzato per componenti ng-ui-system.\r\n * Persiste su IndexedDB con cleanup automatico.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiLoggerService {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private dbPromise: Promise<IDBDatabase> | null = null;\r\n\r\n /** Stato toggle runtime. */\r\n readonly enabled = signal(this.detectEnabled());\r\n\r\n /** Configurazione runtime. */\r\n private config: UiLoggerConfig = {\r\n enabled: this.detectEnabled(),\r\n minLevel: 'debug',\r\n ttlMs: UI_LOGGER_DEFAULT_TTL_MS,\r\n maxEntries: UI_LOGGER_MAX_ENTRIES,\r\n };\r\n\r\n /** True se IndexedDB disponibile e siamo in browser. */\r\n private idbSupported(): boolean {\r\n return isPlatformBrowser(this.platformId) && typeof indexedDB !== 'undefined';\r\n }\r\n\r\n /** Rileva se logging attivo (default: true in dev se non production). */\r\n private detectEnabled(): boolean {\r\n if (!isPlatformBrowser(this.platformId)) return false;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const ng = (window as any).ng;\r\n const isDev = ng && typeof ng.probe === 'function';\r\n return isDev;\r\n }\r\n\r\n /** Abilita/disabilita logging runtime. */\r\n setEnabled(value: boolean): void {\r\n this.enabled.set(value);\r\n this.config.enabled = value;\r\n }\r\n\r\n /** Configura il logger. */\r\n configure(config: Partial<UiLoggerConfig>): void {\r\n this.config = { ...this.config, ...config };\r\n this.enabled.set(this.config.enabled);\r\n }\r\n\r\n // Public API: generic log\r\n\r\n /**\r\n * Log generico con controllo enabled e livello.\r\n */\r\n log(\r\n category: UiLogCategory,\r\n level: UiLogLevel,\r\n action: string,\r\n payload?: Record<string, unknown>,\r\n duration?: number\r\n ): void {\r\n if (!this.enabled()) return;\r\n if (!this.shouldLogLevel(level)) return;\r\n void this.persist(category, level, action, payload, duration);\r\n }\r\n\r\n /**\r\n * Log azione form (submit, reset, valueChange, etc).\r\n */\r\n logFormAction(\r\n action: 'init' | 'submit' | 'reset' | 'valueChange' | 'validationChange' | 'customEvent' | 'destroy',\r\n payload: { schemaId: string;[key: string]: unknown }\r\n ): void {\r\n this.log('form', 'info', action, payload);\r\n }\r\n\r\n /**\r\n * Log azione wizard (stepChange, complete, validationFailed, etc).\r\n */\r\n logWizardAction(\r\n action: 'init' | 'stepChange' | 'stepComplete' | 'stepValidationFailed' | 'complete' | 'navigation' | 'save' | 'valueChange' | 'keyboardNavigation' | 'destroy',\r\n payload: { wizardId?: string; step?: number;[key: string]: unknown }\r\n ): void {\r\n this.log('wizard', 'info', action, payload);\r\n }\r\n\r\n /**\r\n * Log errore.\r\n */\r\n logError(error: Error | unknown, context?: Record<string, unknown>): void {\r\n const payload: Record<string, unknown> = { ...context };\r\n if (error instanceof Error) {\r\n payload['message'] = error.message;\r\n payload['stack'] = error.stack;\r\n } else {\r\n payload['error'] = error;\r\n }\r\n this.log('error', 'error', 'exception', payload);\r\n }\r\n\r\n /**\r\n * Log debug (solo se enabled e minLevel <= debug).\r\n */\r\n debug(category: UiLogCategory, action: string, payload?: Record<string, unknown>): void {\r\n this.log(category, 'debug', action, payload);\r\n }\r\n\r\n // IndexedDB persistence\r\n\r\n private async persist(\r\n category: UiLogCategory,\r\n level: UiLogLevel,\r\n action: string,\r\n payload?: Record<string, unknown>,\r\n duration?: number\r\n ): Promise<void> {\r\n if (!this.idbSupported()) return;\r\n\r\n const entry: UiLogEntry = {\r\n id: `${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,\r\n category,\r\n level,\r\n action,\r\n payload,\r\n timestamp: Date.now(),\r\n duration,\r\n url: typeof window !== 'undefined' ? window.location.href : '',\r\n userId: this.getUserId(),\r\n };\r\n\r\n try {\r\n const db = await this.openDb();\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readwrite');\r\n tx.objectStore(UI_LOGGER_IDB_STORE).put(entry, entry.id);\r\n\r\n // Debug visibile in dev mode\r\n // eslint-disable-next-line no-console\r\n if (this.enabled()) {\r\n // eslint-disable-next-line no-console\r\n console.log(`[UiLogger] ${entry.category}:${entry.action}`, entry.payload ?? '');\r\n }\r\n\r\n // Cleanup asincrono senza bloccare\r\n void this.cleanupIfNeeded(db);\r\n } catch (e) {\r\n // Silent fail: logging non deve rompere l'app\r\n // eslint-disable-next-line no-console\r\n console.warn('[UiLogger] Persist failed:', e);\r\n }\r\n }\r\n\r\n /** Recupera userId da localStorage se disponibile. */\r\n private getUserId(): string | undefined {\r\n if (typeof localStorage === 'undefined') return undefined;\r\n return localStorage.getItem('exLogin') ?? undefined;\r\n }\r\n\r\n /** Verifica se il livello deve essere loggato in base a minLevel. */\r\n private shouldLogLevel(level: UiLogLevel): boolean {\r\n const minIndex = UI_LOGGER_LEVELS.indexOf(this.config.minLevel);\r\n const levelIndex = UI_LOGGER_LEVELS.indexOf(level);\r\n return levelIndex >= minIndex;\r\n }\r\n\r\n // Query API\r\n\r\n /**\r\n * Recupera log con filtri.\r\n */\r\n async query(filter: UiLogFilter = {}): Promise<UiLogEntry[]> {\r\n if (!this.idbSupported()) return [];\r\n\r\n const db = await this.openDb();\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readonly');\r\n const store = tx.objectStore(UI_LOGGER_IDB_STORE);\r\n\r\n const all: UiLogEntry[] = await new Promise((resolve, reject) => {\r\n const request = store.getAll();\r\n request.onsuccess = () => resolve(request.result as UiLogEntry[]);\r\n request.onerror = () => reject(request.error);\r\n });\r\n\r\n return this.applyFilter(all, filter);\r\n }\r\n\r\n /**\r\n * Riepilogo log per dashboard.\r\n */\r\n async summary(): Promise<UiLogSummary> {\r\n const all = await this.query();\r\n\r\n const byCategory = { form: 0, wizard: 0, navigation: 0, system: 0, error: 0 } as Record<UiLogCategory, number>;\r\n const byLevel = { debug: 0, info: 0, warn: 0, error: 0 } as Record<UiLogLevel, number>;\r\n\r\n let oldest = Infinity;\r\n let newest = 0;\r\n\r\n for (const entry of all) {\r\n byCategory[entry.category]++;\r\n byLevel[entry.level]++;\r\n if (entry.timestamp < oldest) oldest = entry.timestamp;\r\n if (entry.timestamp > newest) newest = entry.timestamp;\r\n }\r\n\r\n return {\r\n total: all.length,\r\n byCategory,\r\n byLevel,\r\n oldest: oldest === Infinity ? 0 : oldest,\r\n newest,\r\n };\r\n }\r\n\r\n /**\r\n * Cancella log più vecchi di TTL.\r\n */\r\n async purgeOld(): Promise<number> {\r\n if (!this.idbSupported()) return 0;\r\n\r\n const cutoff = Date.now() - this.config.ttlMs;\r\n const toDelete: string[] = [];\r\n\r\n const db = await this.openDb();\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readonly');\r\n const store = tx.objectStore(UI_LOGGER_IDB_STORE);\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const cursor = store.openCursor();\r\n cursor.onsuccess = (e) => {\r\n const result = (e.target as IDBRequest).result as IDBCursorWithValue | null;\r\n if (!result) {\r\n resolve();\r\n return;\r\n }\r\n const entry = result.value as UiLogEntry;\r\n if (entry.timestamp < cutoff) {\r\n toDelete.push(entry.id);\r\n }\r\n result.continue();\r\n };\r\n cursor.onerror = () => reject(cursor.error);\r\n });\r\n\r\n if (toDelete.length > 0) {\r\n const delTx = db.transaction(UI_LOGGER_IDB_STORE, 'readwrite');\r\n for (const id of toDelete) {\r\n delTx.objectStore(UI_LOGGER_IDB_STORE).delete(id);\r\n }\r\n }\r\n\r\n return toDelete.length;\r\n }\r\n\r\n /**\r\n * Cancella tutti i log.\r\n */\r\n async clear(): Promise<void> {\r\n if (!this.idbSupported()) return;\r\n\r\n const db = await this.openDb();\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readwrite');\r\n await new Promise<void>((resolve, reject) => {\r\n const request = tx.objectStore(UI_LOGGER_IDB_STORE).clear();\r\n request.onsuccess = () => resolve();\r\n request.onerror = () => reject(request.error);\r\n });\r\n }\r\n\r\n // Internals\r\n\r\n private openDb(): Promise<IDBDatabase> {\r\n if (this.dbPromise) return this.dbPromise;\r\n\r\n this.dbPromise = new Promise((resolve, reject) => {\r\n const req = indexedDB.open(UI_LOGGER_IDB_NAME, UI_LOGGER_IDB_VERSION);\r\n req.onerror = () => reject(req.error);\r\n req.onsuccess = () => resolve(req.result);\r\n req.onupgradeneeded = (ev) => {\r\n const db = (ev.target as IDBOpenDBRequest).result;\r\n if (!db.objectStoreNames.contains(UI_LOGGER_IDB_STORE)) {\r\n db.createObjectStore(UI_LOGGER_IDB_STORE);\r\n }\r\n };\r\n });\r\n\r\n return this.dbPromise;\r\n }\r\n\r\n private async cleanupIfNeeded(db: IDBDatabase): Promise<void> {\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readonly');\r\n const count = await new Promise<number>((resolve, reject) => {\r\n const req = tx.objectStore(UI_LOGGER_IDB_STORE).count();\r\n req.onsuccess = () => resolve(req.result);\r\n req.onerror = () => reject(req.error);\r\n });\r\n\r\n if (count > this.config.maxEntries) {\r\n void this.purgeOld();\r\n }\r\n }\r\n\r\n private applyFilter(entries: UiLogEntry[], filter: UiLogFilter): UiLogEntry[] {\r\n let result = entries;\r\n\r\n if (filter.category) {\r\n result = result.filter((e) => e.category === filter.category);\r\n }\r\n if (filter.level) {\r\n result = result.filter((e) => e.level === filter.level);\r\n }\r\n if (filter.action) {\r\n result = result.filter((e) => e.action.includes(filter.action!));\r\n }\r\n if (filter.from) {\r\n result = result.filter((e) => e.timestamp >= filter.from!);\r\n }\r\n if (filter.to) {\r\n result = result.filter((e) => e.timestamp <= filter.to!);\r\n }\r\n\r\n // Ordina newest first\r\n result = result.sort((a, b) => b.timestamp - a.timestamp);\r\n\r\n if (filter.limit && filter.limit > 0) {\r\n result = result.slice(0, filter.limit);\r\n }\r\n\r\n return result;\r\n }\r\n}","/**\r\n * @module ng-ui-system/form-builder\r\n * Tipi relativi alla validazione dei campi.\r\n */\r\n\r\nimport { ValidatorFn } from '@angular/forms';\r\nimport { UiFieldCondition } from './condition.types';\r\n\r\n// ─── Operatori cross-field ────────────────────────────────────────\r\n\r\n/**\r\n * Operatori di confronto per validazioni cross-field.\r\n */\r\nexport type UiCrossFieldOperator = 'greater_than' | 'greater_equal' | 'less_than' | 'less_equal' | 'not_equal';\r\n\r\n/**\r\n * Configurazione per validazione cross-field.\r\n * Confronta il valore del campo corrente con quello di un altro campo.\r\n *\r\n * @example\r\n * ```typescript\r\n * // La data di fine deve essere successiva alla data di inizio\r\n * crossField: {\r\n * targetField: 'data-inizio',\r\n * operator: 'greater_than',\r\n * dataType: 'date',\r\n * }\r\n * ```\r\n */\r\nexport interface UiCrossFieldConfig {\r\n /** Chiave del campo di confronto. */\r\n targetField: string;\r\n /** Operatore di confronto. */\r\n operator: UiCrossFieldOperator;\r\n /** Tipo di dato per il confronto. */\r\n dataType: 'date' | 'number';\r\n /** Per le date, specifica se il formato e MM/YYYY. */\r\n isMonthYear?: boolean;\r\n}\r\n\r\n// ─── Validazione date ─────────────────────────────────────────────\r\n\r\n/**\r\n * Keyword predefinite per date di riferimento.\r\n */\r\nexport type UiDateKeyword = 'today' | 'tomorrow' | 'yesterday';\r\n\r\n/**\r\n * Configurazione per validazione date-min / date-max.\r\n * Permette di validare che una data sia precedente o successiva\r\n * a un valore di riferimento, con supporto per offset temporali.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Data deve essere >= oggi\r\n * { type: 'date-min', value: 'today', message: 'La data deve essere futura' }\r\n *\r\n * // Data deve essere <= oggi + 1 anno\r\n * { type: 'date-max', value: 'today', offset: '1y', message: 'Max 1 anno da oggi' }\r\n *\r\n * // Data deve essere >= una data specifica\r\n * { type: 'date-min', value: '01/01/2024', message: 'Almeno dal 2024' }\r\n * ```\r\n */\r\nexport interface UiDateValidationConfig {\r\n /**\r\n * Data di riferimento.\r\n * Puo essere una keyword (`'today'`, `'tomorrow'`, `'yesterday'`)\r\n * o una data nel formato `DD/MM/YYYY`.\r\n */\r\n value: string | UiDateKeyword;\r\n /**\r\n * Offset da applicare alla data di riferimento.\r\n *\r\n * Formato: `numero + unita`\r\n * - `'y'` o `'a'` per anni (es. `'1y'`, `'2a'`)\r\n * - `'m'` per mesi (es. `'6m'`, `'12m'`)\r\n * - `'g'` o `'d'` per giorni (es. `'30g'`, `'7d'`)\r\n * - `'w'` per settimane (es. `'2w'`)\r\n */\r\n offset?: string;\r\n}\r\n\r\n// ─── Tipi di validazione ──────────────────────────────────────────\r\n\r\n/**\r\n * Tipi di validazione supportati dal form builder.\r\n *\r\n * | Tipo | Valore atteso | Descrizione |\r\n * |-------------|--------------------|-----------------------------------------|\r\n * | `required` | — | Campo obbligatorio |\r\n * | `email` | — | Formato email valido |\r\n * | `min` | `number` | Valore numerico minimo |\r\n * | `max` | `number` | Valore numerico massimo |\r\n * | `minLength` | `number` | Lunghezza minima stringa |\r\n * | `maxLength` | `number` | Lunghezza massima stringa |\r\n * | `pattern` | `string` (regex) | Pattern regex da rispettare |\r\n * | `custom` | `ValidatorFn` | Validatore Angular custom |\r\n * | `crossField`| `CrossFieldConfig` | Confronto con un altro campo |\r\n * | `date-min` | `string` | Data minima (keyword o DD/MM/YYYY) |\r\n * | `date-max` | `string` | Data massima (keyword o DD/MM/YYYY) |\r\n * | `fileSize` | `number` (bytes) | Dimensione massima file |\r\n * | `fileType` | `string[]` (MIME) | Tipi file accettati |\r\n * | `fileCount` | `number` | Numero massimo file |\r\n */\r\nexport type UiValidationType =\r\n | 'required'\r\n | 'email'\r\n | 'min'\r\n | 'max'\r\n | 'minLength'\r\n | 'maxLength'\r\n | 'pattern'\r\n | 'custom'\r\n | 'crossField'\r\n | 'date-min'\r\n | 'date-max'\r\n | 'fileSize'\r\n | 'fileType'\r\n | 'fileCount';\r\n\r\n// ─── Regola di validazione ────────────────────────────────────────\r\n\r\n/**\r\n * Regola di validazione per un campo del form.\r\n *\r\n * Supporta validazioni standard, cross-field, date con offset,\r\n * file e validatori custom Angular. Ogni regola puo avere\r\n * condizioni che ne controllano l'applicazione.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Validazione required condizionale\r\n * {\r\n * type: 'required',\r\n * message: 'Campo obbligatorio se attivo',\r\n * conditions: [{ field: 'is-active', operator: 'equals', value: true }],\r\n * }\r\n *\r\n * // Validazione cross-field\r\n * {\r\n * type: 'crossField',\r\n * crossField: {\r\n * targetField: 'eta-minima',\r\n * operator: 'greater_than',\r\n * dataType: 'number',\r\n * },\r\n * message: \"L'eta massima deve essere maggiore dell'eta minima\",\r\n * }\r\n * ```\r\n */\r\nexport interface UiValidationRule {\r\n /** Tipo di validazione. */\r\n type: UiValidationType;\r\n /**\r\n * Valore per la validazione.\r\n * - Per `min`/`max`: valore numerico\r\n * - Per `minLength`/`maxLength`: lunghezza\r\n * - Per `pattern`: stringa regex\r\n * - Per `date-min`/`date-max`: keyword o data `DD/MM/YYYY`\r\n * - Per `fileSize`: dimensione in bytes\r\n * - Per `fileType`: array di MIME types\r\n * - Per `fileCount`: numero massimo file\r\n */\r\n value?: any;\r\n /**\r\n * Offset temporale per `date-min`/`date-max`.\r\n * @see UiDateValidationConfig.offset\r\n */\r\n offset?: string;\r\n /** Configurazione per validazione cross-field. */\r\n crossField?: UiCrossFieldConfig;\r\n /** Messaggio di errore personalizzato. */\r\n message?: string;\r\n /** Funzione validatore Angular custom (per `type: 'custom'`). */\r\n validator?: ValidatorFn;\r\n /** Condizioni per applicare questa regola (validazione condizionale). */\r\n conditions?: UiFieldCondition[];\r\n}\r\n\r\n// ─── Stato di validazione ─────────────────────────────────────────\r\n\r\n/**\r\n * Stato di validazione complessivo del form.\r\n */\r\nexport interface UiFormValidationState {\r\n /** Se il form e valido. */\r\n valid: boolean;\r\n /** Mappa errori per chiave campo. */\r\n errors: Record<string, string[]>;\r\n /** Chiavi dei campi modificati. */\r\n dirty: string[];\r\n /** Chiavi dei campi toccati. */\r\n touched: string[];\r\n}\r\n\r\n/**\r\n * Chiave `ValidationErrors` usata dai CVA custom per esporre errori granulari\r\n * sui campi interni (atomici) verso l'error-summary del form-builder.\r\n */\r\nexport const UI_FORM_NESTED_FIELD_ERRORS_KEY = 'uiNestedFieldErrors';\r\n\r\n/**\r\n * Dettaglio di un errore per l'error summary.\r\n */\r\nexport interface UiFormErrorDetail {\r\n /** Chiave del campo in errore. */\r\n fieldKey: string;\r\n /** Label del campo per visualizzazione. */\r\n fieldLabel: string;\r\n /** Lista messaggi di errore. */\r\n errors: string[];\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { UiFieldCondition } from '../types/condition.types';\r\n\r\n/**\r\n * Servizio per la valutazione delle condizioni di visibilita,\r\n * required e disable dei campi del form.\r\n *\r\n * Supporta 12 operatori di confronto, logica AND/OR\r\n * e accesso a valori annidati tramite dot notation.\r\n *\r\n * @providedIn 'root'\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiFormConditionService {\r\n /**\r\n * Valuta una singola condizione rispetto ai dati del form.\r\n *\r\n * @param condition - Condizione da valutare.\r\n * @param formData - Stato corrente dei dati del form.\r\n * @returns `true` se la condizione e soddisfatta.\r\n */\r\n evaluateCondition(condition: UiFieldCondition, formData: Record<string, any>): boolean {\r\n const fieldValue = this.getNestedValue(formData, condition.field);\r\n\r\n switch (condition.operator) {\r\n case 'equals':\r\n return fieldValue === condition.value;\r\n case 'not_equals':\r\n return fieldValue !== condition.value;\r\n case 'contains':\r\n return this.stringContains(fieldValue, condition.value);\r\n case 'not_contains':\r\n return !this.stringContains(fieldValue, condition.value);\r\n case 'greater_than':\r\n return this.numericCompare(fieldValue, condition.value, '>');\r\n case 'less_than':\r\n return this.numericCompare(fieldValue, condition.value, '<');\r\n case 'greater_equal':\r\n return this.numericCompare(fieldValue, condition.value, '>=');\r\n case 'less_equal':\r\n return this.numericCompare(fieldValue, condition.value, '<=');\r\n case 'is_empty':\r\n return this.isEmpty(fieldValue);\r\n case 'is_not_empty':\r\n return !this.isEmpty(fieldValue);\r\n case 'in_array':\r\n return Array.isArray(condition.value) && condition.value.includes(fieldValue);\r\n case 'not_in_array':\r\n return Array.isArray(condition.value) && !condition.value.includes(fieldValue);\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Valuta un array di condizioni con logica AND/OR.\r\n *\r\n * La prima condizione stabilisce il valore iniziale.\r\n * Le condizioni successive usano la proprieta `logic` per\r\n * combinare il risultato (`AND` per default).\r\n *\r\n * @param conditions - Array di condizioni.\r\n * @param formData - Stato corrente dei dati del form.\r\n * @returns `true` se le condizioni combinate sono soddisfatte.\r\n */\r\n evaluateConditions(conditions: UiFieldCondition[], formData: Record<string, any>): boolean {\r\n if (!conditions || conditions.length === 0) {\r\n return true;\r\n }\r\n\r\n let result = this.evaluateCondition(conditions[0], formData);\r\n\r\n for (let i = 1; i < conditions.length; i++) {\r\n const condition = conditions[i];\r\n const conditionResult = this.evaluateCondition(condition, formData);\r\n\r\n if (condition.logic === 'OR') {\r\n result = result || conditionResult;\r\n } else {\r\n result = result && conditionResult;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /** Accesso a valori annidati tramite dot notation (es. `'address.city'`). */\r\n private getNestedValue(obj: any, path: string): any {\r\n return path\r\n .split('.')\r\n .reduce((current, key) => (current != null && current[key] !== undefined ? current[key] : undefined), obj);\r\n }\r\n\r\n /** Confronto stringa case-insensitive. */\r\n private stringContains(haystack: any, needle: any): boolean {\r\n if (haystack == null || needle == null) return false;\r\n return String(haystack).toLowerCase().includes(String(needle).toLowerCase());\r\n }\r\n\r\n /** Confronto numerico generico. */\r\n private numericCompare(a: any, b: any, op: string): boolean {\r\n const n1 = Number(a);\r\n const n2 = Number(b);\r\n if (isNaN(n1) || isNaN(n2)) return false;\r\n switch (op) {\r\n case '>':\r\n return n1 > n2;\r\n case '<':\r\n return n1 < n2;\r\n case '>=':\r\n return n1 >= n2;\r\n case '<=':\r\n return n1 <= n2;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Verifica se un valore e vuoto in modo robusto.\r\n * Gestisce null, undefined, false, stringhe vuote, array vuoti e oggetti vuoti.\r\n */\r\n private isEmpty(value: any): boolean {\r\n if (value === null || value === undefined || value === false) return true;\r\n if (typeof value === 'string' && value.trim().length === 0) return true;\r\n if (Array.isArray(value) && value.length === 0) return true;\r\n if (typeof value === 'object' && Object.keys(value).length === 0) return true;\r\n return false;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl, ValidatorFn, Validators } from '@angular/forms';\r\nimport {\r\n parse,\r\n format,\r\n startOfDay,\r\n startOfMonth,\r\n addDays,\r\n addMonths,\r\n addYears,\r\n addWeeks,\r\n isAfter,\r\n isBefore,\r\n isEqual,\r\n isValid as isDateValid,\r\n} from 'date-fns';\r\nimport { UiValidationRule } from '../types/validation.types';\r\nimport { UiCrossFieldConfig, UiCrossFieldOperator } from '../types/validation.types';\r\nimport { UiFileData } from '../types/field.types';\r\nimport { UiFormConditionService } from './form-condition.service';\r\n\r\n/**\r\n * Servizio per la creazione e gestione dei validatori Angular\r\n * basati sulle regole dichiarative dello schema del form.\r\n *\r\n * Supporta validazioni standard, cross-field, date con offset,\r\n * file e validatori condizionali.\r\n *\r\n * @providedIn 'root'\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiFormValidationService {\r\n constructor(private conditionService: UiFormConditionService) {}\r\n\r\n // ─── Creazione validatori ──────────────────────────────────────\r\n\r\n /** Crea un array di validatori Angular dalle regole di validazione. */\r\n createValidators(rules: UiValidationRule[]): ValidatorFn[] {\r\n if (!rules?.length) return [];\r\n return rules.map((r) => this.createValidator(r)).filter((v): v is ValidatorFn => v !== null);\r\n }\r\n\r\n /**\r\n * Crea validatori con supporto condizionale.\r\n * Le regole con `conditions` vengono applicate solo se le condizioni sono soddisfatte.\r\n */\r\n createConditionalValidators(rules: UiValidationRule[], formData: Record<string, any>): ValidatorFn[] {\r\n if (!rules?.length) return [];\r\n const validators: ValidatorFn[] = [];\r\n\r\n for (const rule of rules) {\r\n if (rule.conditions?.length) {\r\n const shouldApply = this.conditionService.evaluateConditions(rule.conditions, formData);\r\n if (!shouldApply) continue;\r\n }\r\n const v = this.createValidator(rule);\r\n if (v) validators.push(v);\r\n }\r\n\r\n return validators;\r\n }\r\n\r\n /**\r\n * Aggiorna i validatori di un campo in base allo stato corrente del form.\r\n * Usato per ricalcolare validazioni condizionali quando i dati cambiano.\r\n */\r\n updateFieldValidators(\r\n control: AbstractControl,\r\n rules: UiValidationRule[] | undefined,\r\n formData: Record<string, any>,\r\n ): void {\r\n if (!rules?.length) {\r\n control.clearValidators();\r\n } else {\r\n const validators = this.createConditionalValidators(rules, formData);\r\n control.setValidators(validators);\r\n }\r\n control.updateValueAndValidity({ emitEvent: false });\r\n }\r\n\r\n // ─── Utility pubbliche ─────────────────────────────────────────\r\n\r\n /** Verifica se un campo dovrebbe mostrare gli errori. */\r\n shouldShowFieldErrors(control: AbstractControl): boolean {\r\n return control.invalid && (control.dirty || control.touched);\r\n }\r\n\r\n /** Restituisce i campi correlati da cross-field validation. */\r\n getCrossFieldRelatedFields(fieldKey: string, allRules: Record<string, UiValidationRule[]>): string[] {\r\n const related: string[] = [];\r\n for (const [key, rules] of Object.entries(allRules)) {\r\n if (key === fieldKey) continue;\r\n for (const rule of rules) {\r\n if (rule.type === 'crossField' && rule.crossField?.targetField === fieldKey) {\r\n related.push(key);\r\n }\r\n }\r\n }\r\n return related;\r\n }\r\n\r\n /** Verifica se un campo ha validazioni cross-field che lo referenziano. */\r\n hasCrossFieldValidations(fieldKey: string, allRules: Record<string, UiValidationRule[]>): boolean {\r\n return this.getCrossFieldRelatedFields(fieldKey, allRules).length > 0;\r\n }\r\n\r\n /** Formatta la dimensione del file in una stringa leggibile. */\r\n formatFileSize(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\r\n }\r\n\r\n // ─── Factory validatori ────────────────────────────────────────\r\n\r\n private createValidator(rule: UiValidationRule): ValidatorFn | null {\r\n switch (rule.type) {\r\n case 'required':\r\n return Validators.required;\r\n case 'email':\r\n return Validators.email;\r\n case 'min':\r\n return Validators.min(rule.value);\r\n case 'max':\r\n return Validators.max(rule.value);\r\n case 'minLength':\r\n return Validators.minLength(rule.value);\r\n case 'maxLength':\r\n return Validators.maxLength(rule.value);\r\n case 'pattern':\r\n return Validators.pattern(rule.value);\r\n case 'custom':\r\n return rule.validator || null;\r\n case 'crossField':\r\n return rule.crossField ? this.createCrossFieldValidator(rule.crossField) : null;\r\n case 'date-min':\r\n return this.createDateMinValidator(rule.value, rule.offset);\r\n case 'date-max':\r\n return this.createDateMaxValidator(rule.value, rule.offset);\r\n case 'fileSize':\r\n return this.createFileSizeValidator(rule.value);\r\n case 'fileType':\r\n return this.createFileTypeValidator(rule.value);\r\n case 'fileCount':\r\n return this.createFileCountValidator(rule.value);\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n // ─── Cross-field ───────────────────────────────────────────────\r\n\r\n private createCrossFieldValidator(config: UiCrossFieldConfig): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n if (!control.parent || !config.targetField) return null;\r\n\r\n const targetControl = control.parent.get(config.targetField);\r\n if (!targetControl) return null;\r\n\r\n const sourceValue = control.value;\r\n const targetValue = targetControl.value;\r\n\r\n if (sourceValue == null || targetValue == null || sourceValue === '' || targetValue === '') {\r\n return null;\r\n }\r\n\r\n let isValid = false;\r\n if (config.dataType === 'date') {\r\n isValid = this.validateDateComparison(sourceValue, targetValue, config.operator, config.isMonthYear);\r\n } else {\r\n isValid = this.validateNumberComparison(sourceValue, targetValue, config.operator);\r\n }\r\n\r\n return isValid\r\n ? null\r\n : {\r\n crossField: {\r\n actualValue: sourceValue,\r\n requiredComparison: config.operator,\r\n comparedValue: targetValue,\r\n targetField: config.targetField,\r\n },\r\n };\r\n };\r\n }\r\n\r\n /** Confronto date con date-fns. */\r\n private validateDateComparison(\r\n sourceValue: any,\r\n targetValue: any,\r\n operator: UiCrossFieldOperator,\r\n isMonthYear?: boolean,\r\n ): boolean {\r\n const normalize = isMonthYear ? startOfMonth : startOfDay;\r\n const sourceDate = normalize(new Date(sourceValue));\r\n const targetDate = normalize(new Date(targetValue));\r\n\r\n if (!isDateValid(sourceDate) || !isDateValid(targetDate)) return false;\r\n\r\n switch (operator) {\r\n case 'greater_than':\r\n return isAfter(sourceDate, targetDate);\r\n case 'greater_equal':\r\n return isAfter(sourceDate, targetDate) || isEqual(sourceDate, targetDate);\r\n case 'less_than':\r\n return isBefore(sourceDate, targetDate);\r\n case 'less_equal':\r\n return isBefore(sourceDate, targetDate) || isEqual(sourceDate, targetDate);\r\n case 'not_equal':\r\n return !isEqual(sourceDate, targetDate);\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /** Confronto numerico. */\r\n private validateNumberComparison(sourceValue: any, targetValue: any, operator: UiCrossFieldOperator): boolean {\r\n const src = Number(sourceValue);\r\n const tgt = Number(targetValue);\r\n if (isNaN(src) || isNaN(tgt)) return false;\r\n\r\n switch (operator) {\r\n case 'greater_than':\r\n return src > tgt;\r\n case 'greater_equal':\r\n return src >= tgt;\r\n case 'less_than':\r\n return src < tgt;\r\n case 'less_equal':\r\n return src <= tgt;\r\n case 'not_equal':\r\n return src !== tgt;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n // ─── Date min/max (con keyword e offset) ───────────────────────\r\n\r\n private createDateMinValidator(value: string, offset?: string): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n if (!control.value) return null;\r\n\r\n const refDate = this.parseReferenceDate(value, offset);\r\n if (!refDate) return null;\r\n\r\n const inputDate = startOfDay(new Date(control.value));\r\n if (!isDateValid(inputDate)) {\r\n return { 'date-min': { message: 'Data non valida', referenceDate: this.formatRefDate(refDate) } };\r\n }\r\n\r\n if (isBefore(inputDate, refDate)) {\r\n return {\r\n 'date-min': {\r\n message: `La data deve essere successiva o uguale a ${this.formatRefDate(refDate)}`,\r\n referenceDate: this.formatRefDate(refDate),\r\n inputDate: format(inputDate, 'dd/MM/yyyy'),\r\n },\r\n };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n private createDateMaxValidator(value: string, offset?: string): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n if (!control.value) return null;\r\n\r\n const refDate = this.parseReferenceDate(value, offset);\r\n if (!refDate) return null;\r\n\r\n const inputDate = startOfDay(new Date(control.value));\r\n if (!isDateValid(inputDate)) {\r\n return { 'date-max': { message: 'Data non valida', referenceDate: this.formatRefDate(refDate) } };\r\n }\r\n\r\n if (isAfter(inputDate, refDate)) {\r\n return {\r\n 'date-max': {\r\n message: `La data deve essere precedente o uguale a ${this.formatRefDate(refDate)}`,\r\n referenceDate: this.formatRefDate(refDate),\r\n inputDate: format(inputDate, 'dd/MM/yyyy'),\r\n },\r\n };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n /**\r\n * Parsa una data di riferimento da keyword o stringa DD/MM/YYYY\r\n * e applica un eventuale offset temporale.\r\n */\r\n private parseReferenceDate(value: string, offset?: string): Date | null {\r\n const today = startOfDay(new Date());\r\n let date: Date;\r\n\r\n switch (value?.toLowerCase().trim()) {\r\n case 'today':\r\n case 'oggi':\r\n date = today;\r\n break;\r\n case 'tomorrow':\r\n case 'domani':\r\n date = addDays(today, 1);\r\n break;\r\n case 'yesterday':\r\n case 'ieri':\r\n date = addDays(today, -1);\r\n break;\r\n default: {\r\n // Prova DD/MM/YYYY\r\n const parsed = parse(value, 'dd/MM/yyyy', new Date());\r\n if (isDateValid(parsed)) {\r\n date = startOfDay(parsed);\r\n } else {\r\n // Prova YYYY-MM-DD (ISO)\r\n const isoDate = new Date(value);\r\n if (isDateValid(isoDate)) {\r\n date = startOfDay(isoDate);\r\n } else {\r\n return null;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return offset ? this.applyDateOffset(date, offset) : date;\r\n }\r\n\r\n /**\r\n * Applica un offset temporale a una data.\r\n *\r\n * Formato: `numero + unita`\r\n * - `y`/`a` = anni, `m` = mesi, `g`/`d` = giorni, `s`/`w` = settimane\r\n */\r\n private applyDateOffset(date: Date, offset: string): Date {\r\n const match = offset.match(/^(-?\\d+)([yYaAmMgGdDsSwW])$/);\r\n if (!match) return date;\r\n\r\n const amount = parseInt(match[1], 10);\r\n switch (match[2].toLowerCase()) {\r\n case 'y':\r\n case 'a':\r\n return addYears(date, amount);\r\n case 'm':\r\n return addMonths(date, amount);\r\n case 'g':\r\n case 'd':\r\n return addDays(date, amount);\r\n case 's':\r\n case 'w':\r\n return addWeeks(date, amount);\r\n default:\r\n return date;\r\n }\r\n }\r\n\r\n private formatRefDate(date: Date): string {\r\n return format(date, 'dd/MM/yyyy');\r\n }\r\n\r\n // ─── File validators ───────────────────────────────────────────\r\n\r\n private createFileSizeValidator(maxSize: number): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n const files: UiFileData[] = control.value;\r\n if (!Array.isArray(files) || files.length === 0) return null;\r\n\r\n const oversized = files.filter((f) => f.size > maxSize);\r\n if (oversized.length > 0) {\r\n return {\r\n fileSize: {\r\n maxSize,\r\n maxSizeFormatted: this.formatFileSize(maxSize),\r\n files: oversized.map((f) => f.filename),\r\n },\r\n };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n private createFileTypeValidator(allowedTypes: string[]): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n const files: UiFileData[] = control.value;\r\n if (!Array.isArray(files) || files.length === 0) return null;\r\n\r\n const invalid = files.filter((f) => {\r\n return !allowedTypes.some((type) => {\r\n if (type.endsWith('/*')) {\r\n const category = type.split('/')[0];\r\n return f.mimeType.startsWith(category + '/');\r\n }\r\n return f.mimeType === type;\r\n });\r\n });\r\n\r\n if (invalid.length > 0) {\r\n return {\r\n fileType: {\r\n allowedTypes,\r\n files: invalid.map((f) => f.filename),\r\n },\r\n };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n private createFileCountValidator(maxCount: number): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n const files: UiFileData[] = control.value;\r\n if (!Array.isArray(files)) return null;\r\n\r\n if (files.length > maxCount) {\r\n return { fileCount: { maxCount, actualCount: files.length } };\r\n }\r\n return null;\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { UiValidationRule } from '../types/validation.types';\r\n\r\n/** Opzioni per la visibilità degli errori di un campo. */\r\nexport interface UiFieldErrorDisplayOptions {\r\n /** Tratta il campo come prevalorizzato (mostra errori anche senza touched). */\r\n treatAsPrevalorized?: boolean;\r\n}\r\n\r\n/**\r\n * Servizio condiviso per messaggi di errore, visibilità errori e conteggio caratteri\r\n * dei campi form-builder e dei componenti atomici standalone.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiFormFieldErrorService {\r\n /**\r\n * Restituisce i messaggi di errore user-facing per un controllo.\r\n *\r\n * @param control Controllo Angular del campo\r\n * @param rules Regole di validazione dichiarative (messaggi custom dallo schema)\r\n */\r\n getFieldErrors(control: AbstractControl | null, rules: UiValidationRule[] = []): string[] {\r\n if (!control?.errors) return [];\r\n\r\n const messages: string[] = [];\r\n for (const [errorKey, errorValue] of Object.entries(control.errors)) {\r\n const rule = rules.find(\r\n (r) =>\r\n this.normalizeValidationKey(r.type) === errorKey ||\r\n (r.type === 'crossField' && errorKey === 'crossField'),\r\n );\r\n if (rule?.message) {\r\n messages.push(rule.message);\r\n } else {\r\n messages.push(this.getDefaultErrorMessage(errorKey, errorValue));\r\n }\r\n }\r\n return messages;\r\n }\r\n\r\n /**\r\n * Indica se mostrare gli errori per un controllo (invalid + touched/dirty/prevalorizzato).\r\n */\r\n shouldShowFieldErrors(\r\n control: AbstractControl | null,\r\n options: UiFieldErrorDisplayOptions = {},\r\n ): boolean {\r\n if (!control) return false;\r\n return (\r\n control.invalid &&\r\n (control.dirty || control.touched || options.treatAsPrevalorized === true)\r\n );\r\n }\r\n\r\n /**\r\n * Conteggio caratteri corrente/massimo per campi text/textarea con maxLength.\r\n */\r\n getCharCount(\r\n control: AbstractControl | null,\r\n maxLength?: number,\r\n ): { current: number; max: number } | null {\r\n if (maxLength == null || maxLength <= 0) return null;\r\n const current = String(control?.value ?? '').length;\r\n return { current, max: maxLength };\r\n }\r\n\r\n /** Estrae maxLength dalle regole schema. */\r\n resolveMaxLength(rules: UiValidationRule[] = []): number | undefined {\r\n const rule = rules.find((r) => r.type === 'maxLength');\r\n return rule?.value != null ? Number(rule.value) : undefined;\r\n }\r\n\r\n private normalizeValidationKey(schemaType: string): string {\r\n const keyMap: Record<string, string> = {\r\n minLength: 'minlength',\r\n maxLength: 'maxlength',\r\n };\r\n return keyMap[schemaType] || schemaType;\r\n }\r\n\r\n private getDefaultErrorMessage(errorKey: string, errorValue: unknown): string {\r\n if (typeof errorValue === 'string') {\r\n return errorValue;\r\n }\r\n\r\n const ev = errorValue as Record<string, unknown> | null | undefined;\r\n\r\n switch (errorKey) {\r\n case 'required':\r\n return 'Campo obbligatorio';\r\n case 'email':\r\n return 'Formato email non valido';\r\n case 'min':\r\n return `Valore minimo: ${ev?.['min']}`;\r\n case 'max':\r\n return `Valore massimo: ${ev?.['max']}`;\r\n case 'minlength':\r\n return `Lunghezza minima: ${ev?.['requiredLength']} caratteri`;\r\n case 'maxlength':\r\n return `Lunghezza massima: ${ev?.['requiredLength']} caratteri`;\r\n case 'pattern':\r\n return 'Formato non valido';\r\n case 'crossField':\r\n return 'Valore non coerente con il campo correlato';\r\n case 'date-min':\r\n return (ev?.['message'] as string) || 'Data troppo remota';\r\n case 'date-max':\r\n return (ev?.['message'] as string) || 'Data troppo avanzata';\r\n case 'fileSize':\r\n return `Dimensione massima: ${ev?.['maxSizeFormatted']}`;\r\n case 'fileType':\r\n return 'Formato file non accettato';\r\n case 'fileCount':\r\n return `Massimo ${ev?.['maxCount']} file`;\r\n default:\r\n return 'Valore non valido';\r\n }\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiFormErrorDetail } from '../../types/validation.types';\r\n\r\n/**\r\n * Riepilogo stato validazione del form.\r\n *\r\n * Con errori: indicatore + dropdown hover/click per il dettaglio e navigazione ai campi.\r\n * Senza errori: messaggio di stato positivo fisso (no dropdown), UI prevedibile.\r\n *\r\n * @selector ui-form-error-summary\r\n */\r\n@Component({\r\n selector: 'ui-form-error-summary',\r\n standalone: true,\r\n imports: [LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n template: `\r\n <div\r\n class=\"ui-form-error-summary\"\r\n [class.ui-form-error-summary--invalid]=\"hasErrors\"\r\n [class.ui-form-error-summary--valid]=\"!hasErrors\"\r\n >\r\n @if (hasErrors) {\r\n <div\r\n class=\"ui-form-error-summary__panel ui-form-error-summary__panel--invalid\"\r\n (mouseenter)=\"showDropdown = true\"\r\n (mouseleave)=\"showDropdown = false\"\r\n >\r\n <div\r\n class=\"ui-form-error-summary__heading\"\r\n (click)=\"showDropdown = !showDropdown\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-expanded]=\"showDropdown\"\r\n [attr.aria-label]=\"displayCount + ' errori nel form'\"\r\n (keydown.enter)=\"showDropdown = !showDropdown\"\r\n (keydown.space)=\"showDropdown = !showDropdown; $event.preventDefault()\"\r\n >\r\n <lucide-icon name=\"alert-circle\" [size]=\"20\" class=\"ui-form-error-summary__icon\" aria-hidden=\"true\" />\r\n <p class=\"ui-form-error-summary__text\">\r\n Sono presenti <strong>{{ displayCount }}</strong>\r\n {{ displayCount === 1 ? 'errore' : 'errori' }} nel form.\r\n </p>\r\n </div>\r\n\r\n <div\r\n class=\"ui-form-error-summary__dropdown\"\r\n [class.ui-form-error-summary__dropdown--visible]=\"showDropdown\"\r\n role=\"list\"\r\n aria-label=\"Elenco errori del form\"\r\n >\r\n <div class=\"ui-form-error-summary__dropdown-content\">\r\n <h4 class=\"ui-form-error-summary__dropdown-title\">Dettagli errori:</h4>\r\n <ul class=\"ui-form-error-summary__list\">\r\n @for (detail of errors; track detail.fieldKey) {\r\n <li\r\n class=\"ui-form-error-summary__item\"\r\n role=\"listitem\"\r\n (click)=\"onFieldClick(detail.fieldKey)\"\r\n tabindex=\"0\"\r\n (keydown.enter)=\"onFieldClick(detail.fieldKey)\"\r\n >\r\n <div class=\"ui-form-error-summary__field-name\">\r\n <lucide-icon name=\"arrow-right\" [size]=\"14\" class=\"ui-form-error-summary__arrow\" aria-hidden=\"true\" />\r\n {{ detail.fieldLabel }}\r\n </div>\r\n <div class=\"ui-form-error-summary__messages\">\r\n @for (err of detail.errors; track $index; let last = $last) {\r\n <span>{{ err }}@if (!last) {, }</span>\r\n }\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"ui-form-error-summary__panel ui-form-error-summary__panel--valid\" role=\"status\" aria-live=\"polite\">\r\n <lucide-icon name=\"check-circle\" [size]=\"20\" class=\"ui-form-error-summary__icon-valid\" aria-hidden=\"true\" />\r\n <p class=\"ui-form-error-summary__text-valid\">{{ validMessage }}</p>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styleUrl: './form-error-summary.component.scss',\r\n})\r\nexport class UiFormErrorSummaryComponent {\r\n /** Lista di errori dettagliati per campo. */\r\n @Input() errors: UiFormErrorDetail[] = [];\r\n\r\n /** Conteggio totale degli errori (somma di tutti i messaggi). */\r\n @Input() totalErrorCount = 0;\r\n\r\n /** Testo mostrato quando non ci sono errori. */\r\n @Input() validMessage = 'Il form è compilato correttamente';\r\n\r\n /** Emesso quando l'utente clicca su un errore per navigare al campo. */\r\n @Output() fieldClick = new EventEmitter<string>();\r\n\r\n /** @internal Stato del dropdown (solo con errori). */\r\n showDropdown = false;\r\n\r\n /** True se il form ha almeno un errore da mostrare nel summary. */\r\n get hasErrors(): boolean {\r\n return this.displayCount > 0;\r\n }\r\n\r\n /** Conteggio da visualizzare: usa totalErrorCount se fornito, altrimenti conta dai dettagli. */\r\n get displayCount(): number {\r\n return this.totalErrorCount > 0 ? this.totalErrorCount : this.errors.reduce((sum, d) => sum + d.errors.length, 0);\r\n }\r\n\r\n /** @internal Gestione click su errore. */\r\n onFieldClick(fieldKey: string): void {\r\n this.showDropdown = false;\r\n this.fieldClick.emit(fieldKey);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n forwardRef,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiFileData, UiFileInputConfig } from '../../types/field.types';\r\n\r\n/**\r\n * Componente file input standalone con drag & drop,\r\n * anteprima, validazione e supporto multiplo.\r\n *\r\n * Implementa `ControlValueAccessor` per integrazione\r\n * diretta con Angular Reactive Forms.\r\n *\r\n * @selector ui-file-input\r\n */\r\n@Component({\r\n selector: 'ui-file-input',\r\n standalone: true,\r\n imports: [LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiFileInputComponent),\r\n multi: true,\r\n },\r\n ],\r\n template: `\r\n <div class=\"ui-file-input\" [class.ui-file-input--disabled]=\"disabled()\" [class.ui-file-input--drag-over]=\"isDragOver()\">\r\n <!-- Area drag & drop -->\r\n @if (config?.enableDragDrop !== false) {\r\n <div\r\n class=\"ui-file-input__drop-zone\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave()\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"fileInput.click()\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"config?.dragDropText || 'Trascina i file qui o clicca per selezionare'\"\r\n (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\"\r\n >\r\n <lucide-icon name=\"upload\" [size]=\"24\" aria-hidden=\"true\" />\r\n <span class=\"ui-file-input__drop-text\">\r\n {{ config?.dragDropText || 'Trascina i file qui o clicca per selezionare' }}\r\n </span>\r\n @if (config?.acceptedTypes?.length) {\r\n <span class=\"ui-file-input__hint\">\r\n Formati: {{ config!.acceptedTypes!.join(', ') }}\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <button\r\n class=\"ui-file-input__select-btn\"\r\n type=\"button\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"fileInput.click()\"\r\n >\r\n <lucide-icon name=\"paperclip\" [size]=\"16\" aria-hidden=\"true\" />\r\n {{ config?.placeholder || 'Seleziona file' }}\r\n </button>\r\n }\r\n\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n class=\"ui-file-input__native\"\r\n [accept]=\"acceptString\"\r\n [multiple]=\"config?.multiple ?? false\"\r\n [disabled]=\"disabled()\"\r\n (change)=\"onFileSelected($event)\"\r\n />\r\n\r\n <!-- Lista file selezionati -->\r\n @if (files().length > 0) {\r\n <div class=\"ui-file-input__file-list\" role=\"list\">\r\n @for (file of files(); track file.id || $index) {\r\n <div class=\"ui-file-input__file-item\" role=\"listitem\">\r\n <div class=\"ui-file-input__file-info\">\r\n <lucide-icon name=\"file\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span class=\"ui-file-input__file-name\">{{ file.filename }}</span>\r\n <span class=\"ui-file-input__file-size\">{{ formatSize(file.size) }}</span>\r\n </div>\r\n @if (!disabled()) {\r\n <button\r\n class=\"ui-file-input__remove-btn\"\r\n type=\"button\"\r\n [attr.aria-label]=\"'Rimuovi ' + file.filename\"\r\n (click)=\"removeFile($index)\"\r\n >\r\n <lucide-icon name=\"x\" [size]=\"14\" aria-hidden=\"true\" />\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styleUrl: './file-input.component.scss',\r\n})\r\nexport class UiFileInputComponent implements ControlValueAccessor {\r\n /** Configurazione del file input. */\r\n @Input() config: UiFileInputConfig | undefined;\r\n\r\n /** File rimosso dalla lista. */\r\n @Output() fileRemoved = new EventEmitter<UiFileData>();\r\n\r\n /** Errore di validazione file. */\r\n @Output() validationError = new EventEmitter<string>();\r\n\r\n // ── Stato interno (signals) ──\r\n readonly files = signal<UiFileData[]>([]);\r\n readonly disabled = signal(false);\r\n readonly isDragOver = signal(false);\r\n\r\n private onChange: (value: UiFileData[]) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n /** Stringa accept per l'input nativo. */\r\n get acceptString(): string {\r\n return this.config?.acceptedTypes?.join(',') || '';\r\n }\r\n\r\n // ── ControlValueAccessor ──\r\n writeValue(value: UiFileData[]): void {\r\n this.files.set(Array.isArray(value) ? value : []);\r\n }\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled.set(isDisabled);\r\n }\r\n\r\n // ── Drag & drop ──\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver.set(true);\r\n }\r\n\r\n onDragLeave(): void {\r\n this.isDragOver.set(false);\r\n }\r\n\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver.set(false);\r\n if (this.disabled()) return;\r\n\r\n const droppedFiles = event.dataTransfer?.files;\r\n if (droppedFiles?.length) {\r\n this.processFiles(droppedFiles);\r\n }\r\n }\r\n\r\n onFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files?.length) {\r\n this.processFiles(input.files);\r\n input.value = ''; // Reset per permettere la ri-selezione dello stesso file\r\n }\r\n }\r\n\r\n removeFile(index: number): void {\r\n const current = [...this.files()];\r\n const removed = current.splice(index, 1);\r\n this.files.set(current);\r\n this.onChange(current);\r\n if (removed[0]) this.fileRemoved.emit(removed[0]);\r\n }\r\n\r\n formatSize(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\r\n }\r\n\r\n // ── Processing ──\r\n private async processFiles(fileList: FileList): Promise<void> {\r\n this.onTouched();\r\n const maxFiles = this.config?.maxFiles || Infinity;\r\n const current = this.config?.multiple ? [...this.files()] : [];\r\n const remaining = maxFiles - current.length;\r\n\r\n if (remaining <= 0) {\r\n this.validationError.emit(`Numero massimo di file raggiunto (${maxFiles})`);\r\n return;\r\n }\r\n\r\n const filesToProcess = Array.from(fileList).slice(0, remaining);\r\n\r\n for (const file of filesToProcess) {\r\n // Validazione dimensione\r\n if (this.config?.maxFileSize && file.size > this.config.maxFileSize) {\r\n this.validationError.emit(`Il file \"${file.name}\" supera la dimensione massima consentita`);\r\n continue;\r\n }\r\n\r\n // Validazione tipo\r\n if (this.config?.acceptedTypes?.length) {\r\n const isAccepted = this.config.acceptedTypes.some((type) => {\r\n if (type.endsWith('/*')) {\r\n return file.type.startsWith(type.split('/')[0] + '/');\r\n }\r\n return file.type === type;\r\n });\r\n if (!isAccepted) {\r\n this.validationError.emit(`Il formato del file \"${file.name}\" non e accettato`);\r\n continue;\r\n }\r\n }\r\n\r\n const content = new Uint8Array(await file.arrayBuffer());\r\n const ext = file.name.split('.').pop() || '';\r\n\r\n const fileData: UiFileData = {\r\n filename: file.name,\r\n content,\r\n mimeType: file.type,\r\n extension: ext,\r\n size: file.size,\r\n needsUpload: true,\r\n id: `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`, // NOSONAR - Used for non-cryptographic file ID generation in UI\r\n timestamp: new Date(),\r\n };\r\n\r\n // Genera preview per immagini\r\n if (this.config?.showPreview && file.type.startsWith('image/')) {\r\n fileData.previewUrl = URL.createObjectURL(file);\r\n }\r\n\r\n current.push(fileData);\r\n }\r\n\r\n this.files.set(current);\r\n this.onChange(current);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport * as locationData from '../../../sources/location-data.opt.json';\r\nimport * as nazioniData from '../../../sources/nazioni.opt.json';\r\n\r\n// ─── Interfacce JSON ottimizzate ──────────────────────────────────\r\n\r\n/** Voce nazione nel JSON ottimizzato. */\r\nexport interface MinifiedNazioneOption {\r\n /** Codice nazione (es. `'ITA'`). */\r\n x: string;\r\n /** Descrizione (es. `'Italia'`). */\r\n d: string;\r\n}\r\n\r\n/** Voce provincia/comune nel JSON ottimizzato. */\r\nexport interface MinifiedSelectOption {\r\n /** Codice (provincia o comune). */\r\n x: string;\r\n /** Descrizione. */\r\n d: string;\r\n /** CAP singolo o multipli. */\r\n c?: string | string[];\r\n}\r\n\r\ninterface MinifiedLocationMap {\r\n province: MinifiedSelectOption[];\r\n comuniPerProvincia: Record<string, MinifiedSelectOption[]>;\r\n}\r\n\r\ninterface MinifiedNazioniMap {\r\n nazioni: MinifiedNazioneOption[];\r\n}\r\n\r\n// ─── Interfacce pubbliche (formato legacy compatibile) ───────────\r\n\r\n/** Nazione. */\r\nexport interface UiNazione {\r\n codStatoPk: string;\r\n codiceCatastale: string;\r\n descrizione: string;\r\n}\r\n\r\n/** Provincia. */\r\nexport interface UiProvincia {\r\n codiceProvinciaPk: string;\r\n nomeProvincia: string;\r\n siglaProvincia: string;\r\n visibile: boolean;\r\n}\r\n\r\n/** Comune. */\r\nexport interface UiComune {\r\n codiceCatastale: string;\r\n codiceComunePk: string;\r\n comuneSoppresso: boolean;\r\n nomeComune: string;\r\n prov: UiProvincia;\r\n visibile: boolean;\r\n}\r\n\r\n/**\r\n * Servizio per la gestione dei dati geografici italiani\r\n * da file JSON statici ottimizzati.\r\n *\r\n * Elimina la necessita di chiamate backend per nazioni,\r\n * province, comuni e CAP. I dati vengono caricati in memoria\r\n * al primo accesso e poi serviti dalla cache.\r\n *\r\n * @providedIn 'root'\r\n *\r\n * @example\r\n * ```typescript\r\n * const nazioni = await this.locationService.getNazioni();\r\n * const province = await this.locationService.getProvince();\r\n * const comuni = await this.locationService.getComuniByProvincia('015');\r\n * const caps = await this.locationService.getCapList('015146');\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiLocationService {\r\n private readonly nazioniMap: MinifiedNazioniMap;\r\n private readonly locationMap: MinifiedLocationMap;\r\n private readonly nazioniCache = new Map<string, UiNazione>();\r\n private readonly provinceCache = new Map<string, UiProvincia>();\r\n private readonly comuniCache = new Map<string, UiComune>();\r\n\r\n constructor() {\r\n this.nazioniMap = nazioniData as MinifiedNazioniMap;\r\n this.locationMap = locationData as any;\r\n this.initializeCaches();\r\n }\r\n\r\n // ─── API pubblica ──────────────────────────────────────────────\r\n\r\n /** Elenco completo delle nazioni (Italia prima). */\r\n async getNazioni(): Promise<{ data: UiNazione[] }> {\r\n const nazioni = Array.from(this.nazioniCache.values());\r\n return { data: this.sortNazioniItaliaFirst(nazioni) };\r\n }\r\n\r\n /** Elenco completo delle province, ordinate alfabeticamente. */\r\n async getProvince(): Promise<{ content: UiProvincia[] }> {\r\n const province = Array.from(this.provinceCache.values()).sort((a, b) =>\r\n a.nomeProvincia.localeCompare(b.nomeProvincia, 'it'),\r\n );\r\n return { content: province };\r\n }\r\n\r\n /** Elenco dei comuni per una specifica provincia. */\r\n async getComuniByProvincia(provinciaId: string): Promise<UiComune[]> {\r\n const comuniMin = this.locationMap.comuniPerProvincia[provinciaId] || [];\r\n const provincia = this.provinceCache.get(provinciaId);\r\n if (!provincia) return [];\r\n\r\n return comuniMin\r\n .map((c) => ({\r\n codiceCatastale: c.x,\r\n codiceComunePk: c.x,\r\n comuneSoppresso: false,\r\n nomeComune: c.d,\r\n prov: provincia,\r\n visibile: true,\r\n }))\r\n .sort((a, b) => a.nomeComune.localeCompare(b.nomeComune, 'it'));\r\n }\r\n\r\n /** Elenco dei CAP per un comune. */\r\n async getCapList(comuneId: string): Promise<string[]> {\r\n for (const comuni of Object.values(this.locationMap.comuniPerProvincia)) {\r\n const comune = comuni.find((c) => c.x === comuneId);\r\n if (comune?.c) {\r\n return Array.isArray(comune.c) ? comune.c : [comune.c];\r\n }\r\n }\r\n return [];\r\n }\r\n\r\n /** Dati completi di una location (nazione, provincia o comune). */\r\n async getLocationFullData(\r\n type: 'nazione' | 'provincia' | 'comune',\r\n id: string,\r\n provinciaId?: string,\r\n ): Promise<UiNazione | UiProvincia | UiComune | null> {\r\n switch (type) {\r\n case 'nazione':\r\n return this.nazioniCache.get(id) ?? null;\r\n case 'provincia':\r\n return this.provinceCache.get(id) ?? null;\r\n case 'comune': {\r\n if (!provinciaId) return this.comuniCache.get(id) ?? null;\r\n const comuni = await this.getComuniByProvincia(provinciaId);\r\n return comuni.find((c) => c.codiceComunePk === id) ?? null;\r\n }\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n // ─── Inizializzazione cache ────────────────────────────────────\r\n\r\n private initializeCaches(): void {\r\n // Nazioni\r\n for (const n of this.nazioniMap.nazioni) {\r\n this.nazioniCache.set(n.x, {\r\n codStatoPk: n.x,\r\n codiceCatastale: n.x,\r\n descrizione: n.d,\r\n });\r\n }\r\n\r\n // Province\r\n for (const p of this.locationMap.province) {\r\n this.provinceCache.set(p.x, {\r\n codiceProvinciaPk: p.x,\r\n nomeProvincia: p.d,\r\n siglaProvincia: p.x,\r\n visibile: true,\r\n });\r\n }\r\n\r\n // Comuni (con riferimento alla provincia)\r\n for (const [provinciaId, comuni] of Object.entries(this.locationMap.comuniPerProvincia)) {\r\n const provincia = this.provinceCache.get(provinciaId);\r\n if (!provincia) continue;\r\n for (const c of comuni) {\r\n this.comuniCache.set(c.x, {\r\n codiceCatastale: c.x,\r\n codiceComunePk: c.x,\r\n comuneSoppresso: false,\r\n nomeComune: c.d,\r\n prov: provincia,\r\n visibile: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n private sortNazioniItaliaFirst(nazioni: UiNazione[]): UiNazione[] {\r\n return nazioni.sort((a, b) => {\r\n const aItalia = a.descrizione?.toLowerCase().includes('italia') || a.codStatoPk === 'ITA';\r\n const bItalia = b.descrizione?.toLowerCase().includes('italia') || b.codStatoPk === 'ITA';\r\n if (aItalia && !bItalia) return -1;\r\n if (!aItalia && bItalia) return 1;\r\n return (a.descrizione || '').localeCompare(b.descrizione || '', 'it', { sensitivity: 'base' });\r\n });\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n forwardRef,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectorRef,\r\n Injector,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormBuilder,\r\n FormGroup,\r\n NG_VALUE_ACCESSOR,\r\n NG_VALIDATORS,\r\n FormControl,\r\n AbstractControl,\r\n ValidationErrors,\r\n Validators,\r\n Validator,\r\n NgControl,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { Subject, combineLatest, takeUntil, distinctUntilChanged, startWith, map } from 'rxjs';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { UiLocationService, UiNazione, UiProvincia, UiComune } from '../../services/location.service';\r\nimport { UiLocationConfig, UiLocationValue } from '../../types/territoriale.types';\r\n\r\n/**\r\n * Interfaccia interna per i CAP nel componente.\r\n */\r\ninterface UiCapOption {\r\n /** ID del CAP. */\r\n id: string;\r\n /** Codice CAP visualizzato. */\r\n codice: string;\r\n /** ID del comune associato. */\r\n comuneId: string;\r\n}\r\n\r\n/**\r\n * Componente standalone per la selezione di dati geografici italiani o esteri.\r\n *\r\n * Supporta due modalita:\r\n * - **Italia**: selezione a cascata nazione -> provincia -> comune -> CAP\r\n * - **Estero**: selezione nazione + campo testo libero per il comune\r\n *\r\n * Campi opzionali configurabili: indirizzo, mail, PEC, telefono.\r\n *\r\n * Implementa `ControlValueAccessor` e `Validator` per l'integrazione\r\n * diretta con Angular Reactive Forms.\r\n *\r\n * Utilizza dati da JSON statici tramite `UiLocationService`\r\n * (nessuna dipendenza al backend).\r\n *\r\n * @selector ui-specifica-territoriale\r\n *\r\n * @example\r\n * ```html\r\n * <ui-specifica-territoriale\r\n * [formControl]=\"myControl\"\r\n * [config]=\"{ italyByDefault: true, cap: { show: true } }\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-specifica-territoriale',\r\n standalone: true,\r\n imports: [ReactiveFormsModule, MatFormFieldModule, MatSelectModule, MatInputModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiSpecificaTerritorialeComponent),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => UiSpecificaTerritorialeComponent),\r\n multi: true,\r\n },\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: './specifica-territoriale.component.html',\r\n styleUrl: './specifica-territoriale.component.scss',\r\n})\r\nexport class UiSpecificaTerritorialeComponent implements ControlValueAccessor, Validator, OnInit, OnDestroy {\r\n /** Configurazione del componente. */\r\n @Input() config: UiLocationConfig = {};\r\n\r\n /** Stato disabilitato globale. */\r\n @Input() disabled = false;\r\n\r\n // ─── Pattern di validazione ──────────────────────────────────────\r\n private readonly EMAIL_PATTERN = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n private readonly PEC_PATTERN = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n private readonly PHONE_PATTERN = /^[+]?[0-9\\s\\-()]{6,16}$/;\r\n\r\n // ─── Stato interno ──────────────────────────────────────────────\r\n form!: FormGroup;\r\n isItalian = false;\r\n isForeign = false;\r\n ngControl!: NgControl;\r\n\r\n /** Elenco nazioni disponibili. */\r\n nazioni: UiNazione[] = [];\r\n /** Elenco province disponibili. */\r\n province: UiProvincia[] = [];\r\n /** Comuni filtrati per la provincia selezionata. */\r\n filteredComuni: UiComune[] = [];\r\n /** CAP filtrati per il comune selezionato. */\r\n filteredCaps: UiCapOption[] = [];\r\n\r\n /** Promise di inizializzazione (utile per test e table-territoriale). */\r\n initializationPromise: Promise<void> | null = null;\r\n\r\n private readonly destroy$ = new Subject<void>();\r\n private onChange = (_value: UiLocationValue) => {};\r\n private onTouched = () => {};\r\n private onValidatorChange = () => {};\r\n private subscriptionsInitialized = false;\r\n private pendingWriteValue: UiLocationValue | null = null;\r\n private isInitializing = false;\r\n private tipologicheLoaded = false;\r\n\r\n constructor(\r\n private readonly fb: FormBuilder,\r\n private readonly injector: Injector,\r\n private readonly cdr: ChangeDetectorRef,\r\n private readonly locationService: UiLocationService,\r\n ) {\r\n this.initializeForm();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.setupNgControl();\r\n this.initializationPromise = this.initializeComponent();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n // ─── ControlValueAccessor ───────────────────────────────────────\r\n\r\n writeValue(value: UiLocationValue | null): void {\r\n if (!this.tipologicheLoaded) {\r\n this.pendingWriteValue = value;\r\n return;\r\n }\r\n this.processWriteValue(value);\r\n }\r\n\r\n registerOnChange(fn: (value: UiLocationValue) => void): void {\r\n this.onChange = (value) => {\r\n if (!this.isInitializing) fn(value);\r\n };\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n registerOnValidatorChange(fn: () => void): void {\r\n this.onValidatorChange = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n if (isDisabled) {\r\n this.form.disable();\r\n } else {\r\n this.form.enable();\r\n this.applyFieldsDisabledState();\r\n }\r\n }\r\n\r\n // ─── Validator ──────────────────────────────────────────────────\r\n\r\n validate(_control: AbstractControl): ValidationErrors | null {\r\n if (!this.form) return null;\r\n\r\n const errors: ValidationErrors = {};\r\n const isNazioneRequired = this.config.nazione?.required !== false;\r\n const isProvinciaRequired = this.config.provincia?.required !== false;\r\n const isComuneRequired = this.config.comune?.required !== false;\r\n const isComuneEsteroRequired = this.config.comuneEstero?.required !== false;\r\n\r\n // Validazione nazione\r\n if (isNazioneRequired && !this.form.get('nazioneId')?.value) {\r\n errors['nazioneRequired'] = 'Seleziona una nazione';\r\n }\r\n\r\n // Validazioni Italia\r\n if (this.isItalian) {\r\n if (isProvinciaRequired && !this.form.get('provinciaId')?.value) {\r\n errors['provinciaRequired'] = 'Seleziona una provincia';\r\n }\r\n if (isComuneRequired && !this.form.get('comuneId')?.value) {\r\n errors['comuneRequired'] = 'Seleziona un comune';\r\n }\r\n if (this.config.cap?.required && this.showCAP && !this.form.get('cap')?.value) {\r\n errors['capRequired'] = 'Inserisci il CAP';\r\n }\r\n if (this.config.indirizzo?.required && this.showIndirizzo) {\r\n const v = this.form.get('indirizzo')?.value;\r\n if (!v || v.trim() === '') errors['indirizzoRequired'] = \"Inserisci l'indirizzo\";\r\n }\r\n this.validateContactFields(errors);\r\n }\r\n\r\n // Validazioni estero\r\n if (this.isForeign) {\r\n const comuneEstero = this.form.get('comuneEstero')?.value;\r\n if (isComuneEsteroRequired && (!comuneEstero || comuneEstero.trim() === '')) {\r\n errors['comuneEsteroRequired'] = 'Inserisci il comune estero';\r\n }\r\n }\r\n\r\n return Object.keys(errors).length > 0 ? errors : null;\r\n }\r\n\r\n // ─── API pubblica ───────────────────────────────────────────────\r\n\r\n /** Marca tutti i controlli interni come touched. */\r\n markAsTouched(): void {\r\n Object.values(this.form.controls).forEach((c) => c.markAsTouched());\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Verifica se mostrare gli errori per un campo interno. */\r\n shouldShowFieldErrors(fieldKey: string): boolean {\r\n const control = this.form.get(fieldKey);\r\n return !!(control?.invalid && (control.touched || control.dirty));\r\n }\r\n\r\n /** Errori di un campo interno come array di messaggi. */\r\n getFieldErrors(fieldKey: string): string[] {\r\n const control = this.form.get(fieldKey);\r\n if (!control?.errors) return [];\r\n const messages: string[] = [];\r\n const errs = control.errors;\r\n if (errs['required']) messages.push('Campo obbligatorio');\r\n if (errs['pattern']) messages.push('Formato non valido');\r\n if (errs['email']) messages.push('Email non valida');\r\n return messages;\r\n }\r\n\r\n /** Handler blur per propagare il touched. */\r\n onBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n /** Resetta lo stato del componente. */\r\n resetComponentState(): void {\r\n this.isItalian = false;\r\n this.isForeign = false;\r\n this.filteredComuni = [];\r\n this.filteredCaps = [];\r\n this.form.get('comuneId')?.disable({ emitEvent: false });\r\n this.form.get('cap')?.disable({ emitEvent: false });\r\n this.updateValidators();\r\n }\r\n\r\n // ─── Getter calcolati ───────────────────────────────────────────\r\n\r\n /** Labels personalizzabili con valori di default. */\r\n get labels() {\r\n return {\r\n nazione: this.config.labels?.nazione || 'Nazione',\r\n provincia: this.config.labels?.provincia || 'Provincia',\r\n comune: this.config.labels?.comune || 'Comune',\r\n cap: this.config.labels?.cap || 'CAP',\r\n indirizzo: this.config.labels?.indirizzo || 'Indirizzo',\r\n comuneEstero: this.config.labels?.comuneEstero || 'Comune Estero',\r\n mail: this.config.labels?.mail || 'Email',\r\n pec: this.config.labels?.pec || 'PEC',\r\n telefono: this.config.labels?.telefono || 'Telefono',\r\n };\r\n }\r\n\r\n get hasValidationErrors(): boolean {\r\n const externalInvalid = !!(\r\n this.ngControl?.control?.invalid &&\r\n (this.ngControl.control.touched || this.ngControl.control.dirty)\r\n );\r\n if (externalInvalid) return true;\r\n\r\n const isInteracted =\r\n this.form?.touched || this.form?.dirty || this.ngControl?.control?.touched || this.ngControl?.control?.dirty;\r\n if (isInteracted) {\r\n return !!this.validate(null as any);\r\n }\r\n return false;\r\n }\r\n\r\n get validationErrors(): string[] {\r\n // Errori esterni dal FormBuilder\r\n if (this.ngControl?.control?.errors) {\r\n const errors: string[] = [];\r\n if (this.ngControl.control.errors['required']) {\r\n errors.push('Inizia selezionando la nazione');\r\n }\r\n if (errors.length > 0) return errors;\r\n }\r\n\r\n // Errori interni\r\n const internalErrors = this.validate(null as any);\r\n if (!internalErrors) return [];\r\n return Object.values(internalErrors) as string[];\r\n }\r\n\r\n get showCAP(): boolean {\r\n return this.config.cap?.show !== false;\r\n }\r\n get showIndirizzo(): boolean {\r\n return this.config.indirizzo?.show !== false;\r\n }\r\n get showMail(): boolean {\r\n return this.config.mail?.show === true;\r\n }\r\n get showPEC(): boolean {\r\n return this.config.pec?.show === true;\r\n }\r\n get showTelefono(): boolean {\r\n return this.config.telefono?.show === true;\r\n }\r\n\r\n get capColumns(): number {\r\n return this.config.cap?.columns || 6;\r\n }\r\n get indirizzoColumns(): number {\r\n return this.config.indirizzo?.columns || 12;\r\n }\r\n get mailColumns(): number {\r\n return this.config.mail?.columns || 6;\r\n }\r\n get pecColumns(): number {\r\n return this.config.pec?.columns || 6;\r\n }\r\n get telefonoColumns(): number {\r\n return this.config.telefono?.columns || 6;\r\n }\r\n\r\n get isItalyByDefault(): boolean {\r\n return this.config.italyByDefault === true;\r\n }\r\n\r\n get isCapDisabled(): boolean {\r\n const comuneId = this.form.get('comuneId')?.value;\r\n return !comuneId || this.filteredCaps.length === 0 || this.filteredCaps.length === 1;\r\n }\r\n\r\n get isNazioneDisabled(): boolean {\r\n return this.disabled || this.config.italyByDefault === true;\r\n }\r\n\r\n get isRequired(): boolean {\r\n if (this.config.nazione?.required !== false) return true;\r\n if (!this.ngControl?.control) return false;\r\n const validator = this.ngControl.control.validator;\r\n if (validator) {\r\n const errors = validator({} as AbstractControl);\r\n return !!errors?.['required'];\r\n }\r\n return false;\r\n }\r\n\r\n // ─── Inizializzazione ──────────────────────────────────────────\r\n\r\n private async initializeComponent(): Promise<void> {\r\n try {\r\n await this.loadLocationData();\r\n this.tipologicheLoaded = true;\r\n\r\n if (this.pendingWriteValue !== null) {\r\n this.processWriteValue(this.pendingWriteValue);\r\n this.pendingWriteValue = null;\r\n } else {\r\n this.applyInitialConfiguration();\r\n }\r\n\r\n if (!this.subscriptionsInitialized) {\r\n this.setupFormSubscriptions();\r\n this.subscriptionsInitialized = true;\r\n }\r\n } catch (error) {\r\n console.error('[UiSpecificaTerritoriale] Errore inizializzazione:', error);\r\n this.tipologicheLoaded = false;\r\n }\r\n }\r\n\r\n private initializeForm(): void {\r\n this.form = this.fb.group({\r\n nazioneId: [null, Validators.required],\r\n provinciaId: [null],\r\n comuneId: [{ value: null, disabled: true }],\r\n cap: [{ value: null, disabled: true }],\r\n comuneEstero: [null],\r\n indirizzo: [null],\r\n mail: [null],\r\n pec: [null],\r\n telefono: [null],\r\n });\r\n }\r\n\r\n private setupNgControl(): void {\r\n const ngControl = this.injector.get(NgControl, null, { self: true, optional: true });\r\n if (ngControl) {\r\n this.ngControl = ngControl;\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n private async loadLocationData(): Promise<void> {\r\n const [nazioniResult, provinceResult] = await Promise.all([\r\n this.locationService.getNazioni(),\r\n this.locationService.getProvince(),\r\n ]);\r\n this.nazioni = nazioniResult.data;\r\n this.province = provinceResult.content;\r\n }\r\n\r\n // ─── Gestione writeValue ────────────────────────────────────────\r\n\r\n private processWriteValue(value: UiLocationValue | null): void {\r\n this.isInitializing = true;\r\n\r\n if (value) {\r\n const processedValue = this.handleItalyByDefaultValue(value);\r\n this.form.patchValue(processedValue, { emitEvent: false });\r\n\r\n this.updateComponentState(processedValue).then(() => {\r\n this.applyInitialConfiguration();\r\n this.isInitializing = false;\r\n this.form.patchValue(processedValue, { emitEvent: true });\r\n this.handleTerritorialChanges(\r\n processedValue.nazioneId || '',\r\n processedValue.provinciaId || '',\r\n processedValue.comuneId || '',\r\n );\r\n this.updateValidators();\r\n Object.values(this.form.controls).forEach((ctrl) => ctrl.updateValueAndValidity({ emitEvent: false }));\r\n this.form.updateValueAndValidity();\r\n });\r\n } else {\r\n this.form.reset(undefined, { emitEvent: false });\r\n this.resetComponentState();\r\n this.applyInitialConfiguration();\r\n this.isInitializing = false;\r\n }\r\n }\r\n\r\n private handleItalyByDefaultValue(value: UiLocationValue): UiLocationValue {\r\n if (!this.config.italyByDefault) return value;\r\n if (value.nazioneId && value.nazioneId !== 'ITA') {\r\n return { ...value, nazioneId: 'ITA', comuneEstero: undefined };\r\n }\r\n return value;\r\n }\r\n\r\n // ─── Subscriptions ──────────────────────────────────────────────\r\n\r\n private setupFormSubscriptions(): void {\r\n // Subscription per i cambiamenti territoriali (nazione/provincia/comune)\r\n combineLatest([\r\n this.form\r\n .get('nazioneId')!\r\n .valueChanges.pipe(startWith(this.form.get('nazioneId')!.value), distinctUntilChanged()),\r\n this.form\r\n .get('provinciaId')!\r\n .valueChanges.pipe(startWith(this.form.get('provinciaId')!.value), distinctUntilChanged()),\r\n this.form.get('comuneId')!.valueChanges.pipe(startWith(this.form.get('comuneId')!.value), distinctUntilChanged()),\r\n ])\r\n .pipe(\r\n takeUntil(this.destroy$),\r\n map(([nazioneId, provinciaId, comuneId]) => ({ nazioneId, provinciaId, comuneId })),\r\n )\r\n .subscribe(({ nazioneId, provinciaId, comuneId }) => {\r\n if (!this.isInitializing && this.tipologicheLoaded) {\r\n this.handleTerritorialChanges(nazioneId, provinciaId, comuneId);\r\n }\r\n });\r\n\r\n // Subscription per tutti i cambiamenti del form\r\n this.form.valueChanges\r\n .pipe(\r\n takeUntil(this.destroy$),\r\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)),\r\n )\r\n .subscribe((formValue) => {\r\n if (!this.isInitializing && this.tipologicheLoaded) {\r\n this.onChange(formValue);\r\n this.notifyValidationChange();\r\n }\r\n });\r\n\r\n this.cdr.detectChanges();\r\n }\r\n\r\n // ─── Logica territoriale ────────────────────────────────────────\r\n\r\n private async handleTerritorialChanges(nazioneId: string, provinciaId: string, comuneId: string): Promise<void> {\r\n this.updateNationalityState(nazioneId);\r\n await this.updateTerritorialData(provinciaId, comuneId);\r\n this.updateValidators();\r\n }\r\n\r\n private updateNationalityState(nazioneId: string): void {\r\n const nazione = this.nazioni.find((n) => n.codStatoPk === nazioneId);\r\n this.isItalian = nazione?.codStatoPk === 'ITA';\r\n this.isForeign = !!(nazione && nazione.codStatoPk !== 'ITA');\r\n }\r\n\r\n private async updateTerritorialData(provinciaId: string, comuneId: string): Promise<void> {\r\n if (this.isItalian && provinciaId) {\r\n await this.updateFilteredComuni(provinciaId);\r\n } else {\r\n this.filteredComuni = [];\r\n }\r\n\r\n if (this.isItalian && comuneId) {\r\n await this.updateFilteredCaps(comuneId);\r\n } else {\r\n this.filteredCaps = [];\r\n }\r\n\r\n this.applyFieldsDisabledState();\r\n }\r\n\r\n private async updateFilteredComuni(provinciaId: string): Promise<void> {\r\n if (!provinciaId) {\r\n this.filteredComuni = [];\r\n return;\r\n }\r\n try {\r\n this.filteredComuni = await this.locationService.getComuniByProvincia(provinciaId);\r\n const currentComuneId = this.form.get('comuneId')?.value;\r\n if (currentComuneId && !this.filteredComuni.find((c) => c.codiceComunePk === currentComuneId)) {\r\n this.form.patchValue({ comuneId: null }, { emitEvent: false });\r\n }\r\n } catch {\r\n this.filteredComuni = [];\r\n }\r\n }\r\n\r\n private async updateFilteredCaps(comuneId: string): Promise<void> {\r\n if (!comuneId) {\r\n this.filteredCaps = [];\r\n this.form.patchValue({ cap: null }, { emitEvent: true });\r\n return;\r\n }\r\n\r\n const caps = await this.locationService.getCapList(comuneId);\r\n this.filteredCaps = caps.map((capCode) => ({ id: capCode, codice: capCode, comuneId }));\r\n\r\n const currentCap = this.form.get('cap')?.value;\r\n if (this.filteredCaps.length === 1) {\r\n this.form.patchValue({ cap: this.filteredCaps[0].id }, { emitEvent: true });\r\n } else if (this.filteredCaps.length > 1) {\r\n if (!currentCap || !this.filteredCaps.some((c) => c.id === currentCap)) {\r\n this.form.patchValue({ cap: null }, { emitEvent: true });\r\n }\r\n } else {\r\n this.form.patchValue({ cap: null }, { emitEvent: true });\r\n }\r\n }\r\n\r\n private async updateComponentState(value: UiLocationValue): Promise<void> {\r\n this.updateNationalityState(value.nazioneId || '');\r\n await this.updateFilteredComuni(value.provinciaId || '');\r\n await this.updateFilteredCaps(value.comuneId || '');\r\n this.applyFieldsDisabledState();\r\n this.updateValidators();\r\n }\r\n\r\n // ─── Stato campi ───────────────────────────────────────────────\r\n\r\n private applyFieldsDisabledState(): void {\r\n if (this.disabled) {\r\n this.form.disable({ emitEvent: false });\r\n return;\r\n }\r\n\r\n const comuneControl = this.form.get('comuneId');\r\n const capControl = this.form.get('cap');\r\n const nazioneControl = this.form.get('nazioneId');\r\n\r\n // Comune abilitato solo se Italia + provincia selezionata\r\n if (this.isItalian && this.form.get('provinciaId')?.value) {\r\n comuneControl?.enable({ emitEvent: false });\r\n } else {\r\n comuneControl?.disable({ emitEvent: false });\r\n }\r\n\r\n // CAP segue logica specifica\r\n if (this.isCapDisabled) {\r\n capControl?.disable({ emitEvent: false });\r\n } else {\r\n capControl?.enable({ emitEvent: false });\r\n }\r\n\r\n // Nazione disabilitata se italyByDefault\r\n if (this.isItalyByDefault) {\r\n nazioneControl?.disable({ emitEvent: false });\r\n } else {\r\n nazioneControl?.enable({ emitEvent: false });\r\n }\r\n }\r\n\r\n // ─── Validazione dinamica ──────────────────────────────────────\r\n\r\n private updateValidators(): void {\r\n const controls: Record<string, AbstractControl | null> = {\r\n nazione: this.form.get('nazioneId'),\r\n provincia: this.form.get('provinciaId'),\r\n comune: this.form.get('comuneId'),\r\n comuneEstero: this.form.get('comuneEstero'),\r\n cap: this.form.get('cap'),\r\n indirizzo: this.form.get('indirizzo'),\r\n mail: this.form.get('mail'),\r\n pec: this.form.get('pec'),\r\n telefono: this.form.get('telefono'),\r\n };\r\n\r\n // Pulisci tutti i validatori\r\n Object.values(controls).forEach((c) => c?.clearValidators());\r\n\r\n // Nazione\r\n if (this.config.nazione?.required !== false) {\r\n controls['nazione']?.setValidators(Validators.required);\r\n }\r\n\r\n if (this.isItalian) {\r\n if (this.config.provincia?.required !== false) {\r\n controls['provincia']?.setValidators(Validators.required);\r\n }\r\n if (this.config.comune?.required !== false) {\r\n controls['comune']?.setValidators(Validators.required);\r\n }\r\n if (this.config.cap?.required && this.showCAP) {\r\n controls['cap']?.setValidators(Validators.required);\r\n }\r\n if (this.config.indirizzo?.required && this.showIndirizzo) {\r\n controls['indirizzo']?.setValidators(Validators.required);\r\n }\r\n this.applyContactValidators(controls);\r\n } else if (this.isForeign) {\r\n if (this.config.comuneEstero?.required !== false) {\r\n controls['comuneEstero']?.setValidators(Validators.required);\r\n }\r\n }\r\n\r\n // Aggiorna senza emettere eventi\r\n Object.values(controls).forEach((c) => c?.updateValueAndValidity({ emitEvent: false }));\r\n this.notifyValidationChange();\r\n }\r\n\r\n private applyContactValidators(controls: Record<string, AbstractControl | null>): void {\r\n if (this.config.mail?.required && this.showMail) {\r\n controls['mail']?.setValidators([Validators.required, Validators.pattern(this.EMAIL_PATTERN)]);\r\n } else if (this.showMail) {\r\n controls['mail']?.setValidators([Validators.pattern(this.EMAIL_PATTERN)]);\r\n }\r\n\r\n if (this.config.pec?.required && this.showPEC) {\r\n controls['pec']?.setValidators([Validators.required, Validators.pattern(this.PEC_PATTERN)]);\r\n } else if (this.showPEC) {\r\n controls['pec']?.setValidators([Validators.pattern(this.PEC_PATTERN)]);\r\n }\r\n\r\n if (this.config.telefono?.required && this.showTelefono) {\r\n controls['telefono']?.setValidators([Validators.required, Validators.pattern(this.PHONE_PATTERN)]);\r\n } else if (this.showTelefono) {\r\n controls['telefono']?.setValidators([Validators.pattern(this.PHONE_PATTERN)]);\r\n }\r\n }\r\n\r\n private validateContactFields(errors: ValidationErrors): void {\r\n if (this.config.mail?.required && this.showMail) {\r\n const v = this.form.get('mail')?.value;\r\n if (!v || v.trim() === '') {\r\n errors['mailRequired'] = \"Inserisci l'email\";\r\n } else if (!this.EMAIL_PATTERN.test(v)) {\r\n errors['mailInvalid'] = \"Inserisci un'email valida\";\r\n }\r\n }\r\n if (this.config.pec?.required && this.showPEC) {\r\n const v = this.form.get('pec')?.value;\r\n if (!v || v.trim() === '') {\r\n errors['pecRequired'] = 'Inserisci la PEC';\r\n } else if (!this.PEC_PATTERN.test(v)) {\r\n errors['pecInvalid'] = 'Inserisci una PEC valida';\r\n }\r\n }\r\n if (this.config.telefono?.required && this.showTelefono) {\r\n const v = this.form.get('telefono')?.value;\r\n if (!v || v.trim() === '') {\r\n errors['telefonoRequired'] = 'Inserisci il telefono';\r\n } else if (!this.PHONE_PATTERN.test(v)) {\r\n errors['telefonoInvalid'] = 'Inserisci un numero di telefono valido';\r\n }\r\n }\r\n }\r\n\r\n // ─── Configurazione iniziale ───────────────────────────────────\r\n\r\n private applyInitialConfiguration(): void {\r\n const nazioneControl = this.form.get('nazioneId');\r\n const currentNazioneId = nazioneControl?.value;\r\n\r\n if (this.config.italyByDefault) {\r\n const italia = this.nazioni.find((n) => n.codStatoPk === 'ITA');\r\n if (italia && (!currentNazioneId || currentNazioneId !== 'ITA')) {\r\n this.form.patchValue({ nazioneId: italia.codStatoPk }, { emitEvent: false });\r\n }\r\n this.updateNationalityState('ITA');\r\n nazioneControl?.disable({ emitEvent: false });\r\n } else {\r\n if (currentNazioneId) this.updateNationalityState(currentNazioneId);\r\n if (!this.disabled) nazioneControl?.enable({ emitEvent: false });\r\n }\r\n\r\n this.updateValidators();\r\n }\r\n\r\n private notifyValidationChange(): void {\r\n if (this.onValidatorChange) {\r\n setTimeout(() => this.onValidatorChange(), 0);\r\n }\r\n }\r\n}\r\n","<!--\r\n Componente per la selezione di dati geografici (Italia/Estero).\r\n Utilizza il flow control moderno di Angular (@if, @for).\r\n-->\r\n<div\r\n class=\"ui-location\"\r\n [formGroup]=\"form\"\r\n [class.ui-location--foreign]=\"isForeign\"\r\n [class.ui-location--italian]=\"isItalian\"\r\n>\r\n <!-- ==================== NAZIONE ==================== -->\r\n <div class=\"ui-location__field-row\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n class=\"ui-location__full-width\"\r\n [class.ui-location__italy-default]=\"config.italyByDefault\"\r\n >\r\n <mat-label>{{ labels.nazione }}</mat-label>\r\n <mat-select\r\n formControlName=\"nazioneId\"\r\n [disabled]=\"disabled || isNazioneDisabled\"\r\n (blur)=\"onBlur()\"\r\n aria-label=\"Seleziona nazione\"\r\n >\r\n <mat-option [value]=\"null\">Seleziona nazione</mat-option>\r\n @for (nazione of nazioni; track nazione.codStatoPk) {\r\n <mat-option [value]=\"nazione.codStatoPk\">\r\n {{ nazione.descrizione }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (shouldShowFieldErrors('nazioneId')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('nazioneId'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- ==================== CAMPI ITALIA ==================== -->\r\n @if (isItalian) {\r\n <div class=\"ui-location__provincia-comune\">\r\n <!-- Provincia -->\r\n <div class=\"ui-location__field-row\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.provincia }}</mat-label>\r\n <mat-select\r\n formControlName=\"provinciaId\"\r\n [disabled]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n aria-label=\"Seleziona provincia\"\r\n >\r\n <mat-option [value]=\"null\">Seleziona provincia</mat-option>\r\n @for (prov of province; track prov.codiceProvinciaPk) {\r\n <mat-option [value]=\"prov.codiceProvinciaPk\">\r\n {{ prov.nomeProvincia }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (shouldShowFieldErrors('provinciaId')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('provinciaId'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- Comune -->\r\n <div class=\"ui-location__field-row\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.comune }}</mat-label>\r\n <mat-select\r\n formControlName=\"comuneId\"\r\n [disabled]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n aria-label=\"Seleziona comune\"\r\n >\r\n <mat-option [value]=\"null\">Seleziona comune</mat-option>\r\n @for (comune of filteredComuni; track comune.codiceComunePk) {\r\n <mat-option [value]=\"comune.codiceComunePk\">\r\n {{ comune.nomeComune }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (shouldShowFieldErrors('comuneId')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('comuneId'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== GRIGLIA CAMPI DINAMICI ==================== -->\r\n <div class=\"ui-location__dynamic-grid\">\r\n <!-- CAP -->\r\n @if (showCAP && isItalian) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + capColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.cap }}</mat-label>\r\n <mat-select\r\n formControlName=\"cap\"\r\n [disabled]=\"disabled || isCapDisabled\"\r\n (blur)=\"onBlur()\"\r\n aria-label=\"Seleziona CAP\"\r\n >\r\n <mat-option [value]=\"null\">Seleziona CAP</mat-option>\r\n @for (cap of filteredCaps; track cap.id) {\r\n <mat-option [value]=\"cap.id\">{{ cap.codice }}</mat-option>\r\n }\r\n </mat-select>\r\n @if (shouldShowFieldErrors('cap')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('cap'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <!-- Indirizzo -->\r\n @if (showIndirizzo) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + indirizzoColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.indirizzo }}</mat-label>\r\n <input\r\n matInput\r\n formControlName=\"indirizzo\"\r\n placeholder=\"Via, numero civico\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('indirizzo')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('indirizzo'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <!-- Mail -->\r\n @if (showMail) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + mailColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.mail }}</mat-label>\r\n <input\r\n matInput\r\n type=\"email\"\r\n formControlName=\"mail\"\r\n placeholder=\"esempio@email.com\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('mail')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('mail'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <!-- PEC -->\r\n @if (showPEC) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + pecColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.pec }}</mat-label>\r\n <input\r\n matInput\r\n type=\"email\"\r\n formControlName=\"pec\"\r\n placeholder=\"esempio@pec.it\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('pec')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('pec'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <!-- Telefono -->\r\n @if (showTelefono) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + telefonoColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.telefono }}</mat-label>\r\n <input\r\n matInput\r\n type=\"tel\"\r\n formControlName=\"telefono\"\r\n placeholder=\"+39 123 456 7890\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('telefono')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('telefono'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- ==================== CAMPO ESTERO ==================== -->\r\n @if (isForeign) {\r\n <div class=\"ui-location__field-row\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.comuneEstero }}</mat-label>\r\n <input\r\n matInput\r\n formControlName=\"comuneEstero\"\r\n placeholder=\"Inserisci citta/comune\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('comuneEstero')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('comuneEstero'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n forwardRef,\r\n OnInit,\r\n OnDestroy,\r\n OnChanges,\r\n SimpleChanges,\r\n ChangeDetectorRef,\r\n ViewChild,\r\n Injector,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n NG_VALIDATORS,\r\n Validator,\r\n AbstractControl,\r\n ValidationErrors,\r\n FormControl,\r\n NgControl,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { MatTableModule, MatTableDataSource } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiSpecificaTerritorialeComponent } from '../specifica-territoriale/specifica-territoriale.component';\r\nimport { UiLocationService } from '../../services/location.service';\r\nimport { UiButtonAreaComponent, UiButtonDescriptor } from '../../../button/index';\r\nimport {\r\n UiLocationTableConfig,\r\n UiLocationRow,\r\n UiLocationConfig,\r\n UiLocationValue,\r\n} from '../../types/territoriale.types';\r\n\r\n/**\r\n * Componente standalone per la gestione tabellare di location multiple.\r\n *\r\n * Permette l'inserimento, la modifica e l'eliminazione di righe\r\n * territoriali (italiane o estere) tramite una tabella Material\r\n * con form inline basato su `UiSpecificaTerritorialeComponent`.\r\n *\r\n * Implementa `ControlValueAccessor` e `Validator` per l'integrazione\r\n * con Angular Reactive Forms. Il valore e un array di `UiLocationRow`.\r\n *\r\n * @selector ui-table-territoriale\r\n *\r\n * @example\r\n * ```html\r\n * <ui-table-territoriale\r\n * [formControl]=\"sedeControl\"\r\n * [config]=\"{\r\n * tableLabel: 'Sedi operative',\r\n * subFieldConfig: { italyByDefault: true, cap: { show: true } }\r\n * }\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-table-territoriale',\r\n standalone: true,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatTableModule,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n UiSpecificaTerritorialeComponent,\r\n UiButtonAreaComponent,\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiTableTerritorialeComponent),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => UiTableTerritorialeComponent),\r\n multi: true,\r\n },\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: './table-territoriale.component.html',\r\n styleUrl: './table-territoriale.component.scss',\r\n})\r\nexport class UiTableTerritorialeComponent implements ControlValueAccessor, Validator, OnInit, OnDestroy, OnChanges {\r\n /** Configurazione della tabella. */\r\n @Input() config: UiLocationTableConfig = {};\r\n\r\n /** Stato disabilitato globale. */\r\n @Input() disabled = false;\r\n\r\n // ─── Stato interno ──────────────────────────────────────────────\r\n\r\n /** Righe della tabella. */\r\n rows: UiLocationRow[] = [];\r\n /** DataSource Material per la tabella. */\r\n dataSource = new MatTableDataSource<UiLocationRow>([]);\r\n\r\n /** Modalita editing attiva. */\r\n editMode = false;\r\n /** Modalita inserimento attiva. */\r\n insertMode = false;\r\n /** Riga in modifica. */\r\n editingRow: UiLocationRow | null = null;\r\n /** Indice della riga in modifica. */\r\n editingIndex: number | null = null;\r\n\r\n /** Colonne visualizzate nella tabella. */\r\n displayedColumns: string[] = [];\r\n /** Configurazione delle colonne. */\r\n columnConfig: Record<string, { label: string; show: boolean }> = {};\r\n\r\n /** Pulsanti per il form di inserimento/modifica. */\r\n formButtons: UiButtonDescriptor[] = [];\r\n /** Pulsante per aggiungere una nuova riga. */\r\n addButton: UiButtonDescriptor[] = [];\r\n\r\n /** NgControl per accedere alla validazione del form parent. */\r\n ngControl: NgControl | null = null;\r\n\r\n @ViewChild(UiSpecificaTerritorialeComponent)\r\n specificaForm!: UiSpecificaTerritorialeComponent;\r\n\r\n private readonly destroy$ = new Subject<void>();\r\n private onChange = (_value: UiLocationRow[]) => {};\r\n private onTouched = () => {};\r\n private onValidatorChange = () => {};\r\n\r\n constructor(\r\n private readonly cdr: ChangeDetectorRef,\r\n private readonly injector: Injector,\r\n private readonly locationService: UiLocationService,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.ngControl = this.injector.get(NgControl, null, { optional: true, self: true });\r\n this.initializeColumns();\r\n this.calculateActions();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config'] && !changes['config'].firstChange) {\r\n this.initializeColumns();\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n // ─── ControlValueAccessor ───────────────────────────────────────\r\n\r\n writeValue(value: UiLocationRow[] | null): void {\r\n this.rows = value ? [...value] : [];\r\n this.dataSource.data = this.rows;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n registerOnChange(fn: (value: UiLocationRow[]) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n // ─── Validator ──────────────────────────────────────────────────\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n if (control?.validator) {\r\n const errors = control.validator({} as AbstractControl);\r\n if (errors?.['required'] && (!this.rows || this.rows.length === 0)) {\r\n return { required: true };\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // ─── Getter calcolati ───────────────────────────────────────────\r\n\r\n get isRequired(): boolean {\r\n if (!this.ngControl?.control) return false;\r\n const validator = this.ngControl.control.validator;\r\n if (validator) {\r\n const errors = validator({} as AbstractControl);\r\n return !!errors?.['required'];\r\n }\r\n return false;\r\n }\r\n\r\n get hasValidationErrors(): boolean {\r\n return !!(this.ngControl?.control?.invalid && (this.ngControl.control.touched || this.ngControl.control.dirty));\r\n }\r\n\r\n get validationErrors(): string[] {\r\n if (!this.hasValidationErrors || !this.ngControl?.control?.errors) return [];\r\n const errors: string[] = [];\r\n if (this.ngControl.control.errors['required']) {\r\n errors.push(this.config.requiredMessage || 'Aggiungere almeno un elemento');\r\n }\r\n return errors;\r\n }\r\n\r\n // ─── Colonne dinamiche ─────────────────────────────────────────\r\n\r\n private initializeColumns(): void {\r\n const subConfig = this.config.subFieldConfig || {};\r\n\r\n // Colonne base - nasconde 'stato' quando italyByDefault e true\r\n this.columnConfig = {\r\n stato: { label: 'Stato', show: !subConfig.italyByDefault },\r\n provincia: { label: 'Provincia', show: true },\r\n comune: { label: 'Comune', show: true },\r\n };\r\n\r\n // Colonne dinamiche dalla configurazione\r\n if (subConfig.cap?.show) {\r\n this.columnConfig['cap'] = { label: subConfig.labels?.cap || 'CAP', show: true };\r\n }\r\n if (subConfig.indirizzo?.show) {\r\n this.columnConfig['indirizzo'] = { label: subConfig.labels?.indirizzo || 'Indirizzo', show: true };\r\n }\r\n if (subConfig.mail?.show) {\r\n this.columnConfig['mail'] = { label: subConfig.labels?.mail || 'Email', show: true };\r\n }\r\n if (subConfig.pec?.show) {\r\n this.columnConfig['pec'] = { label: subConfig.labels?.pec || 'PEC', show: true };\r\n }\r\n if (subConfig.telefono?.show) {\r\n this.columnConfig['telefono'] = { label: subConfig.labels?.telefono || 'Telefono', show: true };\r\n }\r\n\r\n // Colonna azioni sempre alla fine\r\n this.columnConfig['azioni'] = { label: 'Azioni', show: true };\r\n\r\n this.displayedColumns = Object.keys(this.columnConfig).filter((key) => this.columnConfig[key].show);\r\n }\r\n\r\n // ─── Azioni CRUD ───────────────────────────────────────────────\r\n\r\n /** Attiva la modalita inserimento. */\r\n activateInsertMode(): void {\r\n this.insertMode = true;\r\n this.editMode = false;\r\n this.editingRow = null;\r\n this.editingIndex = null;\r\n this.calculateActions();\r\n this.cdr.detectChanges();\r\n\r\n // Attende l'inizializzazione completa del componente figlio prima\r\n // di resettare il form. writeValue(null) gestisce internamente sia\r\n // il reset sia la riapplicazione della configurazione iniziale\r\n // (es. italyByDefault), quindi non serve chiamare resetComponentState()\r\n // separatamente (altrimenti annullerebbe lo stato impostato).\r\n setTimeout(async () => {\r\n if (this.specificaForm) {\r\n if (this.specificaForm.initializationPromise) {\r\n await this.specificaForm.initializationPromise;\r\n }\r\n this.specificaForm.writeValue(null);\r\n this.cdr.detectChanges();\r\n }\r\n }, 0);\r\n }\r\n\r\n /** Attiva la modalita modifica per una riga. */\r\n editRow(row: UiLocationRow, index: number): void {\r\n this.editMode = true;\r\n this.insertMode = false;\r\n this.editingRow = { ...row };\r\n this.editingIndex = index;\r\n this.calculateActions();\r\n this.cdr.detectChanges();\r\n\r\n // Attende l'inizializzazione completa del componente figlio\r\n // prima di scrivere il valore per la modifica.\r\n setTimeout(async () => {\r\n if (this.specificaForm) {\r\n if (this.specificaForm.initializationPromise) {\r\n await this.specificaForm.initializationPromise;\r\n }\r\n this.specificaForm.writeValue(this.mapRowToFormValue(row));\r\n this.cdr.detectChanges();\r\n }\r\n }, 0);\r\n }\r\n\r\n /** Annulla l'operazione in corso (inserimento o modifica). */\r\n cancelEdit(): void {\r\n this.editMode = false;\r\n this.insertMode = false;\r\n this.editingRow = null;\r\n this.editingIndex = null;\r\n this.calculateActions();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Rimuove una riga dalla tabella. */\r\n removeRow(index: number): void {\r\n this.rows.splice(index, 1);\r\n this.dataSource.data = this.rows;\r\n this.propagateChange();\r\n this.markAsTouched();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Salva la riga corrente (nuova o in modifica). */\r\n async saveRow(): Promise<void> {\r\n if (!this.specificaForm?.form.valid) {\r\n this.specificaForm?.markAsTouched();\r\n return;\r\n }\r\n\r\n const rawValue: UiLocationValue = this.specificaForm.form.getRawValue();\r\n const finalValue = rawValue.nazioneId || rawValue.cap ? rawValue : this.specificaForm.form.value;\r\n\r\n const row = await this.mapFormValueToRow(finalValue);\r\n\r\n if (this.editMode && this.editingIndex !== null) {\r\n row.refId = this.rows[this.editingIndex].refId;\r\n this.rows[this.editingIndex] = row;\r\n } else {\r\n row.refId = this.generateUUID();\r\n this.rows.push(row);\r\n }\r\n\r\n this.dataSource.data = this.rows;\r\n this.cancelEdit();\r\n this.propagateChange();\r\n this.markAsTouched();\r\n this.calculateActions();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Marca il componente come touched. */\r\n markAsTouched(): void {\r\n this.onTouched();\r\n this.ngControl?.control?.markAsTouched();\r\n }\r\n\r\n /** Resetta lo stato del componente. */\r\n resetComponentState(): void {\r\n this.rows = [];\r\n this.dataSource.data = this.rows;\r\n this.insertMode = false;\r\n this.editMode = false;\r\n this.editingRow = null;\r\n this.editingIndex = null;\r\n this.specificaForm?.resetComponentState();\r\n this.onChange(this.rows);\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Funzione track by per la tabella. */\r\n trackByFn(_index: number, item: UiLocationRow): string {\r\n return item.refId || String(_index);\r\n }\r\n\r\n // ─── Mappatura dati ────────────────────────────────────────────\r\n\r\n private mapRowToFormValue(row: UiLocationRow): UiLocationValue {\r\n if (row.stato?.codStatoPk === 'ITA') {\r\n return {\r\n nazioneId: 'ITA',\r\n provinciaId: row.provincia?.codiceProvinciaPk,\r\n comuneId: row.comuni?.codiceComunePk,\r\n cap: row.cap,\r\n indirizzo: row.indirizzo,\r\n mail: row.mail,\r\n pec: row.pec,\r\n telefono: row.telefono,\r\n };\r\n }\r\n return {\r\n nazioneId: row.stato?.codStatoPk,\r\n comuneEstero: row.comuniEsteri?.[0],\r\n indirizzo: row.indirizzo,\r\n mail: row.mail,\r\n pec: row.pec,\r\n telefono: row.telefono,\r\n };\r\n }\r\n\r\n private async mapFormValueToRow(value: UiLocationValue): Promise<UiLocationRow> {\r\n // Se italyByDefault e nazioneId mancante, forza ITA\r\n if (!value.nazioneId && this.config.subFieldConfig?.italyByDefault) {\r\n value.nazioneId = 'ITA';\r\n }\r\n\r\n try {\r\n const stato = await this.locationService.getLocationFullData('nazione', value.nazioneId!);\r\n\r\n if (value.nazioneId === 'ITA') {\r\n let provincia = null;\r\n let comune = null;\r\n\r\n if (value.provinciaId) {\r\n provincia = await this.locationService.getLocationFullData('provincia', value.provinciaId);\r\n }\r\n if (value.comuneId && value.provinciaId) {\r\n comune = await this.locationService.getLocationFullData('comune', value.comuneId, value.provinciaId);\r\n }\r\n\r\n return {\r\n stato,\r\n provincia,\r\n comuni: comune,\r\n comuniEsteri: [],\r\n cap: value.cap,\r\n indirizzo: value.indirizzo,\r\n mail: value.mail,\r\n pec: value.pec,\r\n telefono: value.telefono,\r\n };\r\n }\r\n\r\n return {\r\n stato,\r\n provincia: undefined,\r\n comuni: undefined,\r\n comuniEsteri: value.comuneEstero ? [value.comuneEstero] : [],\r\n indirizzo: value.indirizzo,\r\n mail: value.mail,\r\n pec: value.pec,\r\n telefono: value.telefono,\r\n };\r\n } catch (error) {\r\n console.error('[UiTableTerritoriale] Errore caricamento dati location:', error);\r\n return {\r\n stato: value.nazioneId ? { codStatoPk: value.nazioneId, descrizione: value.nazioneId } : undefined,\r\n provincia: value.provinciaId ? { codiceProvinciaPk: value.provinciaId } : undefined,\r\n comuni: value.comuneId ? { codiceComunePk: value.comuneId } : undefined,\r\n comuniEsteri: value.comuneEstero ? [value.comuneEstero] : [],\r\n cap: value.cap,\r\n indirizzo: value.indirizzo,\r\n mail: value.mail,\r\n pec: value.pec,\r\n telefono: value.telefono,\r\n };\r\n }\r\n }\r\n\r\n // ─── Utilita ───────────────────────────────────────────────────\r\n\r\n private propagateChange(): void {\r\n this.onChange([...this.rows]);\r\n this.onValidatorChange();\r\n }\r\n\r\n private generateUUID(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0; // NOSONAR - Used for non-cryptographic UUID generation in UI table rows\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n }\r\n\r\n private calculateActions(): void {\r\n this.calculateFormButtons();\r\n this.calculateAddButton();\r\n }\r\n\r\n private calculateFormButtons(): void {\r\n if (!this.editMode && !this.insertMode) {\r\n this.formButtons = [];\r\n return;\r\n }\r\n this.formButtons = [\r\n { label: 'Annulla', variant: 'outline', action: () => this.cancelEdit() },\r\n { label: 'Salva', variant: 'primary', action: () => this.saveRow() },\r\n ];\r\n }\r\n\r\n private calculateAddButton(): void {\r\n if (this.editMode || this.insertMode) {\r\n this.addButton = [];\r\n return;\r\n }\r\n this.addButton = [\r\n {\r\n label: this.config.emptyCtaLabel || 'Aggiungi un luogo',\r\n variant: 'outline',\r\n action: () => this.activateInsertMode(),\r\n },\r\n ];\r\n }\r\n}\r\n","<!--\r\n Tabella CRUD per location multiple.\r\n Utilizza UiSpecificaTerritorialeComponent per il form inline di aggiunta/modifica.\r\n-->\r\n<div\r\n class=\"ui-location-table\"\r\n [class.ui-location-table--has-errors]=\"hasValidationErrors\"\r\n>\r\n <!-- ==================== LABEL ==================== -->\r\n <p\r\n class=\"ui-location-table__label\"\r\n [class.ui-location-table__label--invalid]=\"hasValidationErrors\"\r\n >\r\n {{ config.tableLabel || 'Tabella territoriale' }}\r\n @if (isRequired) {\r\n <span class=\"ui-location-table__required\">*</span>\r\n }\r\n </p>\r\n\r\n <!-- ==================== STATO VUOTO ==================== -->\r\n @if (rows.length === 0 && !insertMode && !editMode) {\r\n <div class=\"ui-location-table__empty\">\r\n <span class=\"ui-location-table__empty-text\">\r\n {{ config.emptyPrompt || 'Nessun luogo aggiunto' }}\r\n </span>\r\n <div class=\"ui-location-table__empty-actions\">\r\n @if (hasValidationErrors) {\r\n <div class=\"ui-location-table__validation-errors\">\r\n @for (error of validationErrors; track $index) {\r\n <div class=\"ui-location-table__error-msg\">\r\n <lucide-icon name=\"alert-circle\" [size]=\"14\" />\r\n {{ error }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n <ui-button-area [buttons]=\"addButton\" align=\"end\" />\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- ==================== TABELLA ==================== -->\r\n @if (rows.length > 0 && !insertMode && !editMode) {\r\n <div class=\"ui-location-table__container\">\r\n <table mat-table [dataSource]=\"dataSource\" class=\"ui-location-table__table\" [trackBy]=\"trackByFn\">\r\n @for (column of displayedColumns; track column) {\r\n <ng-container [matColumnDef]=\"column\">\r\n <th\r\n mat-header-cell *matHeaderCellDef\r\n [style.text-align]=\"column === 'azioni' ? 'right' : 'left'\"\r\n >\r\n {{ columnConfig[column].label }}\r\n </th>\r\n <td\r\n mat-cell *matCellDef=\"let row; let i = index\"\r\n [style.text-align]=\"column === 'azioni' ? 'right' : 'left'\"\r\n >\r\n <!-- Stato -->\r\n @if (column === 'stato') {\r\n @if (row.stato?.codStatoPk === 'ITA') {\r\n Italia\r\n } @else if (row.stato?.codStatoPk) {\r\n {{ row.stato.descrizione }} ({{ row.stato.codStatoPk }})\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Provincia -->\r\n @if (column === 'provincia') {\r\n @if (row.stato?.codStatoPk === 'ITA') {\r\n @if (row.provincia?.nomeProvincia) {\r\n {{ row.provincia.nomeProvincia }}\r\n @if (row.provincia.siglaProvincia) {\r\n ({{ row.provincia.siglaProvincia }})\r\n }\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">Non specificata</span>\r\n }\r\n } @else if (row.stato?.codStatoPk) {\r\n <span class=\"ui-location-table__foreign-tag\">ESTERO</span>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Comune -->\r\n @if (column === 'comune') {\r\n @if (row.stato?.codStatoPk === 'ITA') {\r\n @if (row.comuni?.nomeComune) {\r\n {{ row.comuni.nomeComune }}\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n } @else if (row.comuniEsteri && row.comuniEsteri.length > 0) {\r\n {{ row.comuniEsteri.join(', ') }}\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- CAP -->\r\n @if (column === 'cap') {\r\n @if (row.cap) {\r\n <span class=\"ui-location-table__cap\">{{ row.cap }}</span>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Indirizzo -->\r\n @if (column === 'indirizzo') {\r\n @if (row.indirizzo) {\r\n <span class=\"ui-location-table__address\" [title]=\"row.indirizzo\">\r\n {{ row.indirizzo.length > 30 ? row.indirizzo.substring(0, 30) + '...' : row.indirizzo }}\r\n </span>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Mail -->\r\n @if (column === 'mail') {\r\n @if (row.mail) {\r\n <a [href]=\"'mailto:' + row.mail\" class=\"ui-location-table__link ui-location-table__link--email\"\r\n [title]=\"row.mail\" (click)=\"$event.stopPropagation()\">\r\n <lucide-icon name=\"mail\" [size]=\"14\" />\r\n {{ row.mail.length > 25 ? row.mail.substring(0, 25) + '...' : row.mail }}\r\n </a>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- PEC -->\r\n @if (column === 'pec') {\r\n @if (row.pec) {\r\n <a [href]=\"'mailto:' + row.pec\" class=\"ui-location-table__link ui-location-table__link--pec\"\r\n [title]=\"row.pec\" (click)=\"$event.stopPropagation()\">\r\n <lucide-icon name=\"shield-check\" [size]=\"14\" />\r\n {{ row.pec.length > 25 ? row.pec.substring(0, 25) + '...' : row.pec }}\r\n </a>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Telefono -->\r\n @if (column === 'telefono') {\r\n @if (row.telefono) {\r\n <a [href]=\"'tel:' + row.telefono\" class=\"ui-location-table__link ui-location-table__link--phone\"\r\n [title]=\"row.telefono\" (click)=\"$event.stopPropagation()\">\r\n <lucide-icon name=\"phone\" [size]=\"14\" />\r\n {{ row.telefono }}\r\n </a>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Azioni -->\r\n @if (column === 'azioni') {\r\n <div class=\"ui-location-table__actions\">\r\n <button\r\n class=\"ui-location-table__action-btn ui-location-table__action-btn--edit\"\r\n (click)=\"editRow(row, i)\"\r\n [disabled]=\"disabled\"\r\n [matTooltip]=\"'Modifica'\"\r\n type=\"button\"\r\n aria-label=\"Modifica riga\"\r\n >\r\n <lucide-icon name=\"pencil\" [size]=\"16\" />\r\n </button>\r\n <button\r\n class=\"ui-location-table__action-btn ui-location-table__action-btn--delete\"\r\n (click)=\"removeRow(i)\"\r\n [disabled]=\"disabled\"\r\n [matTooltip]=\"'Elimina'\"\r\n type=\"button\"\r\n aria-label=\"Elimina riga\"\r\n >\r\n <lucide-icon name=\"trash-2\" [size]=\"16\" />\r\n </button>\r\n </div>\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\r\n </table>\r\n </div>\r\n\r\n <!-- Pulsante aggiungi sotto la tabella -->\r\n <div class=\"ui-location-table__add-area\">\r\n <ui-button-area [buttons]=\"addButton\" align=\"end\" />\r\n </div>\r\n }\r\n\r\n <!-- ==================== FORM AGGIUNGI/MODIFICA ==================== -->\r\n @if (insertMode || editMode) {\r\n <div class=\"ui-location-table__form\">\r\n <ui-specifica-territoriale\r\n [config]=\"config.subFieldConfig || {}\"\r\n [disabled]=\"disabled\"\r\n #specificaForm\r\n />\r\n <div class=\"ui-location-table__form-actions\">\r\n <ui-button-area [buttons]=\"formButtons\" align=\"end\" />\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Observable, map } from 'rxjs';\r\nimport type {\r\n UiGeocodedForeignDetails,\r\n UiGeocodedItalianDetails,\r\n UiGeocodedLocationType,\r\n UiLocationGeocodedFieldConfig,\r\n} from '../types/geocoded-location.types';\r\n\r\n/** Risposta elementare dell'API search di Nominatim (format=json). */\r\ninterface NominatimSearchItem {\r\n place_id: number;\r\n lat: string;\r\n lon: string;\r\n display_name: string;\r\n importance?: number;\r\n boundingbox?: [string, string, string, string];\r\n address?: Record<string, string>;\r\n}\r\n\r\nconst DEFAULT_BASE = 'https://nominatim.openstreetmap.org';\r\n\r\n/**\r\n * Integrazione con l'API pubblica Nominatim (OpenStreetMap) per la ricerca indirizzi.\r\n * Mappa i risultati sul tipo {@link UiGeocodedLocationType}.\r\n *\r\n * In browser è consigliato usare un proxy same-origin per CORS e User-Agent;\r\n * vedi {@link UiLocationGeocodedFieldConfig.nominatimBaseUrl}.\r\n *\r\n * @providedIn root\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiNominatimGeocodingService {\r\n private readonly http = inject(HttpClient);\r\n\r\n /**\r\n * Cerca indirizzi in base alla query testuale.\r\n *\r\n * @param query - Testo libero inserito dall'utente\r\n * @param config - Opzioni di ricerca e base URL\r\n */\r\n search(query: string, config: UiLocationGeocodedFieldConfig = {}): Observable<UiGeocodedLocationType[]> {\r\n const trimmed = query.trim();\r\n const base = (config.nominatimBaseUrl ?? DEFAULT_BASE).replace(/\\/$/, '');\r\n const limit = config.limit ?? 5;\r\n\r\n let params = new HttpParams()\r\n .set('q', trimmed)\r\n .set('format', 'json')\r\n .set('addressdetails', '1')\r\n .set('limit', String(limit));\r\n\r\n if (config.biasCountry) {\r\n params = params.set('countrycodes', config.biasCountry.toLowerCase());\r\n }\r\n\r\n if (config.biasProximity) {\r\n const { lat, lng } = config.biasProximity;\r\n const pad = 0.05;\r\n const left = lng - pad;\r\n const right = lng + pad;\r\n const top = lat + pad;\r\n const bottom = lat - pad;\r\n params = params.set('viewbox', `${left},${top},${right},${bottom}`).set('bounded', '1');\r\n }\r\n\r\n const url = `${base}/search`;\r\n\r\n return this.http.get<NominatimSearchItem[]>(url, { params }).pipe(map((items) => items.map((item) => this.mapItem(item))));\r\n }\r\n\r\n /** Converte un risultato Nominatim in {@link UiGeocodedLocationType}. */\r\n mapItem(item: NominatimSearchItem): UiGeocodedLocationType {\r\n const addr = item.address ?? {};\r\n const lat = parseFloat(item.lat);\r\n const lon = parseFloat(item.lon);\r\n const bb = item.boundingbox;\r\n\r\n let boundingBox: UiGeocodedLocationType['boundingBox'];\r\n if (bb && bb.length >= 4) {\r\n const south = parseFloat(bb[0]);\r\n const north = parseFloat(bb[1]);\r\n const west = parseFloat(bb[2]);\r\n const east = parseFloat(bb[3]);\r\n if (!Number.isNaN(south + north + west + east)) {\r\n boundingBox = { south, north, west, east };\r\n }\r\n }\r\n\r\n const city =\r\n addr['city'] ||\r\n addr['town'] ||\r\n addr['village'] ||\r\n addr['municipality'] ||\r\n addr['hamlet'] ||\r\n addr['suburb'];\r\n\r\n const confidence =\r\n typeof item.importance === 'number' ? Math.min(1, Math.max(0, item.importance / 0.75)) : undefined;\r\n\r\n const ccRaw = addr['country_code'];\r\n const countryCode = typeof ccRaw === 'string' ? ccRaw.toUpperCase() : undefined;\r\n const isItalian = countryCode === 'IT';\r\n\r\n const italian: UiGeocodedItalianDetails | undefined = isItalian\r\n ? {\r\n comune: city,\r\n provincia: addr['county'] || addr['state_district'] || addr['province'],\r\n regione: addr['state'],\r\n }\r\n : undefined;\r\n\r\n const foreign: UiGeocodedForeignDetails | undefined = !isItalian\r\n ? {\r\n locality: city,\r\n adminArea: addr['state'] || addr['state_district'] || addr['county'],\r\n countryCode,\r\n }\r\n : undefined;\r\n\r\n return {\r\n label: item.display_name,\r\n latitude: lat,\r\n longitude: lon,\r\n formattedAddress: item.display_name,\r\n territory: isItalian ? 'italian' : 'foreign',\r\n italian,\r\n foreign,\r\n street: addr['road'] || addr['pedestrian'] || addr['path'],\r\n streetNumber: addr['house_number'],\r\n postalCode: addr['postcode'],\r\n city,\r\n municipality: addr['municipality'],\r\n province: addr['state_district'] || addr['county'],\r\n region: addr['state'],\r\n country: addr['country'],\r\n countryCode,\r\n placeId: String(item.place_id),\r\n confidence,\r\n boundingBox,\r\n source: 'nominatim',\r\n raw: item,\r\n };\r\n }\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n Input,\r\n OnInit,\r\n ViewChild,\r\n ViewEncapsulation,\r\n forwardRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n ControlValueAccessor,\r\n FormControl,\r\n NG_VALUE_ACCESSOR,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport {\r\n MatAutocompleteModule,\r\n MatAutocompleteSelectedEvent,\r\n MatAutocompleteTrigger,\r\n} from '@angular/material/autocomplete';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { NgForOf } from '@angular/common';\r\nimport { EMPTY, debounceTime, distinctUntilChanged, switchMap, tap, catchError, map, of } from 'rxjs';\r\nimport { UiNominatimGeocodingService } from '../../services/nominatim-geocoding.service';\r\nimport type {\r\n UiGeocodedLocationInput,\r\n UiGeocodedLocationType,\r\n UiLocationGeocodedFieldConfig,\r\n} from '../../types/geocoded-location.types';\r\n\r\n/** Stati UI per hint e messaggi accessibili. */\r\ntype UiGeocodedPanelState = 'idle' | 'loading' | 'results' | 'empty' | 'error';\r\n\r\n/**\r\n * Campo indirizzo con ricerca geocodificata (Nominatim) e selezione atomica da autocomplete.\r\n * Implementa `ControlValueAccessor`; il valore è {@link UiGeocodedLocationType} o `null`.\r\n *\r\n * L'applicazione host deve fornire `provideHttpClient()` (o `HttpClient` equivalente).\r\n */\r\n@Component({\r\n selector: 'ui-location-geocoded',\r\n standalone: true,\r\n imports: [\r\n NgForOf,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatAutocompleteModule,\r\n MatProgressSpinnerModule,\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiLocationGeocodedComponent),\r\n multi: true,\r\n },\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './location-geocoded.component.html',\r\n styleUrl: './location-geocoded.component.scss',\r\n})\r\nexport class UiLocationGeocodedComponent implements ControlValueAccessor, OnInit {\r\n private readonly nominatim = inject(UiNominatimGeocodingService);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly document = inject(DOCUMENT);\r\n\r\n /** Configurazione ricerca (URL base, debounce, limiti). */\r\n @Input() config: UiLocationGeocodedFieldConfig = {};\r\n\r\n /** Placeholder dell'input. */\r\n @Input() placeholder = '';\r\n\r\n /** Etichetta accessibile dell'input (se la label visibile è esterna al componente). */\r\n @Input() inputAriaLabel = 'Cerca indirizzo';\r\n\r\n /** `id` HTML dell'input (per associare la label esterna con `for`). */\r\n @Input() inputId = '';\r\n\r\n /** Disabilita il campo. */\r\n @Input() set disabled(v: boolean) {\r\n this._disabled = v;\r\n this.syncDisabled();\r\n }\r\n get disabled(): boolean {\r\n return this._disabled;\r\n }\r\n\r\n /** Input in sola lettura (testo non modificabile). */\r\n @Input() readonly = false;\r\n\r\n /** Trigger Material: serve a non trattare il blur verso il pannello come uscita senza selezione. */\r\n @ViewChild('autoTrigger') private autoTrigger?: MatAutocompleteTrigger;\r\n\r\n /** Testo digitabile e label selezionata (sempre stringa, compatibile con MatAutocomplete). */\r\n readonly searchControl = new FormControl<string>('', { nonNullable: true });\r\n\r\n /** Suggerimenti correnti per il pannello autocomplete. */\r\n suggestions: UiGeocodedLocationType[] = [];\r\n\r\n /** Ultima query usata per evidenziare i match nel pannello. */\r\n lastQueryForHighlight = '';\r\n\r\n panelState: UiGeocodedPanelState = 'idle';\r\n\r\n private _disabled = false;\r\n private selected: UiGeocodedLocationType | null = null;\r\n /** Evita che la selezione da autocomplete venga trattata come cancellazione del valore. */\r\n private selecting = false;\r\n /** `pointerdown` sul pannello overlay (fase capture): il blur dell'input avviene prima del click; senza questo si azzera il valore. */\r\n private pointerDownOnOverlay = false;\r\n private readonly resultCache = new Map<string, UiGeocodedLocationType[]>();\r\n private readonly maxCacheEntries = 40;\r\n\r\n private onChange: (v: UiGeocodedLocationType | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n ngOnInit(): void {\r\n const minChars = this.config.minChars ?? 3;\r\n const debounceMs = this.config.debounceMs ?? 200;\r\n\r\n this.document.addEventListener('pointerdown', this.onDocumentPointerDown, true);\r\n this.destroyRef.onDestroy(() => {\r\n this.document.removeEventListener('pointerdown', this.onDocumentPointerDown, true);\r\n });\r\n\r\n this.searchControl.valueChanges\r\n .pipe(\r\n tap((text) => {\r\n if (this.selecting) {\r\n return;\r\n }\r\n if (this.selected && text !== this.selected.label) {\r\n this.selected = null;\r\n this.onChange(null);\r\n }\r\n }),\r\n debounceTime(debounceMs),\r\n distinctUntilChanged(),\r\n switchMap((text) => {\r\n const t = text.trim();\r\n if (t.length < minChars) {\r\n this.suggestions = [];\r\n this.panelState = 'idle';\r\n this.lastQueryForHighlight = '';\r\n this.cdr.markForCheck();\r\n return EMPTY;\r\n }\r\n const cacheKey = t.toLowerCase();\r\n const cached = this.resultCache.get(cacheKey);\r\n if (cached) {\r\n return of({ q: t, items: cached });\r\n }\r\n this.panelState = 'loading';\r\n this.cdr.markForCheck();\r\n return this.nominatim.search(t, this.config).pipe(\r\n tap((items) => this.pushCache(cacheKey, items)),\r\n map((items) => ({ q: t, items })),\r\n catchError(() => {\r\n this.panelState = 'error';\r\n this.suggestions = [];\r\n this.cdr.markForCheck();\r\n return EMPTY;\r\n }),\r\n );\r\n }),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe((payload) => {\r\n this.lastQueryForHighlight = payload.q;\r\n this.suggestions = payload.items;\r\n this.panelState = payload.items.length ? 'results' : 'empty';\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n private pushCache(key: string, items: UiGeocodedLocationType[]): void {\r\n if (this.resultCache.size >= this.maxCacheEntries) {\r\n const first = this.resultCache.keys().next().value as string | undefined;\r\n if (first !== undefined) {\r\n this.resultCache.delete(first);\r\n }\r\n }\r\n this.resultCache.set(key, items);\r\n }\r\n\r\n onOptionSelected(event: MatAutocompleteSelectedEvent): void {\r\n this.pointerDownOnOverlay = false;\r\n const opts = event.source.options?.toArray() ?? [];\r\n const idx = opts.indexOf(event.option);\r\n let opt = idx >= 0 ? this.suggestions[idx] : undefined;\r\n if (!opt && typeof event.option.value === 'string') {\r\n opt = this.suggestions.find((o) => o.label === event.option.value);\r\n }\r\n if (!opt) {\r\n return;\r\n }\r\n this.selecting = true;\r\n this.selected = opt;\r\n this.searchControl.setValue(opt.label, { emitEvent: false });\r\n this.onChange(opt);\r\n this.onTouched();\r\n setTimeout(() => {\r\n this.selecting = false;\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Chiusura focus sull'input: differita così `optionSelected` può aggiornare il modello prima di eventuale reset.\r\n * `pointerDownOnOverlay` copre il caso blur → click sulla lista (relatedTarget spesso null).\r\n */\r\n onBlur(event: FocusEvent): void {\r\n const next = event.relatedTarget as HTMLElement | null;\r\n if (next?.closest?.('.cdk-overlay-container')) {\r\n return;\r\n }\r\n const hadPointerOnPanel = this.pointerDownOnOverlay;\r\n setTimeout(() => {\r\n this.pointerDownOnOverlay = false;\r\n if (this.selecting || this.autoTrigger?.panelOpen || hadPointerOnPanel) {\r\n return;\r\n }\r\n const text = this.searchControl.value?.trim() ?? '';\r\n if (!this.selected) {\r\n if (text.length > 0) {\r\n this.searchControl.setValue('', { emitEvent: false });\r\n }\r\n this.onChange(null);\r\n }\r\n this.onTouched();\r\n }, 0);\r\n }\r\n\r\n /** Imposta il flag prima del blur quando l'utente preme sul pannello (stesso gesto del click su `mat-option`). */\r\n private onDocumentPointerDown = (e: PointerEvent): void => {\r\n if (!this.autoTrigger?.panelOpen) {\r\n return;\r\n }\r\n const t = e.target;\r\n if (!(t instanceof Node)) {\r\n return;\r\n }\r\n if (this.document.querySelector('.cdk-overlay-container')?.contains(t)) {\r\n this.pointerDownOnOverlay = true;\r\n }\r\n };\r\n\r\n /**\r\n * Identità stabile per `@for` sui suggerimenti (evita `??` nel template e problemi di codegen).\r\n */\r\n trackSuggestion(opt: UiGeocodedLocationType): string {\r\n return String(opt.placeId ?? opt.label);\r\n }\r\n\r\n /** Segmenta la label per evidenziazione accessibile (match letterale case-insensitive). */\r\n highlightParts(label: string): { text: string; highlight: boolean }[] {\r\n const q = this.lastQueryForHighlight.trim();\r\n if (!q) {\r\n return [{ text: label, highlight: false }];\r\n }\r\n const lower = label.toLowerCase();\r\n const qi = lower.indexOf(q.toLowerCase());\r\n if (qi < 0) {\r\n return [{ text: label, highlight: false }];\r\n }\r\n const parts: { text: string; highlight: boolean }[] = [];\r\n if (qi > 0) {\r\n parts.push({ text: label.slice(0, qi), highlight: false });\r\n }\r\n parts.push({ text: label.slice(qi, qi + q.length), highlight: true });\r\n if (qi + q.length < label.length) {\r\n parts.push({ text: label.slice(qi + q.length), highlight: false });\r\n }\r\n return parts;\r\n }\r\n\r\n /** Messaggio per `aria-live` in base allo stato del pannello. */\r\n getStatusMessage(): string {\r\n switch (this.panelState) {\r\n case 'loading':\r\n return 'Ricerca indirizzi in corso';\r\n case 'results':\r\n return `${this.suggestions.length} suggerimenti disponibili`;\r\n case 'empty':\r\n return 'Nessun risultato per la ricerca';\r\n case 'error':\r\n return 'Errore durante la ricerca. Riprova.';\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n // ─── ControlValueAccessor ───────────────────────────────────────\r\n\r\n writeValue(value: UiGeocodedLocationInput | null): void {\r\n if (value && typeof value === 'object' && 'latitude' in value) {\r\n this.selected = this.ensureTerritory(value);\r\n this.searchControl.setValue(value.label, { emitEvent: false });\r\n } else {\r\n this.selected = null;\r\n this.searchControl.setValue('', { emitEvent: false });\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (v: UiGeocodedLocationType | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled = isDisabled;\r\n this.syncDisabled();\r\n }\r\n\r\n private syncDisabled(): void {\r\n if (this._disabled) {\r\n this.searchControl.disable({ emitEvent: false });\r\n } else {\r\n this.searchControl.enable({ emitEvent: false });\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Completa `territory` e gli slice `italian` / `foreign` se assenti (payload legacy o altri provider).\r\n */\r\n private ensureTerritory(v: UiGeocodedLocationInput): UiGeocodedLocationType {\r\n if (v.territory) {\r\n return { ...v, territory: v.territory };\r\n }\r\n const cc = v.countryCode?.toUpperCase();\r\n const isItalian = cc === 'IT';\r\n return {\r\n ...v,\r\n territory: isItalian ? 'italian' : 'foreign',\r\n italian: isItalian\r\n ? (v.italian ?? {\r\n comune: v.city,\r\n provincia: v.province,\r\n regione: v.region,\r\n })\r\n : undefined,\r\n foreign: !isItalian\r\n ? (v.foreign ?? {\r\n locality: v.city,\r\n adminArea: v.province ?? v.region,\r\n countryCode: cc,\r\n })\r\n : undefined,\r\n };\r\n }\r\n}\r\n","<div class=\"ui-location-geocoded\">\r\n <span class=\"cdk-visually-hidden\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {{ getStatusMessage() }}\r\n </span>\r\n\r\n <mat-form-field appearance=\"outline\" class=\"ui-location-geocoded__field\" subscriptSizing=\"dynamic\">\r\n <input\r\n #autoTrigger=\"matAutocompleteTrigger\"\r\n matInput\r\n type=\"text\"\r\n [attr.id]=\"inputId || null\"\r\n [formControl]=\"searchControl\"\r\n [matAutocomplete]=\"auto\"\r\n [placeholder]=\"placeholder\"\r\n [readonly]=\"readonly\"\r\n [attr.aria-label]=\"inputAriaLabel\"\r\n [attr.aria-invalid]=\"panelState === 'error'\"\r\n [attr.aria-busy]=\"panelState === 'loading'\"\r\n autocomplete=\"off\"\r\n autocorrect=\"off\"\r\n spellcheck=\"false\"\r\n (blur)=\"onBlur($event)\"\r\n />\r\n\r\n @if (panelState === 'loading') {\r\n <mat-spinner matSuffix class=\"ui-location-geocoded__spinner\" diameter=\"20\" />\r\n }\r\n\r\n <mat-autocomplete\r\n #auto=\"matAutocomplete\"\r\n class=\"ui-location-geocoded__panel\"\r\n (optionSelected)=\"onOptionSelected($event)\"\r\n [autoActiveFirstOption]=\"false\"\r\n >\r\n @for (opt of suggestions; track trackSuggestion(opt)) {\r\n <mat-option class=\"ui-location-geocoded__option\" [value]=\"opt.label\">\r\n <span class=\"ui-location-geocoded__option-text\">\r\n <ng-container *ngFor=\"let part of highlightParts(opt.label)\">\r\n <span [class.ui-location-geocoded__match]=\"part.highlight\">{{ part.text }}</span>\r\n </ng-container>\r\n </span>\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n\r\n @if (panelState !== 'error') {\r\n <mat-hint class=\"ui-location-geocoded__hint\">\r\n @if (config.biasCountry) {\r\n <span class=\"ui-location-geocoded__scope\">\r\n Ambito: solo paese {{ config.biasCountry.toUpperCase() }} — luoghi in altri paesi non compaiono tra i risultati.\r\n </span>\r\n }\r\n @if (panelState === 'idle') {\r\n Digita almeno {{ config.minChars ?? 3 }} caratteri per cercare.\r\n } @else if (panelState === 'loading') {\r\n Ricerca in corso...\r\n } @else if (panelState === 'empty') {\r\n @if (config.biasCountry) {\r\n Nessun risultato in questo paese. Per cercare fuori da questo paese rimuovi il filtro paese dalla configurazione del campo.\r\n } @else {\r\n Nessun indirizzo trovato. Modifica la ricerca.\r\n }\r\n } @else if (panelState === 'results') {\r\n {{ suggestions.length }} risultati. Usa frecce e Invio per selezionare.\r\n }\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n\r\n @if (panelState === 'error') {\r\n <div class=\"ui-location-geocoded__api-error\" role=\"alert\">\r\n Impossibile contattare il servizio di geocoding. Riprova.\r\n </div>\r\n }\r\n</div>\r\n","import { FormControl, FormGroupDirective, NgForm } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\n\r\n/**\r\n * ErrorStateMatcher condiviso tra form-builder e campi atomici.\r\n * Mostra errore quando il controllo è invalido e (touched o dirty).\r\n */\r\nexport class UiFormErrorStateMatcher implements ErrorStateMatcher {\r\n isErrorState(control: FormControl | null, _form: FormGroupDirective | NgForm | null): boolean {\r\n return !!(control && control.invalid && (control.touched || control.dirty));\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n ViewEncapsulation,\r\n inject,\r\n} from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiFormFieldErrorService } from '../../services/form-field-error.service';\r\nimport { UiFormErrorStateMatcher } from '../../services/form-error-state.matcher';\r\nimport { UiFormFieldDescriptor, UiFieldOption } from '../../types/field.types';\r\nimport { UiValidationRule } from '../../types/validation.types';\r\n\r\n/**\r\n * Campo atomico text / email / password — stesso rendering del form-builder.\r\n * Modalità builder: `field` + `formGroup`. Modalità standalone: `control` + `label`.\r\n *\r\n * @selector ui-form-text-field\r\n */\r\n@Component({\r\n selector: 'ui-form-text-field',\r\n standalone: true,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatAutocompleteModule,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [{ provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher }],\r\n templateUrl: './form-text-field.component.html',\r\n styleUrl: './form-fields.scss',\r\n})\r\nexport class UiFormTextFieldComponent {\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\n\r\n /** Descriptor schema (modalità builder). */\r\n @Input() field?: UiFormFieldDescriptor;\r\n /** FormGroup dell'istanza (modalità builder). */\r\n @Input() formGroup?: FormGroup;\r\n /** Readonly globale dal form-builder. */\r\n @Input() readonly = false;\r\n /** Errori pre-calcolati dal builder; se null, derivati dal controllo. */\r\n @Input() errors: string[] | null = null;\r\n\r\n /** Control diretto (modalità standalone / CVA). */\r\n @Input() control?: FormControl;\r\n @Input() label?: string;\r\n @Input() placeholder?: string;\r\n @Input() maxLength?: number;\r\n @Input() inputType: 'text' | 'email' | 'password' = 'text';\r\n @Input() validationRules?: UiValidationRule[];\r\n\r\n /** Opzioni autocomplete (campo text searchable nel builder). */\r\n @Input() options: UiFieldOption[] = [];\r\n @Output() optionsFilter = new EventEmitter<string>();\r\n @Output() blurred = new EventEmitter<void>();\r\n\r\n /** True se il campo schema è text searchable. */\r\n get isSearchableText(): boolean {\r\n return this.field?.searchable === true && this.field?.type === 'text';\r\n }\r\n\r\n /** Etichetta effettiva. */\r\n get effectiveLabel(): string {\r\n return this.field?.label ?? this.label ?? '';\r\n }\r\n\r\n /** Placeholder effettivo. */\r\n get effectivePlaceholder(): string {\r\n return this.field?.placeholder ?? this.placeholder ?? '';\r\n }\r\n\r\n /** Tipo input HTML nativo. */\r\n get nativeInputType(): string {\r\n if (this.field) {\r\n switch (this.field.type) {\r\n case 'password':\r\n return 'password';\r\n case 'email':\r\n return 'email';\r\n default:\r\n return 'text';\r\n }\r\n }\r\n return this.inputType;\r\n }\r\n\r\n /** Readonly effettivo sul campo. */\r\n get isReadonly(): boolean {\r\n return this.readonly || this.field?.readonly === true;\r\n }\r\n\r\n /** Controllo risolto per modalità standalone. */\r\n get resolvedControl(): FormControl | null {\r\n return this.control ?? null;\r\n }\r\n\r\n /** Regole validation per messaggi errore. */\r\n get effectiveRules(): UiValidationRule[] {\r\n return this.field?.validation ?? this.validationRules ?? [];\r\n }\r\n\r\n /** Max length da regole o input. */\r\n get effectiveMaxLength(): number | undefined {\r\n if (this.maxLength != null) return this.maxLength;\r\n return this.fieldErrorService.resolveMaxLength(this.effectiveRules);\r\n }\r\n\r\n /** Controllo del campo in modalità builder. */\r\n get fieldControl(): FormControl | null {\r\n if (!this.field || !this.formGroup) return null;\r\n const c = this.formGroup.get(this.field.key);\r\n return c instanceof FormControl ? c : null;\r\n }\r\n\r\n /** Messaggi errore da mostrare in mat-error. */\r\n resolvedErrors(control: FormControl | null): string[] {\r\n if (this.errors != null) return this.errors;\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\n }\r\n\r\n /** Conteggio caratteri (solo text con maxLength). */\r\n charCount(control: FormControl | null): { current: number; max: number } | null {\r\n if (this.field && this.field.type !== 'text') return null;\r\n return this.fieldErrorService.getCharCount(control, this.effectiveMaxLength);\r\n }\r\n\r\n onInput(query: string): void {\r\n this.optionsFilter.emit(query);\r\n }\r\n\r\n onBlur(): void {\r\n this.blurred.emit();\r\n }\r\n}\r\n","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-fb-text-ctx\">\r\n @if (isSearchableText) {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <input\r\n matInput\r\n [formControlName]=\"field.key\"\r\n [type]=\"nativeInputType\"\r\n [matAutocomplete]=\"textAuto\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <mat-autocomplete #textAuto=\"matAutocomplete\">\r\n @for (opt of options; track opt.value) {\r\n <mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\r\n }\r\n </mat-autocomplete>\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n } @else {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <input\r\n matInput\r\n [formControlName]=\"field.key\"\r\n [type]=\"nativeInputType\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (field.iconTooltip) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\"\r\n [attr.aria-label]=\"field.iconTooltip.text\"\r\n >\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"18\" />\r\n </button>\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n @if (charCount(fieldControl); as cc) {\r\n <mat-hint\r\n align=\"end\"\r\n class=\"ui-form-builder__char-count\"\r\n [class.ui-form-builder__char-count--warn]=\"cc.current > cc.max * 0.9\"\r\n [class.ui-form-builder__char-count--error]=\"cc.current > cc.max\"\r\n >\r\n {{ cc.current }} / {{ cc.max }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n }\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n <input\r\n matInput\r\n [formControl]=\"control\"\r\n [type]=\"nativeInputType\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [attr.maxlength]=\"effectiveMaxLength\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n @if (charCount(control); as cc) {\r\n <mat-hint\r\n align=\"end\"\r\n class=\"ui-form-builder__char-count\"\r\n [class.ui-form-builder__char-count--warn]=\"cc.current > cc.max * 0.9\"\r\n [class.ui-form-builder__char-count--error]=\"cc.current > cc.max\"\r\n >\r\n {{ cc.current }} / {{ cc.max }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n </div>\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n ViewEncapsulation,\r\n inject,\r\n} from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiFormFieldErrorService } from '../../services/form-field-error.service';\r\nimport { UiFormErrorStateMatcher } from '../../services/form-error-state.matcher';\r\nimport { UiFormFieldDescriptor } from '../../types/field.types';\r\nimport { UiValidationRule } from '../../types/validation.types';\r\n\r\n/**\r\n * Campo atomico textarea — stesso rendering del form-builder.\r\n *\r\n * @selector ui-form-textarea-field\r\n */\r\n@Component({\r\n selector: 'ui-form-textarea-field',\r\n standalone: true,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [{ provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher }],\r\n templateUrl: './form-textarea-field.component.html',\r\n styleUrl: './form-fields.scss',\r\n})\r\nexport class UiFormTextareaFieldComponent {\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\n\r\n @Input() field?: UiFormFieldDescriptor;\r\n @Input() formGroup?: FormGroup;\r\n @Input() readonly = false;\r\n @Input() errors: string[] | null = null;\r\n\r\n @Input() control?: FormControl;\r\n @Input() label?: string;\r\n @Input() placeholder?: string;\r\n @Input() rows = 4;\r\n @Input() maxLength?: number;\r\n @Input() validationRules?: UiValidationRule[];\r\n\r\n @Output() blurred = new EventEmitter<void>();\r\n\r\n get effectiveLabel(): string {\r\n return this.field?.label ?? this.label ?? '';\r\n }\r\n\r\n get effectivePlaceholder(): string {\r\n return this.field?.placeholder ?? this.placeholder ?? '';\r\n }\r\n\r\n get isReadonly(): boolean {\r\n return this.readonly || this.field?.readonly === true;\r\n }\r\n\r\n get effectiveRules(): UiValidationRule[] {\r\n return this.field?.validation ?? this.validationRules ?? [];\r\n }\r\n\r\n /** Controllo del campo in modalità builder. */\r\n get fieldControl(): FormControl | null {\r\n if (!this.field || !this.formGroup) return null;\r\n const c = this.formGroup.get(this.field.key);\r\n return c instanceof FormControl ? c : null;\r\n }\r\n\r\n get effectiveMaxLength(): number | undefined {\r\n if (this.maxLength != null) return this.maxLength;\r\n return this.fieldErrorService.resolveMaxLength(this.effectiveRules);\r\n }\r\n\r\n resolvedErrors(control: FormControl | null): string[] {\r\n if (this.errors != null) return this.errors;\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\n }\r\n\r\n charCount(control: FormControl | null): { current: number; max: number } | null {\r\n return this.fieldErrorService.getCharCount(control, this.effectiveMaxLength);\r\n }\r\n\r\n onBlur(): void {\r\n this.blurred.emit();\r\n }\r\n}\r\n","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-form-builder__textarea-wrapper\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <textarea\r\n matInput\r\n [formControlName]=\"field.key\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n [rows]=\"rows\"\r\n (blur)=\"onBlur()\"\r\n ></textarea>\r\n @if (field.iconTooltip) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\"\r\n [attr.aria-label]=\"field.iconTooltip.text\"\r\n >\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"18\" />\r\n </button>\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n @if (charCount(fieldControl); as cc) {\r\n <mat-hint\r\n align=\"end\"\r\n class=\"ui-form-builder__char-count\"\r\n [class.ui-form-builder__char-count--warn]=\"cc.current > cc.max * 0.9\"\r\n [class.ui-form-builder__char-count--error]=\"cc.current > cc.max\"\r\n >\r\n {{ cc.current }} / {{ cc.max }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom ui-form-builder__textarea-wrapper\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n <textarea\r\n matInput\r\n [formControl]=\"control\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [rows]=\"rows\"\r\n [attr.maxlength]=\"effectiveMaxLength\"\r\n (blur)=\"onBlur()\"\r\n ></textarea>\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n @if (charCount(control); as cc) {\r\n <mat-hint\r\n align=\"end\"\r\n class=\"ui-form-builder__char-count\"\r\n [class.ui-form-builder__char-count--warn]=\"cc.current > cc.max * 0.9\"\r\n [class.ui-form-builder__char-count--error]=\"cc.current > cc.max\"\r\n >\r\n {{ cc.current }} / {{ cc.max }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n </div>\r\n}\r\n","import { Directive, ElementRef, HostListener, Input, OnInit, Renderer2, forwardRef } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n/**\r\n * Direttiva per formattazione input valuta.\r\n *\r\n * Formatta il valore numerico con separatori italiani (1.234,56)\r\n * e simbolo valuta opzionale. In fase di focus l'utente modifica\r\n * il valore raw, al blur viene riformattato.\r\n *\r\n * Implementa `ControlValueAccessor` per integrazione con Reactive Forms.\r\n *\r\n * @selector [uiCurrencyInput]\r\n *\r\n * @example\r\n * ```html\r\n * <input uiCurrencyInput currencySymbol=\"EUR\" [decimalPlaces]=\"2\" />\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[uiCurrencyInput]',\r\n standalone: true,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiCurrencyInputDirective),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class UiCurrencyInputDirective implements ControlValueAccessor, OnInit {\r\n /** Simbolo valuta visualizzato. @default 'EUR' */\r\n @Input() currencySymbol = 'EUR';\r\n\r\n /** Numero di decimali. @default 2 */\r\n @Input() decimalPlaces = 2;\r\n\r\n private rawValue: number | null = null;\r\n private onChange: (value: number | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n private isFocused = false;\r\n\r\n constructor(\r\n private el: ElementRef<HTMLInputElement>,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.renderer.setStyle(this.el.nativeElement, 'text-align', 'right');\r\n }\r\n\r\n // ── ControlValueAccessor ──\r\n\r\n writeValue(value: any): void {\r\n this.rawValue = value != null ? Number(value) : null;\r\n if (!this.isFocused) {\r\n this.displayFormatted();\r\n }\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.renderer.setProperty(this.el.nativeElement, 'disabled', isDisabled);\r\n }\r\n\r\n // ── Gestione eventi ──\r\n\r\n @HostListener('focus')\r\n onFocus(): void {\r\n this.isFocused = true;\r\n this.renderer.setStyle(this.el.nativeElement, 'text-align', 'left');\r\n // Mostra valore raw per editing\r\n if (this.rawValue != null) {\r\n this.el.nativeElement.value = this.rawValue.toString().replace('.', ',');\r\n } else {\r\n this.el.nativeElement.value = '';\r\n }\r\n }\r\n\r\n @HostListener('blur')\r\n onBlur(): void {\r\n this.isFocused = false;\r\n this.onTouched();\r\n this.parseInput();\r\n this.displayFormatted();\r\n this.renderer.setStyle(this.el.nativeElement, 'text-align', 'right');\r\n }\r\n\r\n @HostListener('input', ['$event.target.value'])\r\n onInput(value: string): void {\r\n // Permetti solo cifre, virgola e punto (come separatore decimale)\r\n const sanitized = value.replace(/[^0-9,.\\-]/g, '');\r\n if (sanitized !== value) {\r\n this.el.nativeElement.value = sanitized;\r\n }\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent): void {\r\n const allowed = [\r\n 'Backspace',\r\n 'Delete',\r\n 'Tab',\r\n 'Escape',\r\n 'Enter',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'Home',\r\n 'End',\r\n ];\r\n if (allowed.includes(event.key)) return;\r\n\r\n // Permetti Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X\r\n if (event.ctrlKey || event.metaKey) return;\r\n\r\n // Permetti cifre\r\n if (/^\\d$/.test(event.key)) return;\r\n\r\n // Permetti virgola e punto (un solo separatore decimale)\r\n if ((event.key === ',' || event.key === '.') && !this.el.nativeElement.value.includes(',')) {\r\n return;\r\n }\r\n\r\n // Permetti segno meno solo all'inizio\r\n if (event.key === '-' && this.el.nativeElement.selectionStart === 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n }\r\n\r\n // ── Utilita interne ──\r\n\r\n private parseInput(): void {\r\n const input = this.el.nativeElement.value.trim();\r\n if (!input) {\r\n this.rawValue = null;\r\n this.onChange(null);\r\n return;\r\n }\r\n\r\n // Normalizza: rimuovi punti migliaia, sostituisci virgola con punto\r\n const normalized = input.replace(/\\./g, '').replace(',', '.');\r\n const num = parseFloat(normalized);\r\n\r\n if (isNaN(num)) {\r\n this.rawValue = null;\r\n this.onChange(null);\r\n } else {\r\n this.rawValue = num;\r\n this.onChange(num);\r\n }\r\n }\r\n\r\n /** Mostra il valore formattato con separatori italiani e simbolo. */\r\n private displayFormatted(): void {\r\n if (this.rawValue == null) {\r\n this.el.nativeElement.value = '';\r\n return;\r\n }\r\n\r\n const formatted = this.formatItalian(this.rawValue, this.decimalPlaces);\r\n this.el.nativeElement.value = this.currencySymbol ? `${formatted} ${this.currencySymbol}` : formatted;\r\n }\r\n\r\n /** Formattazione italiana: 1.234,56 */\r\n private formatItalian(value: number, decimals: number): string {\r\n const parts = value.toFixed(decimals).split('.');\r\n const intPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.'); // NOSONAR - Used on controlled number strings from toFixed(), low ReDoS risk\r\n return decimals > 0 ? `${intPart},${parts[1]}` : intPart;\r\n }\r\n}\r\n","import {\r\r\n ChangeDetectionStrategy,\r\r\n Component,\r\r\n EventEmitter,\r\r\n Input,\r\r\n Output,\r\r\n ViewEncapsulation,\r\r\n inject,\r\r\n} from '@angular/core';\r\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\r\nimport { MatInputModule } from '@angular/material/input';\r\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\r\nimport { LucideAngularModule } from 'lucide-angular';\r\r\nimport { UiCurrencyInputDirective } from '../../directives/currency-input.directive';\r\r\nimport { UiFormErrorStateMatcher } from '../../services/form-error-state.matcher';\r\r\nimport { UiFormFieldErrorService } from '../../services/form-field-error.service';\r\r\nimport { UiFormFieldDescriptor } from '../../types/field.types';\r\r\nimport { UiValidationRule } from '../../types/validation.types';\r\r\n\r\r\n/**\r\r\n * Campo atomico number / currency — stesso rendering del form-builder.\r\r\n *\r\r\n * @selector ui-form-number-field\r\r\n */\r\r\n@Component({\r\r\n selector: 'ui-form-number-field',\r\r\n standalone: true,\r\r\n imports: [\r\r\n ReactiveFormsModule,\r\r\n MatFormFieldModule,\r\r\n MatInputModule,\r\r\n MatTooltipModule,\r\r\n LucideAngularModule,\r\r\n UiCurrencyInputDirective,\r\r\n ],\r\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\r\n encapsulation: ViewEncapsulation.None,\r\r\n providers: [{ provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher }],\r\r\n templateUrl: './form-number-field.component.html',\r\r\n styleUrl: './form-fields.scss',\r\r\n})\r\r\nexport class UiFormNumberFieldComponent {\r\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\r\n\r\r\n @Input() field?: UiFormFieldDescriptor;\r\r\n @Input() formGroup?: FormGroup;\r\r\n @Input() readonly = false;\r\r\n @Input() errors: string[] | null = null;\r\r\n\r\r\n @Input() control?: FormControl;\r\r\n @Input() label?: string;\r\r\n @Input() placeholder?: string;\r\r\n @Input() validationRules?: UiValidationRule[];\r\r\n /** Modalità valuta standalone (equivalente a `field.metadata.type === 'currency'`). */\r\r\n @Input() currencyMode = false;\r\r\n @Input() currencySymbol = 'EUR';\r\r\n @Input() decimalPlaces = 2;\r\r\n\r\r\n @Output() blurred = new EventEmitter<void>();\r\r\n\r\r\n get effectiveLabel(): string {\r\r\n return this.field?.label ?? this.label ?? '';\r\r\n }\r\r\n\r\r\n get effectivePlaceholder(): string {\r\r\n return this.field?.placeholder ?? this.placeholder ?? '';\r\r\n }\r\r\n\r\r\n get isReadonly(): boolean {\r\r\n return this.readonly || this.field?.readonly === true;\r\r\n }\r\r\n\r\r\n get isCurrency(): boolean {\r\r\n if (this.field?.metadata?.['type'] === 'currency') return true;\r\r\n return this.currencyMode;\r\r\n }\r\r\n\r\r\n get effectiveCurrencySymbol(): string {\r\r\n return (this.field?.metadata?.['currency'] as string) || this.currencySymbol;\r\r\n }\r\r\n\r\r\n get effectiveDecimalPlaces(): number {\r\r\n const fromField = this.field?.metadata?.['decimals'];\r\r\n return fromField != null ? Number(fromField) : this.decimalPlaces;\r\r\n }\r\r\n\r\r\n get effectiveRules(): UiValidationRule[] {\r\r\n return this.field?.validation ?? this.validationRules ?? [];\r\r\n }\r\r\n\r\r\n get fieldControl(): FormControl | null {\r\r\n if (!this.field || !this.formGroup) return null;\r\r\n const c = this.formGroup.get(this.field.key);\r\r\n return c instanceof FormControl ? c : null;\r\r\n }\r\r\n\r\r\n resolvedErrors(control: FormControl | null): string[] {\r\r\n if (this.errors != null) return this.errors;\r\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\r\n }\r\r\n\r\r\n onBlur(): void {\r\r\n this.blurred.emit();\r\r\n }\r\r\n}\r\r\n\r","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-fb-field-ctx\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n @if (isCurrency) {\r\n <input\r\n matInput\r\n type=\"text\"\r\n [formControlName]=\"field.key\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n uiCurrencyInput\r\n [currencySymbol]=\"effectiveCurrencySymbol\"\r\n [decimalPlaces]=\"effectiveDecimalPlaces\"\r\n (blur)=\"onBlur()\"\r\n />\r\n } @else {\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControlName]=\"field.key\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n (blur)=\"onBlur()\"\r\n />\r\n }\r\n @if (field.iconTooltip) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\"\r\n [attr.aria-label]=\"field.iconTooltip.text\"\r\n >\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"18\" />\r\n </button>\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n @if (isCurrency) {\r\n <input\r\n matInput\r\n type=\"text\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n uiCurrencyInput\r\n [currencySymbol]=\"effectiveCurrencySymbol\"\r\n [decimalPlaces]=\"effectiveDecimalPlaces\"\r\n (blur)=\"onBlur()\"\r\n />\r\n } @else {\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n (blur)=\"onBlur()\"\r\n />\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n}\r\n","import {\r\r\n ChangeDetectionStrategy,\r\r\n Component,\r\r\n EventEmitter,\r\r\n Input,\r\r\n Output,\r\r\n ViewEncapsulation,\r\r\n inject,\r\r\n} from '@angular/core';\r\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\r\nimport { MatInputModule } from '@angular/material/input';\r\r\nimport { MatSelectModule } from '@angular/material/select';\r\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\r\nimport { LucideAngularModule } from 'lucide-angular';\r\r\nimport { UiFormErrorStateMatcher } from '../../services/form-error-state.matcher';\r\r\nimport { UiFormFieldErrorService } from '../../services/form-field-error.service';\r\r\nimport { UiFieldOption, UiFormFieldDescriptor } from '../../types/field.types';\r\r\nimport { UiValidationRule } from '../../types/validation.types';\r\r\n\r\r\n/**\r\r\n * Campo atomico select (mat-select o autocomplete searchable).\r\r\n *\r\r\n * @selector ui-form-select-field\r\r\n */\r\r\n@Component({\r\r\n selector: 'ui-form-select-field',\r\r\n standalone: true,\r\r\n imports: [\r\r\n ReactiveFormsModule,\r\r\n MatFormFieldModule,\r\r\n MatInputModule,\r\r\n MatSelectModule,\r\r\n MatAutocompleteModule,\r\r\n MatTooltipModule,\r\r\n LucideAngularModule,\r\r\n ],\r\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\r\n encapsulation: ViewEncapsulation.None,\r\r\n providers: [{ provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher }],\r\r\n templateUrl: './form-select-field.component.html',\r\r\n styleUrl: './form-fields.scss',\r\r\n})\r\r\nexport class UiFormSelectFieldComponent {\r\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\r\n\r\r\n @Input() field?: UiFormFieldDescriptor;\r\r\n @Input() formGroup?: FormGroup;\r\r\n @Input() readonly = false;\r\r\n @Input() errors: string[] | null = null;\r\r\n @Input() options: UiFieldOption[] = [];\r\r\n\r\r\n @Input() control?: FormControl;\r\r\n @Input() label?: string;\r\r\n @Input() placeholder?: string;\r\r\n @Input() searchable = false;\r\r\n @Input() hideEmptyOption = false;\r\r\n @Input() validationRules?: UiValidationRule[];\r\r\n\r\r\n @Output() optionsFilter = new EventEmitter<string>();\r\r\n @Output() blurred = new EventEmitter<void>();\r\r\n\r\r\n get effectiveLabel(): string {\r\r\n return this.field?.label ?? this.label ?? '';\r\r\n }\r\r\n\r\r\n get effectivePlaceholder(): string {\r\r\n return this.field?.placeholder ?? this.placeholder ?? '';\r\r\n }\r\r\n\r\r\n get isReadonly(): boolean {\r\r\n return this.readonly || this.field?.readonly === true;\r\r\n }\r\r\n\r\r\n get isSearchable(): boolean {\r\r\n return this.field?.searchable === true || this.searchable;\r\r\n }\r\r\n\r\r\n get showEmptyOption(): boolean {\r\r\n if (this.field) return !this.field.hideEmptyOption;\r\r\n return !this.hideEmptyOption;\r\r\n }\r\r\n\r\r\n get effectiveOptions(): UiFieldOption[] {\r\r\n return this.options;\r\r\n }\r\r\n\r\r\n get effectiveRules(): UiValidationRule[] {\r\r\n return this.field?.validation ?? this.validationRules ?? [];\r\r\n }\r\r\n\r\r\n get fieldControl(): FormControl | null {\r\r\n if (!this.field || !this.formGroup) return null;\r\r\n const c = this.formGroup.get(this.field.key);\r\r\n return c instanceof FormControl ? c : null;\r\r\n }\r\r\n\r\r\n resolvedErrors(control: FormControl | null): string[] {\r\r\n if (this.errors != null) return this.errors;\r\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\r\n }\r\r\n\r\r\n displayWith = (value: unknown): string => {\r\r\n const opt = this.effectiveOptions.find((o) => o.value === value);\r\r\n return opt?.label ?? '';\r\r\n };\r\r\n\r\r\n onInput(query: string): void {\r\r\n this.optionsFilter.emit(query);\r\r\n }\r\r\n\r\r\n onBlur(): void {\r\r\n this.blurred.emit();\r\r\n }\r\r\n}\r\r\n\r","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-fb-field-ctx\">\r\n @if (isSearchable) {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <input\r\n matInput\r\n [formControlName]=\"field.key\"\r\n [matAutocomplete]=\"selectAuto\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <mat-autocomplete #selectAuto=\"matAutocomplete\" [displayWith]=\"displayWith\">\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" class=\"ui-form-builder__option-icon\" />\r\n }\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n } @else {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <mat-select [formControlName]=\"field.key\" [placeholder]=\"effectivePlaceholder\">\r\n @if (showEmptyOption) {\r\n <mat-option [value]=\"null\">--</mat-option>\r\n }\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" class=\"ui-form-builder__option-icon\" />\r\n }\r\n {{ opt.label }}\r\n @if (opt.tooltip) {\r\n <lucide-icon\r\n name=\"info\"\r\n [size]=\"14\"\r\n [matTooltip]=\"opt.tooltip\"\r\n class=\"ui-form-builder__option-info\"\r\n />\r\n }\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (field.iconTooltip) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\"\r\n [attr.aria-label]=\"field.iconTooltip.text\"\r\n >\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"18\" />\r\n </button>\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom\">\r\n @if (isSearchable) {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n <input\r\n matInput\r\n [formControl]=\"control\"\r\n [matAutocomplete]=\"selectAutoStandalone\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <mat-autocomplete #selectAutoStandalone=\"matAutocomplete\" [displayWith]=\"displayWith\">\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" class=\"ui-form-builder__option-icon\" />\r\n }\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n } @else {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n <mat-select [formControl]=\"control\" [placeholder]=\"effectivePlaceholder\">\r\n @if (showEmptyOption) {\r\n <mat-option [value]=\"null\">--</mat-option>\r\n }\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" class=\"ui-form-builder__option-icon\" />\r\n }\r\n {{ opt.label }}\r\n @if (opt.tooltip) {\r\n <lucide-icon\r\n name=\"info\"\r\n [size]=\"14\"\r\n [matTooltip]=\"opt.tooltip\"\r\n class=\"ui-form-builder__option-info\"\r\n />\r\n }\r\n </mat-option>\r\n }\r\n </mat-select>\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n </div>\r\n}\r\n","import {\r\r\n ChangeDetectionStrategy,\r\r\n Component,\r\r\n EventEmitter,\r\r\n Input,\r\r\n Output,\r\r\n ViewEncapsulation,\r\r\n inject,\r\r\n} from '@angular/core';\r\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\r\nimport { MatRadioModule } from '@angular/material/radio';\r\r\nimport { LucideAngularModule } from 'lucide-angular';\r\r\nimport { UiFormFieldErrorService, UiFieldErrorDisplayOptions } from '../../services/form-field-error.service';\r\r\nimport { UiFieldOption, UiFormFieldDescriptor } from '../../types/field.types';\r\r\nimport { UiValidationRule } from '../../types/validation.types';\r\r\n\r\r\n/**\r\r\n * Campo atomico radio group — stesso rendering del form-builder.\r\r\n *\r\r\n * @selector ui-form-radio-field\r\r\n */\r\r\n@Component({\r\r\n selector: 'ui-form-radio-field',\r\r\n standalone: true,\r\r\n imports: [ReactiveFormsModule, MatRadioModule, LucideAngularModule],\r\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\r\n encapsulation: ViewEncapsulation.None,\r\r\n templateUrl: './form-radio-field.component.html',\r\r\n styleUrl: './form-fields.scss',\r\r\n})\r\r\nexport class UiFormRadioFieldComponent {\r\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\r\n\r\r\n @Input() field?: UiFormFieldDescriptor;\r\r\n @Input() formGroup?: FormGroup;\r\r\n @Input() readonly = false;\r\r\n @Input() errors: string[] | null = null;\r\r\n @Input() options: UiFieldOption[] = [];\r\r\n /** Indica asterisco obbligatorio (builder: `isFieldRequired`). */\r\r\n @Input() required = false;\r\r\n /** Override visibilità errori; se null deriva dal controllo. */\r\r\n @Input() showErrors: boolean | null = null;\r\r\n @Input() errorDisplayOptions: UiFieldErrorDisplayOptions = {};\r\r\n\r\r\n @Input() control?: FormControl;\r\r\n @Input() label?: string;\r\r\n @Input() validationRules?: UiValidationRule[];\r\r\n @Input() color: 'primary' | 'accent' | 'warn' = 'primary';\r\r\n\r\r\n @Output() blurred = new EventEmitter<void>();\r\r\n\r\r\n get effectiveLabel(): string {\r\r\n return this.field?.label ?? this.label ?? '';\r\r\n }\r\r\n\r\r\n get isDisabled(): boolean {\r\r\n return this.readonly || this.field?.readonly === true || this.field?.disabled === true;\r\r\n }\r\r\n\r\r\n get effectiveOptions(): UiFieldOption[] {\r\r\n return this.options;\r\r\n }\r\r\n\r\r\n get effectiveColor(): 'primary' | 'accent' | 'warn' {\r\r\n return this.field?.appearance?.color ?? this.color;\r\r\n }\r\r\n\r\r\n get effectiveRules(): UiValidationRule[] {\r\r\n return this.field?.validation ?? this.validationRules ?? [];\r\r\n }\r\r\n\r\r\n get showRequiredMarker(): boolean {\r\r\n if (this.required) return true;\r\r\n return this.effectiveRules.some((r) => r.type === 'required' && !r.conditions?.length);\r\r\n }\r\r\n\r\r\n get fieldControl(): FormControl | null {\r\r\n if (!this.field || !this.formGroup) return null;\r\r\n const c = this.formGroup.get(this.field.key);\r\r\n return c instanceof FormControl ? c : null;\r\r\n }\r\r\n\r\r\n resolvedErrors(control: FormControl | null): string[] {\r\r\n if (this.errors != null) return this.errors;\r\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\r\n }\r\r\n\r\r\n shouldShowErrors(control: FormControl | null): boolean {\r\r\n if (this.showErrors != null) return this.showErrors;\r\r\n return this.fieldErrorService.shouldShowFieldErrors(control, this.errorDisplayOptions);\r\r\n }\r\r\n\r\r\n onBlur(): void {\r\r\n this.blurred.emit();\r\r\n }\r\r\n}\r\r\n\r","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-fb-field-ctx\">\r\n <div class=\"ui-form-builder__radio-wrapper\">\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ effectiveLabel }}\r\n @if (showRequiredMarker) {\r\n <span class=\"ui-form-builder__required\">*</span>\r\n }\r\n </label>\r\n <mat-radio-group\r\n [formControlName]=\"field.key\"\r\n [color]=\"effectiveColor\"\r\n (blur)=\"onBlur()\"\r\n >\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-radio-button [value]=\"opt.value\" [disabled]=\"opt.disabled || isDisabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" />\r\n }\r\n {{ opt.label }}\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n @if (shouldShowErrors(fieldControl)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom ui-form-builder__radio-wrapper\">\r\n @if (effectiveLabel) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ effectiveLabel }}\r\n @if (showRequiredMarker) {\r\n <span class=\"ui-form-builder__required\">*</span>\r\n }\r\n </label>\r\n }\r\n <mat-radio-group [formControl]=\"control\" [color]=\"effectiveColor\" (blur)=\"onBlur()\">\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-radio-button [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" />\r\n }\r\n {{ opt.label }}\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n @if (shouldShowErrors(control)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of resolvedErrors(control); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder\r\n * Adapter e formati per il datepicker italiano (DD/MM/YYYY).\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { NativeDateAdapter, MatDateFormats } from '@angular/material/core';\r\n\r\n/**\r\n * Adapter personalizzato per il parsing delle date in formato italiano DD/MM/YYYY.\r\n *\r\n * Estende il NativeDateAdapter di Angular Material per gestire:\r\n * - Parsing: converte stringhe DD/MM/YYYY in oggetti Date\r\n * - Formattazione: visualizza le date nel formato italiano\r\n * - Primo giorno della settimana: Lunedi (1)\r\n */\r\n@Injectable()\r\nexport class UiItalianDateAdapter extends NativeDateAdapter {\r\n /**\r\n * Il primo giorno della settimana e Lunedi (1).\r\n */\r\n override getFirstDayOfWeek(): number {\r\n return 1;\r\n }\r\n\r\n /**\r\n * Parsing di una stringa di data in formato DD/MM/YYYY.\r\n * Supporta sia il formato con separatore `/` che `-`.\r\n */\r\n override parse(value: any): Date | null {\r\n if (typeof value === 'string' && value.length > 0) {\r\n // Gestisci formato DD/MM/YYYY o DD-MM-YYYY\r\n const parts = value.split(/[\\/\\-]/);\r\n if (parts.length === 3) {\r\n const day = parseInt(parts[0], 10);\r\n const month = parseInt(parts[1], 10) - 1; // Mesi 0-based\r\n const year = parseInt(parts[2], 10);\r\n\r\n if (!isNaN(day) && !isNaN(month) && !isNaN(year)) {\r\n // Validazione base\r\n if (day >= 1 && day <= 31 && month >= 0 && month <= 11 && year >= 1900 && year <= 2100) {\r\n return new Date(year, month, day);\r\n }\r\n }\r\n }\r\n }\r\n return super.parse(value);\r\n }\r\n\r\n /**\r\n * Formatta una data in formato DD/MM/YYYY per la visualizzazione.\r\n */\r\n override format(date: Date, displayFormat: object): string {\r\n if ((displayFormat as any) === 'input') {\r\n const day = date.getDate().toString().padStart(2, '0');\r\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const year = date.getFullYear();\r\n return `${day}/${month}/${year}`;\r\n }\r\n return date.toLocaleDateString('it-IT', {\r\n year: 'numeric',\r\n month: 'long',\r\n day: 'numeric',\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Formati data italiani per Angular Material.\r\n * Configura il datepicker per usare DD/MM/YYYY.\r\n */\r\nexport const UI_IT_DATE_FORMATS: MatDateFormats = {\r\n parse: {\r\n dateInput: 'input',\r\n },\r\n display: {\r\n dateInput: 'input',\r\n monthYearLabel: { year: 'numeric', month: 'short' },\r\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\r\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\r\n },\r\n};\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnInit,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n ViewEncapsulation,\r\n inject,\r\n ElementRef,\r\n TemplateRef,\r\n} from '@angular/core';\r\nimport {\r\n FormGroup,\r\n FormControl,\r\n FormArray,\r\n ReactiveFormsModule,\r\n Validators,\r\n AbstractControl,\r\n} from '@angular/forms';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport {\r\n MatNativeDateModule,\r\n DateAdapter,\r\n MAT_DATE_FORMATS,\r\n MAT_DATE_LOCALE,\r\n ErrorStateMatcher,\r\n} from '@angular/material/core';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { UiAccordionComponent, UiAccordionDescriptor } from '../accordion/index';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { Subject, Subscription, Observable } from 'rxjs';\r\nimport { debounceTime, takeUntil, distinctUntilChanged, filter as rxFilter } from 'rxjs/operators';\r\nimport { UiButtonComponent, UiButtonDescriptor } from '../../components/button/index';\r\nimport { UiButtonAreaComponent } from '../../components/button/button-area.component';\r\nimport { UiBlackboxService } from '../blackbox/blackbox.service';\r\nimport { UiLoggerService } from '../../core/logging/logger.service';\r\nimport { Router } from '@angular/router';\r\n\r\nimport { UiFormSchema, UiFormSection, UiFormData, UiFormCustomEvent, UiFormBuilderConfig, UiRepeatableConfig } from './types/schema.types';\r\nimport {\r\n UiFormFieldDescriptor,\r\n UiFieldOption,\r\n UiFieldType,\r\n UiCustomFieldTemplateContext,\r\n} from './types/field.types';\r\nimport {\r\n UiFormValidationState,\r\n UiFormErrorDetail,\r\n UiValidationRule,\r\n UI_FORM_NESTED_FIELD_ERRORS_KEY,\r\n} from './types/validation.types';\r\nimport { UiFieldCondition } from './types/condition.types';\r\nimport { UiFormConditionService } from './services/form-condition.service';\r\nimport { UiFormValidationService } from './services/form-validation.service';\r\nimport { UiFormFieldErrorService } from './services/form-field-error.service';\r\nimport { UiFormErrorSummaryComponent } from './sub-components/error-summary/form-error-summary.component';\r\nimport { UiFileInputComponent } from './sub-components/file-input/file-input.component';\r\nimport { UiSpecificaTerritorialeComponent } from './sub-components/specifica-territoriale/specifica-territoriale.component';\r\nimport { UiTableTerritorialeComponent } from './sub-components/table-territoriale/table-territoriale.component';\r\nimport { UiLocationGeocodedComponent } from './sub-components/location-geocoded/location-geocoded.component';\r\nimport { UiFormTextFieldComponent, UiFormTextareaFieldComponent, UiFormNumberFieldComponent, UiFormSelectFieldComponent, UiFormRadioFieldComponent } from './sub-components/form-fields/index';\r\nimport { UiFormErrorStateMatcher } from './services/form-error-state.matcher';\r\nimport { UiItalianDateAdapter, UI_IT_DATE_FORMATS } from './adapters/it-date-adapter';\r\n\r\n/**\r\n * Form builder data-driven e schema-based.\r\n *\r\n * Genera un form completo a partire da uno schema dichiarativo (`UiFormSchema`).\r\n * Supporta i tipi di campo del form builder, validazione condizionale, cross-field validation,\r\n * date con offset, opzioni dipendenti/dinamiche, sezioni collapsibili,\r\n * error summary con scroll-to-field e button override.\r\n *\r\n * @selector ui-form-builder\r\n *\r\n * @example\r\n * ```html\r\n * <ui-form-builder\r\n * [schema]=\"formSchema\"\r\n * [initialData]=\"userData\"\r\n * (formSubmit)=\"onSubmit($event)\"\r\n * (valueChange)=\"onChange($event)\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-form-builder',\r\n standalone: true,\r\n imports: [\r\n ReactiveFormsModule,\r\n NgTemplateOutlet,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatCheckboxModule,\r\n MatSlideToggleModule,\r\n MatRadioModule,\r\n MatDatepickerModule,\r\n MatNativeDateModule,\r\n MatAutocompleteModule,\r\n MatChipsModule,\r\n UiAccordionComponent,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n UiButtonComponent,\r\n UiButtonAreaComponent,\r\n UiFormErrorSummaryComponent,\r\n UiFileInputComponent,\r\n UiSpecificaTerritorialeComponent,\r\n UiTableTerritorialeComponent,\r\n UiLocationGeocodedComponent,\r\n UiFormTextFieldComponent,\r\n UiFormTextareaFieldComponent,\r\n UiFormNumberFieldComponent,\r\n UiFormSelectFieldComponent,\r\n UiFormRadioFieldComponent,\r\n ],\r\n providers: [\r\n { provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher },\r\n // Locale italiano per il datepicker Material\r\n { provide: MAT_DATE_LOCALE, useValue: 'it-IT' },\r\n // Adapter personalizzato per parsing DD/MM/YYYY\r\n { provide: DateAdapter, useClass: UiItalianDateAdapter },\r\n // Formati data italiani (DD/MM/YYYY)\r\n { provide: MAT_DATE_FORMATS, useValue: UI_IT_DATE_FORMATS },\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n host: { class: 'ui-form-builder-host' },\r\n templateUrl: './form-builder.component.html',\r\n styleUrl: './form-builder.component.scss',\r\n})\r\nexport class UiFormBuilderComponent implements OnInit, OnChanges, OnDestroy, AfterViewInit {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly elRef = inject(ElementRef);\r\n private readonly conditionService = inject(UiFormConditionService);\r\n private readonly validationService = inject(UiFormValidationService);\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\n\r\n /** @internal Optional BlackBox service — auto-tracks form events when available. */\r\n private readonly blackbox = inject(UiBlackboxService, { optional: true });\r\n /** @internal Router inject for BlackBox route context. */\r\n private readonly bbRouter = inject(Router, { optional: true });\r\n /** @internal Optional Logger service — logs form actions when available. */\r\n private readonly logger = inject(UiLoggerService, { optional: true });\r\n\r\n private readonly destroy$ = new Subject<void>();\r\n private valueChangeSub?: Subscription;\r\n /** @internal Listener cleanup for BlackBox focus/blur tracking. */\r\n private bbFocusHandler: ((e: FocusEvent) => void) | null = null;\r\n private bbBlurHandler: ((e: FocusEvent) => void) | null = null;\r\n\r\n /** ID schema corrente -- usato per evitare rebuild superflui. */\r\n private currentSchemaId: string | null = null;\r\n\r\n // ─── Input ──────────────────────────────────────────────────────\r\n\r\n /** Schema del form. */\r\n @Input() schema!: UiFormSchema;\r\n\r\n /** Dati iniziali per la prevalorizzazione. */\r\n @Input() initialData: UiFormData = {};\r\n\r\n /** Modalita sola lettura globale. */\r\n @Input() readonly = false;\r\n\r\n /** Stato disabilitato globale. */\r\n @Input() disabled = false;\r\n\r\n /** Override dei pulsanti di default. */\r\n @Input() buttonsOverride?: UiButtonDescriptor[];\r\n\r\n /** Chiave del pulsante in stato di caricamento. */\r\n @Input() loadingFor: string | null = null;\r\n\r\n /**\r\n * Mappa chiave logica → template per campi `type: 'custom'`.\r\n * La chiave si risolve con `customConfig.templateKey`, poi `customConfig.component`, poi `field.key`.\r\n */\r\n @Input() customFieldTemplates: Record<string, TemplateRef<unknown>> = {};\r\n\r\n /**\r\n * Template usato quando non esiste una voce in `customFieldTemplates` per la chiave risolta\r\n * (es. un unico `ng-template` con `@switch` sul campo).\r\n */\r\n @Input() customFieldTemplateFallback?: TemplateRef<unknown>;\r\n\r\n // ─── Output ─────────────────────────────────────────────────────\r\n\r\n @Output() valueChange = new EventEmitter<UiFormData>();\r\n @Output() validationChange = new EventEmitter<UiFormValidationState>();\r\n @Output() formSubmit = new EventEmitter<UiFormData>();\r\n @Output() formReset = new EventEmitter<void>();\r\n @Output() customEvent = new EventEmitter<UiFormCustomEvent>();\r\n\r\n // ─── Stato interno ──────────────────────────────────────────────\r\n\r\n formGroup!: FormGroup;\r\n\r\n /** Mappa campo -> opzioni filtrate (per autocomplete e dependent). */\r\n filteredOptions: Record<string, UiFieldOption[]> = {};\r\n\r\n /** Campi prevalorizzati (mostrano errori subito). */\r\n prevalorizedFields = new Set<string>();\r\n\r\n /** Mappa campo -> regole di validazione (per lookup rapido). */\r\n private validationRulesMap: Record<string, UiValidationRule[]> = {};\r\n\r\n /** Mappa dipendenze: campoTarget -> campi dipendenti. */\r\n private fieldDependencies = new Map<string, Set<string>>();\r\n\r\n /** @internal Accordion descriptors per le sezioni collapsibili. */\r\n sectionAccordionMap = new Map<string, UiAccordionDescriptor[]>();\r\n\r\n /** @internal Accordion descriptors per le istanze repeatable (sectionId -> descriptors). */\r\n repeatableAccordionMap = new Map<string, UiAccordionDescriptor[]>();\r\n\r\n /** Flag per evitare emissioni durante l'inizializzazione. */\r\n private isInitializing = true;\r\n\r\n // ─── Getter calcolati ───────────────────────────────────────────\r\n\r\n /** Tutti i campi di tutte le sezioni (incluse repeatable). */\r\n get allFields(): UiFormFieldDescriptor[] {\r\n return this.schema?.sections?.flatMap((s) => s.fields) || [];\r\n }\r\n\r\n /** Campi delle sole sezioni non-repeatable (piatti nel root FormGroup). */\r\n get allFlatFields(): UiFormFieldDescriptor[] {\r\n return this.schema?.sections?.filter((s) => !s.repeatable).flatMap((s) => s.fields) || [];\r\n }\r\n\r\n /** Sezioni con configurazione repeatable. */\r\n get repeatableSections(): UiFormSection[] {\r\n return this.schema?.sections?.filter((s) => !!s.repeatable) || [];\r\n }\r\n\r\n get formErrors(): UiFormErrorDetail[] {\r\n return this.getDetailedFormErrors();\r\n }\r\n\r\n get formButtons(): UiButtonDescriptor[] {\r\n if (this.buttonsOverride) return this.buttonsOverride;\r\n if (!this.schema?.config?.showButtons && this.schema?.config?.showButtons !== undefined) return [];\r\n return [\r\n { label: this.schema?.config?.buttonLabels?.reset || 'Reset', variant: 'outline', action: () => this.onReset() },\r\n {\r\n label: this.schema?.config?.buttonLabels?.submit || 'Invia',\r\n variant: 'primary',\r\n action: () => this.onSubmit(),\r\n },\r\n ];\r\n }\r\n\r\n // ─── Lifecycle ──────────────────────────────────────────────────\r\n //\r\n // ORDINE LIFECYCLE ANGULAR:\r\n // 1. constructor\r\n // 2. ngOnChanges (prima chiamata con valori iniziali)\r\n // 3. ngOnInit\r\n // 4. ngAfterViewInit\r\n // 5. ngOnChanges (chiamate successive per cambio input)\r\n //\r\n // PER IL WIZARD:\r\n // Il wizard crea un nuovo schema (con id diverso) ad ogni cambio step.\r\n // Lo schema viene cachato nel wizard per evitare rebuild infiniti.\r\n // ngOnChanges rileva il cambio di schema.id e ricostruisce il form.\r\n\r\n ngOnInit(): void {\r\n this.logger?.logFormAction('init', { schemaId: this.schema?.id ?? 'unknown', hasFormGroup: !!this.formGroup });\r\n if (!this.schema) {\r\n this.logger?.logFormAction('init', { schemaId: 'unknown', error: 'schema non presente' });\r\n return;\r\n }\r\n this.initFormFromSchema();\r\n }\r\n\r\n /**\r\n * Rileva cambiamenti sugli @Input.\r\n * Ricostruisce il form quando cambia lo schema (id diverso).\r\n * Cruciale per il wizard che cambia schema ad ogni step.\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['schema'] && !changes['schema'].firstChange) {\r\n const newSchema = changes['schema'].currentValue as UiFormSchema;\r\n if (newSchema && newSchema.id !== this.currentSchemaId) {\r\n this.logger?.debug('form', 'schemaRebuild', {\r\n schemaId: newSchema?.id,\r\n previousSchemaId: this.currentSchemaId,\r\n });\r\n this.destroyForm();\r\n this.initFormFromSchema();\r\n }\r\n }\r\n\r\n // Aggiorna lo stato disabled/readonly globalmente\r\n if (changes['disabled'] && !changes['disabled'].firstChange && this.formGroup) {\r\n this.allFlatFields.forEach((field) => {\r\n const control = this.formGroup.get(field.key);\r\n if (!control) return;\r\n if (this.disabled && control.enabled) {\r\n control.disable({ emitEvent: false });\r\n } else if (!this.disabled && control.disabled && !field.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n });\r\n\r\n // Aggiorna disabled anche nelle istanze repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n for (const field of section.fields) {\r\n const control = instanceFg.get(field.key);\r\n if (!control) continue;\r\n if (this.disabled && control.enabled) {\r\n control.disable({ emitEvent: false });\r\n } else if (!this.disabled && control.disabled && !field.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.logger?.debug('form', 'afterViewInit', {\r\n schemaId: this.schema?.id,\r\n hasFormGroup: !!this.formGroup,\r\n fieldCount: this.formGroup ? Object.keys(this.formGroup.controls).length : 0,\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.logger?.logFormAction('destroy', { schemaId: this.currentSchemaId ?? 'unknown' });\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n this.valueChangeSub?.unsubscribe();\r\n\r\n // BlackBox: cleanup DOM listeners\r\n if (this.bbFocusHandler) {\r\n this.elRef.nativeElement.removeEventListener('focusin', this.bbFocusHandler, true);\r\n }\r\n if (this.bbBlurHandler) {\r\n this.elRef.nativeElement.removeEventListener('focusout', this.bbBlurHandler, true);\r\n }\r\n }\r\n\r\n /**\r\n * Inizializza il form dallo schema corrente.\r\n * Estratto per poter essere richiamato sia da ngOnInit che da ngOnChanges.\r\n */\r\n private initFormFromSchema(): void {\r\n if (!this.schema) {\r\n this.logger?.logFormAction('init', { schemaId: 'unknown', error: 'schema nullo' });\r\n return;\r\n }\r\n const totalFields = this.schema.sections?.reduce((sum, s) => sum + s.fields.length, 0) ?? 0;\r\n this.logger?.logFormAction('init', {\r\n schemaId: this.schema.id,\r\n sectionCount: this.schema.sections?.length,\r\n fieldCount: totalFields,\r\n });\r\n this.currentSchemaId = this.schema.id;\r\n this.buildSectionAccordionMap();\r\n this.buildForm();\r\n // Dopo il FormArray reale, allinea i descriptor accordion (max tra min e righe initialData).\r\n for (const section of this.repeatableSections) {\r\n this.rebuildRepeatableAccordion(section);\r\n }\r\n this.isInitializing = false;\r\n this.logger?.debug('form', 'formBuilt', {\r\n schemaId: this.schema.id,\r\n controlKeys: Object.keys(this.formGroup.controls),\r\n });\r\n }\r\n\r\n /**\r\n * Pulisce lo stato del form prima di un rebuild.\r\n */\r\n private destroyForm(): void {\r\n this.logger?.debug('form', 'destroyForm', { schemaId: this.currentSchemaId });\r\n this.valueChangeSub?.unsubscribe();\r\n this.valueChangeSub = undefined;\r\n this.filteredOptions = {};\r\n this.prevalorizedFields.clear();\r\n this.validationRulesMap = {};\r\n this.fieldDependencies.clear();\r\n this.sectionAccordionMap.clear();\r\n this.isInitializing = true;\r\n this.currentSchemaId = null;\r\n }\r\n\r\n // ─── Costruzione form ───────────────────────────────────────────\r\n\r\n private buildForm(): void {\r\n const controls: Record<string, AbstractControl> = {};\r\n\r\n // Campi piatti (sezioni non-repeatable)\r\n for (const field of this.allFlatFields) {\r\n const initialValue = this.initialData?.[field.key] ?? field.defaultValue ?? null;\r\n const isDisabled = field.disabled || this.disabled;\r\n\r\n const control = new FormControl({ value: initialValue, disabled: isDisabled });\r\n\r\n if (field.validation?.length) {\r\n this.validationRulesMap[field.key] = field.validation;\r\n }\r\n\r\n if (initialValue != null && initialValue !== '' && initialValue !== false) {\r\n this.prevalorizedFields.add(field.key);\r\n }\r\n\r\n if (field.options && !this.isObservable(field.options)) {\r\n this.filteredOptions[field.key] = [...(field.options as UiFieldOption[])];\r\n }\r\n\r\n controls[field.key] = control;\r\n }\r\n\r\n // FormArray per sezioni repeatable\r\n for (const section of this.repeatableSections) {\r\n const initialArray = this.initialData?.[section.id] as Record<string, any>[] | undefined;\r\n const count = this.getRepeatableInitialInstanceCount(section);\r\n\r\n const groups: FormGroup[] = [];\r\n for (let i = 0; i < count; i++) {\r\n groups.push(this.buildInstanceFormGroup(section, initialArray?.[i]));\r\n }\r\n controls[section.id] = new FormArray(groups);\r\n }\r\n\r\n this.formGroup = new FormGroup(controls);\r\n\r\n // Applica validatori iniziali\r\n this.applyAllValidators();\r\n\r\n // Registra dipendenze\r\n this.buildDependencyMap();\r\n\r\n // Sottoscrivi ai cambiamenti di valore\r\n this.valueChangeSub = this.formGroup.valueChanges.pipe(debounceTime(50), takeUntil(this.destroy$)).subscribe(() => {\r\n this.evaluateAllConditions();\r\n this.updateDependentOptions();\r\n if (!this.isInitializing) {\r\n this.valueChange.emit(this.getFormValue());\r\n this.validationChange.emit(this.getValidationState());\r\n this.cdr.markForCheck();\r\n }\r\n });\r\n\r\n // Valutazione condizioni iniziale\r\n this.evaluateAllConditions();\r\n\r\n // BlackBox: setup form event tracking\r\n this.setupBlackboxTracking();\r\n }\r\n\r\n /** Costruisce un FormGroup per una singola istanza di sezione repeatable. */\r\n private buildInstanceFormGroup(section: UiFormSection, data?: Record<string, any>): FormGroup {\r\n const controls: Record<string, FormControl> = {};\r\n\r\n for (const field of section.fields) {\r\n const initialValue = data?.[field.key] ?? field.defaultValue ?? null;\r\n const isDisabled = field.disabled || this.disabled;\r\n controls[field.key] = new FormControl({ value: initialValue, disabled: isDisabled });\r\n\r\n if (field.options && !this.isObservable(field.options)) {\r\n this.filteredOptions[field.key] = [...(field.options as UiFieldOption[])];\r\n }\r\n }\r\n\r\n const fg = new FormGroup(controls);\r\n\r\n // Applica validatori all'istanza\r\n for (const field of section.fields) {\r\n if (field.validation?.length) {\r\n const formData = fg.getRawValue();\r\n this.validationService.updateFieldValidators(fg.get(field.key)!, field.validation, formData);\r\n }\r\n }\r\n\r\n return fg;\r\n }\r\n\r\n // ─── BlackBox form tracking ──────────────────────────────────────\r\n\r\n /**\r\n * Sets up BlackBox form event tracking.\r\n * - Focus/blur: DOM event delegation on the host element\r\n * - Value changes: per-field subscriptions with debounce\r\n * - Validation errors: per-field statusChanges subscriptions\r\n * @internal\r\n */\r\n private setupBlackboxTracking(): void {\r\n if (!this.blackbox) return;\r\n const config = this.blackbox.getConfig().formTracking;\r\n const currentRoute = this.bbRouter?.url ?? '';\r\n const formId = this.schema?.id ?? 'unknown';\r\n\r\n // Focus tracking via event delegation\r\n if (config.trackFocus) {\r\n this.bbFocusHandler = (e: FocusEvent) => {\r\n const fieldKey = this.resolveFieldKeyFromEvent(e);\r\n if (!fieldKey) return;\r\n this.blackbox!.trackFormEvent({\r\n timestamp: Date.now(),\r\n route: this.bbRouter?.url ?? currentRoute,\r\n formId,\r\n fieldKey,\r\n eventType: 'focus',\r\n });\r\n };\r\n this.elRef.nativeElement.addEventListener('focusin', this.bbFocusHandler, true);\r\n }\r\n\r\n // Blur tracking via event delegation\r\n if (config.trackBlur) {\r\n this.bbBlurHandler = (e: FocusEvent) => {\r\n const fieldKey = this.resolveFieldKeyFromEvent(e);\r\n if (!fieldKey) return;\r\n this.blackbox!.trackFormEvent({\r\n timestamp: Date.now(),\r\n route: this.bbRouter?.url ?? currentRoute,\r\n formId,\r\n fieldKey,\r\n eventType: 'blur',\r\n });\r\n };\r\n this.elRef.nativeElement.addEventListener('focusout', this.bbBlurHandler, true);\r\n }\r\n\r\n // Per-field value change + validation tracking\r\n for (const field of this.allFields) {\r\n const control = this.formGroup.get(field.key);\r\n if (!control) continue;\r\n\r\n // Value changes\r\n if (config.trackValueChanges) {\r\n control.valueChanges\r\n .pipe(\r\n debounceTime(config.debounceMs),\r\n distinctUntilChanged(),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe((value) => {\r\n this.blackbox!.trackFormEvent({\r\n timestamp: Date.now(),\r\n route: this.bbRouter?.url ?? currentRoute,\r\n formId,\r\n fieldKey: field.key,\r\n eventType: 'valueChange',\r\n metadata: {\r\n value: config.trackValues ? value : undefined,\r\n valid: control.valid,\r\n formValues: config.trackValues ? this.formGroup.getRawValue() : undefined,\r\n },\r\n });\r\n });\r\n }\r\n\r\n // Validation errors\r\n if (config.trackValidation) {\r\n control.statusChanges\r\n .pipe(\r\n rxFilter((status) => status === 'INVALID'),\r\n distinctUntilChanged(),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe(() => {\r\n const errors = control.errors\r\n ? Object.keys(control.errors)\r\n : [];\r\n this.blackbox!.trackFormEvent({\r\n timestamp: Date.now(),\r\n route: this.bbRouter?.url ?? currentRoute,\r\n formId,\r\n fieldKey: field.key,\r\n eventType: 'validationError',\r\n metadata: {\r\n valid: false,\r\n errors,\r\n },\r\n });\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resolve the form field key from a focus/blur DOM event.\r\n * Walks up from the event target looking for `formControlName` or `data-field-key`.\r\n * @internal\r\n */\r\n private resolveFieldKeyFromEvent(e: FocusEvent): string | null {\r\n let target = e.target as HTMLElement | null;\r\n const maxDepth = 5;\r\n let depth = 0;\r\n\r\n while (target && depth < maxDepth) {\r\n // formControlName attribute\r\n const fcn = target.getAttribute('formControlName');\r\n if (fcn) return fcn;\r\n\r\n // data-field-key attribute\r\n const dfk = target.getAttribute('data-field-key');\r\n if (dfk) return dfk;\r\n\r\n target = target.parentElement;\r\n depth++;\r\n }\r\n return null;\r\n }\r\n\r\n // ─── Validazione ────────────────────────────────────────────────\r\n\r\n private applyAllValidators(): void {\r\n // Campi piatti\r\n for (const field of this.allFlatFields) {\r\n if (field.validation?.length) {\r\n const formData = this.formGroup.getRawValue();\r\n this.validationService.updateFieldValidators(this.formGroup.get(field.key)!, field.validation, formData);\r\n }\r\n }\r\n\r\n // Campi nelle istanze repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n for (const field of section.fields) {\r\n if (field.validation?.length) {\r\n const formData = instanceFg.getRawValue();\r\n this.validationService.updateFieldValidators(instanceFg.get(field.key)!, field.validation, formData);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ─── Condizioni ─────────────────────────────────────────────────\r\n\r\n private evaluateAllConditions(): void {\r\n const formData = this.formGroup.getRawValue();\r\n\r\n // Campi piatti\r\n for (const field of this.allFlatFields) {\r\n this.evaluateFieldConditions(field, this.formGroup, formData);\r\n }\r\n\r\n // Campi nelle istanze repeatable (scope intra-istanza)\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n const instanceData = instanceFg.getRawValue();\r\n for (const field of section.fields) {\r\n this.evaluateFieldConditions(field, instanceFg, instanceData);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Valuta condizioni di visibilita/disabilitazione per un singolo campo nel contesto del FormGroup dato. */\r\n private evaluateFieldConditions(field: UiFormFieldDescriptor, fg: FormGroup, formData: Record<string, any>): void {\r\n if (field.conditions?.length) {\r\n const visible = this.conditionService.evaluateConditions(field.conditions, formData);\r\n const control = fg.get(field.key);\r\n if (control) {\r\n if (!visible && control.enabled) {\r\n control.disable({ emitEvent: false });\r\n if (!field.freezeValueOnDisable) {\r\n control.setValue(field.defaultValue ?? null, { emitEvent: false });\r\n }\r\n } else if (visible && control.disabled && !field.disabled && !this.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n }\r\n }\r\n\r\n if (field.disableConditions?.length && !field.conditions?.length) {\r\n const shouldDisable = this.conditionService.evaluateConditions(field.disableConditions, formData);\r\n const control = fg.get(field.key);\r\n if (control) {\r\n if (shouldDisable && control.enabled) {\r\n control.disable({ emitEvent: false });\r\n if (!field.freezeValueOnDisable) {\r\n control.setValue(field.defaultValue ?? null, { emitEvent: false });\r\n }\r\n } else if (!shouldDisable && control.disabled && !field.disabled && !this.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n }\r\n }\r\n\r\n if (field.validation?.some((r) => r.conditions?.length)) {\r\n this.validationService.updateFieldValidators(fg.get(field.key)!, field.validation!, formData);\r\n }\r\n }\r\n\r\n // ─── Dipendenze opzioni ─────────────────────────────────────────\r\n\r\n private buildDependencyMap(): void {\r\n for (const field of this.allFields) {\r\n if (field.dependentOptions?.dependsOn) {\r\n const depKey = field.dependentOptions.dependsOn;\r\n if (!this.fieldDependencies.has(depKey)) {\r\n this.fieldDependencies.set(depKey, new Set());\r\n }\r\n this.fieldDependencies.get(depKey)!.add(field.key);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Costruisce la mappa dei descriptors accordion per le sezioni collapsibili.\r\n * Ogni sezione collapsibile viene mappata a un singolo UiAccordionDescriptor.\r\n * @internal\r\n */\r\n private buildSectionAccordionMap(): void {\r\n this.sectionAccordionMap.clear();\r\n this.repeatableAccordionMap.clear();\r\n\r\n for (const section of this.schema.sections) {\r\n if (section.repeatable) {\r\n this.rebuildRepeatableAccordion(section);\r\n } else if (section.collapsible) {\r\n this.sectionAccordionMap.set(section.id, [{\r\n id: section.id,\r\n title: section.title || '',\r\n icon: section.icon,\r\n expanded: !section.collapsed,\r\n subtitle: section.description,\r\n }]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Numero di istanze repeatable da creare al build/reset:\r\n * almeno `repeatable.min` (se `min > 0` o omesso default 1), mai meno delle righe in `initialData[section.id]`.\r\n * Con `min: 0` non si aggiungono righe oltre a quelle già presenti nei dati iniziali.\r\n */\r\n private getRepeatableInitialInstanceCount(section: UiFormSection): number {\r\n const cfg = section.repeatable;\r\n if (!cfg) return 0;\r\n const initialArray = this.initialData?.[section.id] as Record<string, any>[] | undefined;\r\n const initialLen = initialArray?.length ?? 0;\r\n const minReq = cfg.min;\r\n if (minReq === 0) {\r\n return initialLen;\r\n }\r\n const minInstances = minReq ?? 1;\r\n return Math.max(initialLen, minInstances);\r\n }\r\n\r\n /** Ricostruisce i descriptor accordion per le istanze di una sezione repeatable. */\r\n private rebuildRepeatableAccordion(section: UiFormSection): void {\r\n const arr = this.getRepeatableArray(section.id);\r\n const count = arr?.length ?? this.getRepeatableInitialInstanceCount(section);\r\n const titleTemplate = section.repeatable!.instanceTitle || (section.title ? `${section.title} {index}` : 'Elemento {index}');\r\n const items: UiAccordionDescriptor[] = [];\r\n\r\n for (let i = 0; i < count; i++) {\r\n items.push({\r\n id: `${section.id}-${i}`,\r\n title: titleTemplate.replace('{index}', String(i + 1)),\r\n icon: section.icon,\r\n expanded: true,\r\n index: i,\r\n });\r\n }\r\n\r\n this.repeatableAccordionMap.set(section.id, items);\r\n }\r\n\r\n private updateDependentOptions(): void {\r\n const formData = this.formGroup.getRawValue();\r\n\r\n for (const field of this.allFields) {\r\n // Dynamic options\r\n if (field.dynamicOptions) {\r\n if (field.dynamicOptions.type === 'year-range') {\r\n const min = field.dynamicOptions.minYear || new Date().getFullYear() - 10;\r\n const max = field.dynamicOptions.maxYear || new Date().getFullYear();\r\n const opts: UiFieldOption[] = [];\r\n for (let y = max; y >= min; y--) {\r\n opts.push({ value: y, label: String(y) });\r\n }\r\n this.filteredOptions[field.key] = opts;\r\n } else if (field.dynamicOptions.generator) {\r\n this.filteredOptions[field.key] = field.dynamicOptions.generator(formData);\r\n }\r\n }\r\n\r\n // Dependent options\r\n if (field.dependentOptions && field.options && !this.isObservable(field.options)) {\r\n const dep = field.dependentOptions;\r\n const depValue = formData[dep.dependsOn];\r\n const allOptions = field.options as UiFieldOption[];\r\n\r\n if (depValue == null || depValue === '') {\r\n this.filteredOptions[field.key] = [...allOptions];\r\n continue;\r\n }\r\n\r\n this.filteredOptions[field.key] = allOptions.filter((opt) => {\r\n if (dep.filterType === 'custom' && dep.filterFn) {\r\n return dep.filterFn(opt, depValue, formData);\r\n }\r\n const optVal = Number(opt.value);\r\n const depVal = Number(depValue);\r\n if (isNaN(optVal) || isNaN(depVal)) return true;\r\n\r\n switch (dep.filterType) {\r\n case 'greater_than':\r\n return optVal > depVal;\r\n case 'greater_equal':\r\n return optVal >= depVal;\r\n case 'less_than':\r\n return optVal < depVal;\r\n case 'less_equal':\r\n return optVal <= depVal;\r\n case 'equals':\r\n return optVal === depVal;\r\n case 'not_equals':\r\n return optVal !== depVal;\r\n default:\r\n return true;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // ─── API pubblica ───────────────────────────────────────────────\r\n\r\n /** Verifica se un campo e visibile (opzionalmente nel contesto di un FormGroup specifico). */\r\n isFieldVisible(fieldKey: string, fg?: FormGroup): boolean {\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n if (!field?.conditions?.length) return true;\r\n const target = fg || this.formGroup;\r\n return this.conditionService.evaluateConditions(field.conditions, target.getRawValue());\r\n }\r\n\r\n /** Verifica se un campo e obbligatorio (include validazione condizionale). */\r\n isFieldRequired(fieldKey: string, fg?: FormGroup): boolean {\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n if (field?.required) return true;\r\n\r\n const rules = field?.validation || [];\r\n const target = fg || this.formGroup;\r\n const formData = target.getRawValue();\r\n return rules.some((r) => {\r\n if (r.type !== 'required') return false;\r\n if (!r.conditions?.length) return true;\r\n return this.conditionService.evaluateConditions(r.conditions, formData);\r\n });\r\n }\r\n\r\n /** Verifica se una sezione e visibile. */\r\n isSectionVisible(sectionId: string): boolean {\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section?.conditions?.length) return true;\r\n return this.conditionService.evaluateConditions(section.conditions, this.formGroup.getRawValue());\r\n }\r\n\r\n /** Descriptors accordion per una sezione collapsibile. */\r\n getSectionAccordionItems(sectionId: string): UiAccordionDescriptor[] {\r\n return this.sectionAccordionMap.get(sectionId) || [];\r\n }\r\n\r\n /** Descriptors accordion per le istanze di una sezione repeatable. */\r\n getRepeatableAccordionItems(sectionId: string): UiAccordionDescriptor[] {\r\n return this.repeatableAccordionMap.get(sectionId) || [];\r\n }\r\n\r\n /** Verifica se mostrare errori per un campo. */\r\n shouldShowFieldErrors(fieldKey: string, fg?: FormGroup): boolean {\r\n const target = fg || this.formGroup;\r\n const control = target.get(fieldKey);\r\n return this.fieldErrorService.shouldShowFieldErrors(control, {\r\n treatAsPrevalorized: this.prevalorizedFields.has(fieldKey),\r\n });\r\n }\r\n\r\n /** Errori di un campo come array di messaggi. */\r\n getFieldErrors(fieldKey: string, fg?: FormGroup): string[] {\r\n const target = fg || this.formGroup;\r\n const control = target.get(fieldKey);\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n return this.fieldErrorService.getFieldErrors(control, field?.validation);\r\n }\r\n\r\n /** Valore completo del form (include campi disabilitati). */\r\n getFormValue(): UiFormData {\r\n return this.formGroup.getRawValue();\r\n }\r\n\r\n /** Il form e valido. */\r\n isFormValid(): boolean {\r\n return this.formGroup.valid;\r\n }\r\n\r\n /**\r\n * True se tutti i controlli sono validi, ignorando le chiavi indicate\r\n * (flat e dentro ogni istanza repeatable).\r\n */\r\n isFormValidExcludingFieldKeys(excludedKeys: ReadonlySet<string>): boolean {\r\n return this.isFormGroupValidExcluding(this.formGroup, excludedKeys);\r\n }\r\n\r\n /**\r\n * Risolve la chiave per `customFieldTemplates` (`templateKey` → `component` → `field.key`).\r\n */\r\n resolveCustomTemplateKey(field: UiFormFieldDescriptor): string {\r\n const cc = field.customConfig;\r\n return cc?.templateKey ?? cc?.component ?? field.key;\r\n }\r\n\r\n /**\r\n * Template Angular registrato per il campo custom, o fallback globale.\r\n */\r\n getCustomTemplateRef(field: UiFormFieldDescriptor): TemplateRef<unknown> | null {\r\n const key = this.resolveCustomTemplateKey(field);\r\n return this.customFieldTemplates[key] ?? this.customFieldTemplateFallback ?? null;\r\n }\r\n\r\n /**\r\n * Contesto passato a `ngTemplateOutlet` per il campo custom (CVA sul `control`).\r\n */\r\n getCustomFieldOutletContext(\r\n field: UiFormFieldDescriptor,\r\n fg: FormGroup,\r\n nestedErrorKeyPrefix?: string,\r\n ): UiCustomFieldTemplateContext {\r\n const control = fg.get(field.key) as FormControl;\r\n return {\r\n $implicit: field,\r\n field,\r\n formGroup: fg,\r\n control,\r\n config: field.customConfig?.config ?? {},\r\n nestedErrorKeyPrefix,\r\n emitCustomEvent: (event: string, data?: unknown) => {\r\n this.customEvent.emit({ field: field.key, event, data });\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Template e contesto in un solo oggetto (evita doppie valutazioni nel template).\r\n */\r\n getCustomFieldOutlet(\r\n field: UiFormFieldDescriptor,\r\n fg: FormGroup,\r\n nestedErrorKeyPrefix?: string,\r\n ): { template: TemplateRef<unknown>; context: UiCustomFieldTemplateContext } | null {\r\n const template = this.getCustomTemplateRef(field);\r\n if (!template) return null;\r\n return { template, context: this.getCustomFieldOutletContext(field, fg, nestedErrorKeyPrefix) };\r\n }\r\n\r\n /** Prefisso chiavi errore per campi custom annidati (flat o repeatable). */\r\n buildNestedErrorKeyPrefix(fieldKey: string, instanceKeyPrefix?: string): string {\r\n const base = instanceKeyPrefix ? `${instanceKeyPrefix}${fieldKey}` : fieldKey;\r\n return `${base}__`;\r\n }\r\n\r\n /** Merge errori nested da CVA custom nel dettaglio error-summary. */\r\n private appendCustomNestedFieldErrors(\r\n details: UiFormErrorDetail[],\r\n field: UiFormFieldDescriptor,\r\n control: AbstractControl,\r\n labelPrefix: string,\r\n nestedErrorKeyPrefix: string,\r\n ): void {\r\n if (field.type !== 'custom') return;\r\n const nested = control.errors?.[UI_FORM_NESTED_FIELD_ERRORS_KEY];\r\n if (!Array.isArray(nested) || nested.length === 0) return;\r\n\r\n for (const item of nested as UiFormErrorDetail[]) {\r\n if (!item?.errors?.length) continue;\r\n const relativeKey = item.fieldKey ?? '';\r\n details.push({\r\n fieldKey: relativeKey ? `${nestedErrorKeyPrefix}${relativeKey}` : nestedErrorKeyPrefix.slice(0, -2),\r\n fieldLabel: `${labelPrefix} > ${item.fieldLabel}`,\r\n errors: item.errors,\r\n });\r\n }\r\n }\r\n\r\n private isFormGroupValidExcluding(group: FormGroup, excludedKeys: ReadonlySet<string>): boolean {\r\n for (const key of Object.keys(group.controls)) {\r\n const c = group.get(key);\r\n if (!c) continue;\r\n if (c instanceof FormArray) {\r\n for (let i = 0; i < c.length; i++) {\r\n const row = c.at(i);\r\n if (row instanceof FormGroup && !this.isFormGroupValidExcluding(row, excludedKeys)) {\r\n return false;\r\n }\r\n }\r\n } else if (c instanceof FormGroup) {\r\n if (!this.isFormGroupValidExcluding(c, excludedKeys)) return false;\r\n } else if (c instanceof FormControl) {\r\n if (excludedKeys.has(key)) continue;\r\n if (c.invalid) return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Stato di validazione completo. */\r\n getValidationState(): UiFormValidationState {\r\n const errors: Record<string, string[]> = {};\r\n const dirty: string[] = [];\r\n const touched: string[] = [];\r\n\r\n for (const field of this.allFlatFields) {\r\n const control = this.formGroup.get(field.key);\r\n if (!control) continue;\r\n if (control.dirty) dirty.push(field.key);\r\n if (control.touched) touched.push(field.key);\r\n const fieldErrors = this.getFieldErrors(field.key);\r\n if (fieldErrors.length) errors[field.key] = fieldErrors;\r\n }\r\n\r\n // Includi errori delle istanze repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n for (const field of section.fields) {\r\n const control = instanceFg.get(field.key);\r\n if (!control) continue;\r\n const prefixedKey = `${section.id}[${i}].${field.key}`;\r\n if (control.dirty) dirty.push(prefixedKey);\r\n if (control.touched) touched.push(prefixedKey);\r\n const fieldErrors = this.getFieldErrors(field.key, instanceFg);\r\n if (fieldErrors.length) errors[prefixedKey] = fieldErrors;\r\n }\r\n }\r\n }\r\n\r\n return { valid: this.formGroup.valid, errors, dirty, touched };\r\n }\r\n\r\n /** Errori dettagliati per l'error summary. */\r\n getDetailedFormErrors(): UiFormErrorDetail[] {\r\n const details: UiFormErrorDetail[] = [];\r\n\r\n // Campi piatti\r\n for (const field of this.allFlatFields) {\r\n if (field.type === 'flag' || field.type === 'divider') continue;\r\n if (!this.isFieldVisible(field.key)) continue;\r\n const control = this.formGroup.get(field.key);\r\n if (!control?.errors) continue;\r\n\r\n const nestedPrefix = this.buildNestedErrorKeyPrefix(field.key);\r\n this.appendCustomNestedFieldErrors(details, field, control, field.label, nestedPrefix);\r\n\r\n if (field.type === 'custom' && control.errors[UI_FORM_NESTED_FIELD_ERRORS_KEY]) {\r\n continue;\r\n }\r\n\r\n const errors = this.getFieldErrors(field.key);\r\n if (errors.length) {\r\n details.push({ fieldKey: field.key, fieldLabel: field.label, errors });\r\n }\r\n }\r\n\r\n // Campi nelle istanze repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n const titleTemplate = section.repeatable!.instanceTitle || (section.title ? `${section.title} {index}` : 'Elemento {index}');\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n const instanceLabel = titleTemplate.replace('{index}', String(i + 1));\r\n const instanceKeyPrefix = `${section.id}[${i}].`;\r\n for (const field of section.fields) {\r\n if (field.type === 'flag' || field.type === 'divider') continue;\r\n if (!this.isFieldVisible(field.key, instanceFg)) continue;\r\n const control = instanceFg.get(field.key);\r\n if (!control?.errors) continue;\r\n\r\n const nestedPrefix = this.buildNestedErrorKeyPrefix(field.key, instanceKeyPrefix);\r\n this.appendCustomNestedFieldErrors(\r\n details,\r\n field,\r\n control,\r\n `${instanceLabel} > ${field.label}`,\r\n nestedPrefix,\r\n );\r\n\r\n if (field.type === 'custom' && control.errors[UI_FORM_NESTED_FIELD_ERRORS_KEY]) {\r\n continue;\r\n }\r\n\r\n const errors = this.getFieldErrors(field.key, instanceFg);\r\n if (errors.length) {\r\n details.push({\r\n fieldKey: `${section.id}[${i}].${field.key}`,\r\n fieldLabel: `${instanceLabel} > ${field.label}`,\r\n errors,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return details;\r\n }\r\n\r\n /** Conta errori totali. */\r\n getFormErrorsCount(): number {\r\n return this.getDetailedFormErrors().reduce((sum, d) => sum + d.errors.length, 0);\r\n }\r\n\r\n /** Controlla se ci sono errori. */\r\n hasFormErrors(): boolean {\r\n return this.getFormErrorsCount() > 0;\r\n }\r\n\r\n /** Controllo per un campo. */\r\n getFieldControl(key: string): FormControl | null {\r\n return (this.formGroup.get(key) as FormControl) ?? null;\r\n }\r\n\r\n /** Aggiorna il valore di un campo programmaticamente. */\r\n updateFieldValue(key: string, value: any): void {\r\n const control = this.formGroup.get(key);\r\n if (control) {\r\n control.setValue(value);\r\n control.markAsDirty();\r\n }\r\n }\r\n\r\n /** Forza la validazione di tutti i campi (incluse istanze repeatable). */\r\n validateAllFields(): void {\r\n // Campi piatti\r\n Object.keys(this.formGroup.controls).forEach((key) => {\r\n const control = this.formGroup.get(key);\r\n if (control instanceof FormArray) {\r\n for (let i = 0; i < control.length; i++) {\r\n const fg = control.at(i) as FormGroup;\r\n Object.keys(fg.controls).forEach((fk) => {\r\n const c = fg.get(fk);\r\n c?.markAsTouched();\r\n c?.markAsDirty();\r\n c?.updateValueAndValidity();\r\n });\r\n }\r\n } else {\r\n control?.markAsTouched();\r\n control?.markAsDirty();\r\n control?.updateValueAndValidity();\r\n }\r\n });\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ─── API Repeatable ────────────────────────────────────────────\r\n\r\n /** Restituisce il FormArray di una sezione repeatable. */\r\n getRepeatableArray(sectionId: string): FormArray | null {\r\n const control = this.formGroup?.get(sectionId);\r\n return control instanceof FormArray ? control : null;\r\n }\r\n\r\n /** Restituisce il FormGroup di una specifica istanza repeatable. */\r\n getInstanceFormGroup(sectionId: string, index: number): FormGroup | null {\r\n const arr = this.getRepeatableArray(sectionId);\r\n return arr?.at(index) as FormGroup ?? null;\r\n }\r\n\r\n /** Verifica se e possibile aggiungere nuove istanze. */\r\n canAddInstance(sectionId: string): boolean {\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section?.repeatable) return false;\r\n const arr = this.getRepeatableArray(sectionId);\r\n if (!arr) return false;\r\n return section.repeatable.max == null || arr.length < section.repeatable.max;\r\n }\r\n\r\n /** Verifica se e possibile rimuovere istanze. */\r\n canRemoveInstance(sectionId: string): boolean {\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section?.repeatable) return false;\r\n const arr = this.getRepeatableArray(sectionId);\r\n if (!arr) return false;\r\n return arr.length > (section.repeatable.min ?? 1);\r\n }\r\n\r\n /** Aggiunge una nuova istanza vuota a una sezione repeatable. */\r\n addRepeatableInstance(sectionId: string): void {\r\n if (!this.canAddInstance(sectionId)) return;\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section) return;\r\n\r\n const arr = this.getRepeatableArray(sectionId)!;\r\n arr.push(this.buildInstanceFormGroup(section));\r\n this.rebuildRepeatableAccordion(section);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Rimuove un'istanza da una sezione repeatable. */\r\n removeRepeatableInstance(sectionId: string, index: number): void {\r\n if (!this.canRemoveInstance(sectionId)) return;\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section?.repeatable) return;\r\n\r\n if (section.repeatable.confirmRemove) {\r\n const msg = section.repeatable.confirmMessage ?? 'Sei sicuro di voler rimuovere questa sezione?';\r\n if (!confirm(msg)) return;\r\n }\r\n\r\n const arr = this.getRepeatableArray(sectionId)!;\r\n arr.removeAt(index);\r\n this.rebuildRepeatableAccordion(section);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Duplica un'istanza esistente con i suoi valori. */\r\n duplicateRepeatableInstance(sectionId: string, index: number): void {\r\n if (!this.canAddInstance(sectionId)) return;\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section) return;\r\n\r\n const arr = this.getRepeatableArray(sectionId)!;\r\n const sourceData = (arr.at(index) as FormGroup).getRawValue();\r\n const newGroup = this.buildInstanceFormGroup(section, sourceData);\r\n arr.insert(index + 1, newGroup);\r\n this.rebuildRepeatableAccordion(section);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Titolo di un'istanza repeatable. */\r\n getInstanceTitle(section: UiFormSection, index: number): string {\r\n const template = section.repeatable?.instanceTitle || (section.title ? `${section.title} {index}` : 'Elemento {index}');\r\n return template.replace('{index}', String(index + 1));\r\n }\r\n\r\n /** Scrolla al campo e lo evidenzia. */\r\n scrollToField(fieldKey: string): void {\r\n const control = this.formGroup.get(fieldKey);\r\n if (control) {\r\n control.markAsTouched();\r\n control.markAsDirty();\r\n control.updateValueAndValidity();\r\n }\r\n\r\n setTimeout(() => {\r\n const selectors = [`[data-field-key=\"${fieldKey}\"]`, `[formControlName=\"${fieldKey}\"]`];\r\n let targetElement: HTMLElement | null = null;\r\n for (const sel of selectors) {\r\n targetElement = this.elRef.nativeElement.querySelector(sel);\r\n if (targetElement) break;\r\n }\r\n if (!targetElement) return;\r\n\r\n // Se trovato il formControlName, risali al wrapper\r\n if (targetElement.hasAttribute('formControlName')) {\r\n const wrapper = targetElement.closest('.ui-form-builder__field-wrapper, mat-form-field');\r\n if (wrapper) targetElement = wrapper as HTMLElement;\r\n }\r\n\r\n targetElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n\r\n // Aggiungi classe highlight e rimuovila dopo l'animazione\r\n targetElement.classList.add('ui-form-field--highlight');\r\n setTimeout(() => targetElement!.classList.remove('ui-form-field--highlight'), 2000);\r\n }, 100);\r\n }\r\n\r\n /** Submit del form. */\r\n onSubmit(): void {\r\n this.validateAllFields();\r\n const formValue = this.getFormValue();\r\n const isValid = this.formGroup.valid;\r\n this.logger?.logFormAction('submit', {\r\n schemaId: this.schema?.id ?? 'unknown',\r\n valid: isValid,\r\n fieldCount: Object.keys(formValue).length,\r\n });\r\n if (isValid) {\r\n this.formSubmit.emit(formValue);\r\n }\r\n }\r\n\r\n /** Reset del form. */\r\n onReset(): void {\r\n // Resetta campi piatti\r\n for (const field of this.allFlatFields) {\r\n const value = this.initialData?.[field.key] ?? field.defaultValue ?? null;\r\n const control = this.formGroup.get(field.key);\r\n control?.setValue(value, { emitEvent: false });\r\n control?.markAsPristine();\r\n control?.markAsUntouched();\r\n }\r\n\r\n // Resetta sezioni repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n const initialArray = this.initialData?.[section.id] as Record<string, any>[] | undefined;\r\n const count = this.getRepeatableInitialInstanceCount(section);\r\n\r\n arr.clear();\r\n for (let i = 0; i < count; i++) {\r\n arr.push(this.buildInstanceFormGroup(section, initialArray?.[i]));\r\n }\r\n this.rebuildRepeatableAccordion(section);\r\n }\r\n\r\n this.formGroup.updateValueAndValidity();\r\n this.formReset.emit();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ─── Template helpers ───────────────────────────────────────────\r\n\r\n /** Opzioni per un campo (filtrando per autocomplete query). */\r\n getFieldOptions(field: UiFormFieldDescriptor): UiFieldOption[] {\r\n return this.filteredOptions[field.key] || [];\r\n }\r\n\r\n /** Filtra opzioni per autocomplete. */\r\n filterOptions(field: UiFormFieldDescriptor, query: string): void {\r\n if (!query) {\r\n if (field.options && !this.isObservable(field.options)) {\r\n this.filteredOptions[field.key] = [...(field.options as UiFieldOption[])];\r\n }\r\n return;\r\n }\r\n\r\n const lowerQuery = query.toLowerCase();\r\n\r\n if (field.asyncOptions) {\r\n field.asyncOptions(query).then((opts) => {\r\n this.filteredOptions[field.key] = opts;\r\n this.cdr.markForCheck();\r\n });\r\n } else if (field.options && !this.isObservable(field.options)) {\r\n this.filteredOptions[field.key] = (field.options as UiFieldOption[]).filter((o) =>\r\n o.label.toLowerCase().includes(lowerQuery),\r\n );\r\n }\r\n }\r\n\r\n /** Display fn per autocomplete. */\r\n displayFn(options: UiFieldOption[]): (value: any) => string {\r\n return (value: any) => {\r\n const opt = options.find((o) => o.value === value);\r\n return opt?.label || '';\r\n };\r\n }\r\n\r\n /** Seleziona tutte le opzioni per multiselect. */\r\n selectAll(field: UiFormFieldDescriptor): void {\r\n const options = this.getFieldOptions(field);\r\n const allValues = options.filter((o) => !o.disabled).map((o) => o.value);\r\n this.formGroup.get(field.key)?.setValue(allValues);\r\n }\r\n\r\n /** Aggiunge un chip al freemultiselect (da token: Enter o virgola). */\r\n addFreeChip(field: UiFormFieldDescriptor, event: any): void {\r\n const value = (event.value || '').trim();\r\n if (!value) return;\r\n\r\n const current = this.formGroup.get(field.key)?.value || [];\r\n if (!current.includes(value)) {\r\n this.formGroup.get(field.key)?.setValue([...current, value]);\r\n }\r\n event.chipInput?.clear();\r\n }\r\n\r\n /** Aggiunge un chip al freemultiselect sull'evento blur dell'input. */\r\n addFreeChipOnBlur(field: UiFormFieldDescriptor, event: FocusEvent): void {\r\n const input = event.target as HTMLInputElement;\r\n const value = (input.value || '').trim();\r\n if (!value) return;\r\n\r\n const current = this.formGroup.get(field.key)?.value || [];\r\n if (!current.includes(value)) {\r\n this.formGroup.get(field.key)?.setValue([...current, value]);\r\n }\r\n input.value = '';\r\n }\r\n\r\n /** Rimuove un chip dal freemultiselect. */\r\n removeFreeChip(field: UiFormFieldDescriptor, chipValue: string): void {\r\n const current = this.formGroup.get(field.key)?.value || [];\r\n const protected_ = field.metadata?.['cantDeleteList'] || [];\r\n if (protected_.includes(chipValue)) return;\r\n this.formGroup.get(field.key)?.setValue(current.filter((v: string) => v !== chipValue));\r\n }\r\n\r\n /** Verifica se un chip e protetto dalla cancellazione. */\r\n isChipProtected(field: UiFormFieldDescriptor, chipValue: string): boolean {\r\n return (field.metadata?.['cantDeleteList'] || []).includes(chipValue);\r\n }\r\n\r\n /** Rimuove chip da multiselect. */\r\n removeMultiselectChip(field: UiFormFieldDescriptor, chipValue: any): void {\r\n const current = this.formGroup.get(field.key)?.value || [];\r\n this.formGroup.get(field.key)?.setValue(current.filter((v: any) => v !== chipValue));\r\n }\r\n\r\n /** Trova label di un'opzione dal valore. */\r\n getOptionLabel(field: UiFormFieldDescriptor, value: any): string {\r\n const options = this.getFieldOptions(field);\r\n return options.find((o) => o.value === value)?.label || String(value);\r\n }\r\n\r\n /** Tipo di input nativo per il campo. */\r\n getNativeInputType(field: UiFormFieldDescriptor): string {\r\n switch (field.type) {\r\n case 'password':\r\n return 'password';\r\n case 'email':\r\n return 'email';\r\n default:\r\n return 'text';\r\n }\r\n }\r\n\r\n /**\r\n * Genera le classi CSS per il wrapper di un campo,\r\n * combinando eventuali cssClasses dallo schema con le classi\r\n * responsive per il sistema a griglia base-12.\r\n *\r\n * Mobile-first: tutti i campi sono span-12 di default (100%).\r\n * Le classi `ui-col-{breakpoint}-{n}` attivano la larghezza\r\n * configurata solo dal breakpoint indicato in su.\r\n *\r\n * Breakpoint supportati: sm (≥576px), md (≥768px), lg (≥1024px), xl (≥1280px).\r\n */\r\n getFieldWrapperClasses(field: UiFormFieldDescriptor): string {\r\n const classes: string[] = [];\r\n\r\n if (field.cssClasses?.length) {\r\n classes.push(...field.cssClasses);\r\n }\r\n\r\n // layout.columns → classe per il breakpoint md (default desktop)\r\n if (field.layout?.columns) {\r\n classes.push(`ui-col-md-${field.layout.columns}`);\r\n }\r\n\r\n // layout.breakpoints → classi per breakpoint specifici\r\n if (field.layout?.breakpoints) {\r\n for (const [bp, cols] of Object.entries(field.layout.breakpoints)) {\r\n classes.push(`ui-col-${bp}-${cols}`);\r\n }\r\n }\r\n\r\n return classes.join(' ');\r\n }\r\n\r\n /** Character count per textarea/text con maxLength. */\r\n getCharCount(fieldKey: string, fg?: FormGroup): { current: number; max: number } | null {\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n const maxLength = this.fieldErrorService.resolveMaxLength(field?.validation);\r\n if (maxLength == null) return null;\r\n\r\n const target = fg || this.formGroup;\r\n return this.fieldErrorService.getCharCount(target.get(fieldKey), maxLength);\r\n }\r\n\r\n // ─── Utilita private ────────────────────────────────────────────\r\n\r\n private isObservable(value: any): value is Observable<any> {\r\n return value && typeof value.subscribe === 'function';\r\n }\r\n\r\n getRepeatableAddButtons(section: UiFormSection): UiButtonDescriptor[] {\r\n return [{\r\n label: section.repeatable?.addLabel || '+ Aggiungi',\r\n icon: section.repeatable?.addIcon || 'plus',\r\n variant: 'outline',\r\n action: () => this.addRepeatableInstance(section.id)\r\n }];\r\n }\r\n}\r\n","<!--\r\n ============================================================\r\n UI FORM BUILDER - TEMPLATE PRINCIPALE\r\n ============================================================\r\n ARCHITETTURA:\r\n Ogni <ng-template> che contiene direttive [formControlName]\r\n DEVE wrappare il proprio contenuto in un <div [formGroup]>.\r\n Questo perche Angular risolve l'injector di formControlName\r\n dal CONTESTO DI DICHIARAZIONE del template, non dal punto\r\n di inserimento (ngTemplateOutlet).\r\n\r\n Il FormGroup viene passato tramite context per supportare\r\n sia campi piatti (root FormGroup) che campi in istanze\r\n repeatable (instance FormGroup).\r\n\r\n Senza questo wrapper, formControlName non trova il\r\n FormGroupDirective e lancia NG01050.\r\n ============================================================\r\n-->\r\n\r\n@if (schema && formGroup) {\r\n<div class=\"ui-form-builder\" [formGroup]=\"formGroup\" [class]=\"schema.config?.cssClasses?.join(' ')\">\r\n\r\n <!-- ==================== HEADER ==================== -->\r\n @if (schema.title || schema.description) {\r\n <div class=\"ui-form-builder__header\">\r\n @if (schema.title) {\r\n <h2 class=\"ui-form-builder__title\">{{ schema.title }}</h2>\r\n }\r\n @if (schema.description) {\r\n <p class=\"ui-form-builder__description\">{{ schema.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- ==================== SEZIONI ==================== -->\r\n <div class=\"ui-form-builder__sections\">\r\n @for (section of schema.sections; track section.id) {\r\n @if (isSectionVisible(section.id)) {\r\n\r\n <!-- ─── Sezione REPEATABLE ─── -->\r\n @if (section.repeatable) {\r\n <div class=\"ui-form-builder__section ui-form-builder__section--repeatable\" [class]=\"section.cssClasses?.join(' ')\">\r\n @if (section.title || section.description) {\r\n <div class=\"ui-form-builder__section-header\">\r\n @if (section.title) {\r\n <h3 class=\"ui-form-builder__section-title\">{{ section.title }}</h3>\r\n }\r\n @if (section.description) {\r\n <p class=\"ui-form-builder__section-description\">{{ section.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <ui-accordion [items]=\"getRepeatableAccordionItems(section.id)\" [itemTemplate]=\"repeatableBodyTpl\"\r\n [actionsTemplate]=\"repeatableActionsTpl\" mode=\"multi\" class=\"ui-form-builder__repeatable-accordion\">\r\n <!-- Contenuto di ogni istanza -->\r\n <ng-template #repeatableBodyTpl let-item>\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key, getInstanceFormGroup(section.id, item.index)!) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: getInstanceFormGroup(section.id, item.index), nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key, section.id + '[' + item.index + '].') }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Azioni per ogni istanza (duplica / elimina) -->\r\n <ng-template #repeatableActionsTpl let-item>\r\n @if (canAddInstance(section.id)) {\r\n <button type=\"button\" class=\"ui-form-builder__repeatable-action\"\r\n (click)=\"duplicateRepeatableInstance(section.id, item.index)\" aria-label=\"Duplica\">\r\n <lucide-icon name=\"copy\" [size]=\"15\" />\r\n </button>\r\n }\r\n @if (canRemoveInstance(section.id)) {\r\n <button type=\"button\" class=\"ui-form-builder__repeatable-action ui-form-builder__repeatable-action--danger\"\r\n (click)=\"removeRepeatableInstance(section.id, item.index)\" aria-label=\"Elimina\">\r\n <lucide-icon name=\"trash-2\" [size]=\"15\" />\r\n </button>\r\n }\r\n </ng-template>\r\n </ui-accordion>\r\n\r\n @if (canAddInstance(section.id)) {\r\n <div class=\"ui-form-builder__repeatable-add\">\r\n <ui-button-area [buttons]=\"getRepeatableAddButtons(section)\" align=\"end\" />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- ─── Sezione COLLASSABILE ─── -->\r\n } @else if (section.collapsible) {\r\n <ui-accordion [items]=\"getSectionAccordionItems(section.id)\" [itemTemplate]=\"collapsibleTpl\" mode=\"multi\"\r\n class=\"ui-form-builder__section ui-form-builder__section--collapsible\" [class]=\"section.cssClasses?.join(' ')\">\r\n <ng-template #collapsibleTpl let-item>\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: formGroup, nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key) }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </ui-accordion>\r\n\r\n <!-- ─── Sezione STANDARD ─── -->\r\n } @else {\r\n <div class=\"ui-form-builder__section\" [class]=\"section.cssClasses?.join(' ')\">\r\n @if (section.title || section.description) {\r\n <div class=\"ui-form-builder__section-header\">\r\n @if (section.title) {\r\n <h3 class=\"ui-form-builder__section-title\">{{ section.title }}</h3>\r\n }\r\n @if (section.description) {\r\n <p class=\"ui-form-builder__section-description\">{{ section.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: formGroup, nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key) }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n\r\n <!-- ==================== FOOTER ==================== -->\r\n <div class=\"ui-form-builder__footer\">\r\n @if (!schema.config?.hideErrorSummary) {\r\n <ui-form-error-summary [errors]=\"formErrors\" [totalErrorCount]=\"getFormErrorsCount()\"\r\n [validMessage]=\"schema.config?.errorSummaryValidMessage ?? 'Il form è compilato correttamente'\"\r\n (fieldClick)=\"scrollToField($event)\" />\r\n }\r\n @if (!schema.config?.hideFooter) {\r\n <ui-button-area [buttons]=\"formButtons\" align=\"end\" [loadingIds]=\"loadingFor\" />\r\n }\r\n </div>\r\n</div>\r\n}\r\n\r\n<!-- ============================================================ -->\r\n<!-- FIELD TEMPLATE -->\r\n<!-- ============================================================ -->\r\n<!--\r\n CRITICO: Questo template e dichiarato FUORI dal <div [formGroup]>.\r\n Angular risolve l'injector dal contesto di DICHIARAZIONE.\r\n Il FormGroup viene passato via context (fg) per supportare\r\n sia il root FormGroup che i FormGroup delle istanze repeatable.\r\n-->\r\n<ng-template #fieldTpl let-field let-fg=\"formGroup\" let-nestedErrorKeyPrefix=\"nestedErrorKeyPrefix\">\r\n @if (fg) {\r\n <div [formGroup]=\"fg\" class=\"ui-fb-field-ctx\">\r\n @switch (field.type) {\r\n\r\n <!-- TEXT / EMAIL / PASSWORD -->\r\n @case ('text') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n (optionsFilter)=\"filterOptions(field, $event)\"\r\n />\r\n }\r\n @case ('email') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n @case ('password') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- NUMBER -->\r\n @case ('number') {\r\n <ui-form-number-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- TEXTAREA -->\r\n @case ('textarea') {\r\n <ui-form-textarea-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- SELECT -->\r\n @case ('select') {\r\n <ui-form-select-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n (optionsFilter)=\"filterOptions(field, $event)\"\r\n />\r\n }\r\n\r\n <!-- MULTISELECT -->\r\n @case ('multiselect') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <mat-select [formControlName]=\"field.key\" multiple [placeholder]=\"field.placeholder || ''\">\r\n @if (field.allowSelectAll) {\r\n <mat-option (click)=\"selectAll(field)\" (keydown.enter)=\"selectAll(field)\" (keydown.space)=\"selectAll(field)\">\r\n <em>Seleziona tutto</em>\r\n </mat-option>\r\n }\r\n @for (opt of getFieldOptions(field); track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n @if (fg.get(field.key)?.value?.length) {\r\n <div class=\"ui-form-builder__chips-preview\">\r\n @for (val of fg.get(field.key)!.value; track val) {\r\n <span class=\"ui-form-builder__chip\">\r\n {{ getOptionLabel(field, val) }}\r\n <button type=\"button\" (click)=\"removeMultiselectChip(field, val)\" class=\"ui-form-builder__chip-remove\"\r\n aria-label=\"Rimuovi\">\r\n <lucide-icon name=\"x\" [size]=\"12\" />\r\n </button>\r\n </span>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- FREEMULTISELECT -->\r\n @case ('freemultiselect') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width ui-form-builder__free-multi-field\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <mat-chip-grid #chipGrid [formControlName]=\"field.key\">\r\n @for (chip of fg.get(field.key)?.value || []; track chip) {\r\n <mat-chip-row [removable]=\"!isChipProtected(field, chip)\" (removed)=\"removeFreeChip(field, chip)\">\r\n {{ chip }}\r\n @if (!isChipProtected(field, chip)) {\r\n <button matChipRemove aria-label=\"Rimuovi\">\r\n <lucide-icon name=\"x\" [size]=\"14\" />\r\n </button>\r\n }\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input matInput [matChipInputFor]=\"chipGrid\" [placeholder]=\"field.placeholder || 'Aggiungi...'\"\r\n [readonly]=\"field.readonly || readonly\" (matChipInputTokenEnd)=\"addFreeChip(field, $event)\"\r\n (blur)=\"addFreeChipOnBlur(field, $event)\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- CHECKBOX -->\r\n @case ('checkbox') {\r\n @if (field.appearance?.style === 'switch') {\r\n <mat-slide-toggle [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n </mat-slide-toggle>\r\n } @else {\r\n <mat-checkbox [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\" [matTooltip]=\"field.iconTooltip.text\"\r\n class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-checkbox>\r\n }\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- SWITCH -->\r\n @case ('switch') {\r\n <mat-slide-toggle [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\" [matTooltip]=\"field.iconTooltip.text\"\r\n class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-slide-toggle>\r\n }\r\n\r\n <!-- RADIO -->\r\n @case ('radio') {\r\n <ui-form-radio-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n [required]=\"isFieldRequired(field.key, fg)\"\r\n [showErrors]=\"shouldShowFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- DATE -->\r\n @case ('date') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput [matDatepicker]=\"datepicker\" [formControlName]=\"field.key\"\r\n [placeholder]=\"field.placeholder || 'GG/MM/AAAA'\" [readonly]=\"field.readonly || readonly\" />\r\n <mat-datepicker-toggle matSuffix [for]=\"datepicker\" />\r\n <mat-datepicker #datepicker [startView]=\"field.customConfig?.config?.['monthView'] ? 'year' : 'month'\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- DATETIME -->\r\n @case ('datetime') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput type=\"datetime-local\" [formControlName]=\"field.key\" [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly || readonly\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- FILE -->\r\n @case ('file') {\r\n <div class=\"ui-form-builder__file-wrapper\">\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n <ui-file-input [formControlName]=\"field.key\" [config]=\"field.fileConfig\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- DIVIDER -->\r\n @case ('divider') {\r\n <div class=\"ui-form-builder__divider\">\r\n @if (field.label) {\r\n <span class=\"ui-form-builder__divider-label\">{{ field.label }}</span>\r\n }\r\n <hr class=\"ui-form-builder__divider-line\" />\r\n </div>\r\n }\r\n\r\n <!-- LOCATION (selezione territorio) -->\r\n @case ('location') {\r\n <div class=\"ui-form-builder__location-wrapper\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-specifica-territoriale [formControlName]=\"field.key\" [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- LOCATION-TABLE (tabella CRUD di location) -->\r\n @case ('location-table') {\r\n <div class=\"ui-form-builder__location-table-wrapper\">\r\n <ui-table-territoriale [formControlName]=\"field.key\" [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- LOCATION-GEOCODED (ricerca indirizzo Nominatim) -->\r\n @case ('location-geocoded') {\r\n <div class=\"ui-form-builder__location-geocoded-wrapper\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\" [attr.for]=\"'ui-loc-' + field.key\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-location-geocoded [formControlName]=\"field.key\" [config]=\"field.locationGeocodedConfig || {}\"\r\n [placeholder]=\"field.placeholder || 'Cerca indirizzo...'\"\r\n [inputAriaLabel]=\"field.label || field.placeholder || 'Indirizzo'\"\r\n [inputId]=\"'ui-loc-' + field.key\"\r\n [readonly]=\"field.readonly || readonly\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- CUSTOM -->\r\n @case ('custom') {\r\n <div class=\"ui-form-builder__custom-wrapper\" [attr.data-component]=\"field.customConfig?.component\"\r\n [attr.data-template-key]=\"resolveCustomTemplateKey(field)\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n @if (getCustomFieldOutlet(field, fg, nestedErrorKeyPrefix); as customOutlet) {\r\n <ng-container *ngTemplateOutlet=\"customOutlet.template; context: customOutlet.context\" />\r\n } @else {\r\n <div class=\"ui-form-builder__custom-placeholder\" role=\"status\">\r\n <span>Nessun template registrato per «{{ resolveCustomTemplateKey(field) }}»</span>\r\n </div>\r\n }\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n</ng-template>","import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiButtonComponent } from '../../../button/index';\r\n\r\n/**\r\n * Pannello overlay in basso nell'anteprima che mostra i valori correnti\r\n * del form in formato JSON modificabile.\r\n *\r\n * Permette di visualizzare, modificare, formattare e resettare i valori\r\n * del form durante la fase di anteprima nell'editor.\r\n *\r\n * @selector ui-editor-form-values-panel\r\n */\r\n@Component({\r\n selector: 'ui-editor-form-values-panel',\r\n standalone: true,\r\n imports: [FormsModule, MatFormFieldModule, MatInputModule, LucideAngularModule, UiButtonComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div\r\n class=\"form-values-panel\"\r\n [class.form-values-panel--open]=\"isOpen\"\r\n >\r\n <!-- Intestazione con toggle e azioni -->\r\n <div class=\"form-values-panel__header\" (click)=\"toggle.emit()\">\r\n <div class=\"form-values-panel__header-left\">\r\n <lucide-icon name=\"code\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span class=\"form-values-panel__title\">Valori Form</span>\r\n </div>\r\n\r\n <div class=\"form-values-panel__header-actions\" (click)=\"$event.stopPropagation()\">\r\n <!-- Aggiorna valori -->\r\n <ui-button\r\n icon=\"refresh-cw\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n tooltip=\"Aggiorna valori\"\r\n ariaLabel=\"Aggiorna valori\"\r\n (click)=\"refreshValues.emit()\"\r\n />\r\n\r\n <!-- Pulisci valori -->\r\n <ui-button\r\n icon=\"trash-2\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n tooltip=\"Pulisci valori\"\r\n ariaLabel=\"Pulisci valori\"\r\n (click)=\"clearValues()\"\r\n />\r\n\r\n <!-- Formatta JSON -->\r\n <ui-button\r\n icon=\"align-left\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n tooltip=\"Formatta JSON\"\r\n ariaLabel=\"Formatta JSON\"\r\n (click)=\"formatJson()\"\r\n />\r\n\r\n <!-- Freccia toggle apertura/chiusura -->\r\n <ui-button\r\n [icon]=\"isOpen ? 'chevron-down' : 'chevron-up'\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n tooltip=\"Chiudi pannello\"\r\n ariaLabel=\"Chiudi pannello\"\r\n (click)=\"toggle.emit()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Corpo del pannello (visibile solo quando aperto) -->\r\n @if (isOpen) {\r\n <div class=\"form-values-panel__body\">\r\n <mat-form-field appearance=\"outline\" class=\"form-values-panel__textarea-wrapper\">\r\n <mat-label>JSON</mat-label>\r\n <textarea\r\n matInput\r\n class=\"form-values-panel__textarea\"\r\n [ngModel]=\"jsonText\"\r\n (ngModelChange)=\"onJsonInput($event)\"\r\n rows=\"8\"\r\n spellcheck=\"false\"\r\n placeholder='{ \"chiave\": \"valore\" }'\r\n ></textarea>\r\n </mat-form-field>\r\n\r\n <!-- Indicatore di errore di parsing -->\r\n @if (jsonError) {\r\n <div class=\"form-values-panel__error\">\r\n <lucide-icon name=\"alert-triangle\" [size]=\"14\" aria-hidden=\"true\" />\r\n <span>{{ jsonError }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n /* Contenitore principale del pannello valori */\r\n .form-values-panel {\r\n border-top: 1px solid var(--ui-color-border, #e0e0e0);\r\n background: var(--ui-color-surface, #fff);\r\n transition: max-height 200ms ease-in-out;\r\n overflow: hidden;\r\n }\r\n\r\n /* Intestazione cliccabile per toggle */\r\n .form-values-panel__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: var(--ui-spacing-2, 8px) var(--ui-spacing-3, 12px);\r\n cursor: pointer;\r\n user-select: none;\r\n transition: background-color 150ms;\r\n }\r\n\r\n .form-values-panel__header:hover {\r\n background: var(--ui-color-bg-subtle, #fafafa);\r\n }\r\n\r\n .form-values-panel__header-left {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n }\r\n\r\n .form-values-panel__title {\r\n font-weight: 600;\r\n font-size: var(--ui-font-size-xs, 0.75rem);\r\n color: var(--ui-color-text-secondary, #616161);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n }\r\n\r\n .form-values-panel__header-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1, 4px);\r\n }\r\n\r\n /* Corpo del pannello con textarea */\r\n .form-values-panel__body {\r\n padding: 0 var(--ui-spacing-3, 12px) var(--ui-spacing-3, 12px);\r\n }\r\n\r\n /* Wrapper della textarea */\r\n .form-values-panel__textarea-wrapper {\r\n width: 100%;\r\n }\r\n\r\n /* Textarea per il JSON */\r\n .form-values-panel__textarea {\r\n font-family: 'Fira Code', 'Consolas', 'Monaco', monospace;\r\n font-size: var(--ui-font-size-xs, 0.75rem);\r\n line-height: 1.5;\r\n resize: vertical;\r\n }\r\n\r\n /* Messaggio di errore JSON */\r\n .form-values-panel__error {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1, 4px);\r\n padding: var(--ui-spacing-1, 4px) var(--ui-spacing-2, 8px);\r\n margin-top: var(--ui-spacing-1, 4px);\r\n border-radius: var(--ui-radius-sm, 4px);\r\n background: color-mix(in srgb, var(--ui-color-warn, #f44336) 10%, transparent);\r\n color: var(--ui-color-warn, #f44336);\r\n font-size: var(--ui-font-size-xs, 0.75rem);\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiEditorFormValuesPanelComponent {\r\n /** Valori correnti del form da visualizzare. */\r\n @Input()\r\n set formValues(value: any) {\r\n this._formValues = value;\r\n this.updateJsonText();\r\n }\r\n get formValues(): any {\r\n return this._formValues;\r\n }\r\n\r\n /** Stato di apertura/chiusura del pannello. */\r\n @Input() isOpen = false;\r\n\r\n /** Emesso quando i valori vengono modificati dall'utente via JSON. */\r\n @Output() valuesChange = new EventEmitter<any>();\r\n\r\n /** Emesso alla richiesta di aggiornamento dei valori. */\r\n @Output() refreshValues = new EventEmitter<void>();\r\n\r\n /** Emesso alla richiesta di apertura/chiusura del pannello. */\r\n @Output() toggle = new EventEmitter<void>();\r\n\r\n /** Testo JSON visualizzato nella textarea. */\r\n jsonText = '{}';\r\n\r\n /** Messaggio di errore per JSON non valido. */\r\n jsonError: string | null = null;\r\n\r\n /** @internal Valori interni del form. */\r\n private _formValues: any = {};\r\n\r\n /**\r\n * Gestisce l'input dell'utente nella textarea JSON.\r\n * Prova a parsare il JSON e aggiorna i valori se valido.\r\n * @param text - Testo JSON inserito dall'utente\r\n */\r\n onJsonInput(text: string): void {\r\n this.jsonText = text;\r\n try {\r\n const parsed = JSON.parse(text);\r\n this.jsonError = null;\r\n this.valuesChange.emit(parsed);\r\n } catch (e) {\r\n this.jsonError = 'JSON non valido: controlla la sintassi';\r\n }\r\n }\r\n\r\n /**\r\n * Pulisce i valori del form resettando a oggetto vuoto.\r\n */\r\n clearValues(): void {\r\n this._formValues = {};\r\n this.jsonText = '{}';\r\n this.jsonError = null;\r\n this.valuesChange.emit({});\r\n }\r\n\r\n /**\r\n * Formatta il JSON con indentazione per una migliore leggibilita.\r\n */\r\n formatJson(): void {\r\n try {\r\n const parsed = JSON.parse(this.jsonText);\r\n this.jsonText = JSON.stringify(parsed, null, 2);\r\n this.jsonError = null;\r\n } catch (e) {\r\n this.jsonError = 'Impossibile formattare: JSON non valido';\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Aggiorna il testo JSON dalla rappresentazione interna dei valori.\r\n */\r\n private updateJsonText(): void {\r\n try {\r\n this.jsonText = JSON.stringify(this._formValues, null, 2);\r\n this.jsonError = null;\r\n } catch {\r\n this.jsonText = '{}';\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnChanges,\r\n SimpleChanges,\r\n ViewChild,\r\n inject,\r\n} from '@angular/core';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiButtonComponent } from '../../../button/index';\r\n\r\nimport { UiFormSchema } from '../../../form-builder/types/index';\r\nimport { UiFormBuilderComponent } from '../../../form-builder/form-builder.component';\r\nimport { UiEditorFormValuesPanelComponent } from '../form-values-panel/form-values-panel.component';\r\n\r\n/**\r\n * Contenitore per l'anteprima live del form in fase di editing.\r\n *\r\n * Mostra una preview del form builder generato dallo schema corrente,\r\n * con possibilita di aggiornamento forzato e pannello dei valori.\r\n *\r\n * @selector ui-editor-preview-container\r\n */\r\n@Component({\r\n selector: 'ui-editor-preview-container',\r\n standalone: true,\r\n imports: [LucideAngularModule, UiButtonComponent, UiFormBuilderComponent, UiEditorFormValuesPanelComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"preview-container\">\r\n <!-- Intestazione con azioni -->\r\n <div class=\"preview-container__header\">\r\n <div class=\"preview-container__header-left\">\r\n <lucide-icon name=\"eye\" [size]=\"18\" aria-hidden=\"true\" />\r\n <span class=\"preview-container__title\">Anteprima Form</span>\r\n </div>\r\n\r\n <div class=\"preview-container__header-actions\">\r\n <!-- Aggiorna anteprima -->\r\n <ui-button\r\n icon=\"refresh-cw\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n tooltip=\"Aggiorna anteprima\"\r\n ariaLabel=\"Aggiorna anteprima\"\r\n (click)=\"refresh.emit()\"\r\n />\r\n\r\n <!-- Mostra/nascondi pannello valori -->\r\n <ui-button\r\n icon=\"code\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n tooltip=\"Mostra/nascondi valori form\"\r\n ariaLabel=\"Mostra/nascondi valori form\"\r\n (click)=\"toggleValuesPanel()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Contenuto anteprima -->\r\n <div class=\"preview-container__content\">\r\n @if (!previewSchema || !previewSchema.sections || previewSchema.sections.length === 0) {\r\n <!-- Stato vuoto: nessuno schema -->\r\n <div class=\"preview-container__empty\">\r\n <lucide-icon name=\"layout-template\" [size]=\"40\" aria-hidden=\"true\" />\r\n <p class=\"preview-container__empty-text\">\r\n Aggiungi sezioni e campi per visualizzare l'anteprima\r\n </p>\r\n </div>\r\n } @else {\r\n <!-- Rendering del form builder con snapshot dello schema -->\r\n <div class=\"preview-container__form-wrapper\">\r\n <ui-form-builder\r\n [schema]=\"previewSchema\"\r\n (valueChange)=\"onFormBuilderValueChange($event)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Pannello valori in basso -->\r\n <ui-editor-form-values-panel\r\n [formValues]=\"currentFormValues\"\r\n [isOpen]=\"isValuesPanelOpen\"\r\n (valuesChange)=\"onFormValuesChange($event)\"\r\n (refreshValues)=\"onRefreshValues()\"\r\n (toggle)=\"toggleValuesPanel()\"\r\n />\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n /* Contenitore principale dell'anteprima */\r\n .preview-container {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n background: var(--ui-color-bg-subtle, #fafafa);\r\n position: relative;\r\n }\r\n\r\n /* Intestazione dell'anteprima */\r\n .preview-container__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: var(--ui-spacing-2, 8px) var(--ui-spacing-4, 16px);\r\n border-bottom: 1px solid var(--ui-color-border, #e0e0e0);\r\n background: var(--ui-color-surface, #fff);\r\n }\r\n\r\n .preview-container__header-left {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n }\r\n\r\n .preview-container__title {\r\n font-weight: 600;\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n color: var(--ui-color-text, #212121);\r\n }\r\n\r\n .preview-container__header-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1, 4px);\r\n }\r\n\r\n /* Area di contenuto scrollabile */\r\n .preview-container__content {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: var(--ui-spacing-4, 16px);\r\n }\r\n\r\n /* Stato vuoto: nessuno schema disponibile */\r\n .preview-container__empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--ui-spacing-3, 12px);\r\n padding: var(--ui-spacing-8, 64px) var(--ui-spacing-4, 16px);\r\n text-align: center;\r\n color: var(--ui-color-text-muted, #9e9e9e);\r\n }\r\n\r\n .preview-container__empty-text {\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n margin: 0;\r\n }\r\n\r\n /* Wrapper del form builder renderizzato */\r\n .preview-container__form-wrapper {\r\n background: var(--ui-color-surface, #fff);\r\n border-radius: var(--ui-radius-md, 8px);\r\n padding: var(--ui-spacing-4, 16px);\r\n box-shadow: var(--ui-shadow-sm, 0 1px 3px rgba(0,0,0,0.1));\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiEditorPreviewContainerComponent implements OnChanges {\r\n /** @internal Change detector per OnPush. */\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n /** Riferimento all'istanza del form builder per leggere i valori. */\r\n @ViewChild(UiFormBuilderComponent) formBuilderRef?: UiFormBuilderComponent;\r\n\r\n /** Schema del form ricevuto dal parent (cambia ad ogni modifica nell'editor). */\r\n @Input() schema: UiFormSchema | null = null;\r\n\r\n /**\r\n * Chiave per forzare la ri-creazione del form builder.\r\n * Viene incrementata dal componente padre per invalidare l'anteprima.\r\n */\r\n @Input() key: number = 0;\r\n\r\n /** Emesso alla richiesta di aggiornamento forzato dell'anteprima. */\r\n @Output() refresh = new EventEmitter<void>();\r\n\r\n /**\r\n * Snapshot immutabile dello schema usato per il rendering.\r\n * Viene aggiornato SOLO al primo caricamento, al cambio tab\r\n * (quando `key` cambia) o al refresh esplicito.\r\n * Questo evita che le modifiche nell'editor ricostruiscano\r\n * continuamente il form, perdendo lo stato dell'utente.\r\n */\r\n previewSchema: UiFormSchema | null = null;\r\n\r\n /** Stato di apertura del pannello valori in basso. */\r\n isValuesPanelOpen = false;\r\n\r\n /** Valori correnti del form nell'anteprima. */\r\n currentFormValues: any = {};\r\n\r\n /** @internal Ultimo valore di `key` applicato allo snapshot. */\r\n private lastAppliedKey = -1;\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const keyChanged = changes['key'] && this.key !== this.lastAppliedKey;\r\n const firstSchema = changes['schema']?.firstChange;\r\n\r\n if (keyChanged || firstSchema) {\r\n this.applySchemaSnapshot();\r\n }\r\n }\r\n\r\n /**\r\n * Riceve i valori aggiornati dal form builder ad ogni interazione.\r\n * @param values - Valori correnti del form (inclusi campi disabilitati)\r\n */\r\n onFormBuilderValueChange(values: any): void {\r\n this.currentFormValues = values;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Alterna la visibilita del pannello dei valori del form. */\r\n toggleValuesPanel(): void {\r\n this.isValuesPanelOpen = !this.isValuesPanelOpen;\r\n }\r\n\r\n /**\r\n * Gestisce il cambiamento dei valori dal pannello JSON.\r\n * @param values - Nuovi valori parsati dal JSON\r\n */\r\n onFormValuesChange(values: any): void {\r\n this.currentFormValues = values;\r\n }\r\n\r\n /**\r\n * Aggiorna i valori leggendo lo stato corrente dal form builder.\r\n */\r\n onRefreshValues(): void {\r\n if (this.formBuilderRef) {\r\n this.currentFormValues = this.formBuilderRef.getFormValue();\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Crea una copia profonda dello schema corrente come snapshot\r\n * per il rendering dell'anteprima. L'id viene reso univoco\r\n * per forzare il rebuild del form builder (che ricostruisce\r\n * solo quando `schema.id` cambia).\r\n */\r\n private applySchemaSnapshot(): void {\r\n if (this.schema) {\r\n const snapshot = structuredClone(this.schema);\r\n snapshot.id = `${snapshot.id}__preview_${this.key}`;\r\n this.previewSchema = snapshot;\r\n } else {\r\n this.previewSchema = null;\r\n }\r\n this.lastAppliedKey = this.key;\r\n this.currentFormValues = {};\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder-editor\r\n * Componente principale dell'editor visuale del form builder.\r\n *\r\n * Layout a tre pannelli:\r\n * - Sinistra: palette dei tipi di campo (drag source)\r\n * - Centro: sezioni con campi (drop target + editor inline)\r\n * - Destra: pannello di configurazione del campo selezionato\r\n *\r\n * Funzionalita principali:\r\n * - Drag & drop dei campi dalla palette alle sezioni\r\n * - Riordino campi all'interno e tra sezioni\r\n * - Configurazione campi in tempo reale\r\n * - Preview live del form\r\n * - Import/export JSON\r\n * - Auto-save su localStorage\r\n */\r\n\r\nimport {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnInit,\r\n OnDestroy,\r\n inject,\r\n Optional,\r\n Inject,\r\n} from '@angular/core';\r\nimport { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { Subject, interval } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\n\r\nimport { UiFormSchema, UiFormSection, UiFormFieldDescriptor } from '../form-builder/types/index';\r\n\r\nimport {\r\n UiEditorState,\r\n UiEditorBreadcrumbItem,\r\n UiEditorFieldPaletteItem,\r\n UiEditorAvailableField,\r\n UiEditorDialogData,\r\n} from './types/editor.types';\r\n\r\nimport { UiEditorStateService } from './services/editor-state.service';\r\nimport { UiEditorPersistenceService } from './services/editor-persistence.service';\r\nimport { UiEditorFieldFactoryService } from './services/field-factory.service';\r\n\r\n// Sotto-componenti\r\nimport { UiEditorToolbarComponent } from './sub-components/editor-toolbar/editor-toolbar.component';\r\nimport { UiFieldPaletteComponent } from './sub-components/field-palette/field-palette.component';\r\nimport { UiSectionEditorComponent } from './sub-components/section-editor/section-editor.component';\r\nimport { UiEditorFieldConfigPanelComponent } from './sub-components/field-config-panel/field-config-panel.component';\r\nimport { UiEditorPreviewContainerComponent } from './sub-components/preview-container/preview-container.component';\r\nimport { UiButtonComponent } from '../button/index';\r\n\r\n@Component({\r\n selector: 'ui-form-builder-editor',\r\n standalone: true,\r\n imports: [\r\n DragDropModule,\r\n MatSnackBarModule,\r\n MatTabsModule,\r\n LucideAngularModule,\r\n UiEditorToolbarComponent,\r\n UiFieldPaletteComponent,\r\n UiSectionEditorComponent,\r\n UiEditorFieldConfigPanelComponent,\r\n UiEditorPreviewContainerComponent,\r\n UiButtonComponent,\r\n ],\r\n providers: [UiEditorStateService, UiEditorPersistenceService, UiEditorFieldFactoryService],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"editor-root\" [class.dialog-mode]=\"isDialogMode\">\r\n <!-- Header con chiusura (solo in modale) -->\r\n @if (isDialogMode) {\r\n <div class=\"editor-dialog-header\">\r\n <h2>Form Builder - Editor Visuale</h2>\r\n <ui-button\r\n icon=\"x\"\r\n variant=\"ghost\"\r\n size=\"md\"\r\n ariaLabel=\"Chiudi editor\"\r\n tooltip=\"Chiudi editor\"\r\n (click)=\"closeDialog()\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Toolbar -->\r\n <ui-editor-toolbar\r\n [breadcrumb]=\"breadcrumb\"\r\n [isDirty]=\"state.isDirty\"\r\n [lastSaved]=\"state.lastSaved\"\r\n (newForm)=\"onNewForm()\"\r\n (importJson)=\"onImportJson()\"\r\n (exportJson)=\"onExportJson()\"\r\n (save)=\"onSave()\"\r\n (clear)=\"onClear()\"\r\n (addSection)=\"onAddSection()\"\r\n />\r\n\r\n <!-- Tabs: Editor / Preview -->\r\n <mat-tab-group\r\n [selectedIndex]=\"selectedTabIndex\"\r\n (selectedIndexChange)=\"onTabChange($event)\"\r\n class=\"editor-tabs\"\r\n >\r\n <!-- Tab Editor -->\r\n <mat-tab label=\"Editor\">\r\n <div class=\"editor-layout\" cdkDropListGroup>\r\n <!-- Palette (sidebar sinistra) -->\r\n <div\r\n class=\"editor-sidebar left\"\r\n [style.width.px]=\"leftSidebarWidth\"\r\n >\r\n <ui-field-palette />\r\n <div\r\n class=\"resize-handle resize-handle--right\"\r\n [class.resizing]=\"isResizingLeft\"\r\n (mousedown)=\"onLeftResizeStart($event)\"\r\n ></div>\r\n </div>\r\n\r\n <!-- Area centrale con sezioni -->\r\n <div class=\"editor-main\">\r\n <div class=\"sections-container\">\r\n @for (section of state.schema.sections; track section.id) {\r\n <ui-section-editor\r\n [section]=\"section\"\r\n [isSelected]=\"state.selectedSectionId === section.id\"\r\n [selectedFieldKey]=\"state.selectedFieldKey\"\r\n (sectionUpdate)=\"\r\n stateService.updateSection(section.id, $event)\r\n \"\r\n (sectionDelete)=\"onSectionDelete(section.id)\"\r\n (sectionDuplicate)=\"onSectionDuplicate(section.id)\"\r\n (fieldSelect)=\"onFieldSelect(section.id, $event)\"\r\n (fieldDuplicate)=\"onFieldDuplicate(section.id, $event)\"\r\n (fieldDelete)=\"onFieldDelete(section.id, $event)\"\r\n (fieldDrop)=\"onFieldDrop($event)\"\r\n />\r\n }\r\n\r\n @if (state.schema.sections.length === 0) {\r\n <div class=\"empty-state\">\r\n <lucide-icon\r\n name=\"layout-template\"\r\n [size]=\"64\"\r\n ></lucide-icon>\r\n <h3>Nessuna sezione presente</h3>\r\n <p>\r\n Clicca su \"Sezione\" nella toolbar per aggiungere la prima\r\n sezione\r\n </p>\r\n <ui-button\r\n label=\"Aggiungi Prima Sezione\"\r\n variant=\"primary\"\r\n icon=\"plus\"\r\n (click)=\"onAddSection()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Config panel (sidebar destra) -->\r\n <div\r\n class=\"editor-sidebar right\"\r\n [style.width.px]=\"rightSidebarWidth\"\r\n >\r\n <div\r\n class=\"resize-handle\"\r\n [class.resizing]=\"isResizing\"\r\n (mousedown)=\"onResizeStart($event)\"\r\n ></div>\r\n <ui-editor-field-config-panel\r\n [field]=\"selectedField\"\r\n [availableFields]=\"availableFields\"\r\n (fieldUpdate)=\"\r\n onFieldUpdate(\r\n selectedFieldSectionId!,\r\n state.selectedFieldKey!,\r\n $event\r\n )\r\n \"\r\n />\r\n </div>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- Tab Preview -->\r\n <mat-tab label=\"Anteprima\">\r\n <ui-editor-preview-container\r\n [schema]=\"state.schema\"\r\n [key]=\"previewKey\"\r\n (refresh)=\"refreshPreview()\"\r\n />\r\n </mat-tab>\r\n </mat-tab-group>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n @use '../../core/tokens/mixins' as ui;\r\n\r\n .editor-root {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100vh;\r\n background: var(--ui-color-bg-subtle);\r\n\r\n &.dialog-mode {\r\n height: 100%;\r\n }\r\n }\r\n\r\n .editor-dialog-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: var(--ui-spacing-3) var(--ui-spacing-4);\r\n background: var(--ui-color-surface);\r\n border-bottom: 1px solid var(--ui-color-border);\r\n box-shadow: var(--ui-shadow-sm);\r\n\r\n h2 {\r\n margin: 0;\r\n font-size: var(--ui-font-size-lg);\r\n font-weight: 500;\r\n color: var(--ui-color-text);\r\n }\r\n\r\n /* Stile per il pulsante di chiusura (gestito da UiButton) */\r\n }\r\n\r\n .editor-tabs {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n\r\n /* Stile intestazione tab */\r\n ::ng-deep .mat-mdc-tab-header {\r\n background: var(--ui-color-surface);\r\n border-bottom: 1px solid var(--ui-color-border);\r\n }\r\n\r\n /* Stile etichetta tab */\r\n ::ng-deep .mat-mdc-tab .mdc-tab__text-label {\r\n color: var(--ui-color-text-secondary);\r\n font-weight: 500;\r\n font-size: var(--ui-font-size-sm);\r\n letter-spacing: 0.02em;\r\n }\r\n\r\n /* Tab attivo: testo evidenziato */\r\n ::ng-deep .mat-mdc-tab.mdc-tab--active .mdc-tab__text-label {\r\n color: var(--ui-color-primary);\r\n font-weight: 600;\r\n }\r\n\r\n /* Indicatore tab attivo (ink bar) */\r\n ::ng-deep .mat-mdc-tab-header .mdc-tab-indicator__content--underline {\r\n border-color: var(--ui-color-primary);\r\n border-width: 3px;\r\n }\r\n\r\n ::ng-deep .mat-mdc-tab-body-wrapper {\r\n flex: 1;\r\n overflow: hidden;\r\n }\r\n\r\n ::ng-deep .mat-mdc-tab-body {\r\n height: 100%;\r\n }\r\n\r\n ::ng-deep .mat-mdc-tab-body-content {\r\n height: 100%;\r\n overflow: hidden;\r\n }\r\n }\r\n\r\n .editor-layout {\r\n display: flex;\r\n height: 100%;\r\n overflow: hidden;\r\n }\r\n\r\n .editor-sidebar {\r\n height: 100%;\r\n overflow-y: auto;\r\n background: var(--ui-color-surface);\r\n flex-shrink: 0;\r\n\r\n &.left {\r\n position: relative;\r\n border-right: 1px solid var(--ui-color-border);\r\n min-width: 200px;\r\n max-width: 500px;\r\n }\r\n\r\n &.right {\r\n position: relative;\r\n border-left: 1px solid var(--ui-color-border);\r\n min-width: 400px;\r\n max-width: 1200px;\r\n }\r\n }\r\n\r\n .editor-main {\r\n flex: 1;\r\n min-width: 0;\r\n height: 100%;\r\n overflow-y: auto;\r\n padding: var(--ui-spacing-4);\r\n background: var(--ui-color-bg-subtle);\r\n }\r\n\r\n .sections-container {\r\n max-width: 1200px;\r\n margin: 0 auto;\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ui-spacing-4);\r\n }\r\n\r\n .resize-handle {\r\n position: absolute;\r\n top: 0;\r\n bottom: 0;\r\n width: 6px;\r\n cursor: ew-resize;\r\n z-index: 10;\r\n transition: background-color var(--ui-transition-fast);\r\n\r\n /* Handle sinistro (per sidebar destra) */\r\n left: 0;\r\n\r\n &::before {\r\n content: '';\r\n position: absolute;\r\n left: -3px;\r\n top: 0;\r\n bottom: 0;\r\n width: 12px;\r\n }\r\n\r\n &:hover,\r\n &.resizing {\r\n background-color: color-mix(\r\n in srgb,\r\n var(--ui-color-primary) 30%,\r\n transparent\r\n );\r\n }\r\n\r\n &.resizing {\r\n background-color: color-mix(\r\n in srgb,\r\n var(--ui-color-primary) 50%,\r\n transparent\r\n );\r\n }\r\n }\r\n\r\n /* Handle destro (per sidebar sinistra) */\r\n .resize-handle--right {\r\n left: auto;\r\n right: 0;\r\n\r\n &::before {\r\n left: auto;\r\n right: -3px;\r\n }\r\n }\r\n\r\n .empty-state {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--ui-spacing-12) var(--ui-spacing-8);\r\n text-align: center;\r\n color: var(--ui-color-text-muted);\r\n\r\n lucide-icon {\r\n opacity: 0.4;\r\n }\r\n\r\n h3 {\r\n margin: 0 0 var(--ui-spacing-2) 0;\r\n font-size: var(--ui-font-size-xl);\r\n font-weight: 400;\r\n color: var(--ui-color-text-secondary);\r\n }\r\n\r\n p {\r\n margin: 0 0 var(--ui-spacing-6) 0;\r\n font-size: var(--ui-font-size-md);\r\n color: var(--ui-color-text-muted);\r\n }\r\n }\r\n\r\n /* Responsive */\r\n @media (max-width: 1280px) {\r\n .editor-sidebar.left {\r\n width: 250px;\r\n }\r\n }\r\n\r\n @media (max-width: 960px) {\r\n .editor-layout {\r\n flex-direction: column;\r\n }\r\n\r\n .editor-sidebar {\r\n &.left {\r\n display: none;\r\n }\r\n\r\n &.right {\r\n position: fixed;\r\n right: 0;\r\n top: 64px;\r\n width: 100% !important;\r\n max-width: 350px;\r\n height: calc(100vh - 64px);\r\n z-index: 1000;\r\n box-shadow: var(--ui-shadow-lg);\r\n transform: translateX(100%);\r\n transition: transform var(--ui-transition-normal);\r\n\r\n .resize-handle {\r\n display: none;\r\n }\r\n }\r\n }\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiFormBuilderEditorComponent implements OnInit, OnDestroy {\r\n /** @internal Servizio per lo stato dell'editor. */\r\n readonly stateService = inject(UiEditorStateService);\r\n\r\n /** @internal Servizio per la persistenza. */\r\n private readonly persistenceService = inject(UiEditorPersistenceService);\r\n\r\n /** @internal Factory per i campi. */\r\n private readonly fieldFactory = inject(UiEditorFieldFactoryService);\r\n\r\n /** @internal Snack bar per i messaggi. */\r\n private readonly snackBar = inject(MatSnackBar);\r\n\r\n /** @internal Change detector. */\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n /** @internal Subject per la distruzione. */\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n /** Stato corrente dell'editor. */\r\n state: UiEditorState;\r\n\r\n /** Indice del tab selezionato (0=Editor, 1=Preview). */\r\n selectedTabIndex = 0;\r\n\r\n /** Breadcrumb di navigazione. */\r\n breadcrumb: UiEditorBreadcrumbItem[] = [];\r\n\r\n /** Se il componente e aperto in modalita dialog. */\r\n isDialogMode = false;\r\n\r\n /** Chiave per forzare il re-render del preview. */\r\n previewKey = 0;\r\n\r\n /** Campi disponibili per le condizioni (cache). */\r\n availableFields: UiEditorAvailableField[] = [];\r\n\r\n /** Larghezza della sidebar sinistra (px). */\r\n leftSidebarWidth = 280;\r\n\r\n /** Larghezza della sidebar destra (px). */\r\n rightSidebarWidth = 460;\r\n\r\n /** Se e in corso il resize della sidebar destra. */\r\n isResizing = false;\r\n\r\n /** Se e in corso il resize della sidebar sinistra. */\r\n isResizingLeft = false;\r\n\r\n /** @internal Limiti di resize sidebar destra. */\r\n private readonly MIN_SIDEBAR_WIDTH = 400;\r\n private readonly MAX_SIDEBAR_WIDTH = 1200;\r\n\r\n /** @internal Limiti di resize sidebar sinistra. */\r\n private readonly MIN_LEFT_SIDEBAR_WIDTH = 200;\r\n private readonly MAX_LEFT_SIDEBAR_WIDTH = 500;\r\n\r\n private resizeStartX = 0;\r\n private resizeStartWidth = 0;\r\n private readonly SIDEBAR_WIDTH_KEY = 'ui-editor-right-sidebar-width';\r\n private readonly LEFT_SIDEBAR_WIDTH_KEY = 'ui-editor-left-sidebar-width';\r\n\r\n constructor(\r\n @Optional() public dialogRef: MatDialogRef<UiFormBuilderEditorComponent>,\r\n @Optional() @Inject(MAT_DIALOG_DATA) public dialogData: UiEditorDialogData,\r\n ) {\r\n this.state = this.stateService.getCurrentState();\r\n this.isDialogMode = !!this.dialogRef;\r\n\r\n // Carica schema iniziale se fornito via dialog data\r\n if (this.dialogData?.initialSchema) {\r\n this.stateService.setSchema(this.dialogData.initialSchema);\r\n }\r\n\r\n this.loadSidebarWidth();\r\n }\r\n\r\n ngOnInit(): void {\r\n // Sottoscrizione allo stato\r\n this.stateService.state$.pipe(takeUntil(this.destroy$)).subscribe((state) => {\r\n this.state = state;\r\n this.updateBreadcrumb();\r\n this.updateAvailableFields();\r\n this.cdr.markForCheck();\r\n });\r\n\r\n // Controlla salvataggi precedenti da recuperare\r\n this.checkForRecovery();\r\n\r\n // Auto-save ogni 30 secondi\r\n interval(30000)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n if (this.state.isDirty) {\r\n this.autoSave();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n // ─── Toolbar actions ─────────────────────────────────────────\r\n\r\n /** Aggiunge una nuova sezione. */\r\n onAddSection(): void {\r\n this.stateService.addSection();\r\n this.showMessage('Sezione aggiunta');\r\n }\r\n\r\n /** Salva nel localStorage. */\r\n onSave(): void {\r\n try {\r\n this.persistenceService.saveToLocalStorage(this.state.schema);\r\n this.stateService.markAsSaved();\r\n this.showMessage('Salvato con successo');\r\n } catch (error: any) {\r\n this.showMessage(error.message || 'Errore durante il salvataggio', true);\r\n }\r\n }\r\n\r\n /** Crea un nuovo form. */\r\n onNewForm(): void {\r\n if (this.state.isDirty && !confirm('Ci sono modifiche non salvate. Continuare?')) {\r\n return;\r\n }\r\n this.stateService.reset();\r\n this.showMessage('Nuovo form creato');\r\n }\r\n\r\n /** Importa da file JSON. */\r\n onImportJson(): void {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.accept = '.json';\r\n\r\n input.onchange = async (e: any) => {\r\n const file = e.target.files[0];\r\n if (!file) return;\r\n\r\n try {\r\n const schema = await this.persistenceService.importFromJSON(file);\r\n if (this.state.isDirty && !confirm('Ci sono modifiche non salvate. Sovrascrivere?')) {\r\n return;\r\n }\r\n this.stateService.setSchema(schema);\r\n this.showMessage('Schema importato con successo');\r\n } catch (error: any) {\r\n this.showMessage(error.message || \"Errore durante l'import\", true);\r\n }\r\n };\r\n\r\n input.click();\r\n }\r\n\r\n /** Esporta come file JSON. */\r\n onExportJson(): void {\r\n try {\r\n const validation = this.stateService.validateSchema();\r\n if (!validation.valid) {\r\n const message = `Schema con errori:\\n${validation.errors.map((e) => e.message).join('\\n')}`;\r\n if (!confirm(`${message}\\n\\nEsportare comunque?`)) return;\r\n }\r\n this.persistenceService.exportToJSON(this.state.schema);\r\n this.showMessage('Schema esportato con successo');\r\n } catch (error: any) {\r\n this.showMessage(error.message || \"Errore durante l'export\", true);\r\n }\r\n }\r\n\r\n /** Pulisce tutto lo schema. */\r\n onClear(): void {\r\n if (!confirm('Vuoi davvero eliminare tutto? Questa azione non puo essere annullata.')) return;\r\n this.persistenceService.createBackup(this.state.schema);\r\n this.stateService.clearSchema();\r\n this.showMessage('Schema pulito');\r\n }\r\n\r\n // ─── Sezioni ─────────────────────────────────────────────────\r\n\r\n onSectionDuplicate(sectionId: string): void {\r\n this.stateService.duplicateSection(sectionId);\r\n this.showMessage('Sezione duplicata');\r\n }\r\n\r\n onSectionDelete(sectionId: string): void {\r\n if (!confirm('Vuoi davvero eliminare questa sezione?')) return;\r\n this.stateService.removeSection(sectionId);\r\n this.showMessage('Sezione eliminata');\r\n }\r\n\r\n // ─── Campi ───────────────────────────────────────────────────\r\n\r\n onFieldSelect(sectionId: string, fieldKey: string): void {\r\n this.stateService.selectField(sectionId, fieldKey);\r\n }\r\n\r\n onFieldDuplicate(sectionId: string, fieldKey: string): void {\r\n this.stateService.duplicateField(sectionId, fieldKey);\r\n this.showMessage('Campo duplicato');\r\n }\r\n\r\n onFieldDelete(sectionId: string, fieldKey: string): void {\r\n if (!confirm('Vuoi davvero eliminare questo campo?')) return;\r\n this.stateService.removeField(sectionId, fieldKey);\r\n this.showMessage('Campo eliminato');\r\n }\r\n\r\n onFieldUpdate(sectionId: string, fieldKey: string, updates: Partial<UiFormFieldDescriptor>): void {\r\n this.stateService.updateField(sectionId, fieldKey, updates);\r\n }\r\n\r\n /** Gestisce il drop di un campo (dalla palette o tra sezioni). */\r\n onFieldDrop(event: CdkDragDrop<any>): void {\r\n const prevId = event.previousContainer.id;\r\n\r\n if (prevId.startsWith('palette-')) {\r\n // Drop dalla palette\r\n const paletteItem: UiEditorFieldPaletteItem = event.item.data;\r\n const section: UiFormSection = event.container.data;\r\n const newField = this.fieldFactory.createDefaultField(paletteItem.type);\r\n this.stateService.addFieldAtIndex(section.id, newField, event.currentIndex);\r\n this.showMessage(`Campo ${paletteItem.label} aggiunto`);\r\n } else if (event.previousContainer !== event.container) {\r\n // Spostamento tra sezioni\r\n const field: UiFormFieldDescriptor = event.item.data;\r\n const fromSection: UiFormSection = event.previousContainer.data;\r\n const toSection: UiFormSection = event.container.data;\r\n this.stateService.moveFieldBetweenSections(fromSection.id, toSection.id, field.key, event.currentIndex);\r\n this.showMessage('Campo spostato');\r\n } else {\r\n // Riordino nella stessa sezione\r\n const section: UiFormSection = event.container.data;\r\n this.stateService.moveFieldInSection(section.id, event.previousIndex, event.currentIndex);\r\n }\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ─── Computed properties ─────────────────────────────────────\r\n\r\n /** Campo attualmente selezionato. */\r\n get selectedField(): UiFormFieldDescriptor | null {\r\n if (!this.state.selectedFieldKey) return null;\r\n return this.stateService.findFieldByKey(this.state.selectedFieldKey);\r\n }\r\n\r\n /** ID della sezione del campo selezionato. */\r\n get selectedFieldSectionId(): string | null {\r\n if (!this.state.selectedFieldKey) return null;\r\n return this.stateService.findSectionByFieldKey(this.state.selectedFieldKey)?.id || null;\r\n }\r\n\r\n // ─── Tab / Preview ───────────────────────────────────────────\r\n\r\n onTabChange(index: number): void {\r\n this.selectedTabIndex = index;\r\n if (index === 1) this.refreshPreview();\r\n }\r\n\r\n refreshPreview(): void {\r\n this.previewKey++;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ─── Dialog ──────────────────────────────────────────────────\r\n\r\n /** Chiude la modale restituendo lo schema corrente. */\r\n closeDialog(): void {\r\n this.dialogRef?.close(this.state.schema);\r\n }\r\n\r\n // ─── Resize sidebar ──────────────────────────────────────────\r\n\r\n onResizeStart(event: MouseEvent): void {\r\n event.preventDefault();\r\n this.isResizing = true;\r\n this.resizeStartX = event.clientX;\r\n this.resizeStartWidth = this.rightSidebarWidth;\r\n\r\n document.addEventListener('mousemove', this.onResizeMove);\r\n document.addEventListener('mouseup', this.onResizeEnd);\r\n document.body.style.cursor = 'ew-resize';\r\n document.body.style.userSelect = 'none';\r\n }\r\n\r\n private onResizeMove = (event: MouseEvent): void => {\r\n if (!this.isResizing) return;\r\n const delta = this.resizeStartX - event.clientX;\r\n this.rightSidebarWidth = Math.max(\r\n this.MIN_SIDEBAR_WIDTH,\r\n Math.min(this.MAX_SIDEBAR_WIDTH, this.resizeStartWidth + delta),\r\n );\r\n this.cdr.markForCheck();\r\n };\r\n\r\n private onResizeEnd = (): void => {\r\n if (!this.isResizing) return;\r\n this.isResizing = false;\r\n document.removeEventListener('mousemove', this.onResizeMove);\r\n document.removeEventListener('mouseup', this.onResizeEnd);\r\n document.body.style.cursor = '';\r\n document.body.style.userSelect = '';\r\n this.saveSidebarWidth();\r\n };\r\n\r\n // ─── Resize sidebar sinistra ─────────────────────────────────\r\n\r\n onLeftResizeStart(event: MouseEvent): void {\r\n event.preventDefault();\r\n this.isResizingLeft = true;\r\n this.resizeStartX = event.clientX;\r\n this.resizeStartWidth = this.leftSidebarWidth;\r\n\r\n document.addEventListener('mousemove', this.onLeftResizeMove);\r\n document.addEventListener('mouseup', this.onLeftResizeEnd);\r\n document.body.style.cursor = 'ew-resize';\r\n document.body.style.userSelect = 'none';\r\n }\r\n\r\n private onLeftResizeMove = (event: MouseEvent): void => {\r\n if (!this.isResizingLeft) return;\r\n const delta = event.clientX - this.resizeStartX;\r\n this.leftSidebarWidth = Math.max(\r\n this.MIN_LEFT_SIDEBAR_WIDTH,\r\n Math.min(this.MAX_LEFT_SIDEBAR_WIDTH, this.resizeStartWidth + delta),\r\n );\r\n this.cdr.markForCheck();\r\n };\r\n\r\n private onLeftResizeEnd = (): void => {\r\n if (!this.isResizingLeft) return;\r\n this.isResizingLeft = false;\r\n document.removeEventListener('mousemove', this.onLeftResizeMove);\r\n document.removeEventListener('mouseup', this.onLeftResizeEnd);\r\n document.body.style.cursor = '';\r\n document.body.style.userSelect = '';\r\n this.saveLeftSidebarWidth();\r\n };\r\n\r\n // ─── Private ─────────────────────────────────────────────────\r\n\r\n private checkForRecovery(): void {\r\n if (this.persistenceService.hasLocalStorageData()) {\r\n const age = this.persistenceService.getLocalStorageAge();\r\n const message = age\r\n ? `Trovato salvataggio del ${age.toLocaleString('it-IT')}. Vuoi recuperarlo?`\r\n : 'Trovato salvataggio precedente. Vuoi recuperarlo?';\r\n\r\n const ref = this.snackBar.open(message, 'Recupera', { duration: 10000 });\r\n ref.onAction().subscribe(() => {\r\n const schema = this.persistenceService.loadFromLocalStorage();\r\n if (schema) {\r\n this.stateService.setSchema(schema);\r\n this.showMessage('Schema recuperato');\r\n }\r\n });\r\n }\r\n }\r\n\r\n private autoSave(): void {\r\n try {\r\n this.persistenceService.saveToLocalStorage(this.state.schema);\r\n this.stateService.markAsSaved();\r\n } catch {\r\n // Silenzioso per auto-save\r\n }\r\n }\r\n\r\n private updateBreadcrumb(): void {\r\n this.breadcrumb = [\r\n {\r\n label: this.state.schema.title || 'Form',\r\n id: this.state.schema.id,\r\n type: 'form',\r\n active: !this.state.selectedSectionId && !this.state.selectedFieldKey,\r\n },\r\n ];\r\n\r\n if (this.state.selectedSectionId) {\r\n const section = this.state.schema.sections.find((s) => s.id === this.state.selectedSectionId);\r\n if (section) {\r\n this.breadcrumb.push({\r\n label: section.title || 'Sezione',\r\n id: section.id,\r\n type: 'section',\r\n active: !this.state.selectedFieldKey,\r\n });\r\n }\r\n }\r\n\r\n if (this.state.selectedFieldKey) {\r\n const field = this.stateService.findFieldByKey(this.state.selectedFieldKey);\r\n if (field) {\r\n this.breadcrumb.push({\r\n label: field.label,\r\n id: field.key,\r\n type: 'field',\r\n active: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n private updateAvailableFields(): void {\r\n const fields: UiEditorAvailableField[] = [];\r\n this.state.schema.sections.forEach((section) => {\r\n section.fields.forEach((field) => {\r\n const af: UiEditorAvailableField = {\r\n key: field.key,\r\n label: field.label,\r\n type: field.type,\r\n };\r\n if (field.options && Array.isArray(field.options) && field.options.length > 0) {\r\n af.options = field.options.map((opt) => ({\r\n value: opt.value,\r\n label: opt.label,\r\n }));\r\n }\r\n fields.push(af);\r\n });\r\n });\r\n this.availableFields = fields;\r\n }\r\n\r\n private showMessage(message: string, isError = false): void {\r\n this.snackBar.open(message, 'Chiudi', {\r\n duration: 3000,\r\n panelClass: isError ? ['ui-snackbar-error'] : [],\r\n });\r\n }\r\n\r\n private loadSidebarWidth(): void {\r\n try {\r\n const savedRight = localStorage.getItem(this.SIDEBAR_WIDTH_KEY);\r\n if (savedRight) {\r\n const w = parseInt(savedRight, 10);\r\n if (!isNaN(w) && w >= this.MIN_SIDEBAR_WIDTH && w <= this.MAX_SIDEBAR_WIDTH) {\r\n this.rightSidebarWidth = w;\r\n }\r\n }\r\n const savedLeft = localStorage.getItem(this.LEFT_SIDEBAR_WIDTH_KEY);\r\n if (savedLeft) {\r\n const w = parseInt(savedLeft, 10);\r\n if (!isNaN(w) && w >= this.MIN_LEFT_SIDEBAR_WIDTH && w <= this.MAX_LEFT_SIDEBAR_WIDTH) {\r\n this.leftSidebarWidth = w;\r\n }\r\n }\r\n } catch {\r\n // Silenzioso\r\n }\r\n }\r\n\r\n private saveSidebarWidth(): void {\r\n try {\r\n localStorage.setItem(this.SIDEBAR_WIDTH_KEY, this.rightSidebarWidth.toString());\r\n } catch {\r\n // Silenzioso\r\n }\r\n }\r\n\r\n private saveLeftSidebarWidth(): void {\r\n try {\r\n localStorage.setItem(this.LEFT_SIDEBAR_WIDTH_KEY, this.leftSidebarWidth.toString());\r\n } catch {\r\n // Silenzioso\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n inject,\r\n} from '@angular/core';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiModalConfig } from './modal.types';\r\n\r\n/**\r\n * Componente modale standalone con struttura header/body/footer.\r\n *\r\n * Da utilizzare come wrapper all'interno di componenti aperti\r\n * tramite `UiModalService.open()`. Fornisce la struttura visuale\r\n * e gestisce la chiusura programmatica.\r\n *\r\n * **Content projection:**\r\n * - Contenuto di default: va nel body\r\n * - `[uiModalHeader]`: sostituisce il titolo nell'header\r\n * - `[uiModalFooter]`: azioni nel footer\r\n *\r\n * @selector ui-modal\r\n *\r\n * @example\r\n * ```html\r\n * <ui-modal [config]=\"{ title: 'Dettagli', size: 'md' }\">\r\n * <p>Contenuto del body della modale.</p>\r\n * <div uiModalFooter>\r\n * <ui-button label=\"Chiudi\" variant=\"ghost\" (click)=\"close()\" />\r\n * <ui-button label=\"Salva\" variant=\"primary\" (click)=\"save()\" />\r\n * </div>\r\n * </ui-modal>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-modal',\r\n standalone: true,\r\n imports: [LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'ui-modal-host',\r\n role: 'dialog',\r\n 'aria-modal': 'true',\r\n '[attr.aria-label]': 'config.title || null',\r\n },\r\n template: `\r\n <!-- Header -->\r\n @if (config.title || config.showCloseButton !== false) {\r\n <div class=\"ui-modal__header\">\r\n <div class=\"ui-modal__header-content\">\r\n <ng-content select=\"[uiModalHeader]\">\r\n @if (config.title) {\r\n <h2 class=\"ui-modal__title\">{{ config.title }}</h2>\r\n }\r\n </ng-content>\r\n </div>\r\n @if (config.showCloseButton !== false) {\r\n <button\r\n class=\"ui-modal__close\"\r\n (click)=\"close()\"\r\n aria-label=\"Chiudi modale\"\r\n type=\"button\"\r\n >\r\n <lucide-icon name=\"x\" [size]=\"18\" aria-hidden=\"true\" />\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Body -->\r\n <div class=\"ui-modal__body\">\r\n <ng-content />\r\n </div>\r\n\r\n <!-- Footer -->\r\n @if (!config.hideFooter) {\r\n <div class=\"ui-modal__footer\">\r\n <ng-content select=\"[uiModalFooter]\" />\r\n </div>\r\n }\r\n `,\r\n styleUrl: './modal.component.scss',\r\n})\r\nexport class UiModalComponent {\r\n /** Configurazione strutturale della modale. */\r\n @Input() config: UiModalConfig = {};\r\n\r\n /**\r\n * Emesso quando la modale viene chiusa.\r\n * Utile se il componente e usato direttamente nel template\r\n * senza UiModalService.\r\n */\r\n @Output() closed = new EventEmitter<unknown>();\r\n\r\n /** @internal Riferimento al dialogo Material per la chiusura. */\r\n private dialogRef = inject(MatDialogRef, { optional: true });\r\n\r\n /** Chiude la modale con un risultato opzionale. */\r\n close(result?: unknown): void {\r\n if (this.dialogRef) {\r\n this.dialogRef.close(result);\r\n } else {\r\n this.closed.emit(result);\r\n }\r\n }\r\n}\r\n","import { Component, ChangeDetectionStrategy, ViewEncapsulation, inject } from '@angular/core';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiButtonComponent } from '../button/button.component';\r\nimport { UiConfirmDialogData, UiConfirmVariant, UiIconName, UiVariant } from './modal.types';\r\n\r\n/** @internal Mappatura variante -> icona Lucide di default. */\r\nconst VARIANT_ICON_MAP: Record<UiConfirmVariant, UiIconName> = {\r\n confirm: 'check-circle',\r\n delete: 'trash-2',\r\n warn: 'alert-triangle',\r\n info: 'info',\r\n};\r\n\r\n/** @internal Mappatura variante -> colore pulsante di conferma. */\r\nconst VARIANT_BUTTON_MAP: Record<UiConfirmVariant, UiVariant> = {\r\n confirm: 'primary',\r\n delete: 'warn',\r\n warn: 'warn',\r\n info: 'primary',\r\n};\r\n\r\n/**\r\n * Dialogo di conferma leggero per azioni condizionali.\r\n *\r\n * Non va utilizzato direttamente nel template: viene aperto\r\n * programmaticamente tramite `UiModalService.confirm()` e i suoi\r\n * metodi scorciatoia (`confirmDelete`, `confirmDiscard`, `confirmSave`).\r\n *\r\n * Supporta quattro varianti semantiche — confirm, delete, warn, info —\r\n * ciascuna con icona e colore preconfigurati.\r\n *\r\n * @selector ui-confirm-dialog\r\n *\r\n * @example\r\n * ```typescript\r\n * // Apertura tramite servizio\r\n * this.modalService.confirm({\r\n * title: 'Conferma eliminazione',\r\n * message: 'Questa azione non puo essere annullata.',\r\n * variant: 'delete',\r\n * }).subscribe(confirmed => {\r\n * if (confirmed) this.deleteItem();\r\n * });\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-confirm-dialog',\r\n standalone: true,\r\n imports: [LucideAngularModule, UiButtonComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'ui-confirm-dialog-host',\r\n role: 'alertdialog',\r\n 'aria-modal': 'true',\r\n '[attr.aria-labelledby]': '\"ui-confirm-title\"',\r\n '[attr.aria-describedby]': '\"ui-confirm-message\"',\r\n },\r\n template: `\r\n <div class=\"ui-confirm-dialog\">\r\n <!-- Icona -->\r\n <div [class]=\"iconClasses\">\r\n <lucide-icon [name]=\"iconName\" [size]=\"32\" aria-hidden=\"true\" />\r\n </div>\r\n\r\n <!-- Contenuto -->\r\n <div class=\"ui-confirm-dialog__content\">\r\n @if (data.title) {\r\n <h3 class=\"ui-confirm-dialog__title\" id=\"ui-confirm-title\">{{ data.title }}</h3>\r\n }\r\n <p class=\"ui-confirm-dialog__message\" id=\"ui-confirm-message\">{{ data.message }}</p>\r\n </div>\r\n\r\n <!-- Azioni -->\r\n <div class=\"ui-confirm-dialog__actions\">\r\n <ui-button\r\n [label]=\"data.cancelText || 'Annulla'\"\r\n variant=\"ghost\"\r\n size=\"md\"\r\n (click)=\"cancel()\"\r\n />\r\n <ui-button\r\n [label]=\"data.confirmText || 'Conferma'\"\r\n [variant]=\"confirmButtonVariant\"\r\n size=\"md\"\r\n (click)=\"confirm()\"\r\n />\r\n </div>\r\n </div>\r\n `,\r\n styleUrl: './confirm-dialog.component.scss',\r\n})\r\nexport class UiConfirmDialogComponent {\r\n /** @internal Dati iniettati dal servizio modale. */\r\n readonly data: UiConfirmDialogData = inject(MAT_DIALOG_DATA);\r\n\r\n /** @internal Riferimento al dialogo per la chiusura. */\r\n private readonly dialogRef = inject(MatDialogRef);\r\n\r\n /** Variante semantica corrente. */\r\n get variant(): UiConfirmVariant {\r\n return this.data.variant || 'confirm';\r\n }\r\n\r\n /** Nome icona Lucide da visualizzare. */\r\n get iconName(): UiIconName {\r\n return this.data.icon || VARIANT_ICON_MAP[this.variant];\r\n }\r\n\r\n /** Variante del pulsante di conferma. */\r\n get confirmButtonVariant(): UiVariant {\r\n return VARIANT_BUTTON_MAP[this.variant];\r\n }\r\n\r\n /** Classi CSS per il contenitore icona. */\r\n get iconClasses(): string {\r\n return `ui-confirm-dialog__icon ui-confirm-dialog__icon--${this.variant}`;\r\n }\r\n\r\n /** Conferma e chiude il dialogo con `true`. */\r\n confirm(): void {\r\n this.dialogRef.close(true);\r\n }\r\n\r\n /** Annulla e chiude il dialogo con `false`. */\r\n cancel(): void {\r\n this.dialogRef.close(false);\r\n }\r\n}\r\n","import { Injectable, inject, Type } from '@angular/core';\r\nimport { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\r\nimport { Observable, map } from 'rxjs';\r\nimport { UiConfirmDialogComponent } from './confirm-dialog.component';\r\nimport { UiConfirmDialogData, UiModalOpenConfig, UiModalSize } from './modal.types';\r\n\r\n/** @internal Mappatura dimensione -> larghezza CSS per il pannello overlay. */\r\nconst SIZE_WIDTH_MAP: Record<UiModalSize, string> = {\r\n sm: '400px',\r\n md: '560px',\r\n lg: '720px',\r\n xl: '900px',\r\n fullscreen: '95vw',\r\n};\r\n\r\n/**\r\n * Servizio per aprire modali e dialoghi di conferma.\r\n *\r\n * Gestisce lo stacking intelligente: una modale regolare puo\r\n * ospitare al massimo un dialogo di conferma sopra di se.\r\n * Non e possibile stackare due modali regolari.\r\n *\r\n * @usageNotes\r\n *\r\n * ### Aprire una modale personalizzata\r\n * ```typescript\r\n * const ref = this.modalService.open(MyDialogComponent, {\r\n * size: 'lg',\r\n * data: { userId: 123 },\r\n * });\r\n *\r\n * ref.afterClosed().subscribe(result => {\r\n * console.log('Risultato:', result);\r\n * });\r\n * ```\r\n *\r\n * ### Conferma rapida\r\n * ```typescript\r\n * this.modalService.confirm('Confermi questa azione?')\r\n * .subscribe(ok => { if (ok) this.procedi(); });\r\n * ```\r\n *\r\n * ### Preset di conferma\r\n * ```typescript\r\n * this.modalService.confirmDelete('Progetto Alpha')\r\n * .subscribe(ok => { if (ok) this.elimina(); });\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiModalService {\r\n /** @internal Istanza MatDialog per la gestione overlay. */\r\n private readonly dialog = inject(MatDialog);\r\n\r\n /** @internal Stack delle modali regolari aperte. */\r\n private _modalStack: MatDialogRef<unknown>[] = [];\r\n\r\n /** @internal Traccia se un dialogo di conferma e attualmente aperto. */\r\n private _confirmOpen = false;\r\n\r\n /**\r\n * Apre una modale con un componente personalizzato.\r\n *\r\n * Il componente aperto puo iniettare `MAT_DIALOG_DATA` per accedere\r\n * ai dati e `MatDialogRef` per chiudere la modale.\r\n *\r\n * @param component - Componente standalone da renderizzare nella modale\r\n * @param config - Configurazione (dimensione, dati, comportamento)\r\n * @returns Riferimento alla modale aperta\r\n */\r\n open<T, D = unknown, R = unknown>(component: Type<T>, config?: UiModalOpenConfig<D>): MatDialogRef<T, R> {\r\n // Regola di stacking: non stackare due modali regolari\r\n if (this._modalStack.length > 0) {\r\n console.warn(\r\n '[UiModalService] Una modale e gia aperta. ' +\r\n 'Usa confirm() per aprire un dialogo di conferma sopra la modale corrente.',\r\n );\r\n }\r\n\r\n const size = config?.size || 'md';\r\n\r\n const dialogConfig: MatDialogConfig<D> = {\r\n width: SIZE_WIDTH_MAP[size],\r\n maxWidth: size === 'fullscreen' ? '95vw' : '90vw',\r\n maxHeight: size === 'fullscreen' ? '95vh' : '90vh',\r\n height: size === 'fullscreen' ? '95vh' : undefined,\r\n disableClose: config?.disableClose ?? false,\r\n autoFocus: true,\r\n restoreFocus: true,\r\n data: config?.data as D,\r\n panelClass: ['ui-modal-panel', `ui-modal-panel--${size}`, ...(config?.panelClass ? [config.panelClass] : [])],\r\n hasBackdrop: true,\r\n backdropClass: ['cdk-overlay-dark-backdrop', 'ui-modal-backdrop'],\r\n };\r\n\r\n const ref = this.dialog.open(component, dialogConfig) as MatDialogRef<T, R>;\r\n\r\n this._modalStack.push(ref as MatDialogRef<unknown>);\r\n ref.afterClosed().subscribe(() => {\r\n this._modalStack = this._modalStack.filter((r) => r !== (ref as MatDialogRef<unknown>));\r\n });\r\n\r\n return ref;\r\n }\r\n\r\n /**\r\n * Apre un dialogo di conferma.\r\n *\r\n * Accetta una stringa semplice (messaggio) o un oggetto di\r\n * configurazione completo. Puo essere aperto sopra una modale\r\n * esistente (stacking consentito).\r\n *\r\n * @param messageOrConfig - Messaggio o configurazione completa\r\n * @returns Observable che emette `true` se confermato, `false` se annullato\r\n */\r\n confirm(messageOrConfig: string | UiConfirmDialogData): Observable<boolean> {\r\n const data: UiConfirmDialogData =\r\n typeof messageOrConfig === 'string' ? { message: messageOrConfig } : messageOrConfig;\r\n\r\n // Un solo dialogo di conferma alla volta\r\n if (this._confirmOpen) {\r\n console.warn('[UiModalService] Un dialogo di conferma e gia aperto.');\r\n return new Observable((subscriber) => {\r\n subscriber.next(false);\r\n subscriber.complete();\r\n });\r\n }\r\n\r\n this._confirmOpen = true;\r\n\r\n const dialogConfig: MatDialogConfig<UiConfirmDialogData> = {\r\n width: '420px',\r\n maxWidth: '90vw',\r\n disableClose: false,\r\n autoFocus: false,\r\n restoreFocus: true,\r\n data,\r\n panelClass: ['ui-confirm-panel'],\r\n hasBackdrop: true,\r\n backdropClass:\r\n this._modalStack.length > 0\r\n ? ['cdk-overlay-dark-backdrop', 'ui-confirm-backdrop--stacked']\r\n : ['cdk-overlay-dark-backdrop', 'ui-modal-backdrop'],\r\n };\r\n\r\n const ref = this.dialog.open(UiConfirmDialogComponent, dialogConfig);\r\n\r\n return ref.afterClosed().pipe(\r\n map((result) => {\r\n this._confirmOpen = false;\r\n return !!result;\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Scorciatoia: conferma eliminazione.\r\n * Variante `delete` con icona cestino e pulsante warn.\r\n *\r\n * @param itemName - Nome opzionale dell'elemento da eliminare\r\n */\r\n confirmDelete(itemName?: string): Observable<boolean> {\r\n return this.confirm({\r\n title: 'Conferma eliminazione',\r\n message: itemName\r\n ? `Sei sicuro di voler eliminare \"${itemName}\"? Questa azione non puo essere annullata.`\r\n : 'Sei sicuro di voler eliminare questo elemento? Questa azione non puo essere annullata.',\r\n confirmText: 'Elimina',\r\n cancelText: 'Annulla',\r\n variant: 'delete',\r\n });\r\n }\r\n\r\n /**\r\n * Scorciatoia: conferma abbandono modifiche.\r\n * Variante `warn` con icona avviso.\r\n */\r\n confirmDiscard(): Observable<boolean> {\r\n return this.confirm({\r\n title: 'Modifiche non salvate',\r\n message: 'Ci sono modifiche non salvate. Sei sicuro di voler uscire senza salvare?',\r\n confirmText: 'Esci senza salvare',\r\n cancelText: 'Rimani',\r\n variant: 'warn',\r\n });\r\n }\r\n\r\n /**\r\n * Scorciatoia: conferma salvataggio.\r\n * Variante `confirm` con icona check.\r\n */\r\n confirmSave(): Observable<boolean> {\r\n return this.confirm({\r\n title: 'Conferma salvataggio',\r\n message: 'Sei sicuro di voler salvare le modifiche?',\r\n confirmText: 'Salva',\r\n cancelText: 'Annulla',\r\n variant: 'confirm',\r\n });\r\n }\r\n\r\n /** Chiude tutte le modali e dialoghi aperti. */\r\n closeAll(): void {\r\n this.dialog.closeAll();\r\n this._modalStack = [];\r\n this._confirmOpen = false;\r\n }\r\n\r\n /** Indica se ci sono modali o dialoghi attualmente aperti. */\r\n get hasOpenDialogs(): boolean {\r\n return this.dialog.openDialogs.length > 0;\r\n }\r\n\r\n /** Numero di modali regolari attualmente aperte. */\r\n get openModalCount(): number {\r\n return this._modalStack.length;\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder-editor\r\n * Servizio per aprire l'editor visuale in una modale fullscreen.\r\n */\r\n\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { UiFormSchema } from '../form-builder/types/index';\r\nimport { UiModalService } from '../modal/index';\r\nimport { UiFormBuilderEditorComponent } from './form-builder-editor.component';\r\n\r\n/**\r\n * Servizio per aprire l'editor visuale del form builder\r\n * in una modale fullscreen tramite il UiModalService.\r\n *\r\n * @usageNotes\r\n *\r\n * ### Apertura base\r\n * ```typescript\r\n * const ref = this.editorService.open();\r\n * ref.afterClosed().subscribe(schema => {\r\n * if (schema) console.log('Schema risultante:', schema);\r\n * });\r\n * ```\r\n *\r\n * ### Apertura con schema iniziale\r\n * ```typescript\r\n * this.editorService.open(myExistingSchema)\r\n * .afterClosed()\r\n * .subscribe(schema => { ... });\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiFormBuilderEditorService {\r\n /** @internal Servizio modale per l'apertura. */\r\n private readonly modalService = inject(UiModalService);\r\n\r\n /**\r\n * Apre l'editor in una modale fullscreen.\r\n *\r\n * @param initialSchema - Schema iniziale da caricare nell'editor\r\n * @returns Riferimento alla dialog per gestire chiusura e risultato\r\n */\r\n open(initialSchema?: UiFormSchema): MatDialogRef<UiFormBuilderEditorComponent, UiFormSchema | null> {\r\n return this.modalService.open<UiFormBuilderEditorComponent, any, UiFormSchema | null>(\r\n UiFormBuilderEditorComponent,\r\n {\r\n size: 'fullscreen',\r\n disableClose: false,\r\n data: { initialSchema },\r\n panelClass: 'ui-form-builder-editor-dialog',\r\n },\r\n );\r\n }\r\n}\r\n","/**\n * @module ng-ui-system/form-builder-editor\n * Tipi e interfacce per l'editor visuale del form builder.\n */\n\nimport { UiFieldType, UiFormSchema } from '../../form-builder/types/index';\nimport { UiIconName } from '../../../core/types';\n\n// ─── Stato dell'editor ───────────────────────────────────────────\n\n/**\n * Stato corrente dell'editor.\n * Gestito dal servizio UiEditorStateService tramite BehaviorSubject.\n */\nexport interface UiEditorState {\n /** Schema del form in fase di editing. */\n schema: UiFormSchema;\n /** ID della sezione attualmente selezionata. */\n selectedSectionId: string | null;\n /** Chiave del campo attualmente selezionato. */\n selectedFieldKey: string | null;\n /** Indica se lo schema e stato modificato dall'ultimo salvataggio. */\n isDirty: boolean;\n /** Data dell'ultimo salvataggio. */\n lastSaved: Date | null;\n}\n\n// ─── Palette ─────────────────────────────────────────────────────\n\n/**\n * Categorie per raggruppare i tipi di campo nella palette.\n */\nexport type UiEditorFieldCategory = 'basic' | 'choice' | 'datetime' | 'advanced' | 'custom';\n\n/**\n * Elemento della palette dei tipi di campo.\n * Rappresenta un tipo di campo trascinabile nella palette laterale.\n */\nexport interface UiEditorFieldPaletteItem {\n /** Tipo di campo. */\n type: UiFieldType;\n /** Nome visualizzato nella palette. */\n label: string;\n /** Icona Lucide da mostrare. */\n icon: UiIconName;\n /** Descrizione breve del tipo di campo. */\n description: string;\n /** Categoria di appartenenza. */\n category: UiEditorFieldCategory;\n}\n\n/**\n * Campo disponibile per la selezione nelle condizioni.\n * Versione semplificata del field descriptor per le select.\n */\nexport interface UiEditorAvailableField {\n /** Chiave univoca del campo. */\n key: string;\n /** Label visualizzata. */\n label: string;\n /** Tipo di campo. */\n type: string;\n /** Opzioni (per campi select, radio, etc.). */\n options?: { value: any; label: string }[];\n}\n\n// ─── Breadcrumb ──────────────────────────────────────────────────\n\n/**\n * Elemento del breadcrumb di navigazione dell'editor.\n */\nexport interface UiEditorBreadcrumbItem {\n /** Label visualizzata. */\n label: string;\n /** ID dell'elemento (form, sezione o campo). */\n id: string;\n /** Tipo di elemento. */\n type: 'form' | 'section' | 'field';\n /** Se e l'elemento attualmente attivo. */\n active: boolean;\n}\n\n// ─── Persistenza ─────────────────────────────────────────────────\n\n/**\n * Struttura dati per il salvataggio nel localStorage.\n */\nexport interface UiEditorStorageData {\n /** Schema salvato. */\n schema: UiFormSchema;\n /** Timestamp del salvataggio (epoch ms). */\n timestamp: number;\n /** Versione dello storage per compatibilita futura. */\n version: string;\n}\n\n// ─── Validazione dello schema ────────────────────────────────────\n\n/**\n * Risultato della validazione dello schema nell'editor.\n */\nexport interface UiEditorSchemaValidationResult {\n /** Se lo schema e valido. */\n valid: boolean;\n /** Errori di validazione. */\n errors: UiEditorSchemaValidationError[];\n /** Warning di validazione. */\n warnings: UiEditorSchemaValidationWarning[];\n}\n\n/**\n * Errore di validazione dello schema.\n */\nexport interface UiEditorSchemaValidationError {\n /** Tipo di errore. */\n type: 'duplicate_key' | 'invalid_type' | 'missing_required' | 'invalid_reference' | 'invalid_format';\n /** Messaggio di errore. */\n message: string;\n /** Path dell'elemento con errore (es. `sections[0].fields[2].key`). */\n path: string;\n}\n\n/**\n * Warning di validazione dello schema.\n */\nexport interface UiEditorSchemaValidationWarning {\n /** Tipo di warning. */\n type: 'missing_label' | 'empty_options' | 'unused_field' | 'circular_condition';\n /** Messaggio di warning. */\n message: string;\n /** Path dell'elemento con warning. */\n path: string;\n}\n\n// ─── Configurazione editor ───────────────────────────────────────\n\n/**\n * Dati passati alla modale dell'editor.\n * Iniettabili tramite MAT_DIALOG_DATA.\n */\nexport interface UiEditorDialogData {\n /** Schema iniziale da caricare nell'editor. */\n initialSchema?: UiFormSchema;\n}\n","/**\n * @module ng-ui-system/form-builder-editor\n * Preset di schemi per l'editor del form builder.\n *\n * Raccolta di scenari comuni che dimostrano le capacità del descrittore:\n * - Validazione avanzata (required, pattern, cross-field)\n * - Condizioni di visibilità e disabilitazione\n * - Layout multi-colonna con breakpoints\n * - Campi select/radio/multiselect con opzioni\n * - Sezioni multiple organizzate per contesto\n * - File upload, switch, divider, textarea\n *\n * Utilizzabili sia nella variante Material che Bootstrap Italia.\n */\n\nimport type { UiFormSchema } from '../../form-builder/types/index';\n\n// ────────────────────────────────────────────────────────────────────\n// 1 · Anagrafica dipendente — form HR\n// ────────────────────────────────────────────────────────────────────\n\nexport const PRESET_ANAGRAFICA: UiFormSchema = {\n id: 'preset-anagrafica',\n title: 'Scheda Anagrafica Dipendente',\n description: 'Form HR per onboarding dipendente con dati personali, contatti e documenti.',\n sections: [\n {\n id: 'dati-personali',\n title: 'Dati Personali',\n fields: [\n {\n key: 'nome', type: 'text', label: 'Nome', required: true,\n placeholder: 'Mario', layout: { columns: 4 },\n validation: [{ type: 'required', message: 'Nome obbligatorio' }],\n },\n {\n key: 'cognome', type: 'text', label: 'Cognome', required: true,\n placeholder: 'Rossi', layout: { columns: 4 },\n validation: [{ type: 'required', message: 'Cognome obbligatorio' }],\n },\n {\n key: 'codice_fiscale', type: 'text', label: 'Codice Fiscale', required: true,\n placeholder: 'RSSMRA85M01H501Z', layout: { columns: 4 },\n validation: [\n { type: 'required', message: 'CF obbligatorio' },\n { type: 'pattern', value: '^[A-Z]{6}\\\\d{2}[A-Z]\\\\d{2}[A-Z]\\\\d{3}[A-Z]$', message: 'Formato CF non valido' },\n ],\n },\n {\n key: 'data_nascita', type: 'date', label: 'Data di nascita', required: true,\n layout: { columns: 4 },\n },\n {\n key: 'sesso', type: 'radio', label: 'Sesso', layout: { columns: 4 },\n options: [\n { value: 'M', label: 'Maschio' },\n { value: 'F', label: 'Femmina' },\n { value: 'X', label: 'Non specificato' },\n ],\n },\n {\n key: 'stato_civile', type: 'select', label: 'Stato civile', layout: { columns: 4 },\n options: [\n { value: 'celibe', label: 'Celibe/Nubile' },\n { value: 'coniugato', label: 'Coniugato/a' },\n { value: 'divorziato', label: 'Divorziato/a' },\n { value: 'vedovo', label: 'Vedovo/a' },\n ],\n },\n ],\n },\n {\n id: 'contatti',\n title: 'Contatti',\n fields: [\n {\n key: 'email', type: 'email', label: 'Email aziendale', required: true,\n placeholder: 'mario.rossi@azienda.it', layout: { columns: 6 },\n validation: [\n { type: 'required', message: 'Email obbligatoria' },\n { type: 'email', message: 'Formato email non valido' },\n ],\n },\n {\n key: 'telefono', type: 'text', label: 'Telefono', layout: { columns: 6 },\n placeholder: '+39 333 1234567',\n validation: [\n { type: 'pattern', value: '^\\\\+?[\\\\d\\\\s-]{8,15}$', message: 'Formato telefono non valido' },\n ],\n },\n { key: 'div-indirizzo', type: 'divider', label: 'Indirizzo di residenza' },\n {\n key: 'indirizzo', type: 'text', label: 'Via e numero', layout: { columns: 8 },\n placeholder: 'Via Roma 42',\n },\n {\n key: 'cap', type: 'text', label: 'CAP', layout: { columns: 4 },\n validation: [{ type: 'pattern', value: '^\\\\d{5}$', message: 'CAP: 5 cifre' }],\n },\n {\n key: 'citta', type: 'text', label: 'Città', layout: { columns: 6 },\n },\n {\n key: 'provincia', type: 'text', label: 'Provincia', layout: { columns: 2 },\n placeholder: 'RM',\n validation: [{ type: 'maxLength', value: 2, message: 'Max 2 caratteri' }],\n },\n ],\n },\n {\n id: 'documenti',\n title: 'Documenti',\n fields: [\n {\n key: 'tipo_documento', type: 'select', label: 'Tipo documento', layout: { columns: 4 },\n options: [\n { value: 'ci', label: 'Carta d\\'identità' },\n { value: 'passaporto', label: 'Passaporto' },\n { value: 'patente', label: 'Patente di guida' },\n ],\n },\n {\n key: 'numero_documento', type: 'text', label: 'Numero documento', layout: { columns: 4 },\n conditions: [{ field: 'tipo_documento', operator: 'is_not_empty' }],\n },\n {\n key: 'scadenza_documento', type: 'date', label: 'Scadenza', layout: { columns: 4 },\n conditions: [{ field: 'tipo_documento', operator: 'is_not_empty' }],\n },\n {\n key: 'allegato', type: 'file', label: 'Scansione documento',\n fileConfig: { maxFileSize: 5_000_000, acceptedTypes: ['application/pdf', 'image/*'], maxFiles: 2 },\n conditions: [{ field: 'tipo_documento', operator: 'is_not_empty' }],\n },\n ],\n },\n ],\n config: { columns: 12, showButtons: false },\n};\n\n// ────────────────────────────────────────────────────────────────────\n// 2 · Richiesta intervento tecnico\n// ────────────────────────────────────────────────────────────────────\n\nexport const PRESET_TICKET: UiFormSchema = {\n id: 'preset-ticket',\n title: 'Richiesta Intervento Tecnico',\n description: 'Ticket di assistenza tecnica con priorità, categoria e allegati.',\n sections: [\n {\n id: 'info-richiesta',\n title: 'Informazioni Richiesta',\n fields: [\n {\n key: 'oggetto', type: 'text', label: 'Oggetto', required: true,\n placeholder: 'Breve descrizione del problema',\n validation: [\n { type: 'required', message: 'Oggetto obbligatorio' },\n { type: 'minLength', value: 10, message: 'Minimo 10 caratteri' },\n ],\n },\n {\n key: 'priorita', type: 'radio', label: 'Priorità', required: true,\n layout: { columns: 6 },\n options: [\n { value: 'bassa', label: '🟢 Bassa' },\n { value: 'media', label: '🟡 Media' },\n { value: 'alta', label: '🟠 Alta' },\n { value: 'critica', label: '🔴 Critica' },\n ],\n },\n {\n key: 'categoria', type: 'select', label: 'Categoria', required: true,\n layout: { columns: 6 },\n options: [\n { value: 'hardware', label: 'Hardware' },\n { value: 'software', label: 'Software' },\n { value: 'rete', label: 'Rete / Connettività' },\n { value: 'account', label: 'Account / Permessi' },\n { value: 'altro', label: 'Altro' },\n ],\n },\n {\n key: 'categoria_altro', type: 'text', label: 'Specifica categoria',\n placeholder: 'Descrivi la categoria',\n conditions: [{ field: 'categoria', operator: 'equals', value: 'altro' }],\n },\n {\n key: 'descrizione', type: 'textarea', label: 'Descrizione dettagliata', required: true,\n placeholder: 'Descrivi il problema nel dettaglio, includendo passaggi per riprodurlo...',\n validation: [\n { type: 'required', message: 'Descrizione obbligatoria' },\n { type: 'minLength', value: 30, message: 'Fornisci almeno 30 caratteri' },\n ],\n },\n ],\n },\n {\n id: 'dettagli-tecnici',\n title: 'Dettagli Tecnici',\n fields: [\n {\n key: 'sistema_operativo', type: 'select', label: 'Sistema operativo', layout: { columns: 6 },\n options: [\n { value: 'win11', label: 'Windows 11' },\n { value: 'win10', label: 'Windows 10' },\n { value: 'macos', label: 'macOS' },\n { value: 'linux', label: 'Linux' },\n ],\n },\n {\n key: 'data_primo_evento', type: 'datetime', label: 'Primo evento', layout: { columns: 6 },\n tooltip: 'Quando si è verificato il problema per la prima volta?',\n },\n {\n key: 'riproducibile', type: 'switch', label: 'Il problema è riproducibile?',\n layout: { columns: 6 },\n },\n {\n key: 'frequenza', type: 'select', label: 'Frequenza', layout: { columns: 6 },\n conditions: [{ field: 'riproducibile', operator: 'equals', value: true }],\n options: [\n { value: 'sempre', label: 'Sempre' },\n { value: 'spesso', label: 'Spesso (>50%)' },\n { value: 'occasionale', label: 'Occasionalmente' },\n { value: 'raro', label: 'Raramente' },\n ],\n },\n {\n key: 'screenshot', type: 'file', label: 'Screenshot / Allegati',\n fileConfig: { maxFileSize: 10_000_000, acceptedTypes: ['image/*', 'application/pdf'], maxFiles: 5, multiple: true },\n },\n ],\n },\n {\n id: 'consenso',\n title: 'Consenso e Invio',\n fields: [\n {\n key: 'accesso_remoto', type: 'checkbox', label: 'Autorizzo l\\'accesso remoto alla mia postazione',\n },\n {\n key: 'privacy', type: 'checkbox', label: 'Ho letto e accetto l\\'informativa sulla privacy', required: true,\n validation: [{ type: 'required', message: 'Devi accettare l\\'informativa' }],\n },\n {\n key: 'note_aggiuntive', type: 'textarea', label: 'Note aggiuntive',\n placeholder: 'Informazioni extra utili per la risoluzione...',\n },\n ],\n },\n ],\n config: { columns: 12, showButtons: false },\n};\n\n// ────────────────────────────────────────────────────────────────────\n// 3 · Questionario di valutazione\n// ────────────────────────────────────────────────────────────────────\n\nexport const PRESET_SURVEY: UiFormSchema = {\n id: 'preset-survey',\n title: 'Questionario di Valutazione',\n description: 'Survey di soddisfazione con branching condizionale e scala Likert.',\n sections: [\n {\n id: 'profilo',\n title: 'Profilo Rispondente',\n fields: [\n {\n key: 'ruolo', type: 'select', label: 'Il tuo ruolo', required: true,\n layout: { columns: 6 },\n options: [\n { value: 'dipendente', label: 'Dipendente' },\n { value: 'manager', label: 'Manager / Responsabile' },\n { value: 'dirigente', label: 'Dirigente' },\n { value: 'esterno', label: 'Collaboratore esterno' },\n ],\n },\n {\n key: 'anzianita', type: 'select', label: 'Anzianità in azienda', layout: { columns: 6 },\n options: [\n { value: '<1', label: 'Meno di 1 anno' },\n { value: '1-3', label: '1-3 anni' },\n { value: '3-5', label: '3-5 anni' },\n { value: '5-10', label: '5-10 anni' },\n { value: '>10', label: 'Oltre 10 anni' },\n ],\n },\n {\n key: 'dipartimento', type: 'multiselect', label: 'Dipartimento/i di riferimento',\n options: [\n { value: 'it', label: 'IT' },\n { value: 'hr', label: 'Risorse Umane' },\n { value: 'finance', label: 'Amministrazione' },\n { value: 'sales', label: 'Commerciale' },\n { value: 'ops', label: 'Operations' },\n { value: 'legal', label: 'Legale' },\n ],\n },\n ],\n },\n {\n id: 'soddisfazione',\n title: 'Soddisfazione Generale',\n fields: [\n {\n key: 'soddisfazione_globale', type: 'radio', label: 'Quanto sei soddisfatto complessivamente?', required: true,\n options: [\n { value: 1, label: '1 — Molto insoddisfatto' },\n { value: 2, label: '2 — Insoddisfatto' },\n { value: 3, label: '3 — Neutrale' },\n { value: 4, label: '4 — Soddisfatto' },\n { value: 5, label: '5 — Molto soddisfatto' },\n ],\n },\n {\n key: 'motivo_insoddisfazione', type: 'textarea', label: 'Cosa potremmo migliorare?',\n placeholder: 'Descrivi i motivi della tua insoddisfazione...',\n conditions: [\n { field: 'soddisfazione_globale', operator: 'less_than', value: 3 },\n ],\n validation: [{ type: 'required', message: 'Aiutaci a capire cosa migliorare' }],\n },\n {\n key: 'ambiente_lavoro', type: 'radio', label: 'Ambiente di lavoro',\n options: [\n { value: 1, label: '1 — Pessimo' },\n { value: 2, label: '2 — Scarso' },\n { value: 3, label: '3 — Sufficiente' },\n { value: 4, label: '4 — Buono' },\n { value: 5, label: '5 — Eccellente' },\n ],\n layout: { columns: 6 },\n },\n {\n key: 'work_life_balance', type: 'radio', label: 'Work-Life Balance',\n options: [\n { value: 1, label: '1 — Pessimo' },\n { value: 2, label: '2 — Scarso' },\n { value: 3, label: '3 — Sufficiente' },\n { value: 4, label: '4 — Buono' },\n { value: 5, label: '5 — Eccellente' },\n ],\n layout: { columns: 6 },\n },\n ],\n },\n {\n id: 'formazione',\n title: 'Formazione e Crescita',\n fields: [\n {\n key: 'formazione_adeguata', type: 'switch', label: 'La formazione ricevuta è adeguata al tuo ruolo?',\n },\n {\n key: 'aree_formazione', type: 'freemultiselect', label: 'In quali aree vorresti formazione?',\n placeholder: 'Digita e premi Invio per aggiungere...',\n conditions: [{ field: 'formazione_adeguata', operator: 'equals', value: false }],\n },\n {\n key: 'crescita_professionale', type: 'radio', label: 'Opportunità di crescita professionale',\n options: [\n { value: 1, label: '1 — Pessima' },\n { value: 2, label: '2 — Scarsa' },\n { value: 3, label: '3 — Sufficiente' },\n { value: 4, label: '4 — Buona' },\n { value: 5, label: '5 — Eccellente' },\n ],\n },\n {\n key: 'suggerimenti', type: 'textarea', label: 'Suggerimenti liberi',\n placeholder: 'Qualsiasi commento, suggerimento o proposta...',\n },\n {\n key: 'anonimo', type: 'switch', label: 'Rispondi in forma anonima',\n defaultValue: true,\n },\n ],\n },\n ],\n config: { columns: 12, showButtons: false },\n};\n\n// ────────────────────────────────────────────────────────────────────\n// Indice export\n// ────────────────────────────────────────────────────────────────────\n\nexport interface EditorPresetInfo {\n key: string;\n label: string;\n description: string;\n schema: UiFormSchema;\n}\n\nexport const EDITOR_PRESETS: EditorPresetInfo[] = [\n {\n key: 'anagrafica',\n label: 'Anagrafica Dipendente',\n description: 'Form HR multi-sezione: dati personali, contatti, documenti con condizioni e validazione pattern.',\n schema: PRESET_ANAGRAFICA,\n },\n {\n key: 'ticket',\n label: 'Ticket Assistenza',\n description: 'Richiesta intervento tecnico con priorità, condizioni, switch e file upload.',\n schema: PRESET_TICKET,\n },\n {\n key: 'survey',\n label: 'Questionario Valutazione',\n description: 'Survey con scala Likert, branching condizionale, multiselect e freemultiselect.',\n schema: PRESET_SURVEY,\n },\n];\n","// ── Componente principale ──\r\nexport { UiFormBuilderEditorComponent } from './form-builder-editor.component';\r\n\r\n// ── Servizio apertura modale ──\r\nexport { UiFormBuilderEditorService } from './form-builder-editor.service';\r\n\r\n// ── Servizi interni (esposti per uso avanzato) ──\r\nexport { UiEditorStateService } from './services/editor-state.service';\r\nexport { UiEditorPersistenceService } from './services/editor-persistence.service';\r\nexport { UiEditorFieldFactoryService } from './services/field-factory.service';\r\n\r\n// ── Sotto-componenti (esposti per composizione custom) ──\r\nexport { UiEditorToolbarComponent } from './sub-components/editor-toolbar/editor-toolbar.component';\r\nexport { UiFieldPaletteComponent } from './sub-components/field-palette/field-palette.component';\r\nexport { UiSectionEditorComponent } from './sub-components/section-editor/section-editor.component';\r\nexport { UiEditorFieldConfigPanelComponent } from './sub-components/field-config-panel/field-config-panel.component';\r\nexport { UiEditorPreviewContainerComponent } from './sub-components/preview-container/preview-container.component';\r\nexport { UiValidationEditorComponent } from './sub-components/validation-editor/validation-editor.component';\r\nexport { UiConditionEditorComponent } from './sub-components/condition-editor/condition-editor.component';\r\nexport { UiOptionsEditorComponent } from './sub-components/options-editor/options-editor.component';\r\nexport { UiEditorFormValuesPanelComponent } from './sub-components/form-values-panel/form-values-panel.component';\r\n\r\n// ── Tipi ──\r\nexport * from './types/editor.types';\r\n\r\n// ── Preset ──\r\nexport { PRESET_ANAGRAFICA, PRESET_TICKET, PRESET_SURVEY, EDITOR_PRESETS } from './presets/editor-presets';\r\nexport type { EditorPresetInfo } from './presets/editor-presets';\r\n","/**\n * Bootstrap del secondary entry `@gnggln/ng-ui-system/form-builder-editor`. Form Builder Editor.\n */\nexport * from './lib/components/form-builder-editor/index';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './entry-form-builder-editor';\n"],"names":["i2","i1","i5","i3","i4","i6","i7","isDateValid","i1.UiFormConditionService","takeUntil","i2.UiLocationService","i1.UiLocationService","debounceTime","i8","distinctUntilChanged","rxFilter","i10","i11"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"gnggln-ng-ui-system-form-builder-editor.mjs","sources":["../../../packages/ng-ui-system/src/lib/components/form-builder-editor/services/field-factory.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/services/editor-state.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/services/editor-persistence.service.ts","../../../packages/ng-ui-system/src/lib/components/button/button.component.ts","../../../packages/ng-ui-system/src/lib/components/blackbox/blackbox.types.ts","../../../packages/ng-ui-system/src/lib/components/blackbox/blackbox-fingerprint.service.ts","../../../packages/ng-ui-system/src/lib/components/blackbox/blackbox-storage.service.ts","../../../packages/ng-ui-system/src/lib/components/blackbox/blackbox.service.ts","../../../packages/ng-ui-system/src/lib/components/button/button-area.component.ts","../../../packages/ng-ui-system/src/lib/components/button/index.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.ts","../../../packages/ng-ui-system/src/lib/components/accordion/accordion.component.ts","../../../packages/ng-ui-system/src/lib/core/logging/logger.config.ts","../../../packages/ng-ui-system/src/lib/core/logging/logger.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/types/validation.types.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/services/form-condition.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/services/form-validation.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/services/form-field-error.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/file-input/file-input.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/services/location.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/services/nominatim-geocoding.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/services/form-error-state.matcher.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-text-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-text-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/directives/currency-input.directive.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-number-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-number-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-select-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-select-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/adapters/it-date-adapter.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/form-builder.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/form-builder.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/form-builder-editor.component.ts","../../../packages/ng-ui-system/src/lib/components/modal/modal.component.ts","../../../packages/ng-ui-system/src/lib/components/modal/confirm-dialog.component.ts","../../../packages/ng-ui-system/src/lib/components/modal/modal.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/form-builder-editor.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/types/editor.types.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/presets/editor-presets.ts","../../../packages/ng-ui-system/src/lib/components/form-builder-editor/index.ts","../../../packages/ng-ui-system/src/entry-form-builder-editor.ts","../../../packages/ng-ui-system/src/gnggln-ng-ui-system-form-builder-editor.ts"],"sourcesContent":["/**\r\n * @module ng-ui-system/form-builder-editor\r\n * Factory per la creazione di field descriptor con valori di default.\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { UiFormFieldDescriptor, UiFieldType } from '../../form-builder/types/index';\r\n\r\n/**\r\n * Servizio factory per creare field descriptor con configurazioni\r\n * di default appropriate per ogni tipo di campo.\r\n */\r\n@Injectable()\r\nexport class UiEditorFieldFactoryService {\r\n /** @internal Contatore per generare chiavi univoche. */\r\n private fieldCounter = 0;\r\n\r\n /**\r\n * Crea un field descriptor di default per il tipo specificato.\r\n *\r\n * @param type - Tipo di campo da creare\r\n * @param key - Chiave opzionale (se omessa viene generata automaticamente)\r\n * @returns Field descriptor con valori di default\r\n */\r\n createDefaultField(type: UiFieldType, key?: string): UiFormFieldDescriptor {\r\n const generatedKey = key || this.generateUniqueKey(type);\r\n\r\n const baseField: UiFormFieldDescriptor = {\r\n key: generatedKey,\r\n type,\r\n label: this.getDefaultLabel(type),\r\n placeholder: this.getDefaultPlaceholder(type),\r\n required: false,\r\n disabled: false,\r\n readonly: false,\r\n };\r\n\r\n switch (type) {\r\n case 'select':\r\n case 'radio':\r\n return {\r\n ...baseField,\r\n options: [\r\n { value: 'option1', label: 'Opzione 1' },\r\n { value: 'option2', label: 'Opzione 2' },\r\n ],\r\n hideEmptyOption: false,\r\n };\r\n\r\n case 'multiselect':\r\n case 'freemultiselect':\r\n return {\r\n ...baseField,\r\n options: [\r\n { value: 'option1', label: 'Opzione 1' },\r\n { value: 'option2', label: 'Opzione 2' },\r\n { value: 'option3', label: 'Opzione 3' },\r\n ],\r\n };\r\n\r\n case 'checkbox':\r\n case 'switch':\r\n return {\r\n ...baseField,\r\n defaultValue: false,\r\n appearance: {\r\n style: type === 'switch' ? 'switch' : 'default',\r\n color: 'primary',\r\n },\r\n };\r\n\r\n case 'number':\r\n return {\r\n ...baseField,\r\n defaultValue: 0,\r\n validation: [{ type: 'min', value: 0, message: 'Il valore deve essere maggiore o uguale a 0' }],\r\n };\r\n\r\n case 'email':\r\n return {\r\n ...baseField,\r\n validation: [{ type: 'email', message: 'Inserire un indirizzo email valido' }],\r\n };\r\n\r\n case 'date':\r\n case 'datetime':\r\n return {\r\n ...baseField,\r\n placeholder: type === 'date' ? 'gg/mm/aaaa' : 'gg/mm/aaaa hh:mm',\r\n };\r\n\r\n case 'file':\r\n return {\r\n ...baseField,\r\n fileConfig: {\r\n maxFileSize: 5242880,\r\n multiple: false,\r\n showPreview: true,\r\n enableDragDrop: true,\r\n acceptedTypes: ['image/*', 'application/pdf'],\r\n },\r\n };\r\n\r\n case 'textarea':\r\n return {\r\n ...baseField,\r\n validation: [{ type: 'maxLength', value: 500, message: 'Massimo 500 caratteri' }],\r\n };\r\n\r\n case 'password':\r\n return {\r\n ...baseField,\r\n validation: [{ type: 'minLength', value: 8, message: 'La password deve contenere almeno 8 caratteri' }],\r\n };\r\n\r\n case 'text':\r\n return {\r\n ...baseField,\r\n validation: [{ type: 'maxLength', value: 255, message: 'Massimo 255 caratteri' }],\r\n };\r\n\r\n case 'custom':\r\n return {\r\n ...baseField,\r\n customConfig: {\r\n component: 'custom-component-selector',\r\n inputs: {},\r\n config: {},\r\n },\r\n };\r\n\r\n case 'divider':\r\n return { ...baseField, label: 'Separatore' };\r\n\r\n case 'flag':\r\n return { ...baseField, defaultValue: false };\r\n\r\n default:\r\n return baseField;\r\n }\r\n }\r\n\r\n /** Duplica un campo generando una nuova chiave univoca. */\r\n duplicateField(field: UiFormFieldDescriptor): UiFormFieldDescriptor {\r\n const newKey = this.generateUniqueKey(field.type);\r\n return {\r\n ...JSON.parse(JSON.stringify(field)),\r\n key: newKey,\r\n label: `${field.label} (Copia)`,\r\n };\r\n }\r\n\r\n // ─── Private ─────────────────────────────────────────────────\r\n\r\n /** @internal Genera una chiave univoca per un campo. */\r\n private generateUniqueKey(type: UiFieldType): string {\r\n this.fieldCounter++;\r\n return `${type}_${this.fieldCounter}_${Date.now()}`;\r\n }\r\n\r\n /** @internal Mappa tipo -> label di default. */\r\n private getDefaultLabel(type: UiFieldType): string {\r\n const labels: Record<string, string> = {\r\n text: 'Campo Testo',\r\n email: 'Email',\r\n password: 'Password', // NOSONAR - UI label for password field type, not a credential\r\n number: 'Numero',\r\n textarea: 'Area Testo',\r\n select: 'Selezione',\r\n multiselect: 'Selezione Multipla',\r\n freemultiselect: 'Selezione Multipla Libera',\r\n checkbox: 'Checkbox',\r\n switch: 'Switch',\r\n radio: 'Radio Button',\r\n date: 'Data',\r\n datetime: 'Data e Ora',\r\n file: 'File',\r\n custom: 'Campo Personalizzato',\r\n divider: 'Separatore',\r\n flag: 'Flag',\r\n location: 'Localita',\r\n 'location-table': 'Tabella Localita',\r\n };\r\n return labels[type] || 'Campo';\r\n }\r\n\r\n /** @internal Mappa tipo -> placeholder di default. */\r\n private getDefaultPlaceholder(type: UiFieldType): string {\r\n const placeholders: Record<string, string> = {\r\n text: 'Inserisci il testo',\r\n email: 'nome@esempio.it',\r\n password: 'Inserisci la password', // NOSONAR - UI placeholder text for password field, not a credential\r\n number: 'Inserisci un numero',\r\n textarea: 'Inserisci il testo...',\r\n select: \"Seleziona un'opzione\",\r\n multiselect: 'Seleziona una o piu opzioni',\r\n freemultiselect: 'Seleziona o inserisci valori',\r\n date: 'gg/mm/aaaa',\r\n datetime: 'gg/mm/aaaa hh:mm',\r\n file: 'Seleziona un file',\r\n };\r\n return placeholders[type] || '';\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder-editor\r\n * Servizio per la gestione centralizzata dello stato dell'editor.\r\n */\r\n\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { UiFormSchema, UiFormSection, UiFormFieldDescriptor } from '../../form-builder/types/index';\r\nimport {\r\n UiEditorState,\r\n UiEditorSchemaValidationResult,\r\n UiEditorSchemaValidationError,\r\n UiEditorSchemaValidationWarning,\r\n} from '../types/editor.types';\r\nimport { UiEditorFieldFactoryService } from './field-factory.service';\r\n\r\n/**\r\n * Servizio per la gestione reattiva dello stato dell'editor visuale.\r\n *\r\n * Espone lo stato come Observable e fornisce metodi immutabili\r\n * per tutte le operazioni CRUD su sezioni e campi.\r\n */\r\n@Injectable()\r\nexport class UiEditorStateService {\r\n /** @internal Factory per la creazione dei campi. */\r\n private readonly fieldFactory = inject(UiEditorFieldFactoryService);\r\n\r\n /** @internal Stato iniziale dell'editor. */\r\n private readonly initialState: UiEditorState = {\r\n schema: {\r\n id: `form_${Date.now()}`,\r\n title: 'Nuovo Form',\r\n description: '',\r\n sections: [],\r\n },\r\n selectedSectionId: null,\r\n selectedFieldKey: null,\r\n isDirty: false,\r\n lastSaved: null,\r\n };\r\n\r\n /** @internal Subject per lo stato dell'editor. */\r\n private readonly _state$ = new BehaviorSubject<UiEditorState>(this.initialState);\r\n\r\n /** Stream reattivo dello stato dell'editor. */\r\n readonly state$: Observable<UiEditorState> = this._state$.asObservable();\r\n\r\n // ─── Lettura stato ───────────────────────────────────────────\r\n\r\n /** Restituisce un snapshot dello stato corrente. */\r\n getCurrentState(): UiEditorState {\r\n return this._state$.value;\r\n }\r\n\r\n /** Restituisce lo schema corrente. */\r\n getSchema(): UiFormSchema {\r\n return this.getCurrentState().schema;\r\n }\r\n\r\n // ─── Aggiornamento stato ─────────────────────────────────────\r\n\r\n /** @internal Aggiorna lo stato e marca come dirty. */\r\n private updateState(updates: Partial<UiEditorState>): void {\r\n this._state$.next({\r\n ...this.getCurrentState(),\r\n ...updates,\r\n isDirty: true,\r\n });\r\n }\r\n\r\n /** Imposta uno schema completo (es. da import). */\r\n setSchema(schema: UiFormSchema): void {\r\n this.updateState({ schema });\r\n }\r\n\r\n /** Marca lo stato come salvato. */\r\n markAsSaved(): void {\r\n this._state$.next({\r\n ...this.getCurrentState(),\r\n isDirty: false,\r\n lastSaved: new Date(),\r\n });\r\n }\r\n\r\n /** Reset allo stato iniziale. */\r\n reset(): void {\r\n this._state$.next({\r\n ...this.initialState,\r\n schema: {\r\n id: `form_${Date.now()}`,\r\n title: 'Nuovo Form',\r\n description: '',\r\n sections: [],\r\n },\r\n });\r\n }\r\n\r\n /** Pulisce lo schema mantenendo l'ID. */\r\n clearSchema(): void {\r\n const currentId = this.getSchema().id;\r\n this.updateState({\r\n schema: { id: currentId, sections: [] },\r\n selectedSectionId: null,\r\n selectedFieldKey: null,\r\n });\r\n }\r\n\r\n // ─── Operazioni su sezioni ───────────────────────────────────\r\n\r\n /** Aggiunge una nuova sezione e la seleziona. */\r\n addSection(section?: Partial<UiFormSection>): string {\r\n const schema = { ...this.getSchema() };\r\n const sectionId = section?.id || `section_${Date.now()}`;\r\n\r\n const newSection: UiFormSection = {\r\n id: sectionId,\r\n title: section?.title || `Sezione ${schema.sections.length + 1}`,\r\n description: section?.description || '',\r\n fields: section?.fields || [],\r\n collapsible: false,\r\n collapsed: false,\r\n };\r\n\r\n schema.sections = [...schema.sections, newSection];\r\n this.updateState({ schema, selectedSectionId: sectionId });\r\n return sectionId;\r\n }\r\n\r\n /** Rimuove una sezione per ID. */\r\n removeSection(sectionId: string): void {\r\n const schema = { ...this.getSchema() };\r\n schema.sections = schema.sections.filter((s) => s.id !== sectionId);\r\n\r\n const current = this.getCurrentState();\r\n const updates: Partial<UiEditorState> = { schema };\r\n\r\n if (current.selectedSectionId === sectionId) {\r\n updates.selectedSectionId = null;\r\n updates.selectedFieldKey = null;\r\n }\r\n\r\n this.updateState(updates);\r\n }\r\n\r\n /** Aggiorna proprieta di una sezione. */\r\n updateSection(sectionId: string, updates: Partial<UiFormSection>): void {\r\n const schema = { ...this.getSchema() };\r\n schema.sections = schema.sections.map((s) => (s.id === sectionId ? { ...s, ...updates } : s));\r\n this.updateState({ schema });\r\n }\r\n\r\n /** Duplica una sezione con nuovi ID per sezione e campi. */\r\n duplicateSection(sectionId: string): string | null {\r\n const schema = { ...this.getSchema() };\r\n const section = schema.sections.find((s) => s.id === sectionId);\r\n if (!section) return null;\r\n\r\n const newSectionId = `section_${Date.now()}`;\r\n const duplicated: UiFormSection = {\r\n ...JSON.parse(JSON.stringify(section)),\r\n id: newSectionId,\r\n title: `${section.title} (Copia)`,\r\n fields: section.fields.map((f) => this.fieldFactory.duplicateField(f)),\r\n };\r\n\r\n const index = schema.sections.findIndex((s) => s.id === sectionId);\r\n schema.sections = [...schema.sections.slice(0, index + 1), duplicated, ...schema.sections.slice(index + 1)];\r\n\r\n this.updateState({ schema, selectedSectionId: newSectionId });\r\n return newSectionId;\r\n }\r\n\r\n // ─── Operazioni su campi ─────────────────────────────────────\r\n\r\n /** Aggiunge un campo a una sezione in una posizione specifica. */\r\n addFieldAtIndex(sectionId: string, field: UiFormFieldDescriptor, index: number): void {\r\n const schema = { ...this.getSchema() };\r\n schema.sections = schema.sections.map((s) => {\r\n if (s.id !== sectionId) return s;\r\n const fields = [...s.fields];\r\n fields.splice(index, 0, field);\r\n return { ...s, fields };\r\n });\r\n this.updateState({ schema, selectedFieldKey: field.key });\r\n }\r\n\r\n /** Rimuove un campo da una sezione. */\r\n removeField(sectionId: string, fieldKey: string): void {\r\n const schema = { ...this.getSchema() };\r\n schema.sections = schema.sections.map((s) => {\r\n if (s.id !== sectionId) return s;\r\n return { ...s, fields: s.fields.filter((f) => f.key !== fieldKey) };\r\n });\r\n\r\n const current = this.getCurrentState();\r\n const updates: Partial<UiEditorState> = { schema };\r\n if (current.selectedFieldKey === fieldKey) {\r\n updates.selectedFieldKey = null;\r\n }\r\n this.updateState(updates);\r\n }\r\n\r\n /** Aggiorna proprieta di un campo. */\r\n updateField(sectionId: string, fieldKey: string, fieldUpdates: Partial<UiFormFieldDescriptor>): void {\r\n const schema = { ...this.getSchema() };\r\n schema.sections = schema.sections.map((s) => {\r\n if (s.id !== sectionId) return s;\r\n return {\r\n ...s,\r\n fields: s.fields.map((f) => (f.key === fieldKey ? { ...f, ...fieldUpdates } : f)),\r\n };\r\n });\r\n this.updateState({ schema });\r\n }\r\n\r\n /** Duplica un campo nella stessa sezione. */\r\n duplicateField(sectionId: string, fieldKey: string): void {\r\n const schema = { ...this.getSchema() };\r\n schema.sections = schema.sections.map((s) => {\r\n if (s.id !== sectionId) return s;\r\n const field = s.fields.find((f) => f.key === fieldKey);\r\n if (!field) return s;\r\n\r\n const duplicated = this.fieldFactory.duplicateField(field);\r\n const index = s.fields.findIndex((f) => f.key === fieldKey);\r\n const fields = [...s.fields];\r\n fields.splice(index + 1, 0, duplicated);\r\n return { ...s, fields };\r\n });\r\n this.updateState({ schema });\r\n }\r\n\r\n /** Riordina un campo all'interno della stessa sezione. */\r\n moveFieldInSection(sectionId: string, fromIndex: number, toIndex: number): void {\r\n const schema = { ...this.getSchema() };\r\n schema.sections = schema.sections.map((s) => {\r\n if (s.id !== sectionId) return s;\r\n const fields = [...s.fields];\r\n const [moved] = fields.splice(fromIndex, 1);\r\n fields.splice(toIndex, 0, moved);\r\n return { ...s, fields };\r\n });\r\n this.updateState({ schema });\r\n }\r\n\r\n /** Sposta un campo tra due sezioni diverse. */\r\n moveFieldBetweenSections(fromSectionId: string, toSectionId: string, fieldKey: string, toIndex: number): void {\r\n const schema = { ...this.getSchema() };\r\n let movedField: UiFormFieldDescriptor | undefined;\r\n\r\n schema.sections = schema.sections.map((s) => {\r\n if (s.id === fromSectionId) {\r\n const idx = s.fields.findIndex((f) => f.key === fieldKey);\r\n if (idx !== -1) {\r\n const fields = [...s.fields];\r\n [movedField] = fields.splice(idx, 1);\r\n return { ...s, fields };\r\n }\r\n }\r\n return s;\r\n });\r\n\r\n if (movedField) {\r\n schema.sections = schema.sections.map((s) => {\r\n if (s.id === toSectionId) {\r\n const fields = [...s.fields];\r\n fields.splice(toIndex, 0, movedField!);\r\n return { ...s, fields };\r\n }\r\n return s;\r\n });\r\n }\r\n\r\n this.updateState({ schema });\r\n }\r\n\r\n // ─── Selezione ───────────────────────────────────────────────\r\n\r\n /** Seleziona una sezione (deseleziona il campo). */\r\n selectSection(sectionId: string | null): void {\r\n this._state$.next({\r\n ...this.getCurrentState(),\r\n selectedSectionId: sectionId,\r\n selectedFieldKey: null,\r\n });\r\n }\r\n\r\n /** Seleziona un campo (e la sua sezione). */\r\n selectField(sectionId: string, fieldKey: string | null): void {\r\n this._state$.next({\r\n ...this.getCurrentState(),\r\n selectedSectionId: sectionId,\r\n selectedFieldKey: fieldKey,\r\n });\r\n }\r\n\r\n // ─── Ricerca ─────────────────────────────────────────────────\r\n\r\n /** Trova la sezione che contiene un campo. */\r\n findSectionByFieldKey(fieldKey: string): UiFormSection | null {\r\n return this.getSchema().sections.find((s) => s.fields.some((f) => f.key === fieldKey)) || null;\r\n }\r\n\r\n /** Trova un campo per chiave attraverso tutte le sezioni. */\r\n findFieldByKey(fieldKey: string): UiFormFieldDescriptor | null {\r\n const section = this.findSectionByFieldKey(fieldKey);\r\n return section?.fields.find((f) => f.key === fieldKey) || null;\r\n }\r\n\r\n // ─── Validazione ─────────────────────────────────────────────\r\n\r\n /** Valida lo schema corrente cercando errori e warning strutturali. */\r\n validateSchema(): UiEditorSchemaValidationResult {\r\n const schema = this.getSchema();\r\n const errors: UiEditorSchemaValidationError[] = [];\r\n const warnings: UiEditorSchemaValidationWarning[] = [];\r\n const allKeys = new Set<string>();\r\n\r\n schema.sections.forEach((section, si) => {\r\n section.fields.forEach((field, fi) => {\r\n // Chiavi duplicate\r\n if (allKeys.has(field.key)) {\r\n errors.push({\r\n type: 'duplicate_key',\r\n message: `Chiave duplicata: ${field.key}`,\r\n path: `sections[${si}].fields[${fi}].key`,\r\n });\r\n }\r\n allKeys.add(field.key);\r\n\r\n // Label mancante\r\n if (!field.label?.trim()) {\r\n warnings.push({\r\n type: 'missing_label',\r\n message: `Campo senza label: ${field.key}`,\r\n path: `sections[${si}].fields[${fi}].label`,\r\n });\r\n }\r\n\r\n // Opzioni vuote per campi di scelta\r\n if (['select', 'radio', 'multiselect'].includes(field.type)) {\r\n if (!field.options || (Array.isArray(field.options) && field.options.length === 0)) {\r\n warnings.push({\r\n type: 'empty_options',\r\n message: `Campo ${field.key} di tipo ${field.type} senza opzioni`,\r\n path: `sections[${si}].fields[${fi}].options`,\r\n });\r\n }\r\n }\r\n\r\n // Riferimenti nelle condizioni\r\n if (field.conditions) {\r\n field.conditions.forEach((cond, ci) => {\r\n if (cond.field && !allKeys.has(cond.field)) {\r\n errors.push({\r\n type: 'invalid_reference',\r\n message: `Riferimento a campo inesistente: ${cond.field} in ${field.key}`,\r\n path: `sections[${si}].fields[${fi}].conditions[${ci}].field`,\r\n });\r\n }\r\n });\r\n }\r\n });\r\n });\r\n\r\n return { valid: errors.length === 0, errors, warnings };\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder-editor\r\n * Servizio per la persistenza dello schema (localStorage, import/export JSON).\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { UiFormSchema } from '../../form-builder/types/index';\r\nimport { UiEditorStorageData } from '../types/editor.types';\r\n\r\n/**\r\n * Gestisce il salvataggio e il recupero degli schemi dell'editor.\r\n *\r\n * Supporta:\r\n * - Auto-save e recupero da localStorage\r\n * - Import/export da/verso file JSON\r\n * - Backup automatici con rotazione (max 5)\r\n */\r\n@Injectable()\r\nexport class UiEditorPersistenceService {\r\n /** @internal Chiave localStorage per l'auto-save. */\r\n private readonly STORAGE_KEY = 'ui-form-editor-autosave';\r\n\r\n /** @internal Versione dello storage per migrazioni future. */\r\n private readonly STORAGE_VERSION = '1.0.0';\r\n\r\n /** @internal Durata massima di un salvataggio (24 ore). */\r\n private readonly MAX_AGE_MS = 24 * 60 * 60 * 1000;\r\n\r\n // ─── localStorage ────────────────────────────────────────────\r\n\r\n /** Salva lo schema nel localStorage. */\r\n saveToLocalStorage(schema: UiFormSchema): void {\r\n const data: UiEditorStorageData = {\r\n schema,\r\n timestamp: Date.now(),\r\n version: this.STORAGE_VERSION,\r\n };\r\n try {\r\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(data));\r\n } catch (error) {\r\n throw new Error('Impossibile salvare nel localStorage. Spazio disponibile esaurito.');\r\n }\r\n }\r\n\r\n /** Carica lo schema dal localStorage (null se scaduto o assente). */\r\n loadFromLocalStorage(): UiFormSchema | null {\r\n try {\r\n const raw = localStorage.getItem(this.STORAGE_KEY);\r\n if (!raw) return null;\r\n\r\n const data: UiEditorStorageData = JSON.parse(raw);\r\n if (Date.now() - data.timestamp > this.MAX_AGE_MS) {\r\n this.clearLocalStorage();\r\n return null;\r\n }\r\n return data.schema;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /** Verifica se esiste un salvataggio valido. */\r\n hasLocalStorageData(): boolean {\r\n try {\r\n const raw = localStorage.getItem(this.STORAGE_KEY);\r\n if (!raw) return false;\r\n const data: UiEditorStorageData = JSON.parse(raw);\r\n return Date.now() - data.timestamp <= this.MAX_AGE_MS;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /** Restituisce la data dell'ultimo salvataggio. */\r\n getLocalStorageAge(): Date | null {\r\n try {\r\n const raw = localStorage.getItem(this.STORAGE_KEY);\r\n if (!raw) return null;\r\n const data: UiEditorStorageData = JSON.parse(raw);\r\n return new Date(data.timestamp);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /** Rimuove il salvataggio dal localStorage. */\r\n clearLocalStorage(): void {\r\n localStorage.removeItem(this.STORAGE_KEY);\r\n }\r\n\r\n // ─── Export ──────────────────────────────────────────────────\r\n\r\n /** Esporta lo schema come file JSON scaricabile. */\r\n exportToJSON(schema: UiFormSchema, filename?: string): void {\r\n const json = JSON.stringify(schema, null, 2);\r\n const blob = new Blob([json], { type: 'application/json' });\r\n const defaultName = filename || `form-schema-${schema.id}-${Date.now()}.json`;\r\n this.downloadBlob(blob, defaultName);\r\n }\r\n\r\n // ─── Import ──────────────────────────────────────────────────\r\n\r\n /** Importa lo schema da un file JSON. */\r\n async importFromJSON(file: File): Promise<UiFormSchema> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n try {\r\n const content = e.target?.result as string;\r\n const schema: UiFormSchema = JSON.parse(content);\r\n if (!this.isValidSchema(schema)) {\r\n reject(new Error('Schema non valido: struttura non corretta'));\r\n return;\r\n }\r\n resolve(schema);\r\n } catch {\r\n reject(new Error('Errore durante la lettura del file JSON: formato non valido'));\r\n }\r\n };\r\n reader.onerror = () => reject(new Error('Errore durante la lettura del file'));\r\n reader.readAsText(file);\r\n });\r\n }\r\n\r\n // ─── Backup ──────────────────────────────────────────────────\r\n\r\n /** Crea un backup dello schema prima di operazioni distruttive. */\r\n createBackup(schema: UiFormSchema): void {\r\n const backupKey = `${this.STORAGE_KEY}_backup_${Date.now()}`;\r\n const data: UiEditorStorageData = {\r\n schema,\r\n timestamp: Date.now(),\r\n version: this.STORAGE_VERSION,\r\n };\r\n try {\r\n localStorage.setItem(backupKey, JSON.stringify(data));\r\n this.cleanOldBackups();\r\n } catch {\r\n // Silenzioso: il backup non e critico\r\n }\r\n }\r\n\r\n // ─── Private ─────────────────────────────────────────────────\r\n\r\n /** @internal Validazione strutturale minima dello schema. */\r\n private isValidSchema(schema: unknown): schema is UiFormSchema {\r\n const s = schema as any;\r\n return (\r\n s &&\r\n typeof s === 'object' &&\r\n typeof s.id === 'string' &&\r\n Array.isArray(s.sections) &&\r\n s.sections.every(\r\n (sec: any) =>\r\n sec &&\r\n typeof sec.id === 'string' &&\r\n Array.isArray(sec.fields) &&\r\n sec.fields.every(\r\n (f: any) => f && typeof f.key === 'string' && typeof f.type === 'string' && typeof f.label === 'string',\r\n ),\r\n )\r\n );\r\n }\r\n\r\n /** @internal Scarica un blob come file. */\r\n private downloadBlob(blob: Blob, filename: string): void {\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = filename;\r\n link.style.display = 'none';\r\n document.body.appendChild(link);\r\n link.click();\r\n setTimeout(() => {\r\n document.body.removeChild(link);\r\n URL.revokeObjectURL(url);\r\n }, 100);\r\n }\r\n\r\n /** @internal Mantiene solo gli ultimi 5 backup. */\r\n private cleanOldBackups(): void {\r\n try {\r\n const keys: string[] = [];\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key?.startsWith(`${this.STORAGE_KEY}_backup_`)) {\r\n keys.push(key);\r\n }\r\n }\r\n keys\r\n .sort((a, b) => {\r\n const tsA = parseInt(a.split('_').pop() || '0', 10);\r\n const tsB = parseInt(b.split('_').pop() || '0', 10);\r\n return tsB - tsA;\r\n })\r\n .slice(5)\r\n .forEach((key) => localStorage.removeItem(key));\r\n } catch {\r\n // Silenzioso\r\n }\r\n }\r\n}\r\n","import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiVariant, UiSize, UiIconName } from '../../core/types';\r\nimport { UiIconPosition } from './button.types';\r\n\r\n/** @internal Size-to-icon-pixel mapping for consistent icon sizing. */\r\nconst ICON_SIZE_MAP: Record<UiSize, number> = {\r\n xs: 14,\r\n sm: 16,\r\n md: 18,\r\n lg: 20,\r\n xl: 22,\r\n};\r\n\r\n/**\r\n * Standalone button component with design-token-driven theming,\r\n * variant/size system, Lucide icon support, loading states, and WCAG 2.1 AA accessibility.\r\n *\r\n * Uses native `<button>` click events — listen with `(click)` on the host element.\r\n *\r\n * @selector ui-button\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Basic -->\r\n * <ui-button label=\"Save\" variant=\"primary\" icon=\"save\" (click)=\"save()\" />\r\n *\r\n * <!-- Loading -->\r\n * <ui-button label=\"Submitting...\" variant=\"primary\" [loading]=\"true\" />\r\n *\r\n * <!-- Icon-only: tooltip o ariaLabel forniscono il nome accessibile -->\r\n * <ui-button icon=\"trash-2\" variant=\"warn\" tooltip=\"Elimina\" (click)=\"delete()\" />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-button',\r\n standalone: true,\r\n imports: [MatTooltipModule, LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'ui-button-host',\r\n '[class.ui-button-host--full-width]': 'fullWidth',\r\n },\r\n template: `\r\n <button\r\n [type]=\"type\"\r\n [class]=\"buttonClasses\"\r\n [disabled]=\"disabled || loading\"\r\n [attr.aria-label]=\"effectiveAriaLabel || null\"\r\n [attr.aria-busy]=\"loading || null\"\r\n [matTooltip]=\"tooltip\"\r\n >\r\n <span class=\"ui-button__content\" [class.ui-button__content--hidden]=\"loading\">\r\n @if (icon && iconPosition === 'leading') {\r\n <lucide-icon [name]=\"icon!\" [size]=\"iconSize\" aria-hidden=\"true\" />\r\n }\r\n @if (label) {\r\n <span class=\"ui-button__label\">{{ label }}</span>\r\n }\r\n <ng-content />\r\n @if (icon && iconPosition === 'trailing') {\r\n <lucide-icon [name]=\"icon!\" [size]=\"iconSize\" aria-hidden=\"true\" />\r\n }\r\n </span>\r\n @if (loading) {\r\n <span class=\"ui-button__spinner-overlay\">\r\n <span class=\"ui-button__spinner\" aria-hidden=\"true\"></span>\r\n <span class=\"ui-button__sr-only\">Loading</span>\r\n </span>\r\n }\r\n </button>\r\n `,\r\n styleUrl: './button.component.scss',\r\n})\r\nexport class UiButtonComponent {\r\n /** Button label text. */\r\n @Input() label = '';\r\n\r\n /** Tooltip text shown on hover (uses Angular Material tooltip). */\r\n @Input() tooltip = '';\r\n\r\n /** Visual style variant. */\r\n @Input() variant: UiVariant = 'primary';\r\n\r\n /** Size variant. */\r\n @Input() size: UiSize = 'md';\r\n\r\n /** Lucide icon name. @see https://lucide.dev/icons */\r\n @Input() icon?: UiIconName;\r\n\r\n /** Icon position relative to the label. */\r\n @Input() iconPosition: UiIconPosition = 'trailing';\r\n\r\n /** Whether the button is in a loading state. Disables interaction and shows spinner. */\r\n @Input() loading = false;\r\n\r\n /** Whether the button is disabled. */\r\n @Input() disabled = false;\r\n\r\n /** Expand button to full container width. */\r\n @Input() fullWidth = false;\r\n\r\n /** HTML button type attribute. */\r\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\r\n\r\n /** Accessible label override (required for icon-only buttons). */\r\n @Input() ariaLabel?: string;\r\n\r\n /** Additional CSS class for edge cases. */\r\n @Input() customClass?: string;\r\n\r\n /**\r\n * Nome accessibile risolto per il pulsante nativo.\r\n * Usa `ariaLabel` se impostato; per pulsanti solo icona senza testo visibile\r\n * ricade sul `tooltip` (il tooltip Material non sostituisce il nome accessibile).\r\n */\r\n get effectiveAriaLabel(): string | undefined {\r\n const explicit = this.ariaLabel?.trim();\r\n if (explicit) return explicit;\r\n\r\n if (this.label?.trim()) return undefined;\r\n\r\n const tip = this.tooltip?.trim();\r\n if (this.icon && tip) return tip;\r\n\r\n return undefined;\r\n }\r\n\r\n /** Computed icon pixel size based on button size. */\r\n get iconSize(): number {\r\n return ICON_SIZE_MAP[this.size] ?? 18;\r\n }\r\n\r\n /** Assembled CSS class string for the native button element. */\r\n get buttonClasses(): string {\r\n return [\r\n 'ui-button',\r\n `ui-button--${this.variant}`,\r\n `ui-button--${this.size}`,\r\n this.loading ? 'ui-button--loading' : '',\r\n this.fullWidth ? 'ui-button--full-width' : '',\r\n !this.label && this.icon ? 'ui-button--icon-only' : '',\r\n this.customClass ?? '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/blackbox\r\n * Types and interfaces for the BlackBox observability service.\r\n *\r\n * The BlackBox service acts as a \"black box recorder\" for user sessions,\r\n * capturing navigation, UI interactions, form events and HTTP calls\r\n * in a compressed, opaque format stored in IndexedDB.\r\n */\r\n\r\n// ─── Configuration ───────────────────────────────────────────────────\r\n\r\n/**\r\n * Form tracking granularity flags.\r\n *\r\n * Controls which form events are captured by the BlackBox service.\r\n * All flags default to `true` except `trackValues` which defaults to `false`\r\n * for privacy reasons.\r\n */\r\nexport interface UiBlackboxFormTrackingConfig {\r\n /**\r\n * When `true`, the actual field values are stored in form events.\r\n * When `false`, only the fact that a change occurred is recorded.\r\n * @default false\r\n */\r\n trackValues: boolean;\r\n\r\n /** Track focus events on form fields. @default true */\r\n trackFocus: boolean;\r\n\r\n /** Track blur events on form fields. @default true */\r\n trackBlur: boolean;\r\n\r\n /** Track value change events on form fields. @default true */\r\n trackValueChanges: boolean;\r\n\r\n /** Track validation error events on form fields. @default true */\r\n trackValidation: boolean;\r\n\r\n /**\r\n * Debounce interval (ms) for `valueChanges` subscriptions.\r\n * Higher values reduce noise but increase latency.\r\n * @default 500\r\n */\r\n debounceMs: number;\r\n}\r\n\r\n/**\r\n * Root configuration for the BlackBox service.\r\n *\r\n * All properties are optional — sensible defaults are applied when omitted.\r\n *\r\n * @example\r\n * ```typescript\r\n * blackboxService.configure({\r\n * maxStorageMb: 30,\r\n * formTracking: { trackValues: true, debounceMs: 1000 },\r\n * });\r\n * ```\r\n */\r\nexport interface UiBlackboxConfig {\r\n /**\r\n * Maximum IndexedDB storage quota in megabytes.\r\n * Oldest sessions are pruned when the quota is exceeded.\r\n * @default 50\r\n */\r\n maxStorageMb: number;\r\n\r\n /**\r\n * Interval (ms) at which the in-memory buffer is flushed to IndexedDB.\r\n * @default 5000\r\n */\r\n flushIntervalMs: number;\r\n\r\n /**\r\n * Number of buffered events that trigger an immediate flush.\r\n * @default 20\r\n */\r\n flushThreshold: number;\r\n\r\n /**\r\n * Centralised debounce (ms) applied to the event buffer.\r\n * @default 500\r\n */\r\n bufferDebounceMs: number;\r\n\r\n /** Per-field form tracking configuration. */\r\n formTracking: UiBlackboxFormTrackingConfig;\r\n}\r\n\r\n// ─── Fingerprint ─────────────────────────────────────────────────────\r\n\r\n/**\r\n * Stable device/browser fingerprint generated by FingerprintJS (open-source).\r\n * Persists across sessions and incognito mode.\r\n */\r\nexport type UiBlackboxFingerprint = string;\r\n\r\n// ─── Session ─────────────────────────────────────────────────────────\r\n\r\n/**\r\n * A single recording session, corresponding to one browser tab lifecycle.\r\n *\r\n * Sessions are associated to a stable `fingerprint` so that multiple\r\n * sessions from the same device can be grouped together.\r\n */\r\nexport interface UiBlackboxSession {\r\n /** Unique session identifier (UUID v4). */\r\n sessionId: string;\r\n\r\n /** Stable device/browser fingerprint. */\r\n fingerprint: UiBlackboxFingerprint;\r\n\r\n /** Timestamp (ms since epoch) when the session started. */\r\n startedAt: number;\r\n\r\n /** Timestamp (ms since epoch) when the session ended (tab closed). */\r\n endedAt?: number;\r\n\r\n /** Raw `navigator.userAgent` string captured at session start. */\r\n userAgent: string;\r\n\r\n /**\r\n * Ordered list of navigation steps (route changes).\r\n * Each step contains the actions performed on that page.\r\n */\r\n steps: UiBlackboxStep[];\r\n\r\n /**\r\n * Parallel stream of form interaction events.\r\n * Ordered by timestamp, correlated to routes via `route` field.\r\n */\r\n formEvents: UiBlackboxFormEvent[];\r\n\r\n /**\r\n * Intercepted HTTP calls, ordered by timestamp.\r\n * Only requests explicitly marked with the `X-Ui-Blackbox` header.\r\n */\r\n calls: UiBlackboxHttpCall[];\r\n}\r\n\r\n// ─── Step (Route Change) ─────────────────────────────────────────────\r\n\r\n/**\r\n * A single navigation step created on every `NavigationEnd` event.\r\n * Contains all UI actions performed during this route.\r\n */\r\nexport interface UiBlackboxStep {\r\n /** Timestamp (ms) of the navigation event. */\r\n timestamp: number;\r\n\r\n /** The route URL navigated to. */\r\n route: string;\r\n\r\n /** The previous route URL (undefined for the first step). */\r\n previousRoute?: string;\r\n\r\n /**\r\n * Ordered list of UI actions (clicks) performed on this page.\r\n */\r\n actions: UiBlackboxAction[];\r\n}\r\n\r\n// ─── Action (UI Click) ──────────────────────────────────────────────\r\n\r\n/**\r\n * A single tracked UI action, typically a click.\r\n */\r\nexport interface UiBlackboxAction {\r\n /** Timestamp (ms) of the action. */\r\n timestamp: number;\r\n\r\n /** Type discriminator. Currently only `click` is supported. */\r\n type: 'click';\r\n\r\n /** Information about the clicked element. */\r\n target: UiBlackboxActionTarget;\r\n}\r\n\r\n/**\r\n * Minimal information about the element that was interacted with.\r\n */\r\nexport interface UiBlackboxActionTarget {\r\n /** HTML tag name (lowercase). */\r\n tag: string;\r\n\r\n /** Element `id` attribute, if present. */\r\n id?: string;\r\n\r\n /**\r\n * Custom tracking identifier, set via `data-track-id` attribute\r\n * or the `[uiTrack]` directive value.\r\n */\r\n trackId?: string;\r\n\r\n /** First 50 characters of `innerText` (trimmed). */\r\n text?: string;\r\n}\r\n\r\n// ─── Form Event ──────────────────────────────────────────────────────\r\n\r\n/** Discriminator for form event types. */\r\nexport type UiBlackboxFormEventType =\r\n | 'focus'\r\n | 'blur'\r\n | 'valueChange'\r\n | 'validationError';\r\n\r\n/**\r\n * A single form interaction event from the parallel form stream.\r\n *\r\n * Each event is timestamped and tagged with the current route, allowing\r\n * correlation with navigation steps on a shared timeline.\r\n */\r\nexport interface UiBlackboxFormEvent {\r\n /** Timestamp (ms) of the event. */\r\n timestamp: number;\r\n\r\n /** Route URL where the event occurred. */\r\n route: string;\r\n\r\n /** Schema `id` of the `UiFormBuilderComponent` that owns the field. */\r\n formId: string;\r\n\r\n /** `key` of the field descriptor from the form schema. */\r\n fieldKey: string;\r\n\r\n /** Type of form interaction. */\r\n eventType: UiBlackboxFormEventType;\r\n\r\n /** Optional metadata depending on event type and config. */\r\n metadata?: UiBlackboxFormEventMetadata;\r\n}\r\n\r\n/**\r\n * Optional metadata attached to a `UiBlackboxFormEvent`.\r\n */\r\nexport interface UiBlackboxFormEventMetadata {\r\n /** Field value (only captured when `config.formTracking.trackValues` is `true`). */\r\n value?: any;\r\n\r\n /** Whether the field is currently valid. */\r\n valid?: boolean;\r\n\r\n /** List of active validation error keys. */\r\n errors?: string[];\r\n\r\n /**\r\n * Full form values snapshot at the moment of the event.\r\n * Only captured when `config.formTracking.trackValues` is `true`.\r\n */\r\n formValues?: Record<string, any>;\r\n}\r\n\r\n// ─── HTTP Call ────────────────────────────────────────────────────────\r\n\r\n/**\r\n * A single intercepted HTTP call.\r\n *\r\n * Only requests bearing the `X-Ui-Blackbox` header are captured.\r\n */\r\nexport interface UiBlackboxHttpCall {\r\n /** Timestamp (ms) when the request was initiated. */\r\n timestamp: number;\r\n\r\n /** HTTP method (GET, POST, PUT, DELETE, …). */\r\n method: string;\r\n\r\n /** Request URL. */\r\n url: string;\r\n\r\n /** HTTP status code of the response (undefined if the request failed). */\r\n status?: number;\r\n\r\n /** Round-trip duration in milliseconds. */\r\n durationMs?: number;\r\n\r\n /** Request body payload (serialisable). */\r\n requestPayload?: any;\r\n\r\n /** Response headers filtered by the `X-Ui-Blackbox-Headers` regex. */\r\n responseHeaders?: Record<string, string>;\r\n\r\n /** The regex pattern used to filter response headers. */\r\n headerFilter?: string;\r\n}\r\n\r\n// ─── Internal Buffer Event ───────────────────────────────────────────\r\n\r\n/**\r\n * Union type for all events flowing through the centralised buffer.\r\n * @internal\r\n */\r\nexport type UiBlackboxBufferEvent =\r\n | { kind: 'action'; payload: UiBlackboxAction & { route: string } }\r\n | { kind: 'formEvent'; payload: UiBlackboxFormEvent }\r\n | { kind: 'httpCall'; payload: UiBlackboxHttpCall }\r\n | { kind: 'step'; payload: UiBlackboxStep };\r\n\r\n// ─── Defaults ────────────────────────────────────────────────────────\r\n\r\n/** Default configuration values. */\r\nexport const UI_BLACKBOX_DEFAULTS: UiBlackboxConfig = {\r\n maxStorageMb: 50,\r\n flushIntervalMs: 5000,\r\n flushThreshold: 20,\r\n bufferDebounceMs: 500,\r\n formTracking: {\r\n trackValues: false,\r\n trackFocus: true,\r\n trackBlur: true,\r\n trackValueChanges: true,\r\n trackValidation: true,\r\n debounceMs: 500,\r\n },\r\n};\r\n","/**\r\n * @module ng-ui-system/blackbox\r\n * Fingerprint service — generates a stable device/browser hash\r\n * using the open-source FingerprintJS library (MIT, no API key required).\r\n *\r\n * The fingerprint is computed once and cached in `localStorage` under\r\n * the key `__ui_bb_fp` to avoid redundant recalculations.\r\n */\r\n\r\nimport { Injectable, inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport type { UiBlackboxFingerprint } from './blackbox.types';\r\n\r\n/** localStorage key for the cached fingerprint. */\r\nconst FP_CACHE_KEY = '__ui_bb_fp';\r\n\r\n/**\r\n * Generates and caches a stable browser/device fingerprint.\r\n *\r\n * Uses `@fingerprintjs/fingerprintjs` (open-source, MIT) which analyses\r\n * canvas rendering, WebGL, audio context, screen properties, timezone,\r\n * user-agent, and other browser signals to produce a stable hash.\r\n *\r\n * @usageNotes\r\n * ```typescript\r\n * const fp = inject(UiBlackboxFingerprintService);\r\n * const hash = await fp.getFingerprint();\r\n * // => \"a1b2c3d4e5f6...\" (stable across sessions)\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiBlackboxFingerprintService {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private cached: UiBlackboxFingerprint | null = null;\r\n\r\n /**\r\n * Returns the stable fingerprint for this device/browser.\r\n *\r\n * On first call, loads FingerprintJS dynamically, computes the hash,\r\n * and caches it in both memory and `localStorage`.\r\n * Subsequent calls return the cached value immediately.\r\n */\r\n async getFingerprint(): Promise<UiBlackboxFingerprint> {\r\n // Return cached value if available\r\n if (this.cached) {\r\n return this.cached;\r\n }\r\n\r\n // SSR guard\r\n if (!isPlatformBrowser(this.platformId)) {\r\n return 'ssr-placeholder';\r\n }\r\n\r\n // Try localStorage cache first\r\n try {\r\n const stored = localStorage.getItem(FP_CACHE_KEY);\r\n if (stored) {\r\n this.cached = stored;\r\n return stored;\r\n }\r\n } catch {\r\n // localStorage may be unavailable (privacy mode, quota exceeded)\r\n }\r\n\r\n // Compute fingerprint via FingerprintJS\r\n try {\r\n const FingerprintJS = await import('@fingerprintjs/fingerprintjs');\r\n const agent = await FingerprintJS.load();\r\n const result = await agent.get();\r\n this.cached = result.visitorId;\r\n\r\n // Persist to localStorage\r\n try {\r\n localStorage.setItem(FP_CACHE_KEY, this.cached);\r\n } catch {\r\n // Silently ignore storage errors\r\n }\r\n\r\n return this.cached;\r\n } catch {\r\n // Fallback: generate a pseudo-fingerprint from available signals\r\n const fallback = this.generateFallbackFingerprint();\r\n this.cached = fallback;\r\n\r\n try {\r\n localStorage.setItem(FP_CACHE_KEY, fallback);\r\n } catch {\r\n // Silently ignore\r\n }\r\n\r\n return fallback;\r\n }\r\n }\r\n\r\n /**\r\n * Fallback fingerprint when FingerprintJS is unavailable.\r\n * Combines basic browser signals into a hash.\r\n * @internal\r\n */\r\n private generateFallbackFingerprint(): string {\r\n const signals = [\r\n navigator.userAgent,\r\n navigator.language,\r\n screen.width + 'x' + screen.height,\r\n screen.colorDepth?.toString() ?? '',\r\n Intl.DateTimeFormat().resolvedOptions().timeZone,\r\n navigator.hardwareConcurrency?.toString() ?? '',\r\n ].join('|');\r\n\r\n // Simple string hash (djb2)\r\n let hash = 5381;\r\n for (let i = 0; i < signals.length; i++) {\r\n hash = ((hash << 5) + hash + signals.charCodeAt(i)) >>> 0;\r\n }\r\n return hash.toString(36).padStart(12, '0');\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/blackbox\r\n * IndexedDB storage adapter for BlackBox sessions.\r\n *\r\n * Handles persistence, compression (via native CompressionStream gzip),\r\n * quota enforcement, and JSONL export.\r\n *\r\n * Design notes:\r\n * - DB name: `ui-blackbox`, object store: `sessions`\r\n * - Each session is gzip-compressed before storage for both size\r\n * reduction and inherent obfuscation\r\n * - Quota enforced by total stored size; oldest sessions are pruned first\r\n */\r\n\r\nimport { Injectable, inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport type { UiBlackboxSession, UiBlackboxConfig } from './blackbox.types';\r\nimport { UI_BLACKBOX_DEFAULTS } from './blackbox.types';\r\n\r\nconst DB_NAME = 'ui-blackbox';\r\nconst DB_VERSION = 1;\r\nconst STORE_NAME = 'sessions';\r\n\r\n/**\r\n * Low-level IndexedDB adapter for reading/writing compressed BlackBox sessions.\r\n *\r\n * @usageNotes\r\n * This service is used internally by `UiBlackboxService`.\r\n * Consumers should interact with the higher-level `UiBlackboxService` API.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiBlackboxStorageService {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private db: IDBDatabase | null = null;\r\n private maxStorageMb = UI_BLACKBOX_DEFAULTS.maxStorageMb;\r\n\r\n // ─── Configuration ─────────────────────────────────────────────────\r\n\r\n /** Update the storage quota from the parent service config. */\r\n setMaxStorageMb(mb: number): void {\r\n this.maxStorageMb = mb;\r\n }\r\n\r\n // ─── Database lifecycle ────────────────────────────────────────────\r\n\r\n /** Open (or create) the IndexedDB database. */\r\n private async openDb(): Promise<IDBDatabase> {\r\n if (this.db) return this.db;\r\n if (!isPlatformBrowser(this.platformId)) {\r\n throw new Error('IndexedDB is not available in SSR');\r\n }\r\n\r\n return new Promise<IDBDatabase>((resolve, reject) => {\r\n const request = indexedDB.open(DB_NAME, DB_VERSION);\r\n\r\n request.onupgradeneeded = () => {\r\n const db = request.result;\r\n if (!db.objectStoreNames.contains(STORE_NAME)) {\r\n const store = db.createObjectStore(STORE_NAME, { keyPath: 'sessionId' });\r\n store.createIndex('fingerprint', 'fingerprint', { unique: false });\r\n store.createIndex('startedAt', 'startedAt', { unique: false });\r\n }\r\n };\r\n\r\n request.onsuccess = () => {\r\n this.db = request.result;\r\n resolve(this.db);\r\n };\r\n\r\n request.onerror = () => reject(request.error);\r\n });\r\n }\r\n\r\n // ─── Compression helpers ───────────────────────────────────────────\r\n\r\n /** Compress a string to a gzip Uint8Array using native CompressionStream. */\r\n private async compress(data: string): Promise<Uint8Array> {\r\n const encoder = new TextEncoder();\r\n const stream = new Blob([encoder.encode(data) as BlobPart])\r\n .stream()\r\n .pipeThrough(new CompressionStream('gzip'));\r\n\r\n const reader = stream.getReader();\r\n const chunks: Uint8Array[] = [];\r\n let done = false;\r\n\r\n while (!done) {\r\n const result = await reader.read();\r\n done = result.done;\r\n if (result.value) {\r\n chunks.push(result.value);\r\n }\r\n }\r\n\r\n // Merge chunks into a single ArrayBuffer-backed Uint8Array\r\n const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);\r\n const buffer = new ArrayBuffer(totalLength);\r\n const merged = new Uint8Array(buffer);\r\n let offset = 0;\r\n for (const chunk of chunks) {\r\n merged.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n return merged;\r\n }\r\n\r\n /** Decompress a gzip Uint8Array back to a string. */\r\n private async decompress(data: Uint8Array): Promise<string> {\r\n const stream = new Blob([data as BlobPart])\r\n .stream()\r\n .pipeThrough(new DecompressionStream('gzip'));\r\n\r\n const reader = stream.getReader();\r\n const decoder = new TextDecoder();\r\n let result = '';\r\n let done = false;\r\n\r\n while (!done) {\r\n const chunk = await reader.read();\r\n done = chunk.done;\r\n if (chunk.value) {\r\n result += decoder.decode(chunk.value, { stream: !done });\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n // ─── CRUD ──────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Persist a session to IndexedDB (gzip-compressed).\r\n * Enforces quota after saving.\r\n */\r\n async saveSession(session: UiBlackboxSession): Promise<void> {\r\n const db = await this.openDb();\r\n const json = JSON.stringify(session);\r\n const compressed = await this.compress(json);\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const store = tx.objectStore(STORE_NAME);\r\n\r\n // Store as { sessionId, fingerprint, startedAt, data: Uint8Array }\r\n store.put({\r\n sessionId: session.sessionId,\r\n fingerprint: session.fingerprint,\r\n startedAt: session.startedAt,\r\n sizeBytes: compressed.byteLength,\r\n data: compressed,\r\n });\r\n\r\n tx.oncomplete = () => {\r\n this.enforceQuota().then(resolve).catch(resolve);\r\n };\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n\r\n /**\r\n * Read and decompress a single session by ID.\r\n */\r\n async getSession(sessionId: string): Promise<UiBlackboxSession | null> {\r\n const db = await this.openDb();\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readonly');\r\n const store = tx.objectStore(STORE_NAME);\r\n const req = store.get(sessionId);\r\n\r\n req.onsuccess = async () => {\r\n if (!req.result) {\r\n resolve(null);\r\n return;\r\n }\r\n try {\r\n const json = await this.decompress(req.result.data);\r\n resolve(JSON.parse(json));\r\n } catch (e) {\r\n reject(e);\r\n }\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n /**\r\n * Get all stored sessions (decompressed).\r\n */\r\n async getAllSessions(): Promise<UiBlackboxSession[]> {\r\n const db = await this.openDb();\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readonly');\r\n const store = tx.objectStore(STORE_NAME);\r\n const req = store.getAll();\r\n\r\n req.onsuccess = async () => {\r\n try {\r\n const sessions: UiBlackboxSession[] = [];\r\n for (const record of req.result) {\r\n const json = await this.decompress(record.data);\r\n sessions.push(JSON.parse(json));\r\n }\r\n resolve(sessions);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n /**\r\n * Get all sessions for a given fingerprint.\r\n */\r\n async getSessionsByFingerprint(fingerprint: string): Promise<UiBlackboxSession[]> {\r\n const db = await this.openDb();\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readonly');\r\n const store = tx.objectStore(STORE_NAME);\r\n const index = store.index('fingerprint');\r\n const req = index.getAll(fingerprint);\r\n\r\n req.onsuccess = async () => {\r\n try {\r\n const sessions: UiBlackboxSession[] = [];\r\n for (const record of req.result) {\r\n const json = await this.decompress(record.data);\r\n sessions.push(JSON.parse(json));\r\n }\r\n resolve(sessions);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n /**\r\n * Generate a downloadable JSONL Blob of all sessions.\r\n * Each line is one JSON-serialised session (decompressed).\r\n */\r\n async exportDump(): Promise<Blob> {\r\n const sessions = await this.getAllSessions();\r\n const lines = sessions.map((s) => JSON.stringify(s)).join('\\n');\r\n return new Blob([lines], { type: 'application/x-ndjson' });\r\n }\r\n\r\n /**\r\n * Delete all stored sessions.\r\n */\r\n async clearAll(): Promise<void> {\r\n const db = await this.openDb();\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const store = tx.objectStore(STORE_NAME);\r\n store.clear();\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n\r\n // ─── Quota enforcement ─────────────────────────────────────────────\r\n\r\n /**\r\n * Prune oldest sessions until total stored size is under `maxStorageMb`.\r\n * @internal\r\n */\r\n async enforceQuota(): Promise<void> {\r\n const db = await this.openDb();\r\n const maxBytes = this.maxStorageMb * 1024 * 1024;\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const store = tx.objectStore(STORE_NAME);\r\n const index = store.index('startedAt');\r\n\r\n // Collect all records sorted by startedAt (ascending = oldest first)\r\n const cursorReq = index.openCursor();\r\n const records: { key: IDBValidKey; size: number }[] = [];\r\n let totalSize = 0;\r\n\r\n cursorReq.onsuccess = () => {\r\n const cursor = cursorReq.result;\r\n if (cursor) {\r\n const size: number = cursor.value.sizeBytes || 0;\r\n totalSize += size;\r\n records.push({ key: cursor.primaryKey, size });\r\n cursor.continue();\r\n } else {\r\n // Cursor exhausted — prune if over quota\r\n if (totalSize <= maxBytes) {\r\n resolve();\r\n return;\r\n }\r\n\r\n let freed = 0;\r\n const target = totalSize - maxBytes;\r\n for (const record of records) {\r\n if (freed >= target) break;\r\n store.delete(record.key);\r\n freed += record.size;\r\n }\r\n resolve();\r\n }\r\n };\r\n\r\n cursorReq.onerror = () => reject(cursorReq.error);\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/blackbox\r\n * Core BlackBox observability service — the main entry point for session\r\n * recording, event buffering, and export.\r\n *\r\n * Architecture:\r\n * - Root singleton (`providedIn: 'root'`)\r\n * - On first inject: generates fingerprint, creates session, subscribes to Router events\r\n * - Centralised in-memory buffer with periodic/threshold-based flush to IndexedDB\r\n * - `window:beforeunload` triggers a final best-effort async flush\r\n */\r\n\r\nimport {\r\n Injectable,\r\n inject,\r\n PLATFORM_ID,\r\n OnDestroy,\r\n NgZone,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Router, NavigationEnd } from '@angular/router';\r\nimport { Subject } from 'rxjs';\r\nimport { filter, takeUntil } from 'rxjs/operators';\r\n\r\nimport {\r\n UiBlackboxConfig,\r\n UiBlackboxFormTrackingConfig,\r\n UiBlackboxSession,\r\n UiBlackboxStep,\r\n UiBlackboxAction,\r\n UiBlackboxFormEvent,\r\n UiBlackboxHttpCall,\r\n UiBlackboxBufferEvent,\r\n UI_BLACKBOX_DEFAULTS,\r\n} from './blackbox.types';\r\nimport { UiBlackboxFingerprintService } from './blackbox-fingerprint.service';\r\nimport { UiBlackboxStorageService } from './blackbox-storage.service';\r\n\r\n/**\r\n * Central BlackBox observability service.\r\n *\r\n * Records navigation, UI interactions, form events, and HTTP calls\r\n * into compressed sessions stored in IndexedDB.\r\n *\r\n * @usageNotes\r\n * The service activates automatically when injected. Provide it at root level\r\n * and it will start recording immediately.\r\n *\r\n * ```typescript\r\n * // app.config.ts — just importing the service is enough\r\n * import { UiBlackboxService } from '@gnggln/ng-ui-system';\r\n *\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * // The service is providedIn: 'root', so it's auto-provided.\r\n * // To force eager initialisation:\r\n * { provide: APP_INITIALIZER, useFactory: () => () => inject(UiBlackboxService), multi: true },\r\n * ],\r\n * };\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiBlackboxService implements OnDestroy {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private readonly router = inject(Router);\r\n private readonly zone = inject(NgZone);\r\n private readonly fingerprint = inject(UiBlackboxFingerprintService);\r\n private readonly storage = inject(UiBlackboxStorageService);\r\n\r\n private readonly destroy$ = new Subject<void>();\r\n private config: UiBlackboxConfig = { ...UI_BLACKBOX_DEFAULTS };\r\n\r\n // ─── Session state ─────────────────────────────────────────────────\r\n private session!: UiBlackboxSession;\r\n private currentStep: UiBlackboxStep | null = null;\r\n private initialised = false;\r\n\r\n // ─── Centralised event buffer ──────────────────────────────────────\r\n private buffer: UiBlackboxBufferEvent[] = [];\r\n private flushTimerId: ReturnType<typeof setInterval> | null = null;\r\n private beforeUnloadHandler: (() => void) | null = null;\r\n\r\n constructor() {\r\n if (isPlatformBrowser(this.platformId)) {\r\n this.init();\r\n }\r\n }\r\n\r\n // ─── Initialisation ────────────────────────────────────────────────\r\n\r\n private async init(): Promise<void> {\r\n // Generate session ID\r\n const sessionId = this.generateUuid();\r\n const fp = await this.fingerprint.getFingerprint();\r\n\r\n this.session = {\r\n sessionId,\r\n fingerprint: fp,\r\n startedAt: Date.now(),\r\n userAgent: navigator.userAgent,\r\n steps: [],\r\n formEvents: [],\r\n calls: [],\r\n };\r\n\r\n // Create initial step from current URL\r\n this.currentStep = {\r\n timestamp: Date.now(),\r\n route: this.router.url,\r\n actions: [],\r\n };\r\n this.session.steps.push(this.currentStep);\r\n\r\n // Subscribe to router navigation\r\n this.router.events\r\n .pipe(\r\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe((event) => {\r\n const previousRoute = this.currentStep?.route;\r\n this.currentStep = {\r\n timestamp: Date.now(),\r\n route: event.urlAfterRedirects,\r\n previousRoute,\r\n actions: [],\r\n };\r\n this.pushBufferEvent({ kind: 'step', payload: this.currentStep });\r\n });\r\n\r\n // Setup periodic flush (outside Angular zone to avoid triggering CD)\r\n this.zone.runOutsideAngular(() => {\r\n this.flushTimerId = setInterval(\r\n () => this.flush(),\r\n this.config.flushIntervalMs,\r\n );\r\n\r\n // Best-effort flush on tab close (IndexedDB is async, no sync fallback)\r\n this.beforeUnloadHandler = () => {\r\n this.session.endedAt = Date.now();\r\n void this.flush();\r\n };\r\n window.addEventListener('beforeunload', this.beforeUnloadHandler);\r\n });\r\n\r\n this.initialised = true;\r\n }\r\n\r\n // ─── Public API: Configuration ─────────────────────────────────────\r\n\r\n /**\r\n * Update the BlackBox configuration.\r\n * Can be called at any time; changes take effect immediately.\r\n */\r\n configure(config: Partial<Omit<UiBlackboxConfig, 'formTracking'>> & { formTracking?: Partial<UiBlackboxFormTrackingConfig> }): void {\r\n this.config = {\r\n ...this.config,\r\n ...config,\r\n formTracking: {\r\n ...this.config.formTracking,\r\n ...(config.formTracking ?? {}),\r\n },\r\n };\r\n this.storage.setMaxStorageMb(this.config.maxStorageMb);\r\n\r\n // Restart flush timer with new interval\r\n if (this.flushTimerId !== null) {\r\n clearInterval(this.flushTimerId);\r\n this.zone.runOutsideAngular(() => {\r\n this.flushTimerId = setInterval(\r\n () => this.flush(),\r\n this.config.flushIntervalMs,\r\n );\r\n });\r\n }\r\n }\r\n\r\n /** Returns the current configuration (readonly snapshot). */\r\n getConfig(): Readonly<UiBlackboxConfig> {\r\n return { ...this.config };\r\n }\r\n\r\n // ─── Public API: Tracking ──────────────────────────────────────────\r\n\r\n /**\r\n * Manually track a UI action (click).\r\n *\r\n * Called automatically by `UiButtonAreaComponent` and the `[uiTrack]` directive.\r\n * Can also be called programmatically for custom interactions.\r\n *\r\n * @param trackId - Identifier for the action (e.g. button id, link name).\r\n * @param meta - Optional metadata: `tag`, `text`, `id` of the element.\r\n */\r\n trackAction(\r\n trackId: string,\r\n meta?: { tag?: string; text?: string; id?: string },\r\n ): void {\r\n if (!this.initialised) return;\r\n\r\n const action: UiBlackboxAction = {\r\n timestamp: Date.now(),\r\n type: 'click',\r\n target: {\r\n tag: meta?.tag ?? 'unknown',\r\n id: meta?.id,\r\n trackId,\r\n text: meta?.text?.substring(0, 50),\r\n },\r\n };\r\n\r\n // Add to current step immediately (for in-memory session access)\r\n this.currentStep?.actions.push(action);\r\n\r\n // Also push to buffer for persistence\r\n this.pushBufferEvent({\r\n kind: 'action',\r\n payload: { ...action, route: this.currentStep?.route ?? this.router.url },\r\n });\r\n }\r\n\r\n /**\r\n * Track a form interaction event.\r\n *\r\n * Called automatically by `UiFormBuilderComponent` when the BlackBox\r\n * service is available.\r\n */\r\n trackFormEvent(event: UiBlackboxFormEvent): void {\r\n if (!this.initialised) return;\r\n\r\n this.session.formEvents.push(event);\r\n this.pushBufferEvent({ kind: 'formEvent', payload: event });\r\n }\r\n\r\n /**\r\n * Track an intercepted HTTP call.\r\n * Called by `UiBlackboxInterceptor`.\r\n * @internal\r\n */\r\n trackHttpCall(call: UiBlackboxHttpCall): void {\r\n if (!this.initialised) return;\r\n\r\n this.session.calls.push(call);\r\n this.pushBufferEvent({ kind: 'httpCall', payload: call });\r\n }\r\n\r\n // ─── Public API: Session access ────────────────────────────────────\r\n\r\n /**\r\n * Returns the current in-memory session (live, not yet flushed).\r\n * Useful for debugging or real-time inspection.\r\n */\r\n getCurrentSession(): UiBlackboxSession {\r\n return this.session;\r\n }\r\n\r\n /**\r\n * Retrieve all sessions stored in IndexedDB (decompressed).\r\n */\r\n async getSessionHistory(): Promise<UiBlackboxSession[]> {\r\n return this.storage.getAllSessions();\r\n }\r\n\r\n /**\r\n * Retrieve sessions for the current device fingerprint.\r\n */\r\n async getSessionsForDevice(): Promise<UiBlackboxSession[]> {\r\n const fp = await this.fingerprint.getFingerprint();\r\n return this.storage.getSessionsByFingerprint(fp);\r\n }\r\n\r\n // ─── Public API: Export ────────────────────────────────────────────\r\n\r\n /**\r\n * Export all sessions as a downloadable JSONL Blob.\r\n *\r\n * @returns A Blob containing JSONL data (one session per line).\r\n *\r\n * @example\r\n * ```typescript\r\n * const blob = await blackbox.exportSessions();\r\n * const url = URL.createObjectURL(blob);\r\n * const a = document.createElement('a');\r\n * a.href = url;\r\n * a.download = 'blackbox-sessions.jsonl';\r\n * a.click();\r\n * ```\r\n */\r\n async exportSessions(): Promise<Blob> {\r\n // Flush current session first\r\n await this.flush();\r\n return this.storage.exportDump();\r\n }\r\n\r\n // ─── Public API: Lifecycle ─────────────────────────────────────────\r\n\r\n /**\r\n * Explicitly end the current session.\r\n * Flushes all buffered events and marks the session as ended.\r\n */\r\n async endSession(): Promise<void> {\r\n if (!this.initialised) return;\r\n this.session.endedAt = Date.now();\r\n await this.flush();\r\n }\r\n\r\n /**\r\n * Clear all stored sessions from IndexedDB.\r\n */\r\n async clearHistory(): Promise<void> {\r\n return this.storage.clearAll();\r\n }\r\n\r\n // ─── Buffer management ─────────────────────────────────────────────\r\n\r\n /**\r\n * Push an event into the centralised buffer.\r\n * Triggers an immediate flush if the buffer exceeds the threshold.\r\n * @internal\r\n */\r\n private pushBufferEvent(event: UiBlackboxBufferEvent): void {\r\n this.buffer.push(event);\r\n if (this.buffer.length >= this.config.flushThreshold) {\r\n this.flush();\r\n }\r\n }\r\n\r\n /**\r\n * Flush buffered events to IndexedDB asynchronously.\r\n * @internal\r\n */\r\n private async flush(): Promise<void> {\r\n if (!this.initialised || this.buffer.length === 0) return;\r\n\r\n // Drain buffer\r\n const events = this.buffer.splice(0);\r\n\r\n // Apply step events to the session\r\n for (const event of events) {\r\n if (event.kind === 'step') {\r\n // Steps are already pushed in real-time; ensure they're in the session\r\n if (!this.session.steps.includes(event.payload)) {\r\n this.session.steps.push(event.payload);\r\n }\r\n }\r\n // Actions, formEvents, httpCalls are already pushed in real-time\r\n // to the in-memory session by trackAction/trackFormEvent/trackHttpCall\r\n }\r\n\r\n // Save the full session snapshot\r\n try {\r\n await this.storage.saveSession(this.session);\r\n } catch (e) {\r\n // storage error — re-enqueue events for next flush\r\n console.warn('[UiBlackbox] Storage flush failed:', e);\r\n }\r\n }\r\n\r\n // ─── Utilities ─────────────────────────────────────────────────────\r\n\r\n /** Generate a UUID v4. */\r\n private generateUuid(): string {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n // Fallback for older browsers\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n }\r\n\r\n // ─── Cleanup ───────────────────────────────────────────────────────\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n if (this.flushTimerId !== null) {\r\n clearInterval(this.flushTimerId);\r\n }\r\n\r\n if (this.beforeUnloadHandler) {\r\n window.removeEventListener('beforeunload', this.beforeUnloadHandler);\r\n }\r\n\r\n // Final flush\r\n void this.flush();\r\n }\r\n}\r\n","import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation, inject } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { UiSize } from '../../core/types';\r\nimport { UiButtonComponent } from './button.component';\r\nimport { UiButtonDescriptor, UiButtonAreaAlign } from './button.types';\r\nimport { UiBlackboxService } from '../blackbox/blackbox.service';\r\n\r\n/**\r\n * Standalone button-group component driven by a `UiButtonDescriptor[]` configuration.\r\n *\r\n * Renders a group of `UiButton` instances from declarative descriptors.\r\n * Supports per-button loading/disabled states, dynamic visibility,\r\n * alignment control, and optional navigation via Angular Router.\r\n *\r\n * When the `UiBlackboxService` is provided, button clicks are\r\n * automatically tracked in the active session.\r\n *\r\n * @selector ui-button-area\r\n *\r\n * @example\r\n * ```html\r\n * <ui-button-area\r\n * [buttons]=\"actions\"\r\n * align=\"end\"\r\n * gap=\"sm\"\r\n * [loadingIds]=\"currentlyLoading\"\r\n * />\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // Dynamic configuration\r\n * actions: UiButtonDescriptor[] = [\r\n * { id: 'export', label: 'Export Excel', icon: 'file-spreadsheet', variant: 'primary',\r\n * action: () => this.exportExcel() },\r\n * { id: 'delete', label: 'Delete', icon: 'trash-2', variant: 'warn',\r\n * action: () => this.deleteSelected(), hidden: !this.hasSelection },\r\n * ];\r\n *\r\n * // Set loading state from outside:\r\n * currentlyLoading: string | string[] | null = 'export';\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-button-area',\r\n standalone: true,\r\n imports: [UiButtonComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'ui-button-area-host',\r\n },\r\n template: `\r\n <div\r\n [class]=\"areaClasses\"\r\n role=\"group\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n >\r\n @for (button of visibleButtons; track trackButton($index, button)) {\r\n <ui-button\r\n [attr.data-button-id]=\"button.id || null\"\r\n [label]=\"button.label\"\r\n [tooltip]=\"button.tooltip ?? ''\"\r\n [ariaLabel]=\"button.ariaLabel\"\r\n [icon]=\"button.icon\"\r\n [iconPosition]=\"button.iconPosition ?? 'trailing'\"\r\n [variant]=\"button.variant ?? 'primary'\"\r\n [size]=\"button.size ?? 'md'\"\r\n [loading]=\"isButtonLoading(button)\"\r\n [disabled]=\"isButtonDisabled(button)\"\r\n [customClass]=\"button.customClass\"\r\n (click)=\"handleButtonClick(button, $event)\"\r\n />\r\n }\r\n </div>\r\n `,\r\n styleUrl: './button-area.component.scss',\r\n})\r\nexport class UiButtonAreaComponent {\r\n /**\r\n * Array of button descriptors to render.\r\n * Buttons with `hidden: true` are filtered out.\r\n */\r\n @Input() buttons: UiButtonDescriptor[] = [];\r\n\r\n /** Horizontal alignment of the button group. */\r\n @Input() align: UiButtonAreaAlign = 'end';\r\n\r\n /** Accessible group label for screen readers. */\r\n @Input() ariaLabel = 'Actions';\r\n\r\n /** Gap between buttons (maps to design token spacing). */\r\n @Input() gap: UiSize = 'sm';\r\n\r\n /** Stack buttons vertically on mobile viewports (<600px). */\r\n @Input() stackOnMobile = true;\r\n\r\n /**\r\n * When `true`, all buttons are disabled while any button is in a loading state.\r\n * Useful to prevent double-actions during async operations.\r\n */\r\n @Input() disableWhileLoading = false;\r\n\r\n /**\r\n * Set one or more buttons to a loading state by their `id`.\r\n * Accepts a single string, an array of strings, or `null` to clear.\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Single -->\r\n * <ui-button-area [loadingIds]=\"'save'\" />\r\n *\r\n * <!-- Multiple -->\r\n * <ui-button-area [loadingIds]=\"['save', 'export']\" />\r\n * ```\r\n */\r\n @Input()\r\n set loadingIds(value: string | string[] | null | undefined) {\r\n if (value === null || value === undefined) {\r\n this._loadingIds = new Set();\r\n } else if (Array.isArray(value)) {\r\n this._loadingIds = new Set(value);\r\n } else {\r\n this._loadingIds = new Set([value]);\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _loadingIds = new Set<string>();\r\n\r\n /** @internal Optional router for href navigation. */\r\n private router = inject(Router, { optional: true });\r\n\r\n /** @internal Optional BlackBox service — auto-tracks button clicks when available. */\r\n private blackbox = inject(UiBlackboxService, { optional: true });\r\n\r\n /** Buttons filtered to visible (non-hidden) entries. */\r\n get visibleButtons(): UiButtonDescriptor[] {\r\n return this.buttons.filter((b) => !b.hidden);\r\n }\r\n\r\n /** Assembled CSS class string for the button area container. */\r\n get areaClasses(): string {\r\n return [\r\n 'ui-button-area',\r\n `ui-button-area--align-${this.align}`,\r\n `ui-button-area--gap-${this.gap}`,\r\n this.stackOnMobile ? 'ui-button-area--stack-mobile' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n /** @internal Track function for @for loop. */\r\n trackButton(index: number, button: UiButtonDescriptor): string {\r\n return button.id ?? `idx-${index}`;\r\n }\r\n\r\n /** Whether a specific button is in a loading state. */\r\n isButtonLoading(button: UiButtonDescriptor): boolean {\r\n return !!button.loading || (!!button.id && this._loadingIds.has(button.id));\r\n }\r\n\r\n /** Whether a specific button is disabled (includes loading logic). */\r\n isButtonDisabled(button: UiButtonDescriptor): boolean {\r\n if (button.disabled) return true;\r\n if (this.isButtonLoading(button)) return true;\r\n if (this.disableWhileLoading && this._loadingIds.size > 0) return true;\r\n return false;\r\n }\r\n\r\n /** @internal Handles button click: tracks action, calls callback and/or navigates. */\r\n handleButtonClick(button: UiButtonDescriptor, event: MouseEvent): void {\r\n // BlackBox auto-tracking (no-op if service is not provided)\r\n this.blackbox?.trackAction(button.id ?? button.label, {\r\n tag: 'ui-button',\r\n id: button.id,\r\n text: button.label,\r\n });\r\n\r\n if (button.action) {\r\n button.action(event);\r\n }\r\n if (button.href && this.router) {\r\n this.router.navigateByUrl(button.href);\r\n }\r\n }\r\n}\r\n\r\n","/**\r\n * ng-ui-system — Button entry point.\r\n *\r\n * @example\r\n * ```typescript\r\n * import {\r\n * UiButtonComponent,\r\n * UiButtonAreaComponent,\r\n * UiButtonDescriptor,\r\n * } from 'ng-ui-system';\r\n * ```\r\n */\r\n\r\n// Components\r\nexport { UiButtonComponent } from './button.component';\r\nexport { UiButtonAreaComponent } from './button-area.component';\r\n\r\n// Types\r\nexport {\r\n UiButtonDescriptor,\r\n UiButtonAreaAlign,\r\n UiIconPosition,\r\n} from './button.types';\r\n","import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\n\r\nimport { UiEditorBreadcrumbItem } from '../../types/editor.types';\r\nimport { UiButtonComponent } from '../../../button/index';\r\n\r\n/**\r\n * Toolbar principale dell'editor di form.\r\n *\r\n * Contiene:\r\n * - Sezione sinistra: icona, titolo e breadcrumb di navigazione\r\n * - Centro: indicatore dello stato di salvataggio\r\n * - Destra: pulsanti azione (aggiungi sezione, salva, file, altro)\r\n *\r\n * @selector ui-editor-toolbar\r\n */\r\n@Component({\r\n selector: 'ui-editor-toolbar',\r\n standalone: true,\r\n imports: [MatToolbarModule, MatButtonModule, MatMenuModule, MatTooltipModule, LucideAngularModule, UiButtonComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <mat-toolbar color=\"primary\" class=\"editor-toolbar\">\r\n <!-- Sezione sinistra: icona, titolo e breadcrumb -->\r\n <div class=\"editor-toolbar__left\">\r\n <lucide-icon name=\"pencil\" [size]=\"20\" aria-hidden=\"true\" />\r\n <span class=\"editor-toolbar__title\">Form Builder Editor</span>\r\n\r\n <!-- Breadcrumb di navigazione -->\r\n @if (breadcrumb.length) {\r\n <nav class=\"editor-toolbar__breadcrumb\" aria-label=\"Navigazione editor\">\r\n @for (item of breadcrumb; track item.id; let last = $last) {\r\n <span\r\n class=\"editor-toolbar__breadcrumb-item\"\r\n [class.editor-toolbar__breadcrumb-item--active]=\"item.active\"\r\n >\r\n {{ item.label }}\r\n </span>\r\n @if (!last) {\r\n <lucide-icon\r\n name=\"chevron-right\"\r\n [size]=\"14\"\r\n class=\"editor-toolbar__breadcrumb-sep\"\r\n aria-hidden=\"true\"\r\n />\r\n }\r\n }\r\n </nav>\r\n }\r\n </div>\r\n\r\n <!-- Centro: stato di salvataggio -->\r\n <div class=\"editor-toolbar__center\">\r\n @if (isDirty) {\r\n <lucide-icon name=\"pencil\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span class=\"editor-toolbar__save-status editor-toolbar__save-status--dirty\">\r\n Modifiche non salvate\r\n </span>\r\n } @else {\r\n <lucide-icon name=\"check-circle\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span class=\"editor-toolbar__save-status editor-toolbar__save-status--saved\">\r\n {{ formatLastSaved(lastSaved) }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <!-- Sezione destra: pulsanti azione -->\r\n <div class=\"editor-toolbar__right\">\r\n <!-- Aggiungi sezione -->\r\n <ui-button\r\n icon=\"plus\"\r\n variant=\"ghost\"\r\n size=\"md\"\r\n ariaLabel=\"Aggiungi sezione\"\r\n tooltip=\"Aggiungi sezione\"\r\n (click)=\"addSection.emit()\"\r\n />\r\n\r\n <!-- Salva -->\r\n <ui-button\r\n icon=\"save\"\r\n variant=\"ghost\"\r\n size=\"md\"\r\n ariaLabel=\"Salva\"\r\n tooltip=\"Salva\"\r\n (click)=\"save.emit()\"\r\n />\r\n\r\n <!-- Menu file -->\r\n <button\r\n mat-icon-button\r\n matTooltip=\"Menu file\"\r\n aria-label=\"Menu file\"\r\n [matMenuTriggerFor]=\"fileMenu\"\r\n >\r\n <lucide-icon name=\"folder\" [size]=\"20\" />\r\n </button>\r\n\r\n <mat-menu #fileMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"newForm.emit()\">\r\n <lucide-icon name=\"file-text\" [size]=\"18\" />\r\n <span>Nuovo Form</span>\r\n </button>\r\n <button mat-menu-item (click)=\"importJson.emit()\">\r\n <lucide-icon name=\"download\" [size]=\"18\" />\r\n <span>Importa JSON</span>\r\n </button>\r\n <button mat-menu-item (click)=\"exportJson.emit()\">\r\n <lucide-icon name=\"upload\" [size]=\"18\" />\r\n <span>Esporta JSON</span>\r\n </button>\r\n </mat-menu>\r\n\r\n <!-- Menu altro -->\r\n <button\r\n mat-icon-button\r\n matTooltip=\"Altre azioni\"\r\n aria-label=\"Altre azioni\"\r\n [matMenuTriggerFor]=\"moreMenu\"\r\n >\r\n <lucide-icon name=\"more-vertical\" [size]=\"20\" />\r\n </button>\r\n\r\n <mat-menu #moreMenu=\"matMenu\">\r\n <button mat-menu-item class=\"editor-toolbar__menu-warn\" (click)=\"clear.emit()\">\r\n <lucide-icon name=\"trash-2\" [size]=\"18\" />\r\n <span>Pulisci Tutto</span>\r\n </button>\r\n </mat-menu>\r\n </div>\r\n </mat-toolbar>\r\n `,\r\n styles: [\r\n `\r\n /* Contenitore principale della toolbar */\r\n .editor-toolbar {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--ui-spacing-3, 12px);\r\n padding: 0 var(--ui-spacing-4, 16px);\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n }\r\n\r\n /* ── Sezione sinistra ── */\r\n .editor-toolbar__left {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n min-width: 0;\r\n flex: 1 1 auto;\r\n }\r\n\r\n .editor-toolbar__title {\r\n font-weight: 600;\r\n font-size: var(--ui-font-size-md, 1rem);\r\n white-space: nowrap;\r\n }\r\n\r\n /* ── Breadcrumb ── */\r\n .editor-toolbar__breadcrumb {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1, 4px);\r\n margin-left: var(--ui-spacing-2, 8px);\r\n min-width: 0;\r\n overflow: hidden;\r\n }\r\n\r\n .editor-toolbar__breadcrumb-item {\r\n white-space: nowrap;\r\n opacity: 0.75;\r\n font-size: var(--ui-font-size-xs, 0.75rem);\r\n cursor: default;\r\n transition: opacity var(--ui-transition-fast, 150ms);\r\n }\r\n\r\n .editor-toolbar__breadcrumb-item--active {\r\n opacity: 1;\r\n font-weight: 600;\r\n }\r\n\r\n .editor-toolbar__breadcrumb-sep {\r\n opacity: 0.5;\r\n flex-shrink: 0;\r\n }\r\n\r\n /* ── Stato di salvataggio (centro) ── */\r\n .editor-toolbar__center {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1, 4px);\r\n flex-shrink: 0;\r\n }\r\n\r\n .editor-toolbar__save-status {\r\n font-size: var(--ui-font-size-xs, 0.75rem);\r\n white-space: nowrap;\r\n }\r\n\r\n .editor-toolbar__save-status--dirty {\r\n opacity: 0.85;\r\n }\r\n\r\n .editor-toolbar__save-status--saved {\r\n opacity: 0.7;\r\n }\r\n\r\n /* ── Sezione destra ── */\r\n .editor-toolbar__right {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1, 4px);\r\n flex-shrink: 0;\r\n }\r\n\r\n /* ── Voce menu con colore di avviso ── */\r\n .editor-toolbar__menu-warn {\r\n color: var(--ui-color-warn, #f44336) !important;\r\n }\r\n\r\n /* ── Menu item: icona + testo allineati ── */\r\n [mat-menu-item] {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n }\r\n\r\n /* ── Responsive: nasconde titolo e breadcrumb su schermi piccoli ── */\r\n @media (max-width: 768px) {\r\n .editor-toolbar__title,\r\n .editor-toolbar__breadcrumb {\r\n display: none;\r\n }\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiEditorToolbarComponent {\r\n /** Elementi del breadcrumb di navigazione. */\r\n @Input() breadcrumb: UiEditorBreadcrumbItem[] = [];\r\n\r\n /** Indica se ci sono modifiche non salvate. */\r\n @Input() isDirty = false;\r\n\r\n /** Data dell'ultimo salvataggio riuscito. */\r\n @Input() lastSaved: Date | null = null;\r\n\r\n /** Emesso alla richiesta di creare un nuovo form. */\r\n @Output() newForm = new EventEmitter<void>();\r\n\r\n /** Emesso alla richiesta di importare un JSON. */\r\n @Output() importJson = new EventEmitter<void>();\r\n\r\n /** Emesso alla richiesta di esportare il JSON. */\r\n @Output() exportJson = new EventEmitter<void>();\r\n\r\n /** Emesso alla richiesta di salvataggio. */\r\n @Output() save = new EventEmitter<void>();\r\n\r\n /** Emesso alla richiesta di pulizia completa. */\r\n @Output() clear = new EventEmitter<void>();\r\n\r\n /** Emesso alla richiesta di aggiungere una nuova sezione. */\r\n @Output() addSection = new EventEmitter<void>();\r\n\r\n /**\r\n * Formatta la data dell'ultimo salvataggio in testo leggibile.\r\n * Restituisce descrizioni relative come \"pochi secondi fa\", \"5 minuti fa\", ecc.\r\n *\r\n * @param date - Data dell'ultimo salvataggio oppure null\r\n * @returns Stringa descrittiva dello stato di salvataggio\r\n */\r\n formatLastSaved(date: Date | null): string {\r\n if (!date) return 'Mai salvato';\r\n\r\n const now = Date.now();\r\n const diff = now - date.getTime();\r\n const seconds = Math.floor(diff / 1000);\r\n const minutes = Math.floor(seconds / 60);\r\n const hours = Math.floor(minutes / 60);\r\n\r\n if (seconds < 30) return 'Salvato pochi secondi fa';\r\n if (seconds < 60) return 'Salvato meno di un minuto fa';\r\n if (minutes === 1) return 'Salvato 1 minuto fa';\r\n if (minutes < 60) return `Salvato ${minutes} minuti fa`;\r\n if (hours === 1) return 'Salvato 1 ora fa';\r\n return `Salvato ${hours} ore fa`;\r\n }\r\n}\r\n","import { Component, ChangeDetectionStrategy, Input } from '@angular/core';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { CdkDrag, CdkDragPlaceholder, CdkDropList } from '@angular/cdk/drag-drop';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\n\r\nimport { UiEditorFieldPaletteItem, UiEditorFieldCategory } from '../../types/editor.types';\r\nimport { UiFieldType } from '../../../form-builder/types/index';\r\nimport { UiIconName } from '../../../../core/types';\r\n\r\n/**\r\n * Interfaccia interna per una categoria della palette.\r\n * Raggruppa un insieme di elementi sotto un'etichetta comune.\r\n */\r\ninterface PaletteCategory {\r\n /** Identificativo della categoria. */\r\n key: UiEditorFieldCategory;\r\n /** Etichetta visualizzata nell'intestazione dell'accordion. */\r\n label: string;\r\n /** Icona Lucide della categoria. */\r\n icon: UiIconName;\r\n /** Elementi trascinabili appartenenti alla categoria. */\r\n items: UiEditorFieldPaletteItem[];\r\n}\r\n\r\n/**\r\n * Palette laterale dei tipi di campo disponibili.\r\n *\r\n * Mostra i campi raggruppati per categoria tramite pannelli espandibili.\r\n * Ogni elemento e trascinabile (CDK drag-drop) verso le sezioni del form.\r\n *\r\n * @selector ui-field-palette\r\n */\r\n@Component({\r\n selector: 'ui-field-palette',\r\n standalone: true,\r\n imports: [MatExpansionModule, CdkDropList, CdkDrag, CdkDragPlaceholder, LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"field-palette\">\r\n <h3 class=\"field-palette__header\">Campi disponibili</h3>\r\n\r\n <mat-accordion multi>\r\n @for (category of categories; track category.key) {\r\n <mat-expansion-panel [expanded]=\"category.key === 'basic'\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon [name]=\"category.icon\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>{{ category.label }}</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <div\r\n cdkDropList\r\n [id]=\"'palette-' + category.key\"\r\n [cdkDropListData]=\"category.items\"\r\n [cdkDropListSortingDisabled]=\"true\"\r\n [cdkDropListEnterPredicate]=\"noDrop\"\r\n class=\"field-palette__list\"\r\n >\r\n @for (item of category.items; track item.type) {\r\n <div\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n class=\"field-palette__item\"\r\n >\r\n <!-- Placeholder visualizzato nella lista di destinazione durante il drag -->\r\n <div class=\"field-palette__drag-placeholder\" *cdkDragPlaceholder></div>\r\n\r\n <!-- Icona handle di trascinamento (decorativa, l'intero elemento e draggabile) -->\r\n <lucide-icon\r\n name=\"grip-vertical\"\r\n [size]=\"14\"\r\n class=\"field-palette__drag-handle\"\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <!-- Icona del tipo di campo -->\r\n <lucide-icon\r\n [name]=\"item.icon\"\r\n [size]=\"18\"\r\n class=\"field-palette__item-icon\"\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <!-- Informazioni sul campo -->\r\n <div class=\"field-palette__item-info\">\r\n <span class=\"field-palette__item-label\">{{ item.label }}</span>\r\n <span class=\"field-palette__item-desc\">{{ item.description }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mat-expansion-panel>\r\n }\r\n </mat-accordion>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n /* Contenitore principale della palette */\r\n .field-palette {\r\n padding: var(--ui-spacing-3, 12px);\r\n height: 100%;\r\n overflow-y: auto;\r\n background: var(--ui-color-surface, #fff);\r\n }\r\n\r\n /* Intestazione della palette */\r\n .field-palette__header {\r\n margin: 0 0 var(--ui-spacing-3, 12px);\r\n font-size: var(--ui-font-size-md, 1rem);\r\n font-weight: 600;\r\n color: var(--ui-color-text, #212121);\r\n }\r\n\r\n /* Titolo del pannello: icona + testo */\r\n mat-panel-title {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n font-weight: 500;\r\n }\r\n\r\n /* Lista di campi all'interno del pannello */\r\n .field-palette__list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ui-spacing-1, 4px);\r\n min-height: 24px;\r\n }\r\n\r\n /* Singolo elemento trascinabile */\r\n .field-palette__item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n padding: var(--ui-spacing-2, 8px);\r\n border: 1px solid var(--ui-color-border, #e0e0e0);\r\n border-radius: var(--ui-radius-sm, 4px);\r\n background: var(--ui-color-surface, #fff);\r\n cursor: grab;\r\n transition: box-shadow var(--ui-transition-fast, 150ms),\r\n border-color var(--ui-transition-fast, 150ms);\r\n user-select: none;\r\n }\r\n\r\n .field-palette__item:hover {\r\n border-color: var(--ui-color-primary, #3f51b5);\r\n box-shadow: var(--ui-shadow-sm, 0 1px 3px rgba(0,0,0,.1));\r\n }\r\n\r\n /* Handle di trascinamento */\r\n .field-palette__drag-handle {\r\n color: var(--ui-color-text-muted, #9e9e9e);\r\n flex-shrink: 0;\r\n cursor: grab;\r\n }\r\n\r\n /* Icona tipo campo */\r\n .field-palette__item-icon {\r\n color: var(--ui-color-primary, #3f51b5);\r\n flex-shrink: 0;\r\n }\r\n\r\n /* Blocco info (label + descrizione) */\r\n .field-palette__item-info {\r\n display: flex;\r\n flex-direction: column;\r\n min-width: 0;\r\n }\r\n\r\n .field-palette__item-label {\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n font-weight: 500;\r\n color: var(--ui-color-text, #212121);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n .field-palette__item-desc {\r\n font-size: var(--ui-font-size-xs, 0.75rem);\r\n color: var(--ui-color-text-secondary, #616161);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n /* Placeholder mostrato nella zona di destinazione */\r\n .field-palette__drag-placeholder {\r\n height: 40px;\r\n border: 2px dashed var(--ui-color-primary, #3f51b5);\r\n border-radius: var(--ui-radius-sm, 4px);\r\n background: var(--ui-color-primary-bg, rgba(63, 81, 181, 0.08));\r\n transition: transform var(--ui-transition-fast, 150ms);\r\n }\r\n\r\n /* Stile dell'elemento durante il trascinamento (CDK) */\r\n .cdk-drag-preview {\r\n box-shadow: var(--ui-shadow-md, 0 4px 12px rgba(0,0,0,.15));\r\n border-radius: var(--ui-radius-sm, 4px);\r\n background: var(--ui-color-surface, #fff);\r\n padding: var(--ui-spacing-2, 8px);\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n }\r\n\r\n /* Animazione di spostamento degli elementi CDK */\r\n .cdk-drag-animating {\r\n transition: transform var(--ui-transition-normal, 250ms) cubic-bezier(0, 0, 0.2, 1);\r\n }\r\n\r\n /* Pannelli espandibili: spaziatura */\r\n mat-expansion-panel {\r\n margin-bottom: var(--ui-spacing-1, 4px) !important;\r\n box-shadow: none !important;\r\n border: 1px solid var(--ui-color-border, #e0e0e0);\r\n border-radius: var(--ui-radius-sm, 4px) !important;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiFieldPaletteComponent {\r\n /**\r\n * Predicato che impedisce il drop di elementi dentro la palette.\r\n * La palette e solo una sorgente di drag, non una destinazione.\r\n */\r\n noDrop = (): boolean => false;\r\n\r\n /**\r\n * Catalogo completo degli elementi della palette,\r\n * organizzato per categorie con i rispettivi metadati.\r\n */\r\n readonly categories: PaletteCategory[] = [\r\n {\r\n key: 'basic',\r\n label: 'Campi base',\r\n icon: 'type',\r\n items: [\r\n { type: 'text', label: 'Testo', icon: 'type', description: 'Campo di testo singola riga', category: 'basic' },\r\n { type: 'email', label: 'Email', icon: 'mail', description: 'Campo email con validazione', category: 'basic' },\r\n {\r\n type: 'password',\r\n label: 'Password',\r\n icon: 'lock',\r\n description: 'Campo password mascherato',\r\n category: 'basic',\r\n },\r\n { type: 'number', label: 'Numero', icon: 'hash', description: 'Campo numerico', category: 'basic' },\r\n {\r\n type: 'textarea',\r\n label: 'Area testo',\r\n icon: 'text',\r\n description: 'Campo di testo multilinea',\r\n category: 'basic',\r\n },\r\n ],\r\n },\r\n {\r\n key: 'choice',\r\n label: 'Campi scelta',\r\n icon: 'list',\r\n items: [\r\n {\r\n type: 'select',\r\n label: 'Select',\r\n icon: 'chevron-down',\r\n description: 'Menu a tendina singola scelta',\r\n category: 'choice',\r\n },\r\n {\r\n type: 'multiselect',\r\n label: 'Multiselect',\r\n icon: 'list',\r\n description: 'Selezione multipla',\r\n category: 'choice',\r\n },\r\n {\r\n type: 'freemultiselect',\r\n label: 'Multiselect libera',\r\n icon: 'list-plus',\r\n description: 'Selezione multipla con valori liberi',\r\n category: 'choice',\r\n },\r\n {\r\n type: 'radio',\r\n label: 'Radio',\r\n icon: 'circle-dot',\r\n description: 'Gruppo di opzioni radio',\r\n category: 'choice',\r\n },\r\n {\r\n type: 'checkbox',\r\n label: 'Checkbox',\r\n icon: 'check-square',\r\n description: 'Casella di spunta',\r\n category: 'choice',\r\n },\r\n {\r\n type: 'switch',\r\n label: 'Switch',\r\n icon: 'toggle-left',\r\n description: 'Interruttore on/off',\r\n category: 'choice',\r\n },\r\n ],\r\n },\r\n {\r\n key: 'datetime',\r\n label: 'Data e ora',\r\n icon: 'calendar',\r\n items: [\r\n { type: 'date', label: 'Data', icon: 'calendar', description: 'Selettore di data', category: 'datetime' },\r\n {\r\n type: 'datetime',\r\n label: 'Data e ora',\r\n icon: 'clock',\r\n description: 'Selettore data e ora',\r\n category: 'datetime',\r\n },\r\n ],\r\n },\r\n {\r\n key: 'advanced',\r\n label: 'Avanzati',\r\n icon: 'settings',\r\n items: [\r\n { type: 'file', label: 'File', icon: 'upload', description: 'Caricamento file', category: 'advanced' },\r\n { type: 'flag', label: 'Flag', icon: 'flag', description: 'Campo flag booleano', category: 'advanced' },\r\n ],\r\n },\r\n {\r\n key: 'custom',\r\n label: 'Personalizzati',\r\n icon: 'settings',\r\n items: [\r\n {\r\n type: 'custom',\r\n label: 'Custom',\r\n icon: 'settings',\r\n description: 'Componente personalizzato',\r\n category: 'custom',\r\n },\r\n { type: 'divider', label: 'Separatore', icon: 'minus', description: 'Divisore visuale', category: 'custom' },\r\n ],\r\n },\r\n ];\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder-editor\r\n * Componente editor di sezione per il form builder.\r\n *\r\n * Renderizza una singola sezione del form come card, con supporto\r\n * per espansione/collasso, editing inline del titolo, drag & drop\r\n * dei campi e azioni CRUD su sezione e campi.\r\n */\r\n\r\nimport { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\n\r\nimport { UiButtonComponent } from '../../../button/index';\r\nimport { UiFormSection } from '../../../form-builder/types/index';\r\nimport { UiFieldType } from '../../../form-builder/types/index';\r\n\r\n/**\r\n * Mappa tipo di campo -> nome icona Lucide.\r\n * Usata per visualizzare l'icona corretta accanto a ciascun campo.\r\n */\r\nconst FIELD_ICON_MAP: Record<UiFieldType, string> = {\r\n text: 'type',\r\n email: 'mail',\r\n password: 'lock', // NOSONAR - Icon name for password field type, not a credential\r\n number: 'hash',\r\n textarea: 'text',\r\n select: 'chevron-down',\r\n multiselect: 'list',\r\n freemultiselect: 'list-plus',\r\n radio: 'circle-dot',\r\n checkbox: 'check-square',\r\n switch: 'toggle-left',\r\n date: 'calendar',\r\n datetime: 'clock',\r\n file: 'upload',\r\n flag: 'flag',\r\n custom: 'settings',\r\n divider: 'minus',\r\n location: 'map-pin',\r\n 'location-geocoded': 'globe',\r\n 'location-table': 'map',\r\n};\r\n\r\n/**\r\n * Editor visuale di una singola sezione del form.\r\n *\r\n * Supporta:\r\n * - Header espandibile/collassabile con editing inline del titolo\r\n * - Pulsanti azione: modifica titolo, duplica, elimina\r\n * - Drop list CDK per ricevere campi dalla palette o da altre sezioni\r\n * - Ogni campo mostra: handle di trascinamento, icona tipo, label, chiave, badge tipo, asterisco required\r\n * - Azioni campo (al passaggio mouse): duplica, elimina\r\n * - Stato vuoto quando non ci sono campi\r\n */\r\n@Component({\r\n selector: 'ui-section-editor',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n FormsModule,\r\n MatCardModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n DragDropModule,\r\n LucideAngularModule,\r\n UiButtonComponent,\r\n ],\r\n template: `\r\n <!-- Card della sezione -->\r\n <mat-card\r\n class=\"section-card\"\r\n [class.section-card--selected]=\"isSelected\"\r\n >\r\n <!-- Header della sezione -->\r\n <div class=\"section-header\" (click)=\"toggleExpand()\">\r\n <!-- Indicatore espansione -->\r\n <ui-button\r\n [icon]=\"isExpanded ? 'chevron-down' : 'chevron-right'\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n [tooltip]=\"isExpanded ? 'Comprimi sezione' : 'Espandi sezione'\"\r\n ariaLabel=\"Espandi/Comprimi sezione\"\r\n />\r\n\r\n <!-- Titolo della sezione (doppio click per modificare) -->\r\n @if (isEditingTitle) {\r\n <mat-form-field class=\"section-header__title-field\" appearance=\"outline\">\r\n <input\r\n matInput\r\n [(ngModel)]=\"tempTitle\"\r\n (blur)=\"confirmTitleEdit()\"\r\n (keydown.enter)=\"confirmTitleEdit()\"\r\n (keydown.escape)=\"cancelTitleEdit()\"\r\n (click)=\"$event.stopPropagation()\"\r\n autofocus\r\n />\r\n </mat-form-field>\r\n } @else {\r\n <span\r\n class=\"section-header__title\"\r\n (dblclick)=\"startTitleEdit($event)\"\r\n >\r\n {{ section.title || 'Sezione senza titolo' }}\r\n </span>\r\n }\r\n\r\n <!-- Badge conteggio campi -->\r\n <span class=\"section-header__badge\">\r\n {{ section.fields.length }} {{ section.fields.length === 1 ? 'campo' : 'campi' }}\r\n </span>\r\n\r\n <!-- Azioni sezione -->\r\n <div class=\"section-header__actions\" (click)=\"$event.stopPropagation()\">\r\n <ui-button\r\n icon=\"pencil\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n ariaLabel=\"Modifica titolo\"\r\n tooltip=\"Modifica titolo\"\r\n (click)=\"startTitleEdit($event)\"\r\n />\r\n\r\n <ui-button\r\n icon=\"copy\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n ariaLabel=\"Duplica sezione\"\r\n tooltip=\"Duplica sezione\"\r\n (click)=\"sectionDuplicate.emit()\"\r\n />\r\n\r\n <ui-button\r\n icon=\"trash-2\"\r\n variant=\"warn\"\r\n size=\"sm\"\r\n ariaLabel=\"Elimina sezione\"\r\n tooltip=\"Elimina sezione\"\r\n (click)=\"sectionDelete.emit()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Corpo della sezione (espandibile) -->\r\n @if (isExpanded) {\r\n <div class=\"section-body\">\r\n <!-- Drop list CDK per i campi -->\r\n <div\r\n cdkDropList\r\n [cdkDropListData]=\"section\"\r\n [id]=\"'section-' + section.id\"\r\n (cdkDropListDropped)=\"onFieldDrop($event)\"\r\n class=\"field-drop-list\"\r\n >\r\n @for (field of section.fields; track field.key) {\r\n <div\r\n class=\"field-item\"\r\n cdkDrag\r\n [cdkDragData]=\"field\"\r\n [class.field-item--selected]=\"field.key === selectedFieldKey\"\r\n (click)=\"fieldSelect.emit(field.key)\"\r\n >\r\n <!-- Handle di trascinamento -->\r\n <div class=\"field-item__handle\" cdkDragHandle>\r\n <lucide-icon name=\"grip-vertical\" [size]=\"16\" />\r\n </div>\r\n\r\n <!-- Icona tipo campo -->\r\n <div class=\"field-item__icon\">\r\n <lucide-icon [name]=\"getFieldIcon(field.type)\" [size]=\"16\" />\r\n </div>\r\n\r\n <!-- Informazioni campo -->\r\n <div class=\"field-item__info\">\r\n <span class=\"field-item__label\">\r\n {{ field.label || 'Senza etichetta' }}\r\n @if (field.required) {\r\n <span class=\"field-item__required\">*</span>\r\n }\r\n </span>\r\n <span class=\"field-item__key\">{{ field.key }}</span>\r\n </div>\r\n\r\n <!-- Badge tipo campo -->\r\n <span class=\"field-item__type-badge\">{{ field.type }}</span>\r\n\r\n <!-- Azioni campo (visibili al passaggio del mouse) -->\r\n <div class=\"field-item__actions\" (click)=\"$event.stopPropagation()\">\r\n <ui-button\r\n icon=\"copy\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n ariaLabel=\"Duplica campo\"\r\n tooltip=\"Duplica campo\"\r\n (click)=\"fieldDuplicate.emit(field.key)\"\r\n />\r\n\r\n <ui-button\r\n icon=\"trash-2\"\r\n variant=\"warn\"\r\n size=\"xs\"\r\n ariaLabel=\"Elimina campo\"\r\n tooltip=\"Elimina campo\"\r\n (click)=\"fieldDelete.emit(field.key)\"\r\n />\r\n </div>\r\n </div>\r\n } @empty {\r\n <!-- Stato vuoto -->\r\n <div class=\"field-drop-list__empty\">\r\n <lucide-icon name=\"mouse-pointer-click\" [size]=\"24\" />\r\n <span>Trascina qui i campi dalla palette</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </mat-card>\r\n `,\r\n styles: [\r\n `\r\n /* ─── Card sezione ──────────────────────────────────────── */\r\n\r\n :host {\r\n display: block;\r\n }\r\n\r\n .section-card {\r\n border: 2px solid var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n overflow: hidden;\r\n transition: border-color var(--ui-transition-fast),\r\n box-shadow var(--ui-transition-fast);\r\n }\r\n\r\n .section-card:hover {\r\n box-shadow: var(--ui-shadow-sm);\r\n }\r\n\r\n .section-card--selected {\r\n border-color: var(--ui-color-primary);\r\n box-shadow: var(--ui-shadow-md);\r\n }\r\n\r\n /* ─── Header sezione ────────────────────────────────────── */\r\n\r\n .section-header {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2);\r\n padding: var(--ui-spacing-3) var(--ui-spacing-4);\r\n background: var(--ui-color-bg-subtle);\r\n cursor: pointer;\r\n user-select: none;\r\n transition: background var(--ui-transition-fast);\r\n }\r\n\r\n .section-header:hover {\r\n background: var(--ui-color-surface);\r\n }\r\n\r\n .section-header__title {\r\n flex: 1;\r\n font-size: var(--ui-font-size-md);\r\n font-weight: 600;\r\n color: var(--ui-color-text);\r\n cursor: pointer;\r\n }\r\n\r\n .section-header__title-field {\r\n flex: 1;\r\n }\r\n\r\n /* Riduce il padding del form field inline */\r\n .section-header__title-field ::ng-deep .mat-mdc-form-field-infix {\r\n padding-top: var(--ui-spacing-1) !important;\r\n padding-bottom: var(--ui-spacing-1) !important;\r\n min-height: unset;\r\n }\r\n\r\n .section-header__badge {\r\n font-size: var(--ui-font-size-xs);\r\n color: var(--ui-color-text-muted);\r\n background: var(--ui-color-surface);\r\n padding: var(--ui-spacing-1) var(--ui-spacing-2);\r\n border-radius: var(--ui-radius-sm);\r\n white-space: nowrap;\r\n }\r\n\r\n .section-header__actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1);\r\n opacity: 0;\r\n transition: opacity var(--ui-transition-fast);\r\n }\r\n\r\n .section-header:hover .section-header__actions {\r\n opacity: 1;\r\n }\r\n\r\n /* ─── Corpo sezione ─────────────────────────────────────── */\r\n\r\n .section-body {\r\n padding: var(--ui-spacing-3);\r\n }\r\n\r\n /* ─── Drop list campi ───────────────────────────────────── */\r\n\r\n .field-drop-list {\r\n min-height: 48px;\r\n border: 2px dashed var(--ui-color-border);\r\n border-radius: var(--ui-radius-sm);\r\n transition: border-color var(--ui-transition-fast),\r\n background var(--ui-transition-fast);\r\n }\r\n\r\n .field-drop-list.cdk-drop-list-dragging {\r\n border-color: var(--ui-color-primary);\r\n background: var(--ui-color-primary-bg);\r\n }\r\n\r\n .field-drop-list__empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--ui-spacing-2);\r\n padding: var(--ui-spacing-6) var(--ui-spacing-4);\r\n color: var(--ui-color-text-muted);\r\n font-size: var(--ui-font-size-sm);\r\n }\r\n\r\n /* ─── Elemento campo ────────────────────────────────────── */\r\n\r\n .field-item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2);\r\n padding: var(--ui-spacing-2) var(--ui-spacing-3);\r\n background: var(--ui-color-surface);\r\n border-bottom: 1px solid var(--ui-color-border);\r\n cursor: pointer;\r\n transition: background var(--ui-transition-fast);\r\n }\r\n\r\n .field-item:first-child {\r\n border-top-left-radius: var(--ui-radius-sm);\r\n border-top-right-radius: var(--ui-radius-sm);\r\n }\r\n\r\n .field-item:last-child {\r\n border-bottom: none;\r\n border-bottom-left-radius: var(--ui-radius-sm);\r\n border-bottom-right-radius: var(--ui-radius-sm);\r\n }\r\n\r\n .field-item:hover {\r\n background: var(--ui-color-bg-subtle);\r\n }\r\n\r\n .field-item--selected {\r\n background: var(--ui-color-primary-bg);\r\n border-left: 3px solid var(--ui-color-primary);\r\n }\r\n\r\n /* Handle di trascinamento */\r\n .field-item__handle {\r\n display: flex;\r\n align-items: center;\r\n cursor: grab;\r\n color: var(--ui-color-text-muted);\r\n transition: color var(--ui-transition-fast);\r\n }\r\n\r\n .field-item__handle:active {\r\n cursor: grabbing;\r\n }\r\n\r\n .field-item:hover .field-item__handle {\r\n color: var(--ui-color-text-secondary);\r\n }\r\n\r\n /* Icona tipo campo */\r\n .field-item__icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n border-radius: var(--ui-radius-sm);\r\n background: var(--ui-color-bg-subtle);\r\n color: var(--ui-color-primary);\r\n }\r\n\r\n /* Informazioni campo */\r\n .field-item__info {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n min-width: 0;\r\n }\r\n\r\n .field-item__label {\r\n font-size: var(--ui-font-size-sm);\r\n font-weight: 500;\r\n color: var(--ui-color-text);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n .field-item__required {\r\n color: var(--ui-color-warn);\r\n margin-left: var(--ui-spacing-1);\r\n }\r\n\r\n .field-item__key {\r\n font-size: var(--ui-font-size-xs);\r\n color: var(--ui-color-text-muted);\r\n font-family: monospace;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n /* Badge tipo campo */\r\n .field-item__type-badge {\r\n font-size: var(--ui-font-size-xs);\r\n color: var(--ui-color-primary);\r\n background: var(--ui-color-primary-bg);\r\n padding: 2px var(--ui-spacing-2);\r\n border-radius: var(--ui-radius-sm);\r\n white-space: nowrap;\r\n font-weight: 500;\r\n }\r\n\r\n /* Azioni campo */\r\n .field-item__actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1);\r\n opacity: 0;\r\n transition: opacity var(--ui-transition-fast);\r\n }\r\n\r\n .field-item:hover .field-item__actions {\r\n opacity: 1;\r\n }\r\n\r\n /* ─── CDK Drag & Drop ───────────────────────────────────── */\r\n\r\n .cdk-drag-preview {\r\n box-sizing: border-box;\r\n border-radius: var(--ui-radius-sm);\r\n box-shadow: var(--ui-shadow-md);\r\n background: var(--ui-color-surface);\r\n padding: var(--ui-spacing-2) var(--ui-spacing-3);\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2);\r\n }\r\n\r\n .cdk-drag-placeholder {\r\n opacity: 0.3;\r\n }\r\n\r\n .cdk-drag-animating {\r\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiSectionEditorComponent {\r\n /** Sezione del form da renderizzare. */\r\n @Input({ required: true }) section!: UiFormSection;\r\n\r\n /** Indica se la sezione e attualmente selezionata. */\r\n @Input() isSelected = false;\r\n\r\n /** Chiave del campo attualmente selezionato (o null). */\r\n @Input() selectedFieldKey: string | null = null;\r\n\r\n /** Emette aggiornamenti parziali alla sezione. */\r\n @Output() sectionUpdate = new EventEmitter<Partial<UiFormSection>>();\r\n\r\n /** Emette richiesta di eliminazione della sezione. */\r\n @Output() sectionDelete = new EventEmitter<void>();\r\n\r\n /** Emette richiesta di duplicazione della sezione. */\r\n @Output() sectionDuplicate = new EventEmitter<void>();\r\n\r\n /** Emette la chiave del campo selezionato. */\r\n @Output() fieldSelect = new EventEmitter<string>();\r\n\r\n /** Emette la chiave del campo da duplicare. */\r\n @Output() fieldDuplicate = new EventEmitter<string>();\r\n\r\n /** Emette la chiave del campo da eliminare. */\r\n @Output() fieldDelete = new EventEmitter<string>();\r\n\r\n /** Emette l'evento di drop del CDK drag & drop. */\r\n @Output() fieldDrop = new EventEmitter<CdkDragDrop<any>>();\r\n\r\n /** Stato di espansione della sezione. */\r\n isExpanded = true;\r\n\r\n /** Indica se il titolo e in fase di modifica inline. */\r\n isEditingTitle = false;\r\n\r\n /** Titolo temporaneo durante la modifica inline. */\r\n tempTitle = '';\r\n\r\n /**\r\n * Alterna lo stato di espansione/collasso della sezione.\r\n */\r\n toggleExpand(): void {\r\n this.isExpanded = !this.isExpanded;\r\n }\r\n\r\n /**\r\n * Avvia la modifica inline del titolo della sezione.\r\n * @param event - Evento del mouse per prevenire la propagazione.\r\n */\r\n startTitleEdit(event: Event): void {\r\n event.stopPropagation();\r\n this.tempTitle = this.section.title || '';\r\n this.isEditingTitle = true;\r\n }\r\n\r\n /**\r\n * Conferma la modifica del titolo ed emette l'aggiornamento.\r\n */\r\n confirmTitleEdit(): void {\r\n if (this.isEditingTitle) {\r\n this.isEditingTitle = false;\r\n const trimmed = this.tempTitle.trim();\r\n if (trimmed && trimmed !== this.section.title) {\r\n this.sectionUpdate.emit({ title: trimmed });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Annulla la modifica del titolo, ripristinando il valore originale.\r\n */\r\n cancelTitleEdit(): void {\r\n this.isEditingTitle = false;\r\n this.tempTitle = '';\r\n }\r\n\r\n /**\r\n * Restituisce il nome dell'icona Lucide associata al tipo di campo.\r\n * @param type - Tipo di campo del form.\r\n * @returns Nome dell'icona Lucide.\r\n */\r\n getFieldIcon(type: UiFieldType): string {\r\n return FIELD_ICON_MAP[type] || 'help-circle';\r\n }\r\n\r\n /**\r\n * Gestisce l'evento di drop del CDK drag & drop e lo propaga al parent.\r\n * @param event - Evento CdkDragDrop.\r\n */\r\n onFieldDrop(event: CdkDragDrop<any>): void {\r\n this.fieldDrop.emit(event);\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiButtonComponent } from '../../../button/index';\r\nimport { UiValidationRule, UiValidationType, UiCrossFieldOperator } from '../../../form-builder/types/index';\r\n\r\n/**\r\n * Interfaccia per le opzioni dei tipi di validazione nella select.\r\n */\r\ninterface ValidationTypeOption {\r\n /** Valore del tipo di validazione. */\r\n value: UiValidationType;\r\n /** Etichetta visualizzata nella select. */\r\n label: string;\r\n}\r\n\r\n/**\r\n * Interfaccia per le opzioni degli operatori cross-field nella select.\r\n */\r\ninterface CrossFieldOperatorOption {\r\n /** Valore dell'operatore. */\r\n value: UiCrossFieldOperator;\r\n /** Etichetta visualizzata nella select. */\r\n label: string;\r\n}\r\n\r\n/**\r\n * Editor per le regole di validazione dei campi.\r\n *\r\n * Permette di aggiungere, modificare e rimuovere regole di validazione\r\n * per un campo del form builder. Supporta validazioni standard,\r\n * cross-field, date e file.\r\n *\r\n * @selector ui-validation-editor\r\n */\r\n@Component({\r\n selector: 'ui-validation-editor',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n MatCardModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n LucideAngularModule,\r\n UiButtonComponent,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <!-- Intestazione con titolo e pulsante aggiungi -->\r\n <div class=\"ui-validation-editor__header\">\r\n <h4 class=\"ui-validation-editor__title\">Regole di Validazione</h4>\r\n <ui-button\r\n icon=\"plus\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n tooltip=\"Aggiungi regola di validazione\"\r\n ariaLabel=\"Aggiungi regola di validazione\"\r\n (click)=\"addValidation()\"\r\n />\r\n </div>\r\n\r\n <!-- Lista delle regole di validazione -->\r\n @if (validations.length > 0) {\r\n <div class=\"ui-validation-editor__list\">\r\n @for (rule of validations; track $index) {\r\n <mat-card class=\"ui-validation-editor__card\" appearance=\"outlined\">\r\n <mat-card-content>\r\n <!-- Riga principale: tipo + elimina -->\r\n <div class=\"ui-validation-editor__card-row\">\r\n <mat-form-field class=\"ui-validation-editor__field ui-validation-editor__field--type\" appearance=\"outline\">\r\n <mat-label>Tipo</mat-label>\r\n <mat-select\r\n [ngModel]=\"rule.type\"\r\n (ngModelChange)=\"onTypeChange($index, $event)\"\r\n >\r\n @for (opt of validationTypes; track opt.value) {\r\n <mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <ui-button\r\n icon=\"trash-2\"\r\n variant=\"warn\"\r\n size=\"sm\"\r\n tooltip=\"Elimina regola\"\r\n ariaLabel=\"Elimina regola\"\r\n (click)=\"removeValidation($index)\"\r\n />\r\n </div>\r\n\r\n <!-- Campo valore (se il tipo lo richiede) -->\r\n @if (requiresValue(rule.type)) {\r\n <mat-form-field class=\"ui-validation-editor__field ui-validation-editor__field--full\" appearance=\"outline\">\r\n <mat-label>Valore</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"rule.value\"\r\n (ngModelChange)=\"onValueChange($index, $event)\"\r\n [placeholder]=\"getValuePlaceholder(rule.type)\"\r\n />\r\n </mat-form-field>\r\n }\r\n\r\n <!-- Configurazione cross-field -->\r\n @if (rule.type === 'crossField') {\r\n <div class=\"ui-validation-editor__cross-field\">\r\n <span class=\"ui-validation-editor__cross-field-label\">\r\n <lucide-icon name=\"git-compare\" [size]=\"14\" />\r\n Configurazione cross-field\r\n </span>\r\n\r\n <mat-form-field class=\"ui-validation-editor__field ui-validation-editor__field--full\" appearance=\"outline\">\r\n <mat-label>Campo di confronto</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"rule.crossField?.targetField || ''\"\r\n (ngModelChange)=\"onCrossFieldTargetChange($index, $event)\"\r\n placeholder=\"Chiave del campo target\"\r\n />\r\n </mat-form-field>\r\n\r\n <div class=\"ui-validation-editor__card-row\">\r\n <mat-form-field class=\"ui-validation-editor__field\" appearance=\"outline\">\r\n <mat-label>Operatore</mat-label>\r\n <mat-select\r\n [ngModel]=\"rule.crossField?.operator || 'greater_than'\"\r\n (ngModelChange)=\"onCrossFieldOperatorChange($index, $event)\"\r\n >\r\n @for (op of crossFieldOperators; track op.value) {\r\n <mat-option [value]=\"op.value\">{{ op.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"ui-validation-editor__field\" appearance=\"outline\">\r\n <mat-label>Tipo dato</mat-label>\r\n <mat-select\r\n [ngModel]=\"rule.crossField?.dataType || 'number'\"\r\n (ngModelChange)=\"onCrossFieldDataTypeChange($index, $event)\"\r\n >\r\n <mat-option value=\"date\">Data</mat-option>\r\n <mat-option value=\"number\">Numero</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Messaggio di errore personalizzato -->\r\n <mat-form-field class=\"ui-validation-editor__field ui-validation-editor__field--full\" appearance=\"outline\">\r\n <mat-label>Messaggio di errore</mat-label>\r\n <textarea\r\n matInput\r\n [ngModel]=\"rule.message || ''\"\r\n (ngModelChange)=\"onMessageChange($index, $event)\"\r\n placeholder=\"Messaggio personalizzato...\"\r\n rows=\"2\"\r\n ></textarea>\r\n </mat-form-field>\r\n </mat-card-content>\r\n </mat-card>\r\n }\r\n </div>\r\n } @else {\r\n <!-- Stato vuoto -->\r\n <div class=\"ui-validation-editor__empty\">\r\n <lucide-icon name=\"ruler\" [size]=\"32\" class=\"ui-validation-editor__empty-icon\" />\r\n <p class=\"ui-validation-editor__empty-text\">Nessuna regola di validazione configurata.</p>\r\n <p class=\"ui-validation-editor__empty-hint\">\r\n Clicca il pulsante \"+\" per aggiungere una regola.\r\n </p>\r\n </div>\r\n }\r\n `,\r\n styles: [\r\n `\r\n :host {\r\n display: block;\r\n }\r\n\r\n .ui-validation-editor__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: var(--ui-spacing-3);\r\n }\r\n\r\n .ui-validation-editor__title {\r\n margin: 0;\r\n font-size: var(--ui-font-size-sm);\r\n font-weight: 600;\r\n color: var(--ui-color-text);\r\n }\r\n\r\n .ui-validation-editor__list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ui-spacing-3);\r\n }\r\n\r\n .ui-validation-editor__card {\r\n background: var(--ui-color-surface);\r\n border: 1px solid var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n box-shadow: var(--ui-shadow-sm);\r\n }\r\n\r\n .ui-validation-editor__card-row {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: var(--ui-spacing-2);\r\n }\r\n\r\n .ui-validation-editor__field {\r\n flex: 1;\r\n width: 100%;\r\n }\r\n\r\n .ui-validation-editor__field--type {\r\n flex: 1;\r\n }\r\n\r\n .ui-validation-editor__field--full {\r\n width: 100%;\r\n }\r\n\r\n .ui-validation-editor__cross-field {\r\n border: 1px dashed var(--ui-color-border);\r\n border-radius: var(--ui-radius-sm);\r\n padding: var(--ui-spacing-3);\r\n margin-bottom: var(--ui-spacing-2);\r\n background: var(--ui-color-bg-subtle);\r\n }\r\n\r\n .ui-validation-editor__cross-field-label {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1);\r\n font-size: var(--ui-font-size-xs);\r\n font-weight: 600;\r\n color: var(--ui-color-text-secondary);\r\n margin-bottom: var(--ui-spacing-2);\r\n }\r\n\r\n .ui-validation-editor__empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--ui-spacing-6) var(--ui-spacing-4);\r\n border: 1px dashed var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n background: var(--ui-color-bg-subtle);\r\n text-align: center;\r\n }\r\n\r\n .ui-validation-editor__empty-icon {\r\n color: var(--ui-color-text-muted);\r\n margin-bottom: var(--ui-spacing-2);\r\n }\r\n\r\n .ui-validation-editor__empty-text {\r\n margin: 0;\r\n font-size: var(--ui-font-size-sm);\r\n color: var(--ui-color-text-secondary);\r\n }\r\n\r\n .ui-validation-editor__empty-hint {\r\n margin: var(--ui-spacing-1) 0 0;\r\n font-size: var(--ui-font-size-xs);\r\n color: var(--ui-color-text-muted);\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiValidationEditorComponent {\r\n /** Lista delle regole di validazione da editare. */\r\n @Input() validations: UiValidationRule[] = [];\r\n\r\n /** Emesso quando la lista di regole viene modificata. */\r\n @Output() validationsChange = new EventEmitter<UiValidationRule[]>();\r\n\r\n /** Opzioni disponibili per il tipo di validazione. */\r\n readonly validationTypes: ValidationTypeOption[] = [\r\n { value: 'required', label: 'Obbligatorio' },\r\n { value: 'email', label: 'Email' },\r\n { value: 'min', label: 'Valore minimo' },\r\n { value: 'max', label: 'Valore massimo' },\r\n { value: 'minLength', label: 'Lunghezza minima' },\r\n { value: 'maxLength', label: 'Lunghezza massima' },\r\n { value: 'pattern', label: 'Pattern (regex)' },\r\n { value: 'crossField', label: 'Cross-field' },\r\n { value: 'date-min', label: 'Data minima' },\r\n { value: 'date-max', label: 'Data massima' },\r\n { value: 'fileSize', label: 'Dimensione file' },\r\n { value: 'fileType', label: 'Tipo file' },\r\n { value: 'fileCount', label: 'Numero file' },\r\n ];\r\n\r\n /** Opzioni per gli operatori di confronto cross-field. */\r\n readonly crossFieldOperators: CrossFieldOperatorOption[] = [\r\n { value: 'greater_than', label: 'Maggiore di' },\r\n { value: 'greater_equal', label: 'Maggiore o uguale' },\r\n { value: 'less_than', label: 'Minore di' },\r\n { value: 'less_equal', label: 'Minore o uguale' },\r\n { value: 'not_equal', label: 'Diverso da' },\r\n ];\r\n\r\n /**\r\n * Verifica se il tipo di validazione richiede un campo valore.\r\n * @param type - Tipo di validazione da verificare\r\n * @returns true se il tipo richiede un valore\r\n */\r\n requiresValue(type: UiValidationType): boolean {\r\n return ['min', 'max', 'minLength', 'maxLength', 'pattern', 'fileSize', 'fileCount'].includes(type);\r\n }\r\n\r\n /**\r\n * Restituisce il placeholder appropriato per il campo valore\r\n * in base al tipo di validazione selezionato.\r\n * @param type - Tipo di validazione\r\n * @returns Stringa placeholder\r\n */\r\n getValuePlaceholder(type: UiValidationType): string {\r\n const placeholders: Partial<Record<UiValidationType, string>> = {\r\n min: 'Valore numerico minimo',\r\n max: 'Valore numerico massimo',\r\n minLength: 'Lunghezza minima (numero)',\r\n maxLength: 'Lunghezza massima (numero)',\r\n pattern: 'Espressione regolare (regex)',\r\n fileSize: 'Dimensione massima in bytes',\r\n fileCount: 'Numero massimo di file',\r\n };\r\n return placeholders[type] || 'Inserisci valore';\r\n }\r\n\r\n /**\r\n * Aggiunge una nuova regola di validazione con valori predefiniti.\r\n */\r\n addValidation(): void {\r\n const updated: UiValidationRule[] = [...this.validations, { type: 'required', message: '' }];\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Rimuove la regola di validazione all'indice specificato.\r\n * @param index - Indice della regola da rimuovere\r\n */\r\n removeValidation(index: number): void {\r\n const updated = this.validations.filter((_, i) => i !== index);\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del tipo di validazione.\r\n * Se il tipo diventa 'crossField', inizializza la configurazione cross-field.\r\n * @param index - Indice della regola\r\n * @param type - Nuovo tipo di validazione\r\n */\r\n onTypeChange(index: number, type: UiValidationType): void {\r\n const updated = this.cloneValidations();\r\n updated[index] = { ...updated[index], type };\r\n\r\n // Inizializza la configurazione cross-field se necessario\r\n if (type === 'crossField' && !updated[index].crossField) {\r\n updated[index].crossField = {\r\n targetField: '',\r\n operator: 'greater_than',\r\n dataType: 'number',\r\n };\r\n }\r\n\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del valore della regola.\r\n * @param index - Indice della regola\r\n * @param value - Nuovo valore\r\n */\r\n onValueChange(index: number, value: any): void {\r\n const updated = this.cloneValidations();\r\n updated[index] = { ...updated[index], value };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del messaggio di errore.\r\n * @param index - Indice della regola\r\n * @param message - Nuovo messaggio\r\n */\r\n onMessageChange(index: number, message: string): void {\r\n const updated = this.cloneValidations();\r\n updated[index] = { ...updated[index], message };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del campo target nella configurazione cross-field.\r\n * @param index - Indice della regola\r\n * @param targetField - Nuova chiave del campo target\r\n */\r\n onCrossFieldTargetChange(index: number, targetField: string): void {\r\n const updated = this.cloneValidations();\r\n updated[index] = {\r\n ...updated[index],\r\n crossField: {\r\n ...updated[index].crossField!,\r\n targetField,\r\n },\r\n };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio dell'operatore nella configurazione cross-field.\r\n * @param index - Indice della regola\r\n * @param operator - Nuovo operatore\r\n */\r\n onCrossFieldOperatorChange(index: number, operator: UiCrossFieldOperator): void {\r\n const updated = this.cloneValidations();\r\n updated[index] = {\r\n ...updated[index],\r\n crossField: {\r\n ...updated[index].crossField!,\r\n operator,\r\n },\r\n };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del tipo di dato nella configurazione cross-field.\r\n * @param index - Indice della regola\r\n * @param dataType - Nuovo tipo di dato ('date' | 'number')\r\n */\r\n onCrossFieldDataTypeChange(index: number, dataType: 'date' | 'number'): void {\r\n const updated = this.cloneValidations();\r\n updated[index] = {\r\n ...updated[index],\r\n crossField: {\r\n ...updated[index].crossField!,\r\n dataType,\r\n },\r\n };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Clona l'array delle validazioni per garantire immutabilita.\r\n * @returns Copia superficiale dell'array di validazioni\r\n */\r\n private cloneValidations(): UiValidationRule[] {\r\n return this.validations.map((v) => ({ ...v }));\r\n }\r\n\r\n /**\r\n * Emette l'evento di cambio validazioni.\r\n * @param validations - Nuova lista di validazioni\r\n */\r\n private emitChange(validations: UiValidationRule[]): void {\r\n this.validations = validations;\r\n this.validationsChange.emit(validations);\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder-editor\r\n * Componente editor delle opzioni per campi di tipo select, radio e multiselect.\r\n *\r\n * Permette di aggiungere, modificare, riordinare e rimuovere le opzioni\r\n * di un campo di scelta, con supporto per valore, etichetta e stato disabilitato.\r\n */\r\n\r\nimport { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\n\r\nimport { UiButtonComponent } from '../../../button/index';\r\nimport { UiFieldOption } from '../../../form-builder/types/index';\r\n\r\n/**\r\n * Editor per le opzioni di un campo di scelta (select, radio, multiselect).\r\n *\r\n * Mostra una lista di opzioni con:\r\n * - Header con titolo e pulsante per aggiungere nuove opzioni\r\n * - Per ogni opzione: input valore, input etichetta, checkbox disabilitato,\r\n * frecce per spostamento su/giu, pulsante elimina\r\n * - Stato vuoto quando non ci sono opzioni configurate\r\n */\r\n@Component({\r\n selector: 'ui-options-editor',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n FormsModule,\r\n MatCardModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatCheckboxModule,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n UiButtonComponent,\r\n ],\r\n template: `\r\n <mat-card class=\"options-card\">\r\n <!-- Header -->\r\n <div class=\"options-header\">\r\n <span class=\"options-header__title\">\r\n <lucide-icon name=\"list\" [size]=\"16\" />\r\n Opzioni del Campo\r\n </span>\r\n <ui-button\r\n icon=\"plus\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n ariaLabel=\"Aggiungi opzione\"\r\n tooltip=\"Aggiungi opzione\"\r\n (click)=\"addOption()\"\r\n />\r\n </div>\r\n\r\n <!-- Lista opzioni -->\r\n <div class=\"options-list\">\r\n @for (option of normalizedOptions; track $index) {\r\n <div class=\"option-row\">\r\n <!-- Indice opzione -->\r\n <span class=\"option-row__index\">{{ $index + 1 }}</span>\r\n\r\n <!-- Input valore -->\r\n <mat-form-field class=\"option-row__field\" appearance=\"outline\">\r\n <mat-label>Valore</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"option.value\"\r\n (ngModelChange)=\"updateOption($index, 'value', $event)\"\r\n placeholder=\"Valore\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- Input etichetta -->\r\n <mat-form-field class=\"option-row__field\" appearance=\"outline\">\r\n <mat-label>Etichetta</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"option.label\"\r\n (ngModelChange)=\"updateOption($index, 'label', $event)\"\r\n placeholder=\"Etichetta\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- Checkbox disabilitato -->\r\n <mat-checkbox\r\n [checked]=\"!!option.disabled\"\r\n (change)=\"updateOption($index, 'disabled', $event.checked)\"\r\n matTooltip=\"Opzione disabilitata\"\r\n class=\"option-row__checkbox\"\r\n >\r\n <span class=\"option-row__checkbox-label\">Disab.</span>\r\n </mat-checkbox>\r\n\r\n <!-- Azioni di riordino e rimozione -->\r\n <div class=\"option-row__actions\">\r\n <ui-button\r\n icon=\"arrow-up\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n ariaLabel=\"Sposta su\"\r\n tooltip=\"Sposta su\"\r\n [disabled]=\"$index === 0\"\r\n (click)=\"moveOption($index, -1)\"\r\n />\r\n\r\n <ui-button\r\n icon=\"arrow-down\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n ariaLabel=\"Sposta giu\"\r\n tooltip=\"Sposta giu\"\r\n [disabled]=\"$index === normalizedOptions.length - 1\"\r\n (click)=\"moveOption($index, 1)\"\r\n />\r\n\r\n <ui-button\r\n icon=\"trash-2\"\r\n variant=\"warn\"\r\n size=\"xs\"\r\n ariaLabel=\"Elimina opzione\"\r\n tooltip=\"Elimina opzione\"\r\n (click)=\"removeOption($index)\"\r\n />\r\n </div>\r\n </div>\r\n } @empty {\r\n <!-- Stato vuoto -->\r\n <div class=\"options-empty\">\r\n <lucide-icon name=\"inbox\" [size]=\"24\" />\r\n <span>Nessuna opzione configurata</span>\r\n </div>\r\n }\r\n </div>\r\n </mat-card>\r\n `,\r\n styles: [\r\n `\r\n /* ─── Card opzioni ──────────────────────────────────────── */\r\n\r\n :host {\r\n display: block;\r\n }\r\n\r\n .options-card {\r\n border: 1px solid var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n overflow: hidden;\r\n }\r\n\r\n /* ─── Header ────────────────────────────────────────────── */\r\n\r\n .options-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: var(--ui-spacing-3) var(--ui-spacing-4);\r\n background: var(--ui-color-bg-subtle);\r\n border-bottom: 1px solid var(--ui-color-border);\r\n }\r\n\r\n .options-header__title {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2);\r\n font-size: var(--ui-font-size-sm);\r\n font-weight: 600;\r\n color: var(--ui-color-text);\r\n }\r\n\r\n /* ─── Lista opzioni ─────────────────────────────────────── */\r\n\r\n .options-list {\r\n padding: var(--ui-spacing-3);\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ui-spacing-2);\r\n }\r\n\r\n /* ─── Riga opzione ──────────────────────────────────────── */\r\n\r\n .option-row {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2);\r\n padding: var(--ui-spacing-2);\r\n background: var(--ui-color-surface);\r\n border: 1px solid var(--ui-color-border);\r\n border-radius: var(--ui-radius-sm);\r\n transition: border-color var(--ui-transition-fast),\r\n box-shadow var(--ui-transition-fast);\r\n }\r\n\r\n .option-row:hover {\r\n border-color: var(--ui-color-primary);\r\n box-shadow: var(--ui-shadow-sm);\r\n }\r\n\r\n .option-row__index {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 24px;\r\n height: 24px;\r\n border-radius: 50%;\r\n background: var(--ui-color-bg-subtle);\r\n color: var(--ui-color-text-muted);\r\n font-size: var(--ui-font-size-xs);\r\n font-weight: 600;\r\n flex-shrink: 0;\r\n }\r\n\r\n .option-row__field {\r\n flex: 1;\r\n min-width: 0;\r\n }\r\n\r\n /* Riduce l'altezza dei form field inline */\r\n .option-row__field ::ng-deep .mat-mdc-form-field-infix {\r\n padding-top: var(--ui-spacing-1) !important;\r\n padding-bottom: var(--ui-spacing-1) !important;\r\n min-height: unset;\r\n }\r\n\r\n .option-row__field ::ng-deep .mat-mdc-form-field-subscript-wrapper {\r\n display: none;\r\n }\r\n\r\n .option-row__checkbox {\r\n flex-shrink: 0;\r\n }\r\n\r\n .option-row__checkbox-label {\r\n font-size: var(--ui-font-size-xs);\r\n color: var(--ui-color-text-secondary);\r\n }\r\n\r\n .option-row__actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1);\r\n flex-shrink: 0;\r\n }\r\n\r\n /* ─── Stato vuoto ───────────────────────────────────────── */\r\n\r\n .options-empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--ui-spacing-2);\r\n padding: var(--ui-spacing-6) var(--ui-spacing-4);\r\n color: var(--ui-color-text-muted);\r\n font-size: var(--ui-font-size-sm);\r\n }\r\n\r\n `,\r\n ],\r\n})\r\nexport class UiOptionsEditorComponent {\r\n /**\r\n * Opzioni del campo da modificare.\r\n * Accetta sia un array di UiFieldOption che un valore generico\r\n * (per gestire campi non ancora configurati).\r\n */\r\n @Input() options: UiFieldOption[] | any = [];\r\n\r\n /** Emette l'array aggiornato delle opzioni ad ogni modifica. */\r\n @Output() optionsChange = new EventEmitter<UiFieldOption[]>();\r\n\r\n /**\r\n * Normalizza l'input per garantire che sia sempre un array valido.\r\n * Gestisce il caso in cui le opzioni siano null, undefined o di tipo inatteso.\r\n */\r\n get normalizedOptions(): UiFieldOption[] {\r\n if (Array.isArray(this.options)) {\r\n return this.options;\r\n }\r\n return [];\r\n }\r\n\r\n /**\r\n * Aggiunge una nuova opzione vuota alla lista e notifica il parent.\r\n */\r\n addOption(): void {\r\n const newOption: UiFieldOption = {\r\n value: '',\r\n label: '',\r\n disabled: false,\r\n };\r\n const updated = [...this.normalizedOptions, newOption];\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Aggiorna una proprieta specifica di un'opzione.\r\n * @param index - Indice dell'opzione da aggiornare.\r\n * @param field - Nome della proprieta da modificare.\r\n * @param value - Nuovo valore della proprieta.\r\n */\r\n updateOption(index: number, field: keyof UiFieldOption, value: any): void {\r\n const updated = this.normalizedOptions.map((opt, i) => (i === index ? { ...opt, [field]: value } : opt));\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Rimuove un'opzione dalla lista.\r\n * @param index - Indice dell'opzione da rimuovere.\r\n */\r\n removeOption(index: number): void {\r\n const updated = this.normalizedOptions.filter((_, i) => i !== index);\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Sposta un'opzione in alto o in basso nella lista.\r\n * @param index - Indice corrente dell'opzione.\r\n * @param direction - Direzione dello spostamento: -1 (su) o +1 (giu).\r\n */\r\n moveOption(index: number, direction: -1 | 1): void {\r\n const newIndex = index + direction;\r\n if (newIndex < 0 || newIndex >= this.normalizedOptions.length) {\r\n return;\r\n }\r\n const updated = [...this.normalizedOptions];\r\n const [moved] = updated.splice(index, 1);\r\n updated.splice(newIndex, 0, moved);\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Emette l'array aggiornato delle opzioni.\r\n * @param options - Nuovo array di opzioni.\r\n */\r\n private emitChange(options: UiFieldOption[]): void {\r\n this.optionsChange.emit(options);\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiButtonComponent } from '../../../button/index';\r\nimport { UiFieldCondition, UiConditionalOperator } from '../../../form-builder/types/index';\r\nimport { UiEditorAvailableField } from '../../types/editor.types';\r\n\r\n/**\r\n * Interfaccia per le opzioni degli operatori condizionali nella select.\r\n */\r\ninterface OperatorOption {\r\n /** Valore dell'operatore. */\r\n value: UiConditionalOperator;\r\n /** Etichetta visualizzata nella select. */\r\n label: string;\r\n}\r\n\r\n/**\r\n * Editor per le condizioni di visibilita/disabilitazione dei campi.\r\n *\r\n * Permette di configurare condizioni con editor visuale o JSON.\r\n * Supporta operatori di confronto multipli, logica AND/OR\r\n * e selezione dei valori dalle opzioni dei campi disponibili.\r\n *\r\n * @selector ui-condition-editor\r\n */\r\n@Component({\r\n selector: 'ui-condition-editor',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n MatCardModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n LucideAngularModule,\r\n UiButtonComponent,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <!-- Intestazione con titolo, statistiche e controlli -->\r\n <div class=\"ui-condition-editor__header\">\r\n <div class=\"ui-condition-editor__header-left\">\r\n <h4 class=\"ui-condition-editor__title\">{{ title }}</h4>\r\n @if (conditions.length > 0) {\r\n <span class=\"ui-condition-editor__badge\">{{ conditions.length }}</span>\r\n }\r\n </div>\r\n <div class=\"ui-condition-editor__header-actions\">\r\n <!-- Pulsante formattazione JSON (solo in modalita JSON) -->\r\n @if (jsonMode) {\r\n <ui-button\r\n icon=\"braces\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n tooltip=\"Formatta JSON\"\r\n ariaLabel=\"Formatta JSON\"\r\n (click)=\"formatJson()\"\r\n />\r\n }\r\n\r\n <!-- Toggle modalita JSON/visuale -->\r\n <ui-button\r\n [icon]=\"jsonMode ? 'eye' : 'code'\"\r\n [variant]=\"jsonMode ? 'primary' : 'ghost'\"\r\n size=\"xs\"\r\n [tooltip]=\"jsonMode ? 'Editor visuale' : 'Editor JSON'\"\r\n [ariaLabel]=\"jsonMode ? 'Editor visuale' : 'Editor JSON'\"\r\n (click)=\"toggleJsonMode()\"\r\n />\r\n\r\n <!-- Pulsante pulisci tutto -->\r\n @if (conditions.length > 0) {\r\n <ui-button\r\n icon=\"x\"\r\n variant=\"warn\"\r\n size=\"xs\"\r\n tooltip=\"Rimuovi tutte le condizioni\"\r\n ariaLabel=\"Rimuovi tutte le condizioni\"\r\n (click)=\"clearAll()\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Editor JSON -->\r\n @if (jsonMode) {\r\n <div class=\"ui-condition-editor__json\">\r\n <textarea\r\n class=\"ui-condition-editor__json-textarea\"\r\n [ngModel]=\"jsonText\"\r\n (ngModelChange)=\"onJsonChange($event)\"\r\n rows=\"8\"\r\n placeholder='[{ \"field\": \"...\", \"operator\": \"equals\", \"value\": \"...\" }]'\r\n spellcheck=\"false\"\r\n ></textarea>\r\n @if (jsonError) {\r\n <div class=\"ui-condition-editor__json-error\">\r\n <lucide-icon name=\"alert-triangle\" [size]=\"14\" />\r\n <span>{{ jsonError }}</span>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <!-- Editor visuale -->\r\n @if (availableFields.length === 0) {\r\n <div class=\"ui-condition-editor__warning\">\r\n <lucide-icon name=\"alert-triangle\" [size]=\"16\" />\r\n <span>Nessun campo disponibile per le condizioni.</span>\r\n </div>\r\n }\r\n\r\n @if (conditions.length > 0) {\r\n <div class=\"ui-condition-editor__list\">\r\n @for (cond of conditions; track $index) {\r\n <div class=\"ui-condition-editor__condition-wrapper\">\r\n <!-- Selettore logica AND/OR (dal secondo elemento) -->\r\n @if ($index > 0) {\r\n <div class=\"ui-condition-editor__logic-row\">\r\n <ui-button\r\n label=\"AND\"\r\n [variant]=\"(cond.logic || 'AND') === 'AND' ? 'primary' : 'outline'\"\r\n size=\"xs\"\r\n (click)=\"onLogicChange($index, 'AND')\"\r\n />\r\n <ui-button\r\n label=\"OR\"\r\n [variant]=\"cond.logic === 'OR' ? 'primary' : 'outline'\"\r\n size=\"xs\"\r\n (click)=\"onLogicChange($index, 'OR')\"\r\n />\r\n </div>\r\n }\r\n\r\n <mat-card class=\"ui-condition-editor__card\" appearance=\"outlined\">\r\n <mat-card-content>\r\n <div class=\"ui-condition-editor__card-grid\">\r\n <!-- Selezione campo -->\r\n <mat-form-field class=\"ui-condition-editor__field\" appearance=\"outline\">\r\n <mat-label>Campo</mat-label>\r\n <mat-select\r\n [ngModel]=\"cond.field\"\r\n (ngModelChange)=\"onFieldChange($index, $event)\"\r\n >\r\n @for (f of availableFields; track f.key) {\r\n <mat-option [value]=\"f.key\">{{ f.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- Selezione operatore -->\r\n <mat-form-field class=\"ui-condition-editor__field\" appearance=\"outline\">\r\n <mat-label>Operatore</mat-label>\r\n <mat-select\r\n [ngModel]=\"cond.operator\"\r\n (ngModelChange)=\"onOperatorChange($index, $event)\"\r\n >\r\n @for (op of operators; track op.value) {\r\n <mat-option [value]=\"op.value\">{{ op.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- Campo valore (se l'operatore lo richiede) -->\r\n @if (!isNoValueOperator(cond.operator)) {\r\n <!-- Select multipla per in_array/not_in_array con opzioni disponibili -->\r\n @if (isArrayOperator(cond.operator) && getFieldOptions(cond.field).length > 0) {\r\n <mat-form-field class=\"ui-condition-editor__field\" appearance=\"outline\">\r\n <mat-label>Valori</mat-label>\r\n <mat-select\r\n [ngModel]=\"ensureArray(cond.value)\"\r\n (ngModelChange)=\"onValueChange($index, $event)\"\r\n multiple\r\n >\r\n @for (opt of getFieldOptions(cond.field); track opt.value) {\r\n <mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n } @else if (getFieldOptions(cond.field).length > 0 && !isArrayOperator(cond.operator)) {\r\n <!-- Select singola se il campo ha opzioni -->\r\n <mat-form-field class=\"ui-condition-editor__field\" appearance=\"outline\">\r\n <mat-label>Valore</mat-label>\r\n <mat-select\r\n [ngModel]=\"cond.value\"\r\n (ngModelChange)=\"onValueChange($index, $event)\"\r\n >\r\n @for (opt of getFieldOptions(cond.field); track opt.value) {\r\n <mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n } @else {\r\n <!-- Input testo libero -->\r\n <mat-form-field class=\"ui-condition-editor__field\" appearance=\"outline\">\r\n <mat-label>Valore</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"cond.value\"\r\n (ngModelChange)=\"onValueChange($index, $event)\"\r\n placeholder=\"Inserisci valore\"\r\n />\r\n </mat-form-field>\r\n }\r\n }\r\n\r\n <!-- Pulsante rimuovi -->\r\n <ui-button\r\n icon=\"trash-2\"\r\n variant=\"warn\"\r\n size=\"xs\"\r\n tooltip=\"Rimuovi condizione\"\r\n ariaLabel=\"Rimuovi condizione\"\r\n (click)=\"removeCondition($index)\"\r\n />\r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <!-- Stato vuoto (editor visuale) -->\r\n <div class=\"ui-condition-editor__empty\">\r\n <lucide-icon name=\"git-branch\" [size]=\"28\" class=\"ui-condition-editor__empty-icon\" />\r\n <p class=\"ui-condition-editor__empty-text\">Nessuna condizione configurata.</p>\r\n </div>\r\n }\r\n\r\n <!-- Pulsante aggiungi condizione -->\r\n <ui-button\r\n label=\"Aggiungi condizione\"\r\n icon=\"plus\"\r\n variant=\"outline\"\r\n size=\"sm\"\r\n [disabled]=\"availableFields.length === 0\"\r\n (click)=\"addCondition()\"\r\n />\r\n }\r\n `,\r\n styles: [\r\n `\r\n :host {\r\n display: block;\r\n }\r\n\r\n .ui-condition-editor__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: var(--ui-spacing-3);\r\n }\r\n\r\n .ui-condition-editor__header-left {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2);\r\n }\r\n\r\n .ui-condition-editor__title {\r\n margin: 0;\r\n font-size: var(--ui-font-size-sm);\r\n font-weight: 600;\r\n color: var(--ui-color-text);\r\n }\r\n\r\n .ui-condition-editor__badge {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 20px;\r\n height: 20px;\r\n padding: 0 var(--ui-spacing-1);\r\n border-radius: 10px;\r\n background: var(--ui-color-primary);\r\n color: var(--ui-color-surface);\r\n font-size: var(--ui-font-size-xs);\r\n font-weight: 600;\r\n line-height: 1;\r\n }\r\n\r\n .ui-condition-editor__header-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1);\r\n }\r\n\r\n /* --- Editor JSON --- */\r\n\r\n .ui-condition-editor__json {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ui-spacing-2);\r\n }\r\n\r\n .ui-condition-editor__json-textarea {\r\n width: 100%;\r\n min-height: 120px;\r\n padding: var(--ui-spacing-3);\r\n border: 1px solid var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n background: var(--ui-color-bg-subtle);\r\n color: var(--ui-color-text);\r\n font-family: 'Fira Code', 'Consolas', monospace;\r\n font-size: var(--ui-font-size-xs);\r\n line-height: 1.5;\r\n resize: vertical;\r\n box-sizing: border-box;\r\n\r\n &:focus {\r\n outline: none;\r\n border-color: var(--ui-color-primary);\r\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--ui-color-primary) 20%, transparent);\r\n }\r\n }\r\n\r\n .ui-condition-editor__json-error {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1);\r\n padding: var(--ui-spacing-2);\r\n border-radius: var(--ui-radius-sm);\r\n background: color-mix(in srgb, var(--ui-color-warn) 10%, transparent);\r\n color: var(--ui-color-warn);\r\n font-size: var(--ui-font-size-xs);\r\n }\r\n\r\n /* --- Avviso nessun campo disponibile --- */\r\n\r\n .ui-condition-editor__warning {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2);\r\n padding: var(--ui-spacing-3);\r\n margin-bottom: var(--ui-spacing-3);\r\n border-radius: var(--ui-radius-sm);\r\n background: color-mix(in srgb, var(--ui-color-warn) 10%, transparent);\r\n color: var(--ui-color-warn);\r\n font-size: var(--ui-font-size-xs);\r\n }\r\n\r\n /* --- Lista condizioni --- */\r\n\r\n .ui-condition-editor__list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0;\r\n margin-bottom: var(--ui-spacing-3);\r\n }\r\n\r\n .ui-condition-editor__condition-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .ui-condition-editor__logic-row {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--ui-spacing-1);\r\n padding: var(--ui-spacing-2) 0;\r\n }\r\n\r\n .ui-condition-editor__card {\r\n background: var(--ui-color-surface);\r\n border: 1px solid var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n box-shadow: var(--ui-shadow-sm);\r\n }\r\n\r\n .ui-condition-editor__card-grid {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: var(--ui-spacing-2);\r\n flex-wrap: wrap;\r\n }\r\n\r\n .ui-condition-editor__field {\r\n flex: 1;\r\n min-width: 140px;\r\n }\r\n\r\n /* --- Stato vuoto --- */\r\n\r\n .ui-condition-editor__empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--ui-spacing-5) var(--ui-spacing-4);\r\n margin-bottom: var(--ui-spacing-3);\r\n border: 1px dashed var(--ui-color-border);\r\n border-radius: var(--ui-radius-md);\r\n background: var(--ui-color-bg-subtle);\r\n text-align: center;\r\n }\r\n\r\n .ui-condition-editor__empty-icon {\r\n color: var(--ui-color-text-muted);\r\n margin-bottom: var(--ui-spacing-2);\r\n }\r\n\r\n .ui-condition-editor__empty-text {\r\n margin: 0;\r\n font-size: var(--ui-font-size-sm);\r\n color: var(--ui-color-text-secondary);\r\n }\r\n\r\n `,\r\n ],\r\n})\r\nexport class UiConditionEditorComponent {\r\n /** Lista delle condizioni da editare. */\r\n @Input() conditions: UiFieldCondition[] = [];\r\n\r\n /** Titolo visualizzato nell'intestazione. */\r\n @Input() title = 'Condizioni';\r\n\r\n /** Campi disponibili per la selezione nelle condizioni. */\r\n @Input() availableFields: UiEditorAvailableField[] = [];\r\n\r\n /** Emesso quando la lista di condizioni viene modificata. */\r\n @Output() conditionsChange = new EventEmitter<UiFieldCondition[]>();\r\n\r\n /** Indica se l'editor e in modalita JSON. */\r\n jsonMode = false;\r\n\r\n /** Testo JSON corrente nell'editor. */\r\n jsonText = '';\r\n\r\n /** Errore di parsing del JSON. */\r\n jsonError = '';\r\n\r\n /** Opzioni disponibili per gli operatori condizionali. */\r\n readonly operators: OperatorOption[] = [\r\n { value: 'equals', label: 'Uguale a' },\r\n { value: 'not_equals', label: 'Diverso da' },\r\n { value: 'contains', label: 'Contiene' },\r\n { value: 'not_contains', label: 'Non contiene' },\r\n { value: 'greater_than', label: 'Maggiore di' },\r\n { value: 'less_than', label: 'Minore di' },\r\n { value: 'greater_equal', label: 'Maggiore o uguale' },\r\n { value: 'less_equal', label: 'Minore o uguale' },\r\n { value: 'is_empty', label: 'Vuoto' },\r\n { value: 'is_not_empty', label: 'Non vuoto' },\r\n { value: 'in_array', label: 'Presente in lista' },\r\n { value: 'not_in_array', label: 'Non presente in lista' },\r\n ];\r\n\r\n /**\r\n * Verifica se l'operatore non richiede un campo valore.\r\n * @param operator - Operatore da verificare\r\n * @returns true se l'operatore non necessita di valore\r\n */\r\n isNoValueOperator(operator: UiConditionalOperator): boolean {\r\n return operator === 'is_empty' || operator === 'is_not_empty';\r\n }\r\n\r\n /**\r\n * Verifica se l'operatore opera su array di valori.\r\n * @param operator - Operatore da verificare\r\n * @returns true se l'operatore richiede un array di valori\r\n */\r\n isArrayOperator(operator: UiConditionalOperator): boolean {\r\n return operator === 'in_array' || operator === 'not_in_array';\r\n }\r\n\r\n /**\r\n * Restituisce le opzioni disponibili per un campo specifico.\r\n * @param fieldKey - Chiave del campo\r\n * @returns Array di opzioni del campo, vuoto se non disponibili\r\n */\r\n getFieldOptions(fieldKey: string): { value: any; label: string }[] {\r\n const field = this.availableFields.find((f) => f.key === fieldKey);\r\n return field?.options || [];\r\n }\r\n\r\n /**\r\n * Garantisce che il valore sia un array (per select multiple).\r\n * @param value - Valore da normalizzare\r\n * @returns Il valore come array\r\n */\r\n ensureArray(value: any): any[] {\r\n if (Array.isArray(value)) return value;\r\n if (value == null || value === '') return [];\r\n return [value];\r\n }\r\n\r\n /**\r\n * Attiva/disattiva la modalita editor JSON.\r\n * In apertura serializza le condizioni, in chiusura le deserializza.\r\n */\r\n toggleJsonMode(): void {\r\n if (!this.jsonMode) {\r\n // Passa a modalita JSON: serializza condizioni\r\n this.jsonText = this.conditions.length > 0 ? JSON.stringify(this.conditions, null, 2) : '[]';\r\n this.jsonError = '';\r\n } else {\r\n // Torna a modalita visuale: prova a parsare il JSON\r\n this.applyJson();\r\n }\r\n this.jsonMode = !this.jsonMode;\r\n }\r\n\r\n /**\r\n * Formatta il JSON nell'editor con indentazione.\r\n */\r\n formatJson(): void {\r\n try {\r\n const parsed = JSON.parse(this.jsonText);\r\n this.jsonText = JSON.stringify(parsed, null, 2);\r\n this.jsonError = '';\r\n } catch {\r\n this.jsonError = 'JSON non valido: impossibile formattare.';\r\n }\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del testo JSON nell'editor.\r\n * Tenta il parsing e aggiorna le condizioni se valido.\r\n * @param text - Testo JSON inserito dall'utente\r\n */\r\n onJsonChange(text: string): void {\r\n this.jsonText = text;\r\n this.applyJson();\r\n }\r\n\r\n /**\r\n * Aggiunge una nuova condizione con valori predefiniti.\r\n */\r\n addCondition(): void {\r\n const firstField = this.availableFields.length > 0 ? this.availableFields[0].key : '';\r\n const newCondition: UiFieldCondition = {\r\n field: firstField,\r\n operator: 'equals',\r\n value: '',\r\n };\r\n const updated = [...this.conditions, newCondition];\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Rimuove la condizione all'indice specificato.\r\n * @param index - Indice della condizione da rimuovere\r\n */\r\n removeCondition(index: number): void {\r\n const updated = this.conditions.filter((_, i) => i !== index);\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Rimuove tutte le condizioni.\r\n */\r\n clearAll(): void {\r\n this.emitChange([]);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio della logica di combinazione (AND/OR).\r\n * @param index - Indice della condizione\r\n * @param logic - Nuova logica ('AND' | 'OR')\r\n */\r\n onLogicChange(index: number, logic: 'AND' | 'OR'): void {\r\n const updated = this.cloneConditions();\r\n updated[index] = { ...updated[index], logic };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del campo selezionato in una condizione.\r\n * Resetta il valore quando il campo cambia.\r\n * @param index - Indice della condizione\r\n * @param field - Nuova chiave campo\r\n */\r\n onFieldChange(index: number, field: string): void {\r\n const updated = this.cloneConditions();\r\n updated[index] = { ...updated[index], field, value: '' };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio dell'operatore in una condizione.\r\n * Resetta il valore per operatori senza valore.\r\n * @param index - Indice della condizione\r\n * @param operator - Nuovo operatore\r\n */\r\n onOperatorChange(index: number, operator: UiConditionalOperator): void {\r\n const updated = this.cloneConditions();\r\n const condition = { ...updated[index], operator };\r\n\r\n // Resetta il valore per operatori che non lo richiedono\r\n if (this.isNoValueOperator(operator)) {\r\n condition.value = undefined;\r\n } else if (this.isArrayOperator(operator) && !Array.isArray(condition.value)) {\r\n // Converti a array per operatori su array\r\n condition.value = condition.value ? [condition.value] : [];\r\n }\r\n\r\n updated[index] = condition;\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Gestisce il cambio del valore in una condizione.\r\n * @param index - Indice della condizione\r\n * @param value - Nuovo valore\r\n */\r\n onValueChange(index: number, value: any): void {\r\n const updated = this.cloneConditions();\r\n updated[index] = { ...updated[index], value };\r\n this.emitChange(updated);\r\n }\r\n\r\n /**\r\n * Tenta di applicare il JSON corrente come array di condizioni.\r\n * Aggiorna l'errore in caso di JSON non valido.\r\n */\r\n private applyJson(): void {\r\n try {\r\n const parsed = JSON.parse(this.jsonText);\r\n if (!Array.isArray(parsed)) {\r\n this.jsonError = 'Il JSON deve essere un array di condizioni.';\r\n return;\r\n }\r\n this.jsonError = '';\r\n this.emitChange(parsed);\r\n } catch {\r\n this.jsonError = 'JSON non valido: controlla la sintassi.';\r\n }\r\n }\r\n\r\n /**\r\n * Clona l'array delle condizioni per garantire immutabilita.\r\n * @returns Copia superficiale dell'array di condizioni\r\n */\r\n private cloneConditions(): UiFieldCondition[] {\r\n return this.conditions.map((c) => ({ ...c }));\r\n }\r\n\r\n /**\r\n * Emette l'evento di cambio condizioni.\r\n * @param conditions - Nuova lista di condizioni\r\n */\r\n private emitChange(conditions: UiFieldCondition[]): void {\r\n this.conditions = conditions;\r\n this.conditionsChange.emit(conditions);\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n inject,\r\n} from '@angular/core';\r\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { Subject } from 'rxjs';\r\nimport { debounceTime, takeUntil } from 'rxjs/operators';\r\n\r\nimport { UiFormFieldDescriptor, UiFieldType } from '../../../form-builder/types/index';\r\nimport { UiEditorAvailableField } from '../../types/editor.types';\r\nimport { UiValidationEditorComponent } from '../validation-editor/validation-editor.component';\r\nimport { UiOptionsEditorComponent } from '../options-editor/options-editor.component';\r\nimport { UiConditionEditorComponent } from '../condition-editor/condition-editor.component';\r\n\r\n/**\r\n * Tutti i tipi di campo supportati dal form builder.\r\n * Utilizzati per popolare la select del tipo nella configurazione campo.\r\n */\r\nconst FIELD_TYPES: { value: UiFieldType; label: string }[] = [\r\n { value: 'text', label: 'Testo' },\r\n { value: 'email', label: 'Email' },\r\n { value: 'password', label: 'Password' },\r\n { value: 'number', label: 'Numero' },\r\n { value: 'textarea', label: 'Area di testo' },\r\n { value: 'select', label: 'Select' },\r\n { value: 'multiselect', label: 'Multiselect' },\r\n { value: 'freemultiselect', label: 'Multiselect libero' },\r\n { value: 'checkbox', label: 'Checkbox' },\r\n { value: 'switch', label: 'Switch' },\r\n { value: 'radio', label: 'Radio' },\r\n { value: 'date', label: 'Data' },\r\n { value: 'datetime', label: 'Data e ora' },\r\n { value: 'file', label: 'File' },\r\n { value: 'custom', label: 'Custom' },\r\n { value: 'divider', label: 'Separatore' },\r\n { value: 'flag', label: 'Flag' },\r\n { value: 'location', label: 'Location' },\r\n { value: 'location-table', label: 'Location Table' },\r\n];\r\n\r\n/**\r\n * Tipi di campo che supportano la configurazione delle opzioni.\r\n * Per questi tipi viene mostrato il pannello opzioni nell'editor.\r\n */\r\nconst OPTIONS_FIELD_TYPES: UiFieldType[] = ['select', 'multiselect', 'freemultiselect', 'radio'];\r\n\r\n/**\r\n * Pannello laterale destro per la configurazione di un campo selezionato.\r\n *\r\n * Mostra un form reattivo suddiviso in pannelli espandibili per gestire\r\n * proprieta base, stato, layout, validazioni, opzioni e condizioni.\r\n * Emette aggiornamenti parziali con debounce di 300ms.\r\n *\r\n * @selector ui-editor-field-config-panel\r\n */\r\n@Component({\r\n selector: 'ui-editor-field-config-panel',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatCheckboxModule,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n UiValidationEditorComponent,\r\n UiOptionsEditorComponent,\r\n UiConditionEditorComponent,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"field-config-panel\">\r\n <!-- Intestazione del pannello -->\r\n <div class=\"field-config-panel__header\">\r\n <lucide-icon name=\"settings\" [size]=\"18\" aria-hidden=\"true\" />\r\n <span class=\"field-config-panel__title\">Configurazione Campo</span>\r\n </div>\r\n\r\n <!-- Stato vuoto: nessun campo selezionato -->\r\n @if (!field) {\r\n <div class=\"field-config-panel__empty\">\r\n <lucide-icon name=\"mouse-pointer-click\" [size]=\"32\" aria-hidden=\"true\" />\r\n <p class=\"field-config-panel__empty-text\">\r\n Seleziona un campo per configurarlo\r\n </p>\r\n </div>\r\n }\r\n\r\n <!-- Form di configurazione del campo -->\r\n @if (field && configForm) {\r\n <div class=\"field-config-panel__content\">\r\n <mat-accordion multi>\r\n\r\n <!-- Pannello 1: Proprieta base -->\r\n <mat-expansion-panel [expanded]=\"true\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon name=\"file-text\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>Proprieta base</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <div class=\"field-config-panel__fields\" [formGroup]=\"configForm\">\r\n <!-- Chiave univoca -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Chiave (key)</mat-label>\r\n <input matInput formControlName=\"key\" placeholder=\"campo_univoco\" />\r\n <mat-hint>Identificativo univoco del campo</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- Tipo di campo -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Tipo</mat-label>\r\n <mat-select formControlName=\"type\">\r\n @for (ft of fieldTypes; track ft.value) {\r\n <mat-option [value]=\"ft.value\">{{ ft.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- Label visualizzata -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Label</mat-label>\r\n <input matInput formControlName=\"label\" placeholder=\"Etichetta del campo\" />\r\n </mat-form-field>\r\n\r\n <!-- Placeholder -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Placeholder</mat-label>\r\n <input matInput formControlName=\"placeholder\" placeholder=\"Testo segnaposto\" />\r\n </mat-form-field>\r\n\r\n <!-- Tooltip -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Tooltip</mat-label>\r\n <input matInput formControlName=\"tooltip\" placeholder=\"Testo di aiuto\" />\r\n </mat-form-field>\r\n\r\n <!-- Valore di default -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Valore di default</mat-label>\r\n <input matInput formControlName=\"defaultValue\" placeholder=\"Valore iniziale\" />\r\n </mat-form-field>\r\n </div>\r\n </mat-expansion-panel>\r\n\r\n <!-- Pannello 2: Stato del campo -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon name=\"toggle-left\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>Stato campo</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <div class=\"field-config-panel__fields\" [formGroup]=\"configForm\">\r\n <mat-checkbox formControlName=\"required\" color=\"primary\">\r\n Obbligatorio\r\n </mat-checkbox>\r\n\r\n <mat-checkbox formControlName=\"disabled\" color=\"primary\">\r\n Disabilitato\r\n </mat-checkbox>\r\n\r\n <mat-checkbox formControlName=\"readonly\" color=\"primary\">\r\n Sola lettura\r\n </mat-checkbox>\r\n\r\n @if (isOptionsField) {\r\n <mat-checkbox formControlName=\"hideEmptyOption\" color=\"primary\">\r\n Nascondi opzione vuota\r\n </mat-checkbox>\r\n }\r\n </div>\r\n </mat-expansion-panel>\r\n\r\n <!-- Pannello 3: Layout -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon name=\"layout-grid\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>Layout</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <div class=\"field-config-panel__fields\" [formGroup]=\"configForm\">\r\n <!-- Colonne -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Colonne (1-12)</mat-label>\r\n <input matInput type=\"number\" formControlName=\"columns\" min=\"1\" max=\"12\" />\r\n <mat-hint>Numero di colonne nel grid</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- Ordine -->\r\n <mat-form-field appearance=\"outline\" class=\"field-config-panel__field\">\r\n <mat-label>Ordine</mat-label>\r\n <input matInput type=\"number\" formControlName=\"order\" />\r\n <mat-hint>Posizione nel grid</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n </mat-expansion-panel>\r\n\r\n <!-- Pannello 4: Validazioni -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon name=\"shield-check\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>Validazioni</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ui-validation-editor\r\n [validations]=\"field.validation || []\"\r\n (validationsChange)=\"onValidationsChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n\r\n <!-- Pannello 5: Opzioni (solo per campi con opzioni) -->\r\n @if (isOptionsField) {\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon name=\"list\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>Opzioni</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ui-options-editor\r\n [options]=\"getFieldOptions()\"\r\n (optionsChange)=\"onOptionsChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n }\r\n\r\n <!-- Pannello 6: Condizioni di visibilita -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon name=\"eye\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>Condizioni di visibilita</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ui-condition-editor\r\n [conditions]=\"field.conditions || []\"\r\n [availableFields]=\"availableFields\"\r\n (conditionsChange)=\"onVisibilityConditionsChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n\r\n <!-- Pannello 7: Condizioni di disabilitazione -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <lucide-icon name=\"ban\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span>Condizioni di disabilitazione</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ui-condition-editor\r\n [conditions]=\"field.disableConditions || []\"\r\n [availableFields]=\"availableFields\"\r\n (conditionsChange)=\"onDisableConditionsChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n\r\n </mat-accordion>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n /* Contenitore principale del pannello di configurazione */\r\n .field-config-panel {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n background: var(--ui-color-surface, #fff);\r\n border-left: 1px solid var(--ui-color-border, #e0e0e0);\r\n overflow-y: auto;\r\n }\r\n\r\n /* Intestazione del pannello */\r\n .field-config-panel__header {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n padding: var(--ui-spacing-3, 12px) var(--ui-spacing-4, 16px);\r\n border-bottom: 1px solid var(--ui-color-border, #e0e0e0);\r\n background: var(--ui-color-bg-subtle, #fafafa);\r\n }\r\n\r\n .field-config-panel__title {\r\n font-weight: 600;\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n color: var(--ui-color-text, #212121);\r\n }\r\n\r\n /* Stato vuoto: nessun campo selezionato */\r\n .field-config-panel__empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--ui-spacing-3, 12px);\r\n padding: var(--ui-spacing-8, 64px) var(--ui-spacing-4, 16px);\r\n text-align: center;\r\n color: var(--ui-color-text-muted, #9e9e9e);\r\n }\r\n\r\n .field-config-panel__empty-text {\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n margin: 0;\r\n }\r\n\r\n /* Contenuto scrollabile */\r\n .field-config-panel__content {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: var(--ui-spacing-2, 8px);\r\n }\r\n\r\n /* Gruppo di campi dentro un pannello */\r\n .field-config-panel__fields {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ui-spacing-2, 8px);\r\n padding: var(--ui-spacing-1, 4px) 0;\r\n }\r\n\r\n /* Singolo campo del form di configurazione */\r\n .field-config-panel__field {\r\n width: 100%;\r\n }\r\n\r\n /* Stili per i titoli dei pannelli espandibili */\r\n mat-panel-title {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n font-weight: 500;\r\n color: var(--ui-color-text, #212121);\r\n }\r\n\r\n /* Checkbox con margine superiore */\r\n mat-checkbox {\r\n margin: var(--ui-spacing-1, 4px) 0;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiEditorFieldConfigPanelComponent implements OnChanges, OnDestroy {\r\n /** @internal Servizio per la costruzione del FormGroup. */\r\n private readonly fb = inject(FormBuilder);\r\n\r\n /** @internal Subject per la distruzione e pulizia delle sottoscrizioni. */\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n /** Campo attualmente selezionato per la configurazione. */\r\n @Input() field: UiFormFieldDescriptor | null = null;\r\n\r\n /** Lista dei campi disponibili per le condizioni. */\r\n @Input() availableFields: UiEditorAvailableField[] = [];\r\n\r\n /** Emesso quando il campo viene aggiornato dall'utente. */\r\n @Output() fieldUpdate = new EventEmitter<Partial<UiFormFieldDescriptor>>();\r\n\r\n /** Form reattivo per la configurazione del campo. */\r\n configForm: FormGroup | null = null;\r\n\r\n /** Lista dei tipi di campo per la select. */\r\n readonly fieldTypes = FIELD_TYPES;\r\n\r\n /**\r\n * Indica se il campo selezionato supporta le opzioni.\r\n * Viene utilizzato per mostrare/nascondere il pannello opzioni.\r\n */\r\n get isOptionsField(): boolean {\r\n if (!this.field) return false;\r\n return OPTIONS_FIELD_TYPES.includes(this.field.type);\r\n }\r\n\r\n /**\r\n * Rileva cambiamenti sugli input e ricostruisce il form\r\n * quando cambia il campo selezionato.\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['field']) {\r\n this.buildForm();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * Restituisce le opzioni del campo come array statico.\r\n * Ignora opzioni osservabili poiche non gestibili nell'editor.\r\n */\r\n getFieldOptions(): { value: any; label: string }[] {\r\n if (!this.field?.options || !Array.isArray(this.field.options)) return [];\r\n return this.field.options.map((o) => ({ value: o.value, label: o.label }));\r\n }\r\n\r\n /**\r\n * Gestisce l'aggiornamento delle validazioni dal sotto-componente.\r\n * @param validations - Nuova lista di regole di validazione\r\n */\r\n onValidationsChange(validations: any[]): void {\r\n this.fieldUpdate.emit({ validation: validations });\r\n }\r\n\r\n /**\r\n * Gestisce l'aggiornamento delle opzioni dal sotto-componente.\r\n * @param options - Nuova lista di opzioni\r\n */\r\n onOptionsChange(options: { value: any; label: string }[]): void {\r\n this.fieldUpdate.emit({ options });\r\n }\r\n\r\n /**\r\n * Gestisce l'aggiornamento delle condizioni di visibilita.\r\n * @param conditions - Nuova lista di condizioni\r\n */\r\n onVisibilityConditionsChange(conditions: any[]): void {\r\n this.fieldUpdate.emit({ conditions });\r\n }\r\n\r\n /**\r\n * Gestisce l'aggiornamento delle condizioni di disabilitazione.\r\n * @param conditions - Nuova lista di condizioni\r\n */\r\n onDisableConditionsChange(conditions: any[]): void {\r\n this.fieldUpdate.emit({ disableConditions: conditions });\r\n }\r\n\r\n /**\r\n * @internal\r\n * Costruisce il FormGroup a partire dal campo selezionato.\r\n * Si sottoscrive ai valueChanges con debounce per emettere aggiornamenti.\r\n */\r\n private buildForm(): void {\r\n this.destroy$.next();\r\n\r\n if (!this.field) {\r\n this.configForm = null;\r\n return;\r\n }\r\n\r\n this.configForm = this.fb.group({\r\n key: [this.field.key],\r\n type: [this.field.type],\r\n label: [this.field.label],\r\n placeholder: [this.field.placeholder || ''],\r\n tooltip: [this.field.tooltip || ''],\r\n defaultValue: [this.field.defaultValue ?? ''],\r\n required: [this.field.required || false],\r\n disabled: [this.field.disabled || false],\r\n readonly: [this.field.readonly || false],\r\n hideEmptyOption: [this.field.hideEmptyOption || false],\r\n columns: [this.field.layout?.columns ?? null],\r\n order: [this.field.layout?.order ?? null],\r\n });\r\n\r\n this.configForm.valueChanges.pipe(debounceTime(300), takeUntil(this.destroy$)).subscribe((values) => {\r\n /** Mappa i valori del form nel formato di aggiornamento parziale del campo */\r\n const update: Partial<UiFormFieldDescriptor> = {\r\n key: values.key,\r\n type: values.type,\r\n label: values.label,\r\n placeholder: values.placeholder || undefined,\r\n tooltip: values.tooltip || undefined,\r\n defaultValue: values.defaultValue || undefined,\r\n required: values.required,\r\n disabled: values.disabled,\r\n readonly: values.readonly,\r\n hideEmptyOption: values.hideEmptyOption,\r\n layout: {\r\n columns: values.columns ?? undefined,\r\n order: values.order ?? undefined,\r\n },\r\n };\r\n this.fieldUpdate.emit(update);\r\n });\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n ViewEncapsulation,\r\n DoCheck,\r\n TemplateRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiAccordionDescriptor, UiAccordionToggleEvent, UiAccordionMode } from './accordion.types';\r\n\r\n/**\r\n * Accordion configurabile, data-driven, con supporto multi/single expand,\r\n * animazioni CSS, icone Lucide e template personalizzabili.\r\n *\r\n * Il contenuto dei pannelli viene fornito tramite un `itemTemplate`\r\n * che riceve il descriptor del pannello come contesto.\r\n *\r\n * @selector ui-accordion\r\n *\r\n * @example\r\n * ```html\r\n * <ui-accordion\r\n * [items]=\"sections\"\r\n * [itemTemplate]=\"panelTpl\"\r\n * mode=\"single\"\r\n * >\r\n * <ng-template #panelTpl let-item>\r\n * @switch (item.id) {\r\n * @case ('info') { <app-info-panel /> }\r\n * @case ('address') { <app-address-form /> }\r\n * }\r\n * </ng-template>\r\n * </ui-accordion>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * sections: UiAccordionDescriptor[] = [\r\n * { id: 'info', title: 'Informazioni', icon: 'info', expanded: true },\r\n * { id: 'address', title: 'Indirizzo', icon: 'map-pin' },\r\n * ];\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-accordion',\r\n standalone: true,\r\n imports: [NgTemplateOutlet, LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: { class: 'ui-accordion-host' },\r\n template: `\r\n @for (item of visibleItems; track item.id) {\r\n <div\r\n [class]=\"getPanelClasses(item)\"\r\n [id]=\"'ui-accordion-' + item.id\"\r\n >\r\n <!-- Header: div wrapper per ospitare trigger + azioni + chevron -->\r\n <div\r\n class=\"ui-accordion__header\"\r\n [class.ui-accordion__header--expanded]=\"item.expanded\"\r\n [class.ui-accordion__header--disabled]=\"item.disabled\"\r\n (click)=\"!item.disabled && toggle(item)\"\r\n >\r\n <button\r\n class=\"ui-accordion__trigger\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-expanded]=\"item.expanded\"\r\n [attr.aria-controls]=\"'ui-accordion-body-' + item.id\"\r\n [attr.id]=\"'ui-accordion-header-' + item.id\"\r\n type=\"button\"\r\n (keydown.home)=\"focusFirst($event)\"\r\n (keydown.end)=\"focusLast($event)\"\r\n >\r\n <div class=\"ui-accordion__header-content\">\r\n @if (item.icon) {\r\n <lucide-icon\r\n class=\"ui-accordion__icon\"\r\n [name]=\"item.icon\"\r\n [size]=\"18\"\r\n aria-hidden=\"true\"\r\n />\r\n }\r\n <span class=\"ui-accordion__title\">{{ item.title }}</span>\r\n @if (item.subtitle) {\r\n <span class=\"ui-accordion__subtitle\">{{ item.subtitle }}</span>\r\n }\r\n </div>\r\n\r\n @if (headerTemplate) {\r\n <div class=\"ui-accordion__header-extra\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"headerTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\r\n />\r\n </div>\r\n }\r\n </button>\r\n\r\n @if (actionsTemplate) {\r\n <div\r\n class=\"ui-accordion__actions\"\r\n role=\"group\"\r\n aria-label=\"Azioni pannello\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"actionsTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\r\n />\r\n </div>\r\n }\r\n\r\n <lucide-icon\r\n class=\"ui-accordion__chevron\"\r\n [class.ui-accordion__chevron--rotated]=\"item.expanded\"\r\n name=\"chevron-down\"\r\n [size]=\"16\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n\r\n <!-- Body (animazione CSS grid) -->\r\n <div\r\n class=\"ui-accordion__body-wrapper\"\r\n [class.ui-accordion__body-wrapper--open]=\"item.expanded\"\r\n role=\"region\"\r\n [attr.id]=\"'ui-accordion-body-' + item.id\"\r\n [attr.aria-labelledby]=\"'ui-accordion-header-' + item.id\"\r\n >\r\n <div class=\"ui-accordion__body\">\r\n @if (item.expanded && itemTemplate) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"itemTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n `,\r\n styleUrl: './accordion.component.scss',\r\n})\r\nexport class UiAccordionComponent implements DoCheck {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n /**\r\n * Fingerprint dell'ultimo stato dei descriptor.\r\n * Usato da DoCheck per rilevare mutazioni in-place sulle proprieta\r\n * degli item senza richiedere un nuovo riferimento dell'array.\r\n */\r\n private _lastFingerprint = '';\r\n\r\n /**\r\n * Array di descriptor dei pannelli.\r\n * Pannelli con `hidden: true` vengono filtrati automaticamente.\r\n *\r\n * Supporta sia aggiornamenti immutabili (nuovo array) sia\r\n * mutazioni in-place delle proprieta dei descriptor.\r\n */\r\n @Input() items: UiAccordionDescriptor[] = [];\r\n\r\n /**\r\n * Template per il contenuto di ogni pannello.\r\n * Il contesto fornisce il descriptor come `$implicit`.\r\n *\r\n * @example\r\n * ```html\r\n * <ng-template #tpl let-item>\r\n * <p>Contenuto per: {{ item.title }}</p>\r\n * </ng-template>\r\n * ```\r\n */\r\n @Input() itemTemplate: TemplateRef<unknown> | null = null;\r\n\r\n /**\r\n * Template opzionale per contenuto aggiuntivo nell'header.\r\n * Il contesto fornisce il descriptor come `$implicit`.\r\n * Viene renderizzato all'interno del trigger, tra il titolo e il chevron.\r\n */\r\n @Input() headerTemplate: TemplateRef<unknown> | null = null;\r\n\r\n /**\r\n * Template opzionale per azioni nell'header del pannello.\r\n * Posizionato tra il trigger e il chevron, al di fuori del button\r\n * per consentire elementi interattivi (es. pulsanti duplica/elimina).\r\n * Il contesto fornisce il descriptor come `$implicit`.\r\n */\r\n @Input() actionsTemplate: TemplateRef<unknown> | null = null;\r\n\r\n /**\r\n * Modalita di espansione.\r\n * - `multi`: piu pannelli aperti contemporaneamente\r\n * - `single`: un solo pannello aperto alla volta\r\n */\r\n @Input() mode: UiAccordionMode = 'multi';\r\n\r\n /** Label accessibile per il gruppo accordion. */\r\n @Input() ariaLabel = 'Accordion';\r\n\r\n /** Emesso quando un pannello viene aperto o chiuso. */\r\n @Output() itemToggled = new EventEmitter<UiAccordionToggleEvent>();\r\n\r\n /**\r\n * Rileva mutazioni in-place sulle proprieta dei descriptor.\r\n * Confronta un fingerprint leggero dello stato corrente con quello\r\n * precedente e, se diverso, forza un ciclo di change detection.\r\n *\r\n * Questo permette al consumatore di fare sia:\r\n * - `items[2].hidden = true` (mutazione in-place)\r\n * - `items = [...newItems]` (nuovo riferimento)\r\n */\r\n ngDoCheck(): void {\r\n const fp = this.computeFingerprint();\r\n if (fp !== this._lastFingerprint) {\r\n this._lastFingerprint = fp;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n /** Pannelli visibili (non hidden). */\r\n get visibleItems(): UiAccordionDescriptor[] {\r\n return this.items.filter((i) => !i.hidden);\r\n }\r\n\r\n /** Alterna l'espansione di un pannello. */\r\n toggle(item: UiAccordionDescriptor): void {\r\n if (item.disabled) return;\r\n\r\n const willExpand = !item.expanded;\r\n\r\n // In modalita single, chiudi tutti gli altri\r\n if (willExpand && this.mode === 'single') {\r\n this.items.forEach((i) => {\r\n if (i !== item && i.expanded) {\r\n i.expanded = false;\r\n this.itemToggled.emit({ item: i, expanded: false });\r\n }\r\n });\r\n }\r\n\r\n item.expanded = willExpand;\r\n this.itemToggled.emit({ item, expanded: willExpand });\r\n }\r\n\r\n /** Apre un pannello specifico per id. */\r\n open(id: string): void {\r\n const item = this.items.find((i) => i.id === id);\r\n if (item && !item.expanded && !item.disabled) {\r\n this.toggle(item);\r\n }\r\n }\r\n\r\n /** Chiude un pannello specifico per id. */\r\n close(id: string): void {\r\n const item = this.items.find((i) => i.id === id);\r\n if (item && item.expanded) {\r\n item.expanded = false;\r\n this.itemToggled.emit({ item, expanded: false });\r\n }\r\n }\r\n\r\n /** Apre tutti i pannelli (solo in modalita multi). */\r\n openAll(): void {\r\n if (this.mode === 'single') return;\r\n this.items.forEach((item) => {\r\n if (!item.expanded && !item.disabled && !item.hidden) {\r\n item.expanded = true;\r\n this.itemToggled.emit({ item, expanded: true });\r\n }\r\n });\r\n }\r\n\r\n /** Chiude tutti i pannelli. */\r\n closeAll(): void {\r\n this.items.forEach((item) => {\r\n if (item.expanded) {\r\n item.expanded = false;\r\n this.itemToggled.emit({ item, expanded: false });\r\n }\r\n });\r\n }\r\n\r\n /** @internal Classi CSS per il pannello. */\r\n getPanelClasses(item: UiAccordionDescriptor): string {\r\n return [\r\n 'ui-accordion__panel',\r\n item.expanded ? 'ui-accordion__panel--expanded' : '',\r\n item.disabled ? 'ui-accordion__panel--disabled' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n /** @internal Sposta il focus al primo header. */\r\n focusFirst(event: Event): void {\r\n event.preventDefault();\r\n const headers = this.getHeaders();\r\n headers[0]?.focus();\r\n }\r\n\r\n /** @internal Sposta il focus all'ultimo header. */\r\n focusLast(event: Event): void {\r\n event.preventDefault();\r\n const headers = this.getHeaders();\r\n headers[headers.length - 1]?.focus();\r\n }\r\n\r\n /** @internal Recupera tutti i trigger button del DOM. */\r\n private getHeaders(): HTMLButtonElement[] {\r\n return Array.from(document.querySelectorAll<HTMLButtonElement>('.ui-accordion__trigger:not(:disabled)'));\r\n }\r\n\r\n /**\r\n * @internal Calcola un fingerprint leggero basato sulle proprieta\r\n * reattive dei descriptor (quelle che influenzano il rendering).\r\n */\r\n private computeFingerprint(): string {\r\n return this.items.map((i) => `${i.id}:${i.hidden ?? 0}:${i.disabled ?? 0}:${i.expanded ?? 0}:${i.title}`).join('|');\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/core/logging\r\n * Configurazione IndexedDB per UiLoggerService.\r\n * Pattern omologato a action-logger.config.ts del progetto Siform-PAL.\r\n */\r\n\r\nimport type { UiLogLevel } from './logger.types';\r\n\r\n/** Durata default retention log (7 giorni). */\r\nexport const UI_LOGGER_DEFAULT_TTL_MS = 7 * 24 * 60 * 60 * 1000;\r\n\r\n/** Nome database IndexedDB. */\r\nexport const UI_LOGGER_IDB_NAME = 'ng-ui-system-logs';\r\n\r\n/** Versione database (incrementare su schema change). */\r\nexport const UI_LOGGER_IDB_VERSION = 1;\r\n\r\n/** Nome object store. */\r\nexport const UI_LOGGER_IDB_STORE = 'entries';\r\n\r\n/** Max entry totali per cleanup automatico. */\r\nexport const UI_LOGGER_MAX_ENTRIES = 10000;\r\n\r\n/** Livelli di log ordinati per severità crescente. */\r\nexport const UI_LOGGER_LEVELS: readonly UiLogLevel[] = ['debug', 'info', 'warn', 'error'];\r\n","/**\r\n * @module ng-ui-system/core/logging\r\n * Logger centralizzato con persistenza IndexedDB.\r\n * Pattern omologato a ActionLoggerService del progetto Siform-PAL.\r\n *\r\n * @example\r\n * const logger = inject(UiLoggerService);\r\n * logger.logFormAction('form_submit', { schemaId: 'user-form', values: data });\r\n * logger.logWizardAction('step_change', { from: 0, to: 1 });\r\n */\r\n\r\nimport { inject, Injectable, signal, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\nimport type { UiLogCategory, UiLogEntry, UiLogFilter, UiLogLevel, UiLogSummary, UiLoggerConfig } from './logger.types';\r\nimport {\r\n UI_LOGGER_DEFAULT_TTL_MS,\r\n UI_LOGGER_IDB_NAME,\r\n UI_LOGGER_IDB_STORE,\r\n UI_LOGGER_IDB_VERSION,\r\n UI_LOGGER_MAX_ENTRIES,\r\n UI_LOGGER_LEVELS,\r\n} from './logger.config';\r\n\r\n/**\r\n * Logger centralizzato per componenti ng-ui-system.\r\n * Persiste su IndexedDB con cleanup automatico.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiLoggerService {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private dbPromise: Promise<IDBDatabase> | null = null;\r\n\r\n /** Stato toggle runtime. */\r\n readonly enabled = signal(this.detectEnabled());\r\n\r\n /** Configurazione runtime. */\r\n private config: UiLoggerConfig = {\r\n enabled: this.detectEnabled(),\r\n minLevel: 'debug',\r\n ttlMs: UI_LOGGER_DEFAULT_TTL_MS,\r\n maxEntries: UI_LOGGER_MAX_ENTRIES,\r\n };\r\n\r\n /** True se IndexedDB disponibile e siamo in browser. */\r\n private idbSupported(): boolean {\r\n return isPlatformBrowser(this.platformId) && typeof indexedDB !== 'undefined';\r\n }\r\n\r\n /** Rileva se logging attivo (default: true in dev se non production). */\r\n private detectEnabled(): boolean {\r\n if (!isPlatformBrowser(this.platformId)) return false;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const ng = (window as any).ng;\r\n const isDev = ng && typeof ng.probe === 'function';\r\n return isDev;\r\n }\r\n\r\n /** Abilita/disabilita logging runtime. */\r\n setEnabled(value: boolean): void {\r\n this.enabled.set(value);\r\n this.config.enabled = value;\r\n }\r\n\r\n /** Configura il logger. */\r\n configure(config: Partial<UiLoggerConfig>): void {\r\n this.config = { ...this.config, ...config };\r\n this.enabled.set(this.config.enabled);\r\n }\r\n\r\n // Public API: generic log\r\n\r\n /**\r\n * Log generico con controllo enabled e livello.\r\n */\r\n log(\r\n category: UiLogCategory,\r\n level: UiLogLevel,\r\n action: string,\r\n payload?: Record<string, unknown>,\r\n duration?: number\r\n ): void {\r\n if (!this.enabled()) return;\r\n if (!this.shouldLogLevel(level)) return;\r\n void this.persist(category, level, action, payload, duration);\r\n }\r\n\r\n /**\r\n * Log azione form (submit, reset, valueChange, etc).\r\n */\r\n logFormAction(\r\n action: 'init' | 'submit' | 'reset' | 'valueChange' | 'validationChange' | 'customEvent' | 'destroy',\r\n payload: { schemaId: string;[key: string]: unknown }\r\n ): void {\r\n this.log('form', 'info', action, payload);\r\n }\r\n\r\n /**\r\n * Log azione wizard (stepChange, complete, validationFailed, etc).\r\n */\r\n logWizardAction(\r\n action:\r\n | 'init'\r\n | 'stepChange'\r\n | 'stepComplete'\r\n | 'stepValidationFailed'\r\n | 'complete'\r\n | 'navigation'\r\n | 'save'\r\n | 'valueChange'\r\n | 'keyboardNavigation'\r\n | 'destroy'\r\n | 'resume'\r\n | 'resumeComplete',\r\n payload: { wizardId?: string; step?: number;[key: string]: unknown }\r\n ): void {\r\n this.log('wizard', 'info', action, payload);\r\n }\r\n\r\n /**\r\n * Log errore.\r\n */\r\n logError(error: Error | unknown, context?: Record<string, unknown>): void {\r\n const payload: Record<string, unknown> = { ...context };\r\n if (error instanceof Error) {\r\n payload['message'] = error.message;\r\n payload['stack'] = error.stack;\r\n } else {\r\n payload['error'] = error;\r\n }\r\n this.log('error', 'error', 'exception', payload);\r\n }\r\n\r\n /**\r\n * Log debug (solo se enabled e minLevel <= debug).\r\n */\r\n debug(category: UiLogCategory, action: string, payload?: Record<string, unknown>): void {\r\n this.log(category, 'debug', action, payload);\r\n }\r\n\r\n // IndexedDB persistence\r\n\r\n private async persist(\r\n category: UiLogCategory,\r\n level: UiLogLevel,\r\n action: string,\r\n payload?: Record<string, unknown>,\r\n duration?: number\r\n ): Promise<void> {\r\n if (!this.idbSupported()) return;\r\n\r\n const entry: UiLogEntry = {\r\n id: `${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,\r\n category,\r\n level,\r\n action,\r\n payload,\r\n timestamp: Date.now(),\r\n duration,\r\n url: typeof window !== 'undefined' ? window.location.href : '',\r\n userId: this.getUserId(),\r\n };\r\n\r\n try {\r\n const db = await this.openDb();\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readwrite');\r\n tx.objectStore(UI_LOGGER_IDB_STORE).put(entry, entry.id);\r\n\r\n // Debug visibile in dev mode\r\n // eslint-disable-next-line no-console\r\n if (this.enabled()) {\r\n // eslint-disable-next-line no-console\r\n console.log(`[UiLogger] ${entry.category}:${entry.action}`, entry.payload ?? '');\r\n }\r\n\r\n // Cleanup asincrono senza bloccare\r\n void this.cleanupIfNeeded(db);\r\n } catch (e) {\r\n // Silent fail: logging non deve rompere l'app\r\n // eslint-disable-next-line no-console\r\n console.warn('[UiLogger] Persist failed:', e);\r\n }\r\n }\r\n\r\n /** Recupera userId da localStorage se disponibile. */\r\n private getUserId(): string | undefined {\r\n if (typeof localStorage === 'undefined') return undefined;\r\n return localStorage.getItem('exLogin') ?? undefined;\r\n }\r\n\r\n /** Verifica se il livello deve essere loggato in base a minLevel. */\r\n private shouldLogLevel(level: UiLogLevel): boolean {\r\n const minIndex = UI_LOGGER_LEVELS.indexOf(this.config.minLevel);\r\n const levelIndex = UI_LOGGER_LEVELS.indexOf(level);\r\n return levelIndex >= minIndex;\r\n }\r\n\r\n // Query API\r\n\r\n /**\r\n * Recupera log con filtri.\r\n */\r\n async query(filter: UiLogFilter = {}): Promise<UiLogEntry[]> {\r\n if (!this.idbSupported()) return [];\r\n\r\n const db = await this.openDb();\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readonly');\r\n const store = tx.objectStore(UI_LOGGER_IDB_STORE);\r\n\r\n const all: UiLogEntry[] = await new Promise((resolve, reject) => {\r\n const request = store.getAll();\r\n request.onsuccess = () => resolve(request.result as UiLogEntry[]);\r\n request.onerror = () => reject(request.error);\r\n });\r\n\r\n return this.applyFilter(all, filter);\r\n }\r\n\r\n /**\r\n * Riepilogo log per dashboard.\r\n */\r\n async summary(): Promise<UiLogSummary> {\r\n const all = await this.query();\r\n\r\n const byCategory = { form: 0, wizard: 0, navigation: 0, system: 0, error: 0 } as Record<UiLogCategory, number>;\r\n const byLevel = { debug: 0, info: 0, warn: 0, error: 0 } as Record<UiLogLevel, number>;\r\n\r\n let oldest = Infinity;\r\n let newest = 0;\r\n\r\n for (const entry of all) {\r\n byCategory[entry.category]++;\r\n byLevel[entry.level]++;\r\n if (entry.timestamp < oldest) oldest = entry.timestamp;\r\n if (entry.timestamp > newest) newest = entry.timestamp;\r\n }\r\n\r\n return {\r\n total: all.length,\r\n byCategory,\r\n byLevel,\r\n oldest: oldest === Infinity ? 0 : oldest,\r\n newest,\r\n };\r\n }\r\n\r\n /**\r\n * Cancella log più vecchi di TTL.\r\n */\r\n async purgeOld(): Promise<number> {\r\n if (!this.idbSupported()) return 0;\r\n\r\n const cutoff = Date.now() - this.config.ttlMs;\r\n const toDelete: string[] = [];\r\n\r\n const db = await this.openDb();\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readonly');\r\n const store = tx.objectStore(UI_LOGGER_IDB_STORE);\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const cursor = store.openCursor();\r\n cursor.onsuccess = (e) => {\r\n const result = (e.target as IDBRequest).result as IDBCursorWithValue | null;\r\n if (!result) {\r\n resolve();\r\n return;\r\n }\r\n const entry = result.value as UiLogEntry;\r\n if (entry.timestamp < cutoff) {\r\n toDelete.push(entry.id);\r\n }\r\n result.continue();\r\n };\r\n cursor.onerror = () => reject(cursor.error);\r\n });\r\n\r\n if (toDelete.length > 0) {\r\n const delTx = db.transaction(UI_LOGGER_IDB_STORE, 'readwrite');\r\n for (const id of toDelete) {\r\n delTx.objectStore(UI_LOGGER_IDB_STORE).delete(id);\r\n }\r\n }\r\n\r\n return toDelete.length;\r\n }\r\n\r\n /**\r\n * Cancella tutti i log.\r\n */\r\n async clear(): Promise<void> {\r\n if (!this.idbSupported()) return;\r\n\r\n const db = await this.openDb();\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readwrite');\r\n await new Promise<void>((resolve, reject) => {\r\n const request = tx.objectStore(UI_LOGGER_IDB_STORE).clear();\r\n request.onsuccess = () => resolve();\r\n request.onerror = () => reject(request.error);\r\n });\r\n }\r\n\r\n // Internals\r\n\r\n private openDb(): Promise<IDBDatabase> {\r\n if (this.dbPromise) return this.dbPromise;\r\n\r\n this.dbPromise = new Promise((resolve, reject) => {\r\n const req = indexedDB.open(UI_LOGGER_IDB_NAME, UI_LOGGER_IDB_VERSION);\r\n req.onerror = () => reject(req.error);\r\n req.onsuccess = () => resolve(req.result);\r\n req.onupgradeneeded = (ev) => {\r\n const db = (ev.target as IDBOpenDBRequest).result;\r\n if (!db.objectStoreNames.contains(UI_LOGGER_IDB_STORE)) {\r\n db.createObjectStore(UI_LOGGER_IDB_STORE);\r\n }\r\n };\r\n });\r\n\r\n return this.dbPromise;\r\n }\r\n\r\n private async cleanupIfNeeded(db: IDBDatabase): Promise<void> {\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readonly');\r\n const count = await new Promise<number>((resolve, reject) => {\r\n const req = tx.objectStore(UI_LOGGER_IDB_STORE).count();\r\n req.onsuccess = () => resolve(req.result);\r\n req.onerror = () => reject(req.error);\r\n });\r\n\r\n if (count > this.config.maxEntries) {\r\n void this.purgeOld();\r\n }\r\n }\r\n\r\n private applyFilter(entries: UiLogEntry[], filter: UiLogFilter): UiLogEntry[] {\r\n let result = entries;\r\n\r\n if (filter.category) {\r\n result = result.filter((e) => e.category === filter.category);\r\n }\r\n if (filter.level) {\r\n result = result.filter((e) => e.level === filter.level);\r\n }\r\n if (filter.action) {\r\n result = result.filter((e) => e.action.includes(filter.action!));\r\n }\r\n if (filter.from) {\r\n result = result.filter((e) => e.timestamp >= filter.from!);\r\n }\r\n if (filter.to) {\r\n result = result.filter((e) => e.timestamp <= filter.to!);\r\n }\r\n\r\n // Ordina newest first\r\n result = result.sort((a, b) => b.timestamp - a.timestamp);\r\n\r\n if (filter.limit && filter.limit > 0) {\r\n result = result.slice(0, filter.limit);\r\n }\r\n\r\n return result;\r\n }\r\n}","/**\r\n * @module ng-ui-system/form-builder\r\n * Tipi relativi alla validazione dei campi.\r\n */\r\n\r\nimport { ValidatorFn } from '@angular/forms';\r\nimport { UiFieldCondition } from './condition.types';\r\n\r\n// ─── Operatori cross-field ────────────────────────────────────────\r\n\r\n/**\r\n * Operatori di confronto per validazioni cross-field.\r\n */\r\nexport type UiCrossFieldOperator = 'greater_than' | 'greater_equal' | 'less_than' | 'less_equal' | 'not_equal';\r\n\r\n/**\r\n * Configurazione per validazione cross-field.\r\n * Confronta il valore del campo corrente con quello di un altro campo.\r\n *\r\n * @example\r\n * ```typescript\r\n * // La data di fine deve essere successiva alla data di inizio\r\n * crossField: {\r\n * targetField: 'data-inizio',\r\n * operator: 'greater_than',\r\n * dataType: 'date',\r\n * }\r\n * ```\r\n */\r\nexport interface UiCrossFieldConfig {\r\n /** Chiave del campo di confronto. */\r\n targetField: string;\r\n /** Operatore di confronto. */\r\n operator: UiCrossFieldOperator;\r\n /** Tipo di dato per il confronto. */\r\n dataType: 'date' | 'number';\r\n /** Per le date, specifica se il formato e MM/YYYY. */\r\n isMonthYear?: boolean;\r\n}\r\n\r\n// ─── Validazione date ─────────────────────────────────────────────\r\n\r\n/**\r\n * Keyword predefinite per date di riferimento.\r\n */\r\nexport type UiDateKeyword = 'today' | 'tomorrow' | 'yesterday';\r\n\r\n/**\r\n * Configurazione per validazione date-min / date-max.\r\n * Permette di validare che una data sia precedente o successiva\r\n * a un valore di riferimento, con supporto per offset temporali.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Data deve essere >= oggi\r\n * { type: 'date-min', value: 'today', message: 'La data deve essere futura' }\r\n *\r\n * // Data deve essere <= oggi + 1 anno\r\n * { type: 'date-max', value: 'today', offset: '1y', message: 'Max 1 anno da oggi' }\r\n *\r\n * // Data deve essere >= una data specifica\r\n * { type: 'date-min', value: '01/01/2024', message: 'Almeno dal 2024' }\r\n * ```\r\n */\r\nexport interface UiDateValidationConfig {\r\n /**\r\n * Data di riferimento.\r\n * Puo essere una keyword (`'today'`, `'tomorrow'`, `'yesterday'`)\r\n * o una data nel formato `DD/MM/YYYY`.\r\n */\r\n value: string | UiDateKeyword;\r\n /**\r\n * Offset da applicare alla data di riferimento.\r\n *\r\n * Formato: `numero + unita`\r\n * - `'y'` o `'a'` per anni (es. `'1y'`, `'2a'`)\r\n * - `'m'` per mesi (es. `'6m'`, `'12m'`)\r\n * - `'g'` o `'d'` per giorni (es. `'30g'`, `'7d'`)\r\n * - `'w'` per settimane (es. `'2w'`)\r\n */\r\n offset?: string;\r\n}\r\n\r\n// ─── Tipi di validazione ──────────────────────────────────────────\r\n\r\n/**\r\n * Tipi di validazione supportati dal form builder.\r\n *\r\n * | Tipo | Valore atteso | Descrizione |\r\n * |-------------|--------------------|-----------------------------------------|\r\n * | `required` | — | Campo obbligatorio |\r\n * | `email` | — | Formato email valido |\r\n * | `min` | `number` | Valore numerico minimo |\r\n * | `max` | `number` | Valore numerico massimo |\r\n * | `minLength` | `number` | Lunghezza minima stringa |\r\n * | `maxLength` | `number` | Lunghezza massima stringa |\r\n * | `pattern` | `string` (regex) | Pattern regex da rispettare |\r\n * | `custom` | `ValidatorFn` | Validatore Angular custom |\r\n * | `crossField`| `CrossFieldConfig` | Confronto con un altro campo |\r\n * | `date-min` | `string` | Data minima (keyword o DD/MM/YYYY) |\r\n * | `date-max` | `string` | Data massima (keyword o DD/MM/YYYY) |\r\n * | `fileSize` | `number` (bytes) | Dimensione massima file |\r\n * | `fileType` | `string[]` (MIME) | Tipi file accettati |\r\n * | `fileCount` | `number` | Numero massimo file |\r\n */\r\nexport type UiValidationType =\r\n | 'required'\r\n | 'email'\r\n | 'min'\r\n | 'max'\r\n | 'minLength'\r\n | 'maxLength'\r\n | 'pattern'\r\n | 'custom'\r\n | 'crossField'\r\n | 'date-min'\r\n | 'date-max'\r\n | 'fileSize'\r\n | 'fileType'\r\n | 'fileCount';\r\n\r\n// ─── Regola di validazione ────────────────────────────────────────\r\n\r\n/**\r\n * Regola di validazione per un campo del form.\r\n *\r\n * Supporta validazioni standard, cross-field, date con offset,\r\n * file e validatori custom Angular. Ogni regola puo avere\r\n * condizioni che ne controllano l'applicazione.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Validazione required condizionale\r\n * {\r\n * type: 'required',\r\n * message: 'Campo obbligatorio se attivo',\r\n * conditions: [{ field: 'is-active', operator: 'equals', value: true }],\r\n * }\r\n *\r\n * // Validazione cross-field\r\n * {\r\n * type: 'crossField',\r\n * crossField: {\r\n * targetField: 'eta-minima',\r\n * operator: 'greater_than',\r\n * dataType: 'number',\r\n * },\r\n * message: \"L'eta massima deve essere maggiore dell'eta minima\",\r\n * }\r\n * ```\r\n */\r\nexport interface UiValidationRule {\r\n /** Tipo di validazione. */\r\n type: UiValidationType;\r\n /**\r\n * Valore per la validazione.\r\n * - Per `min`/`max`: valore numerico\r\n * - Per `minLength`/`maxLength`: lunghezza\r\n * - Per `pattern`: stringa regex\r\n * - Per `date-min`/`date-max`: keyword o data `DD/MM/YYYY`\r\n * - Per `fileSize`: dimensione in bytes\r\n * - Per `fileType`: array di MIME types\r\n * - Per `fileCount`: numero massimo file\r\n */\r\n value?: any;\r\n /**\r\n * Offset temporale per `date-min`/`date-max`.\r\n * @see UiDateValidationConfig.offset\r\n */\r\n offset?: string;\r\n /** Configurazione per validazione cross-field. */\r\n crossField?: UiCrossFieldConfig;\r\n /** Messaggio di errore personalizzato. */\r\n message?: string;\r\n /** Funzione validatore Angular custom (per `type: 'custom'`). */\r\n validator?: ValidatorFn;\r\n /** Condizioni per applicare questa regola (validazione condizionale). */\r\n conditions?: UiFieldCondition[];\r\n}\r\n\r\n// ─── Stato di validazione ─────────────────────────────────────────\r\n\r\n/**\r\n * Stato di validazione complessivo del form.\r\n */\r\nexport interface UiFormValidationState {\r\n /** Se il form e valido. */\r\n valid: boolean;\r\n /** Mappa errori per chiave campo. */\r\n errors: Record<string, string[]>;\r\n /** Chiavi dei campi modificati. */\r\n dirty: string[];\r\n /** Chiavi dei campi toccati. */\r\n touched: string[];\r\n}\r\n\r\n/**\r\n * Chiave `ValidationErrors` usata dai CVA custom per esporre errori granulari\r\n * sui campi interni (atomici) verso l'error-summary del form-builder.\r\n */\r\nexport const UI_FORM_NESTED_FIELD_ERRORS_KEY = 'uiNestedFieldErrors';\r\n\r\n/**\r\n * Dettaglio di un errore per l'error summary.\r\n */\r\nexport interface UiFormErrorDetail {\r\n /** Chiave del campo in errore. */\r\n fieldKey: string;\r\n /** Label del campo per visualizzazione. */\r\n fieldLabel: string;\r\n /** Lista messaggi di errore. */\r\n errors: string[];\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { UiFieldCondition } from '../types/condition.types';\r\n\r\n/**\r\n * Servizio per la valutazione delle condizioni di visibilita,\r\n * required e disable dei campi del form.\r\n *\r\n * Supporta 12 operatori di confronto, logica AND/OR\r\n * e accesso a valori annidati tramite dot notation.\r\n *\r\n * @providedIn 'root'\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiFormConditionService {\r\n /**\r\n * Valuta una singola condizione rispetto ai dati del form.\r\n *\r\n * @param condition - Condizione da valutare.\r\n * @param formData - Stato corrente dei dati del form.\r\n * @returns `true` se la condizione e soddisfatta.\r\n */\r\n evaluateCondition(condition: UiFieldCondition, formData: Record<string, any>): boolean {\r\n const fieldValue = this.getNestedValue(formData, condition.field);\r\n\r\n switch (condition.operator) {\r\n case 'equals':\r\n return fieldValue === condition.value;\r\n case 'not_equals':\r\n return fieldValue !== condition.value;\r\n case 'contains':\r\n return this.stringContains(fieldValue, condition.value);\r\n case 'not_contains':\r\n return !this.stringContains(fieldValue, condition.value);\r\n case 'greater_than':\r\n return this.numericCompare(fieldValue, condition.value, '>');\r\n case 'less_than':\r\n return this.numericCompare(fieldValue, condition.value, '<');\r\n case 'greater_equal':\r\n return this.numericCompare(fieldValue, condition.value, '>=');\r\n case 'less_equal':\r\n return this.numericCompare(fieldValue, condition.value, '<=');\r\n case 'is_empty':\r\n return this.isEmpty(fieldValue);\r\n case 'is_not_empty':\r\n return !this.isEmpty(fieldValue);\r\n case 'in_array':\r\n return Array.isArray(condition.value) && condition.value.includes(fieldValue);\r\n case 'not_in_array':\r\n return Array.isArray(condition.value) && !condition.value.includes(fieldValue);\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Valuta un array di condizioni con logica AND/OR.\r\n *\r\n * La prima condizione stabilisce il valore iniziale.\r\n * Le condizioni successive usano la proprieta `logic` per\r\n * combinare il risultato (`AND` per default).\r\n *\r\n * @param conditions - Array di condizioni.\r\n * @param formData - Stato corrente dei dati del form.\r\n * @returns `true` se le condizioni combinate sono soddisfatte.\r\n */\r\n evaluateConditions(conditions: UiFieldCondition[], formData: Record<string, any>): boolean {\r\n if (!conditions || conditions.length === 0) {\r\n return true;\r\n }\r\n\r\n let result = this.evaluateCondition(conditions[0], formData);\r\n\r\n for (let i = 1; i < conditions.length; i++) {\r\n const condition = conditions[i];\r\n const conditionResult = this.evaluateCondition(condition, formData);\r\n\r\n if (condition.logic === 'OR') {\r\n result = result || conditionResult;\r\n } else {\r\n result = result && conditionResult;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /** Accesso a valori annidati tramite dot notation (es. `'address.city'`). */\r\n private getNestedValue(obj: any, path: string): any {\r\n return path\r\n .split('.')\r\n .reduce((current, key) => (current != null && current[key] !== undefined ? current[key] : undefined), obj);\r\n }\r\n\r\n /** Confronto stringa case-insensitive. */\r\n private stringContains(haystack: any, needle: any): boolean {\r\n if (haystack == null || needle == null) return false;\r\n return String(haystack).toLowerCase().includes(String(needle).toLowerCase());\r\n }\r\n\r\n /** Confronto numerico generico. */\r\n private numericCompare(a: any, b: any, op: string): boolean {\r\n const n1 = Number(a);\r\n const n2 = Number(b);\r\n if (isNaN(n1) || isNaN(n2)) return false;\r\n switch (op) {\r\n case '>':\r\n return n1 > n2;\r\n case '<':\r\n return n1 < n2;\r\n case '>=':\r\n return n1 >= n2;\r\n case '<=':\r\n return n1 <= n2;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Verifica se un valore e vuoto in modo robusto.\r\n * Gestisce null, undefined, false, stringhe vuote, array vuoti e oggetti vuoti.\r\n */\r\n private isEmpty(value: any): boolean {\r\n if (value === null || value === undefined || value === false) return true;\r\n if (typeof value === 'string' && value.trim().length === 0) return true;\r\n if (Array.isArray(value) && value.length === 0) return true;\r\n if (typeof value === 'object' && Object.keys(value).length === 0) return true;\r\n return false;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl, ValidatorFn, Validators } from '@angular/forms';\r\nimport {\r\n parse,\r\n format,\r\n startOfDay,\r\n startOfMonth,\r\n addDays,\r\n addMonths,\r\n addYears,\r\n addWeeks,\r\n isAfter,\r\n isBefore,\r\n isEqual,\r\n isValid as isDateValid,\r\n} from 'date-fns';\r\nimport { UiValidationRule } from '../types/validation.types';\r\nimport { UiCrossFieldConfig, UiCrossFieldOperator } from '../types/validation.types';\r\nimport { UiFileData } from '../types/field.types';\r\nimport { UiFormConditionService } from './form-condition.service';\r\n\r\n/**\r\n * Servizio per la creazione e gestione dei validatori Angular\r\n * basati sulle regole dichiarative dello schema del form.\r\n *\r\n * Supporta validazioni standard, cross-field, date con offset,\r\n * file e validatori condizionali.\r\n *\r\n * @providedIn 'root'\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiFormValidationService {\r\n constructor(private conditionService: UiFormConditionService) {}\r\n\r\n // ─── Creazione validatori ──────────────────────────────────────\r\n\r\n /** Crea un array di validatori Angular dalle regole di validazione. */\r\n createValidators(rules: UiValidationRule[]): ValidatorFn[] {\r\n if (!rules?.length) return [];\r\n return rules.map((r) => this.createValidator(r)).filter((v): v is ValidatorFn => v !== null);\r\n }\r\n\r\n /**\r\n * Crea validatori con supporto condizionale.\r\n * Le regole con `conditions` vengono applicate solo se le condizioni sono soddisfatte.\r\n */\r\n createConditionalValidators(rules: UiValidationRule[], formData: Record<string, any>): ValidatorFn[] {\r\n if (!rules?.length) return [];\r\n const validators: ValidatorFn[] = [];\r\n\r\n for (const rule of rules) {\r\n if (rule.conditions?.length) {\r\n const shouldApply = this.conditionService.evaluateConditions(rule.conditions, formData);\r\n if (!shouldApply) continue;\r\n }\r\n const v = this.createValidator(rule);\r\n if (v) validators.push(v);\r\n }\r\n\r\n return validators;\r\n }\r\n\r\n /**\r\n * Aggiorna i validatori di un campo in base allo stato corrente del form.\r\n * Usato per ricalcolare validazioni condizionali quando i dati cambiano.\r\n */\r\n updateFieldValidators(\r\n control: AbstractControl,\r\n rules: UiValidationRule[] | undefined,\r\n formData: Record<string, any>,\r\n ): void {\r\n if (!rules?.length) {\r\n control.clearValidators();\r\n } else {\r\n const validators = this.createConditionalValidators(rules, formData);\r\n control.setValidators(validators);\r\n }\r\n control.updateValueAndValidity({ emitEvent: false });\r\n }\r\n\r\n // ─── Utility pubbliche ─────────────────────────────────────────\r\n\r\n /** Verifica se un campo dovrebbe mostrare gli errori. */\r\n shouldShowFieldErrors(control: AbstractControl): boolean {\r\n return control.invalid && (control.dirty || control.touched);\r\n }\r\n\r\n /** Restituisce i campi correlati da cross-field validation. */\r\n getCrossFieldRelatedFields(fieldKey: string, allRules: Record<string, UiValidationRule[]>): string[] {\r\n const related: string[] = [];\r\n for (const [key, rules] of Object.entries(allRules)) {\r\n if (key === fieldKey) continue;\r\n for (const rule of rules) {\r\n if (rule.type === 'crossField' && rule.crossField?.targetField === fieldKey) {\r\n related.push(key);\r\n }\r\n }\r\n }\r\n return related;\r\n }\r\n\r\n /** Verifica se un campo ha validazioni cross-field che lo referenziano. */\r\n hasCrossFieldValidations(fieldKey: string, allRules: Record<string, UiValidationRule[]>): boolean {\r\n return this.getCrossFieldRelatedFields(fieldKey, allRules).length > 0;\r\n }\r\n\r\n /** Formatta la dimensione del file in una stringa leggibile. */\r\n formatFileSize(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\r\n }\r\n\r\n // ─── Factory validatori ────────────────────────────────────────\r\n\r\n private createValidator(rule: UiValidationRule): ValidatorFn | null {\r\n switch (rule.type) {\r\n case 'required':\r\n return Validators.required;\r\n case 'email':\r\n return Validators.email;\r\n case 'min':\r\n return Validators.min(rule.value);\r\n case 'max':\r\n return Validators.max(rule.value);\r\n case 'minLength':\r\n return Validators.minLength(rule.value);\r\n case 'maxLength':\r\n return Validators.maxLength(rule.value);\r\n case 'pattern':\r\n return Validators.pattern(rule.value);\r\n case 'custom':\r\n return rule.validator || null;\r\n case 'crossField':\r\n return rule.crossField ? this.createCrossFieldValidator(rule.crossField) : null;\r\n case 'date-min':\r\n return this.createDateMinValidator(rule.value, rule.offset);\r\n case 'date-max':\r\n return this.createDateMaxValidator(rule.value, rule.offset);\r\n case 'fileSize':\r\n return this.createFileSizeValidator(rule.value);\r\n case 'fileType':\r\n return this.createFileTypeValidator(rule.value);\r\n case 'fileCount':\r\n return this.createFileCountValidator(rule.value);\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n // ─── Cross-field ───────────────────────────────────────────────\r\n\r\n private createCrossFieldValidator(config: UiCrossFieldConfig): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n if (!control.parent || !config.targetField) return null;\r\n\r\n const targetControl = control.parent.get(config.targetField);\r\n if (!targetControl) return null;\r\n\r\n const sourceValue = control.value;\r\n const targetValue = targetControl.value;\r\n\r\n if (sourceValue == null || targetValue == null || sourceValue === '' || targetValue === '') {\r\n return null;\r\n }\r\n\r\n let isValid = false;\r\n if (config.dataType === 'date') {\r\n isValid = this.validateDateComparison(sourceValue, targetValue, config.operator, config.isMonthYear);\r\n } else {\r\n isValid = this.validateNumberComparison(sourceValue, targetValue, config.operator);\r\n }\r\n\r\n return isValid\r\n ? null\r\n : {\r\n crossField: {\r\n actualValue: sourceValue,\r\n requiredComparison: config.operator,\r\n comparedValue: targetValue,\r\n targetField: config.targetField,\r\n },\r\n };\r\n };\r\n }\r\n\r\n /** Confronto date con date-fns. */\r\n private validateDateComparison(\r\n sourceValue: any,\r\n targetValue: any,\r\n operator: UiCrossFieldOperator,\r\n isMonthYear?: boolean,\r\n ): boolean {\r\n const normalize = isMonthYear ? startOfMonth : startOfDay;\r\n const sourceDate = normalize(new Date(sourceValue));\r\n const targetDate = normalize(new Date(targetValue));\r\n\r\n if (!isDateValid(sourceDate) || !isDateValid(targetDate)) return false;\r\n\r\n switch (operator) {\r\n case 'greater_than':\r\n return isAfter(sourceDate, targetDate);\r\n case 'greater_equal':\r\n return isAfter(sourceDate, targetDate) || isEqual(sourceDate, targetDate);\r\n case 'less_than':\r\n return isBefore(sourceDate, targetDate);\r\n case 'less_equal':\r\n return isBefore(sourceDate, targetDate) || isEqual(sourceDate, targetDate);\r\n case 'not_equal':\r\n return !isEqual(sourceDate, targetDate);\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /** Confronto numerico. */\r\n private validateNumberComparison(sourceValue: any, targetValue: any, operator: UiCrossFieldOperator): boolean {\r\n const src = Number(sourceValue);\r\n const tgt = Number(targetValue);\r\n if (isNaN(src) || isNaN(tgt)) return false;\r\n\r\n switch (operator) {\r\n case 'greater_than':\r\n return src > tgt;\r\n case 'greater_equal':\r\n return src >= tgt;\r\n case 'less_than':\r\n return src < tgt;\r\n case 'less_equal':\r\n return src <= tgt;\r\n case 'not_equal':\r\n return src !== tgt;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n // ─── Date min/max (con keyword e offset) ───────────────────────\r\n\r\n private createDateMinValidator(value: string, offset?: string): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n if (!control.value) return null;\r\n\r\n const refDate = this.parseReferenceDate(value, offset);\r\n if (!refDate) return null;\r\n\r\n const inputDate = startOfDay(new Date(control.value));\r\n if (!isDateValid(inputDate)) {\r\n return { 'date-min': { message: 'Data non valida', referenceDate: this.formatRefDate(refDate) } };\r\n }\r\n\r\n if (isBefore(inputDate, refDate)) {\r\n return {\r\n 'date-min': {\r\n message: `La data deve essere successiva o uguale a ${this.formatRefDate(refDate)}`,\r\n referenceDate: this.formatRefDate(refDate),\r\n inputDate: format(inputDate, 'dd/MM/yyyy'),\r\n },\r\n };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n private createDateMaxValidator(value: string, offset?: string): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n if (!control.value) return null;\r\n\r\n const refDate = this.parseReferenceDate(value, offset);\r\n if (!refDate) return null;\r\n\r\n const inputDate = startOfDay(new Date(control.value));\r\n if (!isDateValid(inputDate)) {\r\n return { 'date-max': { message: 'Data non valida', referenceDate: this.formatRefDate(refDate) } };\r\n }\r\n\r\n if (isAfter(inputDate, refDate)) {\r\n return {\r\n 'date-max': {\r\n message: `La data deve essere precedente o uguale a ${this.formatRefDate(refDate)}`,\r\n referenceDate: this.formatRefDate(refDate),\r\n inputDate: format(inputDate, 'dd/MM/yyyy'),\r\n },\r\n };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n /**\r\n * Parsa una data di riferimento da keyword o stringa DD/MM/YYYY\r\n * e applica un eventuale offset temporale.\r\n */\r\n private parseReferenceDate(value: string, offset?: string): Date | null {\r\n const today = startOfDay(new Date());\r\n let date: Date;\r\n\r\n switch (value?.toLowerCase().trim()) {\r\n case 'today':\r\n case 'oggi':\r\n date = today;\r\n break;\r\n case 'tomorrow':\r\n case 'domani':\r\n date = addDays(today, 1);\r\n break;\r\n case 'yesterday':\r\n case 'ieri':\r\n date = addDays(today, -1);\r\n break;\r\n default: {\r\n // Prova DD/MM/YYYY\r\n const parsed = parse(value, 'dd/MM/yyyy', new Date());\r\n if (isDateValid(parsed)) {\r\n date = startOfDay(parsed);\r\n } else {\r\n // Prova YYYY-MM-DD (ISO)\r\n const isoDate = new Date(value);\r\n if (isDateValid(isoDate)) {\r\n date = startOfDay(isoDate);\r\n } else {\r\n return null;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return offset ? this.applyDateOffset(date, offset) : date;\r\n }\r\n\r\n /**\r\n * Applica un offset temporale a una data.\r\n *\r\n * Formato: `numero + unita`\r\n * - `y`/`a` = anni, `m` = mesi, `g`/`d` = giorni, `s`/`w` = settimane\r\n */\r\n private applyDateOffset(date: Date, offset: string): Date {\r\n const match = offset.match(/^(-?\\d+)([yYaAmMgGdDsSwW])$/);\r\n if (!match) return date;\r\n\r\n const amount = parseInt(match[1], 10);\r\n switch (match[2].toLowerCase()) {\r\n case 'y':\r\n case 'a':\r\n return addYears(date, amount);\r\n case 'm':\r\n return addMonths(date, amount);\r\n case 'g':\r\n case 'd':\r\n return addDays(date, amount);\r\n case 's':\r\n case 'w':\r\n return addWeeks(date, amount);\r\n default:\r\n return date;\r\n }\r\n }\r\n\r\n private formatRefDate(date: Date): string {\r\n return format(date, 'dd/MM/yyyy');\r\n }\r\n\r\n // ─── File validators ───────────────────────────────────────────\r\n\r\n private createFileSizeValidator(maxSize: number): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n const files: UiFileData[] = control.value;\r\n if (!Array.isArray(files) || files.length === 0) return null;\r\n\r\n const oversized = files.filter((f) => f.size > maxSize);\r\n if (oversized.length > 0) {\r\n return {\r\n fileSize: {\r\n maxSize,\r\n maxSizeFormatted: this.formatFileSize(maxSize),\r\n files: oversized.map((f) => f.filename),\r\n },\r\n };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n private createFileTypeValidator(allowedTypes: string[]): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n const files: UiFileData[] = control.value;\r\n if (!Array.isArray(files) || files.length === 0) return null;\r\n\r\n const invalid = files.filter((f) => {\r\n return !allowedTypes.some((type) => {\r\n if (type.endsWith('/*')) {\r\n const category = type.split('/')[0];\r\n return f.mimeType.startsWith(category + '/');\r\n }\r\n return f.mimeType === type;\r\n });\r\n });\r\n\r\n if (invalid.length > 0) {\r\n return {\r\n fileType: {\r\n allowedTypes,\r\n files: invalid.map((f) => f.filename),\r\n },\r\n };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n private createFileCountValidator(maxCount: number): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n const files: UiFileData[] = control.value;\r\n if (!Array.isArray(files)) return null;\r\n\r\n if (files.length > maxCount) {\r\n return { fileCount: { maxCount, actualCount: files.length } };\r\n }\r\n return null;\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { UiValidationRule } from '../types/validation.types';\r\n\r\n/** Opzioni per la visibilità degli errori di un campo. */\r\nexport interface UiFieldErrorDisplayOptions {\r\n /** Tratta il campo come prevalorizzato (mostra errori anche senza touched). */\r\n treatAsPrevalorized?: boolean;\r\n}\r\n\r\n/**\r\n * Servizio condiviso per messaggi di errore, visibilità errori e conteggio caratteri\r\n * dei campi form-builder e dei componenti atomici standalone.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiFormFieldErrorService {\r\n /**\r\n * Restituisce i messaggi di errore user-facing per un controllo.\r\n *\r\n * @param control Controllo Angular del campo\r\n * @param rules Regole di validazione dichiarative (messaggi custom dallo schema)\r\n */\r\n getFieldErrors(control: AbstractControl | null, rules: UiValidationRule[] = []): string[] {\r\n if (!control?.errors) return [];\r\n\r\n const messages: string[] = [];\r\n for (const [errorKey, errorValue] of Object.entries(control.errors)) {\r\n const rule = rules.find(\r\n (r) =>\r\n this.normalizeValidationKey(r.type) === errorKey ||\r\n (r.type === 'crossField' && errorKey === 'crossField'),\r\n );\r\n if (rule?.message) {\r\n messages.push(rule.message);\r\n } else {\r\n messages.push(this.getDefaultErrorMessage(errorKey, errorValue));\r\n }\r\n }\r\n return messages;\r\n }\r\n\r\n /**\r\n * Indica se mostrare gli errori per un controllo (invalid + touched/dirty/prevalorizzato).\r\n */\r\n shouldShowFieldErrors(\r\n control: AbstractControl | null,\r\n options: UiFieldErrorDisplayOptions = {},\r\n ): boolean {\r\n if (!control) return false;\r\n return (\r\n control.invalid &&\r\n (control.dirty || control.touched || options.treatAsPrevalorized === true)\r\n );\r\n }\r\n\r\n /**\r\n * Conteggio caratteri corrente/massimo per campi text/textarea con maxLength.\r\n */\r\n getCharCount(\r\n control: AbstractControl | null,\r\n maxLength?: number,\r\n ): { current: number; max: number } | null {\r\n if (maxLength == null || maxLength <= 0) return null;\r\n const current = String(control?.value ?? '').length;\r\n return { current, max: maxLength };\r\n }\r\n\r\n /** Estrae maxLength dalle regole schema. */\r\n resolveMaxLength(rules: UiValidationRule[] = []): number | undefined {\r\n const rule = rules.find((r) => r.type === 'maxLength');\r\n return rule?.value != null ? Number(rule.value) : undefined;\r\n }\r\n\r\n private normalizeValidationKey(schemaType: string): string {\r\n const keyMap: Record<string, string> = {\r\n minLength: 'minlength',\r\n maxLength: 'maxlength',\r\n };\r\n return keyMap[schemaType] || schemaType;\r\n }\r\n\r\n private getDefaultErrorMessage(errorKey: string, errorValue: unknown): string {\r\n if (typeof errorValue === 'string') {\r\n return errorValue;\r\n }\r\n\r\n const ev = errorValue as Record<string, unknown> | null | undefined;\r\n\r\n switch (errorKey) {\r\n case 'required':\r\n return 'Campo obbligatorio';\r\n case 'email':\r\n return 'Formato email non valido';\r\n case 'min':\r\n return `Valore minimo: ${ev?.['min']}`;\r\n case 'max':\r\n return `Valore massimo: ${ev?.['max']}`;\r\n case 'minlength':\r\n return `Lunghezza minima: ${ev?.['requiredLength']} caratteri`;\r\n case 'maxlength':\r\n return `Lunghezza massima: ${ev?.['requiredLength']} caratteri`;\r\n case 'pattern':\r\n return 'Formato non valido';\r\n case 'crossField':\r\n return 'Valore non coerente con il campo correlato';\r\n case 'date-min':\r\n return (ev?.['message'] as string) || 'Data troppo remota';\r\n case 'date-max':\r\n return (ev?.['message'] as string) || 'Data troppo avanzata';\r\n case 'fileSize':\r\n return `Dimensione massima: ${ev?.['maxSizeFormatted']}`;\r\n case 'fileType':\r\n return 'Formato file non accettato';\r\n case 'fileCount':\r\n return `Massimo ${ev?.['maxCount']} file`;\r\n default:\r\n return 'Valore non valido';\r\n }\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiFormErrorDetail } from '../../types/validation.types';\r\n\r\n/**\r\n * Riepilogo stato validazione del form.\r\n *\r\n * Con errori: indicatore + dropdown hover/click per il dettaglio e navigazione ai campi.\r\n * Senza errori: messaggio di stato positivo fisso (no dropdown), UI prevedibile.\r\n *\r\n * @selector ui-form-error-summary\r\n */\r\n@Component({\r\n selector: 'ui-form-error-summary',\r\n standalone: true,\r\n imports: [LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n template: `\r\n <div\r\n class=\"ui-form-error-summary\"\r\n [class.ui-form-error-summary--invalid]=\"hasErrors\"\r\n [class.ui-form-error-summary--valid]=\"!hasErrors\"\r\n >\r\n @if (hasErrors) {\r\n <div\r\n class=\"ui-form-error-summary__panel ui-form-error-summary__panel--invalid\"\r\n (mouseenter)=\"showDropdown = true\"\r\n (mouseleave)=\"showDropdown = false\"\r\n >\r\n <div\r\n class=\"ui-form-error-summary__heading\"\r\n (click)=\"showDropdown = !showDropdown\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-expanded]=\"showDropdown\"\r\n [attr.aria-label]=\"displayCount + ' errori nel form'\"\r\n (keydown.enter)=\"showDropdown = !showDropdown\"\r\n (keydown.space)=\"showDropdown = !showDropdown; $event.preventDefault()\"\r\n >\r\n <lucide-icon name=\"alert-circle\" [size]=\"20\" class=\"ui-form-error-summary__icon\" aria-hidden=\"true\" />\r\n <p class=\"ui-form-error-summary__text\">\r\n Sono presenti <strong>{{ displayCount }}</strong>\r\n {{ displayCount === 1 ? 'errore' : 'errori' }} nel form.\r\n </p>\r\n </div>\r\n\r\n <div\r\n class=\"ui-form-error-summary__dropdown\"\r\n [class.ui-form-error-summary__dropdown--visible]=\"showDropdown\"\r\n role=\"list\"\r\n aria-label=\"Elenco errori del form\"\r\n >\r\n <div class=\"ui-form-error-summary__dropdown-content\">\r\n <h4 class=\"ui-form-error-summary__dropdown-title\">Dettagli errori:</h4>\r\n <ul class=\"ui-form-error-summary__list\">\r\n @for (detail of errors; track detail.fieldKey) {\r\n <li\r\n class=\"ui-form-error-summary__item\"\r\n role=\"listitem\"\r\n (click)=\"onFieldClick(detail.fieldKey)\"\r\n tabindex=\"0\"\r\n (keydown.enter)=\"onFieldClick(detail.fieldKey)\"\r\n >\r\n <div class=\"ui-form-error-summary__field-name\">\r\n <lucide-icon name=\"arrow-right\" [size]=\"14\" class=\"ui-form-error-summary__arrow\" aria-hidden=\"true\" />\r\n {{ detail.fieldLabel }}\r\n </div>\r\n <div class=\"ui-form-error-summary__messages\">\r\n @for (err of detail.errors; track $index; let last = $last) {\r\n <span>{{ err }}@if (!last) {, }</span>\r\n }\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"ui-form-error-summary__panel ui-form-error-summary__panel--valid\" role=\"status\" aria-live=\"polite\">\r\n <lucide-icon name=\"check-circle\" [size]=\"20\" class=\"ui-form-error-summary__icon-valid\" aria-hidden=\"true\" />\r\n <p class=\"ui-form-error-summary__text-valid\">{{ validMessage }}</p>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styleUrl: './form-error-summary.component.scss',\r\n})\r\nexport class UiFormErrorSummaryComponent {\r\n /** Lista di errori dettagliati per campo. */\r\n @Input() errors: UiFormErrorDetail[] = [];\r\n\r\n /** Conteggio totale degli errori (somma di tutti i messaggi). */\r\n @Input() totalErrorCount = 0;\r\n\r\n /** Testo mostrato quando non ci sono errori. */\r\n @Input() validMessage = 'Il form è compilato correttamente';\r\n\r\n /** Emesso quando l'utente clicca su un errore per navigare al campo. */\r\n @Output() fieldClick = new EventEmitter<string>();\r\n\r\n /** @internal Stato del dropdown (solo con errori). */\r\n showDropdown = false;\r\n\r\n /** True se il form ha almeno un errore da mostrare nel summary. */\r\n get hasErrors(): boolean {\r\n return this.displayCount > 0;\r\n }\r\n\r\n /** Conteggio da visualizzare: usa totalErrorCount se fornito, altrimenti conta dai dettagli. */\r\n get displayCount(): number {\r\n return this.totalErrorCount > 0 ? this.totalErrorCount : this.errors.reduce((sum, d) => sum + d.errors.length, 0);\r\n }\r\n\r\n /** @internal Gestione click su errore. */\r\n onFieldClick(fieldKey: string): void {\r\n this.showDropdown = false;\r\n this.fieldClick.emit(fieldKey);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n forwardRef,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiFileData, UiFileInputConfig } from '../../types/field.types';\r\n\r\n/**\r\n * Componente file input standalone con drag & drop,\r\n * anteprima, validazione e supporto multiplo.\r\n *\r\n * Implementa `ControlValueAccessor` per integrazione\r\n * diretta con Angular Reactive Forms.\r\n *\r\n * @selector ui-file-input\r\n */\r\n@Component({\r\n selector: 'ui-file-input',\r\n standalone: true,\r\n imports: [LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiFileInputComponent),\r\n multi: true,\r\n },\r\n ],\r\n template: `\r\n <div class=\"ui-file-input\" [class.ui-file-input--disabled]=\"disabled()\" [class.ui-file-input--drag-over]=\"isDragOver()\">\r\n <!-- Area drag & drop -->\r\n @if (config?.enableDragDrop !== false) {\r\n <div\r\n class=\"ui-file-input__drop-zone\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave()\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"fileInput.click()\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"config?.dragDropText || 'Trascina i file qui o clicca per selezionare'\"\r\n (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\"\r\n >\r\n <lucide-icon name=\"upload\" [size]=\"24\" aria-hidden=\"true\" />\r\n <span class=\"ui-file-input__drop-text\">\r\n {{ config?.dragDropText || 'Trascina i file qui o clicca per selezionare' }}\r\n </span>\r\n @if (config?.acceptedTypes?.length) {\r\n <span class=\"ui-file-input__hint\">\r\n Formati: {{ config!.acceptedTypes!.join(', ') }}\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <button\r\n class=\"ui-file-input__select-btn\"\r\n type=\"button\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"fileInput.click()\"\r\n >\r\n <lucide-icon name=\"paperclip\" [size]=\"16\" aria-hidden=\"true\" />\r\n {{ config?.placeholder || 'Seleziona file' }}\r\n </button>\r\n }\r\n\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n class=\"ui-file-input__native\"\r\n [accept]=\"acceptString\"\r\n [multiple]=\"config?.multiple ?? false\"\r\n [disabled]=\"disabled()\"\r\n (change)=\"onFileSelected($event)\"\r\n />\r\n\r\n <!-- Lista file selezionati -->\r\n @if (files().length > 0) {\r\n <div class=\"ui-file-input__file-list\" role=\"list\">\r\n @for (file of files(); track file.id || $index) {\r\n <div class=\"ui-file-input__file-item\" role=\"listitem\">\r\n <div class=\"ui-file-input__file-info\">\r\n <lucide-icon name=\"file\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span class=\"ui-file-input__file-name\">{{ file.filename }}</span>\r\n <span class=\"ui-file-input__file-size\">{{ formatSize(file.size) }}</span>\r\n </div>\r\n @if (!disabled()) {\r\n <button\r\n class=\"ui-file-input__remove-btn\"\r\n type=\"button\"\r\n [attr.aria-label]=\"'Rimuovi ' + file.filename\"\r\n (click)=\"removeFile($index)\"\r\n >\r\n <lucide-icon name=\"x\" [size]=\"14\" aria-hidden=\"true\" />\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styleUrl: './file-input.component.scss',\r\n})\r\nexport class UiFileInputComponent implements ControlValueAccessor {\r\n /** Configurazione del file input. */\r\n @Input() config: UiFileInputConfig | undefined;\r\n\r\n /** File rimosso dalla lista. */\r\n @Output() fileRemoved = new EventEmitter<UiFileData>();\r\n\r\n /** Errore di validazione file. */\r\n @Output() validationError = new EventEmitter<string>();\r\n\r\n // ── Stato interno (signals) ──\r\n readonly files = signal<UiFileData[]>([]);\r\n readonly disabled = signal(false);\r\n readonly isDragOver = signal(false);\r\n\r\n private onChange: (value: UiFileData[]) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n /** Stringa accept per l'input nativo. */\r\n get acceptString(): string {\r\n return this.config?.acceptedTypes?.join(',') || '';\r\n }\r\n\r\n // ── ControlValueAccessor ──\r\n writeValue(value: UiFileData[]): void {\r\n this.files.set(Array.isArray(value) ? value : []);\r\n }\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled.set(isDisabled);\r\n }\r\n\r\n // ── Drag & drop ──\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver.set(true);\r\n }\r\n\r\n onDragLeave(): void {\r\n this.isDragOver.set(false);\r\n }\r\n\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver.set(false);\r\n if (this.disabled()) return;\r\n\r\n const droppedFiles = event.dataTransfer?.files;\r\n if (droppedFiles?.length) {\r\n this.processFiles(droppedFiles);\r\n }\r\n }\r\n\r\n onFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files?.length) {\r\n this.processFiles(input.files);\r\n input.value = ''; // Reset per permettere la ri-selezione dello stesso file\r\n }\r\n }\r\n\r\n removeFile(index: number): void {\r\n const current = [...this.files()];\r\n const removed = current.splice(index, 1);\r\n this.files.set(current);\r\n this.onChange(current);\r\n if (removed[0]) this.fileRemoved.emit(removed[0]);\r\n }\r\n\r\n formatSize(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\r\n }\r\n\r\n // ── Processing ──\r\n private async processFiles(fileList: FileList): Promise<void> {\r\n this.onTouched();\r\n const maxFiles = this.config?.maxFiles || Infinity;\r\n const current = this.config?.multiple ? [...this.files()] : [];\r\n const remaining = maxFiles - current.length;\r\n\r\n if (remaining <= 0) {\r\n this.validationError.emit(`Numero massimo di file raggiunto (${maxFiles})`);\r\n return;\r\n }\r\n\r\n const filesToProcess = Array.from(fileList).slice(0, remaining);\r\n\r\n for (const file of filesToProcess) {\r\n // Validazione dimensione\r\n if (this.config?.maxFileSize && file.size > this.config.maxFileSize) {\r\n this.validationError.emit(`Il file \"${file.name}\" supera la dimensione massima consentita`);\r\n continue;\r\n }\r\n\r\n // Validazione tipo\r\n if (this.config?.acceptedTypes?.length) {\r\n const isAccepted = this.config.acceptedTypes.some((type) => {\r\n if (type.endsWith('/*')) {\r\n return file.type.startsWith(type.split('/')[0] + '/');\r\n }\r\n return file.type === type;\r\n });\r\n if (!isAccepted) {\r\n this.validationError.emit(`Il formato del file \"${file.name}\" non e accettato`);\r\n continue;\r\n }\r\n }\r\n\r\n const content = new Uint8Array(await file.arrayBuffer());\r\n const ext = file.name.split('.').pop() || '';\r\n\r\n const fileData: UiFileData = {\r\n filename: file.name,\r\n content,\r\n mimeType: file.type,\r\n extension: ext,\r\n size: file.size,\r\n needsUpload: true,\r\n id: `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`, // NOSONAR - Used for non-cryptographic file ID generation in UI\r\n timestamp: new Date(),\r\n };\r\n\r\n // Genera preview per immagini\r\n if (this.config?.showPreview && file.type.startsWith('image/')) {\r\n fileData.previewUrl = URL.createObjectURL(file);\r\n }\r\n\r\n current.push(fileData);\r\n }\r\n\r\n this.files.set(current);\r\n this.onChange(current);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport * as locationData from '../../../sources/location-data.opt.json';\r\nimport * as nazioniData from '../../../sources/nazioni.opt.json';\r\n\r\n// ─── Interfacce JSON ottimizzate ──────────────────────────────────\r\n\r\n/** Voce nazione nel JSON ottimizzato. */\r\nexport interface MinifiedNazioneOption {\r\n /** Codice nazione (es. `'ITA'`). */\r\n x: string;\r\n /** Descrizione (es. `'Italia'`). */\r\n d: string;\r\n}\r\n\r\n/** Voce provincia/comune nel JSON ottimizzato. */\r\nexport interface MinifiedSelectOption {\r\n /** Codice (provincia o comune). */\r\n x: string;\r\n /** Descrizione. */\r\n d: string;\r\n /** CAP singolo o multipli. */\r\n c?: string | string[];\r\n}\r\n\r\ninterface MinifiedLocationMap {\r\n province: MinifiedSelectOption[];\r\n comuniPerProvincia: Record<string, MinifiedSelectOption[]>;\r\n}\r\n\r\ninterface MinifiedNazioniMap {\r\n nazioni: MinifiedNazioneOption[];\r\n}\r\n\r\n// ─── Interfacce pubbliche (formato legacy compatibile) ───────────\r\n\r\n/** Nazione. */\r\nexport interface UiNazione {\r\n codStatoPk: string;\r\n codiceCatastale: string;\r\n descrizione: string;\r\n}\r\n\r\n/** Provincia. */\r\nexport interface UiProvincia {\r\n codiceProvinciaPk: string;\r\n nomeProvincia: string;\r\n siglaProvincia: string;\r\n visibile: boolean;\r\n}\r\n\r\n/** Comune. */\r\nexport interface UiComune {\r\n codiceCatastale: string;\r\n codiceComunePk: string;\r\n comuneSoppresso: boolean;\r\n nomeComune: string;\r\n prov: UiProvincia;\r\n visibile: boolean;\r\n}\r\n\r\n/**\r\n * Servizio per la gestione dei dati geografici italiani\r\n * da file JSON statici ottimizzati.\r\n *\r\n * Elimina la necessita di chiamate backend per nazioni,\r\n * province, comuni e CAP. I dati vengono caricati in memoria\r\n * al primo accesso e poi serviti dalla cache.\r\n *\r\n * @providedIn 'root'\r\n *\r\n * @example\r\n * ```typescript\r\n * const nazioni = await this.locationService.getNazioni();\r\n * const province = await this.locationService.getProvince();\r\n * const comuni = await this.locationService.getComuniByProvincia('015');\r\n * const caps = await this.locationService.getCapList('015146');\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiLocationService {\r\n private readonly nazioniMap: MinifiedNazioniMap;\r\n private readonly locationMap: MinifiedLocationMap;\r\n private readonly nazioniCache = new Map<string, UiNazione>();\r\n private readonly provinceCache = new Map<string, UiProvincia>();\r\n private readonly comuniCache = new Map<string, UiComune>();\r\n\r\n constructor() {\r\n this.nazioniMap = nazioniData as MinifiedNazioniMap;\r\n this.locationMap = locationData as any;\r\n this.initializeCaches();\r\n }\r\n\r\n // ─── API pubblica ──────────────────────────────────────────────\r\n\r\n /** Elenco completo delle nazioni (Italia prima). */\r\n async getNazioni(): Promise<{ data: UiNazione[] }> {\r\n const nazioni = Array.from(this.nazioniCache.values());\r\n return { data: this.sortNazioniItaliaFirst(nazioni) };\r\n }\r\n\r\n /** Elenco completo delle province, ordinate alfabeticamente. */\r\n async getProvince(): Promise<{ content: UiProvincia[] }> {\r\n const province = Array.from(this.provinceCache.values()).sort((a, b) =>\r\n a.nomeProvincia.localeCompare(b.nomeProvincia, 'it'),\r\n );\r\n return { content: province };\r\n }\r\n\r\n /** Elenco dei comuni per una specifica provincia. */\r\n async getComuniByProvincia(provinciaId: string): Promise<UiComune[]> {\r\n const comuniMin = this.locationMap.comuniPerProvincia[provinciaId] || [];\r\n const provincia = this.provinceCache.get(provinciaId);\r\n if (!provincia) return [];\r\n\r\n return comuniMin\r\n .map((c) => ({\r\n codiceCatastale: c.x,\r\n codiceComunePk: c.x,\r\n comuneSoppresso: false,\r\n nomeComune: c.d,\r\n prov: provincia,\r\n visibile: true,\r\n }))\r\n .sort((a, b) => a.nomeComune.localeCompare(b.nomeComune, 'it'));\r\n }\r\n\r\n /** Elenco dei CAP per un comune. */\r\n async getCapList(comuneId: string): Promise<string[]> {\r\n for (const comuni of Object.values(this.locationMap.comuniPerProvincia)) {\r\n const comune = comuni.find((c) => c.x === comuneId);\r\n if (comune?.c) {\r\n return Array.isArray(comune.c) ? comune.c : [comune.c];\r\n }\r\n }\r\n return [];\r\n }\r\n\r\n /** Dati completi di una location (nazione, provincia o comune). */\r\n async getLocationFullData(\r\n type: 'nazione' | 'provincia' | 'comune',\r\n id: string,\r\n provinciaId?: string,\r\n ): Promise<UiNazione | UiProvincia | UiComune | null> {\r\n switch (type) {\r\n case 'nazione':\r\n return this.nazioniCache.get(id) ?? null;\r\n case 'provincia':\r\n return this.provinceCache.get(id) ?? null;\r\n case 'comune': {\r\n if (!provinciaId) return this.comuniCache.get(id) ?? null;\r\n const comuni = await this.getComuniByProvincia(provinciaId);\r\n return comuni.find((c) => c.codiceComunePk === id) ?? null;\r\n }\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n // ─── Inizializzazione cache ────────────────────────────────────\r\n\r\n private initializeCaches(): void {\r\n // Nazioni\r\n for (const n of this.nazioniMap.nazioni) {\r\n this.nazioniCache.set(n.x, {\r\n codStatoPk: n.x,\r\n codiceCatastale: n.x,\r\n descrizione: n.d,\r\n });\r\n }\r\n\r\n // Province\r\n for (const p of this.locationMap.province) {\r\n this.provinceCache.set(p.x, {\r\n codiceProvinciaPk: p.x,\r\n nomeProvincia: p.d,\r\n siglaProvincia: p.x,\r\n visibile: true,\r\n });\r\n }\r\n\r\n // Comuni (con riferimento alla provincia)\r\n for (const [provinciaId, comuni] of Object.entries(this.locationMap.comuniPerProvincia)) {\r\n const provincia = this.provinceCache.get(provinciaId);\r\n if (!provincia) continue;\r\n for (const c of comuni) {\r\n this.comuniCache.set(c.x, {\r\n codiceCatastale: c.x,\r\n codiceComunePk: c.x,\r\n comuneSoppresso: false,\r\n nomeComune: c.d,\r\n prov: provincia,\r\n visibile: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n private sortNazioniItaliaFirst(nazioni: UiNazione[]): UiNazione[] {\r\n return nazioni.sort((a, b) => {\r\n const aItalia = a.descrizione?.toLowerCase().includes('italia') || a.codStatoPk === 'ITA';\r\n const bItalia = b.descrizione?.toLowerCase().includes('italia') || b.codStatoPk === 'ITA';\r\n if (aItalia && !bItalia) return -1;\r\n if (!aItalia && bItalia) return 1;\r\n return (a.descrizione || '').localeCompare(b.descrizione || '', 'it', { sensitivity: 'base' });\r\n });\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n forwardRef,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectorRef,\r\n Injector,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormBuilder,\r\n FormGroup,\r\n NG_VALUE_ACCESSOR,\r\n NG_VALIDATORS,\r\n FormControl,\r\n AbstractControl,\r\n ValidationErrors,\r\n Validators,\r\n Validator,\r\n NgControl,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { Subject, combineLatest, takeUntil, distinctUntilChanged, startWith, map } from 'rxjs';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { UiLocationService, UiNazione, UiProvincia, UiComune } from '../../services/location.service';\r\nimport { UiLocationConfig, UiLocationValue } from '../../types/territoriale.types';\r\n\r\n/**\r\n * Interfaccia interna per i CAP nel componente.\r\n */\r\ninterface UiCapOption {\r\n /** ID del CAP. */\r\n id: string;\r\n /** Codice CAP visualizzato. */\r\n codice: string;\r\n /** ID del comune associato. */\r\n comuneId: string;\r\n}\r\n\r\n/**\r\n * Componente standalone per la selezione di dati geografici italiani o esteri.\r\n *\r\n * Supporta due modalita:\r\n * - **Italia**: selezione a cascata nazione -> provincia -> comune -> CAP\r\n * - **Estero**: selezione nazione + campo testo libero per il comune\r\n *\r\n * Campi opzionali configurabili: indirizzo, mail, PEC, telefono.\r\n *\r\n * Implementa `ControlValueAccessor` e `Validator` per l'integrazione\r\n * diretta con Angular Reactive Forms.\r\n *\r\n * Utilizza dati da JSON statici tramite `UiLocationService`\r\n * (nessuna dipendenza al backend).\r\n *\r\n * @selector ui-specifica-territoriale\r\n *\r\n * @example\r\n * ```html\r\n * <ui-specifica-territoriale\r\n * [formControl]=\"myControl\"\r\n * [config]=\"{ italyByDefault: true, cap: { show: true } }\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-specifica-territoriale',\r\n standalone: true,\r\n imports: [ReactiveFormsModule, MatFormFieldModule, MatSelectModule, MatInputModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiSpecificaTerritorialeComponent),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => UiSpecificaTerritorialeComponent),\r\n multi: true,\r\n },\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: './specifica-territoriale.component.html',\r\n styleUrl: './specifica-territoriale.component.scss',\r\n})\r\nexport class UiSpecificaTerritorialeComponent implements ControlValueAccessor, Validator, OnInit, OnDestroy {\r\n /** Configurazione del componente. */\r\n @Input() config: UiLocationConfig = {};\r\n\r\n /** Stato disabilitato globale. */\r\n @Input() disabled = false;\r\n\r\n // ─── Pattern di validazione ──────────────────────────────────────\r\n private readonly EMAIL_PATTERN = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n private readonly PEC_PATTERN = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n private readonly PHONE_PATTERN = /^[+]?[0-9\\s\\-()]{6,16}$/;\r\n\r\n // ─── Stato interno ──────────────────────────────────────────────\r\n form!: FormGroup;\r\n isItalian = false;\r\n isForeign = false;\r\n ngControl!: NgControl;\r\n\r\n /** Elenco nazioni disponibili. */\r\n nazioni: UiNazione[] = [];\r\n /** Elenco province disponibili. */\r\n province: UiProvincia[] = [];\r\n /** Comuni filtrati per la provincia selezionata. */\r\n filteredComuni: UiComune[] = [];\r\n /** CAP filtrati per il comune selezionato. */\r\n filteredCaps: UiCapOption[] = [];\r\n\r\n /** Promise di inizializzazione (utile per test e table-territoriale). */\r\n initializationPromise: Promise<void> | null = null;\r\n\r\n private readonly destroy$ = new Subject<void>();\r\n private onChange = (_value: UiLocationValue) => {};\r\n private onTouched = () => {};\r\n private onValidatorChange = () => {};\r\n private subscriptionsInitialized = false;\r\n private pendingWriteValue: UiLocationValue | null = null;\r\n private isInitializing = false;\r\n private tipologicheLoaded = false;\r\n\r\n constructor(\r\n private readonly fb: FormBuilder,\r\n private readonly injector: Injector,\r\n private readonly cdr: ChangeDetectorRef,\r\n private readonly locationService: UiLocationService,\r\n ) {\r\n this.initializeForm();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.setupNgControl();\r\n this.initializationPromise = this.initializeComponent();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n // ─── ControlValueAccessor ───────────────────────────────────────\r\n\r\n writeValue(value: UiLocationValue | null): void {\r\n if (!this.tipologicheLoaded) {\r\n this.pendingWriteValue = value;\r\n return;\r\n }\r\n this.processWriteValue(value);\r\n }\r\n\r\n registerOnChange(fn: (value: UiLocationValue) => void): void {\r\n this.onChange = (value) => {\r\n if (!this.isInitializing) fn(value);\r\n };\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n registerOnValidatorChange(fn: () => void): void {\r\n this.onValidatorChange = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n if (isDisabled) {\r\n this.form.disable();\r\n } else {\r\n this.form.enable();\r\n this.applyFieldsDisabledState();\r\n }\r\n }\r\n\r\n // ─── Validator ──────────────────────────────────────────────────\r\n\r\n validate(_control: AbstractControl): ValidationErrors | null {\r\n if (!this.form) return null;\r\n\r\n const errors: ValidationErrors = {};\r\n const isNazioneRequired = this.config.nazione?.required !== false;\r\n const isProvinciaRequired = this.config.provincia?.required !== false;\r\n const isComuneRequired = this.config.comune?.required !== false;\r\n const isComuneEsteroRequired = this.config.comuneEstero?.required !== false;\r\n\r\n // Validazione nazione\r\n if (isNazioneRequired && !this.form.get('nazioneId')?.value) {\r\n errors['nazioneRequired'] = 'Seleziona una nazione';\r\n }\r\n\r\n // Validazioni Italia\r\n if (this.isItalian) {\r\n if (isProvinciaRequired && !this.form.get('provinciaId')?.value) {\r\n errors['provinciaRequired'] = 'Seleziona una provincia';\r\n }\r\n if (isComuneRequired && !this.form.get('comuneId')?.value) {\r\n errors['comuneRequired'] = 'Seleziona un comune';\r\n }\r\n if (this.config.cap?.required && this.showCAP && !this.form.get('cap')?.value) {\r\n errors['capRequired'] = 'Inserisci il CAP';\r\n }\r\n if (this.config.indirizzo?.required && this.showIndirizzo) {\r\n const v = this.form.get('indirizzo')?.value;\r\n if (!v || v.trim() === '') errors['indirizzoRequired'] = \"Inserisci l'indirizzo\";\r\n }\r\n this.validateContactFields(errors);\r\n }\r\n\r\n // Validazioni estero\r\n if (this.isForeign) {\r\n const comuneEstero = this.form.get('comuneEstero')?.value;\r\n if (isComuneEsteroRequired && (!comuneEstero || comuneEstero.trim() === '')) {\r\n errors['comuneEsteroRequired'] = 'Inserisci il comune estero';\r\n }\r\n }\r\n\r\n return Object.keys(errors).length > 0 ? errors : null;\r\n }\r\n\r\n // ─── API pubblica ───────────────────────────────────────────────\r\n\r\n /** Marca tutti i controlli interni come touched. */\r\n markAsTouched(): void {\r\n Object.values(this.form.controls).forEach((c) => c.markAsTouched());\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Verifica se mostrare gli errori per un campo interno. */\r\n shouldShowFieldErrors(fieldKey: string): boolean {\r\n const control = this.form.get(fieldKey);\r\n return !!(control?.invalid && (control.touched || control.dirty));\r\n }\r\n\r\n /** Errori di un campo interno come array di messaggi. */\r\n getFieldErrors(fieldKey: string): string[] {\r\n const control = this.form.get(fieldKey);\r\n if (!control?.errors) return [];\r\n const messages: string[] = [];\r\n const errs = control.errors;\r\n if (errs['required']) messages.push('Campo obbligatorio');\r\n if (errs['pattern']) messages.push('Formato non valido');\r\n if (errs['email']) messages.push('Email non valida');\r\n return messages;\r\n }\r\n\r\n /** Handler blur per propagare il touched. */\r\n onBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n /** Resetta lo stato del componente. */\r\n resetComponentState(): void {\r\n this.isItalian = false;\r\n this.isForeign = false;\r\n this.filteredComuni = [];\r\n this.filteredCaps = [];\r\n this.form.get('comuneId')?.disable({ emitEvent: false });\r\n this.form.get('cap')?.disable({ emitEvent: false });\r\n this.updateValidators();\r\n }\r\n\r\n // ─── Getter calcolati ───────────────────────────────────────────\r\n\r\n /** Labels personalizzabili con valori di default. */\r\n get labels() {\r\n return {\r\n nazione: this.config.labels?.nazione || 'Nazione',\r\n provincia: this.config.labels?.provincia || 'Provincia',\r\n comune: this.config.labels?.comune || 'Comune',\r\n cap: this.config.labels?.cap || 'CAP',\r\n indirizzo: this.config.labels?.indirizzo || 'Indirizzo',\r\n comuneEstero: this.config.labels?.comuneEstero || 'Comune Estero',\r\n mail: this.config.labels?.mail || 'Email',\r\n pec: this.config.labels?.pec || 'PEC',\r\n telefono: this.config.labels?.telefono || 'Telefono',\r\n };\r\n }\r\n\r\n get hasValidationErrors(): boolean {\r\n const externalInvalid = !!(\r\n this.ngControl?.control?.invalid &&\r\n (this.ngControl.control.touched || this.ngControl.control.dirty)\r\n );\r\n if (externalInvalid) return true;\r\n\r\n const isInteracted =\r\n this.form?.touched || this.form?.dirty || this.ngControl?.control?.touched || this.ngControl?.control?.dirty;\r\n if (isInteracted) {\r\n return !!this.validate(null as any);\r\n }\r\n return false;\r\n }\r\n\r\n get validationErrors(): string[] {\r\n // Errori esterni dal FormBuilder\r\n if (this.ngControl?.control?.errors) {\r\n const errors: string[] = [];\r\n if (this.ngControl.control.errors['required']) {\r\n errors.push('Inizia selezionando la nazione');\r\n }\r\n if (errors.length > 0) return errors;\r\n }\r\n\r\n // Errori interni\r\n const internalErrors = this.validate(null as any);\r\n if (!internalErrors) return [];\r\n return Object.values(internalErrors) as string[];\r\n }\r\n\r\n get showCAP(): boolean {\r\n return this.config.cap?.show !== false;\r\n }\r\n get showIndirizzo(): boolean {\r\n return this.config.indirizzo?.show !== false;\r\n }\r\n get showMail(): boolean {\r\n return this.config.mail?.show === true;\r\n }\r\n get showPEC(): boolean {\r\n return this.config.pec?.show === true;\r\n }\r\n get showTelefono(): boolean {\r\n return this.config.telefono?.show === true;\r\n }\r\n\r\n get capColumns(): number {\r\n return this.config.cap?.columns || 6;\r\n }\r\n get indirizzoColumns(): number {\r\n return this.config.indirizzo?.columns || 12;\r\n }\r\n get mailColumns(): number {\r\n return this.config.mail?.columns || 6;\r\n }\r\n get pecColumns(): number {\r\n return this.config.pec?.columns || 6;\r\n }\r\n get telefonoColumns(): number {\r\n return this.config.telefono?.columns || 6;\r\n }\r\n\r\n get isItalyByDefault(): boolean {\r\n return this.config.italyByDefault === true;\r\n }\r\n\r\n get isCapDisabled(): boolean {\r\n const comuneId = this.form.get('comuneId')?.value;\r\n return !comuneId || this.filteredCaps.length === 0 || this.filteredCaps.length === 1;\r\n }\r\n\r\n get isNazioneDisabled(): boolean {\r\n return this.disabled || this.config.italyByDefault === true;\r\n }\r\n\r\n get isRequired(): boolean {\r\n if (this.config.nazione?.required !== false) return true;\r\n if (!this.ngControl?.control) return false;\r\n const validator = this.ngControl.control.validator;\r\n if (validator) {\r\n const errors = validator({} as AbstractControl);\r\n return !!errors?.['required'];\r\n }\r\n return false;\r\n }\r\n\r\n // ─── Inizializzazione ──────────────────────────────────────────\r\n\r\n private async initializeComponent(): Promise<void> {\r\n try {\r\n await this.loadLocationData();\r\n this.tipologicheLoaded = true;\r\n\r\n if (this.pendingWriteValue !== null) {\r\n this.processWriteValue(this.pendingWriteValue);\r\n this.pendingWriteValue = null;\r\n } else {\r\n this.applyInitialConfiguration();\r\n }\r\n\r\n if (!this.subscriptionsInitialized) {\r\n this.setupFormSubscriptions();\r\n this.subscriptionsInitialized = true;\r\n }\r\n } catch (error) {\r\n console.error('[UiSpecificaTerritoriale] Errore inizializzazione:', error);\r\n this.tipologicheLoaded = false;\r\n }\r\n }\r\n\r\n private initializeForm(): void {\r\n this.form = this.fb.group({\r\n nazioneId: [null, Validators.required],\r\n provinciaId: [null],\r\n comuneId: [{ value: null, disabled: true }],\r\n cap: [{ value: null, disabled: true }],\r\n comuneEstero: [null],\r\n indirizzo: [null],\r\n mail: [null],\r\n pec: [null],\r\n telefono: [null],\r\n });\r\n }\r\n\r\n private setupNgControl(): void {\r\n const ngControl = this.injector.get(NgControl, null, { self: true, optional: true });\r\n if (ngControl) {\r\n this.ngControl = ngControl;\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n private async loadLocationData(): Promise<void> {\r\n const [nazioniResult, provinceResult] = await Promise.all([\r\n this.locationService.getNazioni(),\r\n this.locationService.getProvince(),\r\n ]);\r\n this.nazioni = nazioniResult.data;\r\n this.province = provinceResult.content;\r\n }\r\n\r\n // ─── Gestione writeValue ────────────────────────────────────────\r\n\r\n private processWriteValue(value: UiLocationValue | null): void {\r\n this.isInitializing = true;\r\n\r\n if (value) {\r\n const processedValue = this.handleItalyByDefaultValue(value);\r\n this.form.patchValue(processedValue, { emitEvent: false });\r\n\r\n this.updateComponentState(processedValue).then(() => {\r\n this.applyInitialConfiguration();\r\n this.isInitializing = false;\r\n this.form.patchValue(processedValue, { emitEvent: true });\r\n this.handleTerritorialChanges(\r\n processedValue.nazioneId || '',\r\n processedValue.provinciaId || '',\r\n processedValue.comuneId || '',\r\n );\r\n this.updateValidators();\r\n Object.values(this.form.controls).forEach((ctrl) => ctrl.updateValueAndValidity({ emitEvent: false }));\r\n this.form.updateValueAndValidity();\r\n });\r\n } else {\r\n this.form.reset(undefined, { emitEvent: false });\r\n this.resetComponentState();\r\n this.applyInitialConfiguration();\r\n this.isInitializing = false;\r\n }\r\n }\r\n\r\n private handleItalyByDefaultValue(value: UiLocationValue): UiLocationValue {\r\n if (!this.config.italyByDefault) return value;\r\n if (value.nazioneId && value.nazioneId !== 'ITA') {\r\n return { ...value, nazioneId: 'ITA', comuneEstero: undefined };\r\n }\r\n return value;\r\n }\r\n\r\n // ─── Subscriptions ──────────────────────────────────────────────\r\n\r\n private setupFormSubscriptions(): void {\r\n // Subscription per i cambiamenti territoriali (nazione/provincia/comune)\r\n combineLatest([\r\n this.form\r\n .get('nazioneId')!\r\n .valueChanges.pipe(startWith(this.form.get('nazioneId')!.value), distinctUntilChanged()),\r\n this.form\r\n .get('provinciaId')!\r\n .valueChanges.pipe(startWith(this.form.get('provinciaId')!.value), distinctUntilChanged()),\r\n this.form.get('comuneId')!.valueChanges.pipe(startWith(this.form.get('comuneId')!.value), distinctUntilChanged()),\r\n ])\r\n .pipe(\r\n takeUntil(this.destroy$),\r\n map(([nazioneId, provinciaId, comuneId]) => ({ nazioneId, provinciaId, comuneId })),\r\n )\r\n .subscribe(({ nazioneId, provinciaId, comuneId }) => {\r\n if (!this.isInitializing && this.tipologicheLoaded) {\r\n this.handleTerritorialChanges(nazioneId, provinciaId, comuneId);\r\n }\r\n });\r\n\r\n // Subscription per tutti i cambiamenti del form\r\n this.form.valueChanges\r\n .pipe(\r\n takeUntil(this.destroy$),\r\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)),\r\n )\r\n .subscribe((formValue) => {\r\n if (!this.isInitializing && this.tipologicheLoaded) {\r\n this.onChange(formValue);\r\n this.notifyValidationChange();\r\n }\r\n });\r\n\r\n this.cdr.detectChanges();\r\n }\r\n\r\n // ─── Logica territoriale ────────────────────────────────────────\r\n\r\n private async handleTerritorialChanges(nazioneId: string, provinciaId: string, comuneId: string): Promise<void> {\r\n this.updateNationalityState(nazioneId);\r\n await this.updateTerritorialData(provinciaId, comuneId);\r\n this.updateValidators();\r\n }\r\n\r\n private updateNationalityState(nazioneId: string): void {\r\n const nazione = this.nazioni.find((n) => n.codStatoPk === nazioneId);\r\n this.isItalian = nazione?.codStatoPk === 'ITA';\r\n this.isForeign = !!(nazione && nazione.codStatoPk !== 'ITA');\r\n }\r\n\r\n private async updateTerritorialData(provinciaId: string, comuneId: string): Promise<void> {\r\n if (this.isItalian && provinciaId) {\r\n await this.updateFilteredComuni(provinciaId);\r\n } else {\r\n this.filteredComuni = [];\r\n }\r\n\r\n if (this.isItalian && comuneId) {\r\n await this.updateFilteredCaps(comuneId);\r\n } else {\r\n this.filteredCaps = [];\r\n }\r\n\r\n this.applyFieldsDisabledState();\r\n }\r\n\r\n private async updateFilteredComuni(provinciaId: string): Promise<void> {\r\n if (!provinciaId) {\r\n this.filteredComuni = [];\r\n return;\r\n }\r\n try {\r\n this.filteredComuni = await this.locationService.getComuniByProvincia(provinciaId);\r\n const currentComuneId = this.form.get('comuneId')?.value;\r\n if (currentComuneId && !this.filteredComuni.find((c) => c.codiceComunePk === currentComuneId)) {\r\n this.form.patchValue({ comuneId: null }, { emitEvent: false });\r\n }\r\n } catch {\r\n this.filteredComuni = [];\r\n }\r\n }\r\n\r\n private async updateFilteredCaps(comuneId: string): Promise<void> {\r\n if (!comuneId) {\r\n this.filteredCaps = [];\r\n this.form.patchValue({ cap: null }, { emitEvent: true });\r\n return;\r\n }\r\n\r\n const caps = await this.locationService.getCapList(comuneId);\r\n this.filteredCaps = caps.map((capCode) => ({ id: capCode, codice: capCode, comuneId }));\r\n\r\n const currentCap = this.form.get('cap')?.value;\r\n if (this.filteredCaps.length === 1) {\r\n this.form.patchValue({ cap: this.filteredCaps[0].id }, { emitEvent: true });\r\n } else if (this.filteredCaps.length > 1) {\r\n if (!currentCap || !this.filteredCaps.some((c) => c.id === currentCap)) {\r\n this.form.patchValue({ cap: null }, { emitEvent: true });\r\n }\r\n } else {\r\n this.form.patchValue({ cap: null }, { emitEvent: true });\r\n }\r\n }\r\n\r\n private async updateComponentState(value: UiLocationValue): Promise<void> {\r\n this.updateNationalityState(value.nazioneId || '');\r\n await this.updateFilteredComuni(value.provinciaId || '');\r\n await this.updateFilteredCaps(value.comuneId || '');\r\n this.applyFieldsDisabledState();\r\n this.updateValidators();\r\n }\r\n\r\n // ─── Stato campi ───────────────────────────────────────────────\r\n\r\n private applyFieldsDisabledState(): void {\r\n if (this.disabled) {\r\n this.form.disable({ emitEvent: false });\r\n return;\r\n }\r\n\r\n const comuneControl = this.form.get('comuneId');\r\n const capControl = this.form.get('cap');\r\n const nazioneControl = this.form.get('nazioneId');\r\n\r\n // Comune abilitato solo se Italia + provincia selezionata\r\n if (this.isItalian && this.form.get('provinciaId')?.value) {\r\n comuneControl?.enable({ emitEvent: false });\r\n } else {\r\n comuneControl?.disable({ emitEvent: false });\r\n }\r\n\r\n // CAP segue logica specifica\r\n if (this.isCapDisabled) {\r\n capControl?.disable({ emitEvent: false });\r\n } else {\r\n capControl?.enable({ emitEvent: false });\r\n }\r\n\r\n // Nazione disabilitata se italyByDefault\r\n if (this.isItalyByDefault) {\r\n nazioneControl?.disable({ emitEvent: false });\r\n } else {\r\n nazioneControl?.enable({ emitEvent: false });\r\n }\r\n }\r\n\r\n // ─── Validazione dinamica ──────────────────────────────────────\r\n\r\n private updateValidators(): void {\r\n const controls: Record<string, AbstractControl | null> = {\r\n nazione: this.form.get('nazioneId'),\r\n provincia: this.form.get('provinciaId'),\r\n comune: this.form.get('comuneId'),\r\n comuneEstero: this.form.get('comuneEstero'),\r\n cap: this.form.get('cap'),\r\n indirizzo: this.form.get('indirizzo'),\r\n mail: this.form.get('mail'),\r\n pec: this.form.get('pec'),\r\n telefono: this.form.get('telefono'),\r\n };\r\n\r\n // Pulisci tutti i validatori\r\n Object.values(controls).forEach((c) => c?.clearValidators());\r\n\r\n // Nazione\r\n if (this.config.nazione?.required !== false) {\r\n controls['nazione']?.setValidators(Validators.required);\r\n }\r\n\r\n if (this.isItalian) {\r\n if (this.config.provincia?.required !== false) {\r\n controls['provincia']?.setValidators(Validators.required);\r\n }\r\n if (this.config.comune?.required !== false) {\r\n controls['comune']?.setValidators(Validators.required);\r\n }\r\n if (this.config.cap?.required && this.showCAP) {\r\n controls['cap']?.setValidators(Validators.required);\r\n }\r\n if (this.config.indirizzo?.required && this.showIndirizzo) {\r\n controls['indirizzo']?.setValidators(Validators.required);\r\n }\r\n this.applyContactValidators(controls);\r\n } else if (this.isForeign) {\r\n if (this.config.comuneEstero?.required !== false) {\r\n controls['comuneEstero']?.setValidators(Validators.required);\r\n }\r\n }\r\n\r\n // Aggiorna senza emettere eventi\r\n Object.values(controls).forEach((c) => c?.updateValueAndValidity({ emitEvent: false }));\r\n this.notifyValidationChange();\r\n }\r\n\r\n private applyContactValidators(controls: Record<string, AbstractControl | null>): void {\r\n if (this.config.mail?.required && this.showMail) {\r\n controls['mail']?.setValidators([Validators.required, Validators.pattern(this.EMAIL_PATTERN)]);\r\n } else if (this.showMail) {\r\n controls['mail']?.setValidators([Validators.pattern(this.EMAIL_PATTERN)]);\r\n }\r\n\r\n if (this.config.pec?.required && this.showPEC) {\r\n controls['pec']?.setValidators([Validators.required, Validators.pattern(this.PEC_PATTERN)]);\r\n } else if (this.showPEC) {\r\n controls['pec']?.setValidators([Validators.pattern(this.PEC_PATTERN)]);\r\n }\r\n\r\n if (this.config.telefono?.required && this.showTelefono) {\r\n controls['telefono']?.setValidators([Validators.required, Validators.pattern(this.PHONE_PATTERN)]);\r\n } else if (this.showTelefono) {\r\n controls['telefono']?.setValidators([Validators.pattern(this.PHONE_PATTERN)]);\r\n }\r\n }\r\n\r\n private validateContactFields(errors: ValidationErrors): void {\r\n if (this.config.mail?.required && this.showMail) {\r\n const v = this.form.get('mail')?.value;\r\n if (!v || v.trim() === '') {\r\n errors['mailRequired'] = \"Inserisci l'email\";\r\n } else if (!this.EMAIL_PATTERN.test(v)) {\r\n errors['mailInvalid'] = \"Inserisci un'email valida\";\r\n }\r\n }\r\n if (this.config.pec?.required && this.showPEC) {\r\n const v = this.form.get('pec')?.value;\r\n if (!v || v.trim() === '') {\r\n errors['pecRequired'] = 'Inserisci la PEC';\r\n } else if (!this.PEC_PATTERN.test(v)) {\r\n errors['pecInvalid'] = 'Inserisci una PEC valida';\r\n }\r\n }\r\n if (this.config.telefono?.required && this.showTelefono) {\r\n const v = this.form.get('telefono')?.value;\r\n if (!v || v.trim() === '') {\r\n errors['telefonoRequired'] = 'Inserisci il telefono';\r\n } else if (!this.PHONE_PATTERN.test(v)) {\r\n errors['telefonoInvalid'] = 'Inserisci un numero di telefono valido';\r\n }\r\n }\r\n }\r\n\r\n // ─── Configurazione iniziale ───────────────────────────────────\r\n\r\n private applyInitialConfiguration(): void {\r\n const nazioneControl = this.form.get('nazioneId');\r\n const currentNazioneId = nazioneControl?.value;\r\n\r\n if (this.config.italyByDefault) {\r\n const italia = this.nazioni.find((n) => n.codStatoPk === 'ITA');\r\n if (italia && (!currentNazioneId || currentNazioneId !== 'ITA')) {\r\n this.form.patchValue({ nazioneId: italia.codStatoPk }, { emitEvent: false });\r\n }\r\n this.updateNationalityState('ITA');\r\n nazioneControl?.disable({ emitEvent: false });\r\n } else {\r\n if (currentNazioneId) this.updateNationalityState(currentNazioneId);\r\n if (!this.disabled) nazioneControl?.enable({ emitEvent: false });\r\n }\r\n\r\n this.updateValidators();\r\n }\r\n\r\n private notifyValidationChange(): void {\r\n if (this.onValidatorChange) {\r\n setTimeout(() => this.onValidatorChange(), 0);\r\n }\r\n }\r\n}\r\n","<!--\r\n Componente per la selezione di dati geografici (Italia/Estero).\r\n Utilizza il flow control moderno di Angular (@if, @for).\r\n-->\r\n<div\r\n class=\"ui-location\"\r\n [formGroup]=\"form\"\r\n [class.ui-location--foreign]=\"isForeign\"\r\n [class.ui-location--italian]=\"isItalian\"\r\n>\r\n <!-- ==================== NAZIONE ==================== -->\r\n <div class=\"ui-location__field-row\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n class=\"ui-location__full-width\"\r\n [class.ui-location__italy-default]=\"config.italyByDefault\"\r\n >\r\n <mat-label>{{ labels.nazione }}</mat-label>\r\n <mat-select\r\n formControlName=\"nazioneId\"\r\n [disabled]=\"disabled || isNazioneDisabled\"\r\n (blur)=\"onBlur()\"\r\n aria-label=\"Seleziona nazione\"\r\n >\r\n <mat-option [value]=\"null\">Seleziona nazione</mat-option>\r\n @for (nazione of nazioni; track nazione.codStatoPk) {\r\n <mat-option [value]=\"nazione.codStatoPk\">\r\n {{ nazione.descrizione }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (shouldShowFieldErrors('nazioneId')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('nazioneId'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- ==================== CAMPI ITALIA ==================== -->\r\n @if (isItalian) {\r\n <div class=\"ui-location__provincia-comune\">\r\n <!-- Provincia -->\r\n <div class=\"ui-location__field-row\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.provincia }}</mat-label>\r\n <mat-select\r\n formControlName=\"provinciaId\"\r\n [disabled]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n aria-label=\"Seleziona provincia\"\r\n >\r\n <mat-option [value]=\"null\">Seleziona provincia</mat-option>\r\n @for (prov of province; track prov.codiceProvinciaPk) {\r\n <mat-option [value]=\"prov.codiceProvinciaPk\">\r\n {{ prov.nomeProvincia }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (shouldShowFieldErrors('provinciaId')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('provinciaId'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- Comune -->\r\n <div class=\"ui-location__field-row\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.comune }}</mat-label>\r\n <mat-select\r\n formControlName=\"comuneId\"\r\n [disabled]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n aria-label=\"Seleziona comune\"\r\n >\r\n <mat-option [value]=\"null\">Seleziona comune</mat-option>\r\n @for (comune of filteredComuni; track comune.codiceComunePk) {\r\n <mat-option [value]=\"comune.codiceComunePk\">\r\n {{ comune.nomeComune }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (shouldShowFieldErrors('comuneId')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('comuneId'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== GRIGLIA CAMPI DINAMICI ==================== -->\r\n <div class=\"ui-location__dynamic-grid\">\r\n <!-- CAP -->\r\n @if (showCAP && isItalian) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + capColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.cap }}</mat-label>\r\n <mat-select\r\n formControlName=\"cap\"\r\n [disabled]=\"disabled || isCapDisabled\"\r\n (blur)=\"onBlur()\"\r\n aria-label=\"Seleziona CAP\"\r\n >\r\n <mat-option [value]=\"null\">Seleziona CAP</mat-option>\r\n @for (cap of filteredCaps; track cap.id) {\r\n <mat-option [value]=\"cap.id\">{{ cap.codice }}</mat-option>\r\n }\r\n </mat-select>\r\n @if (shouldShowFieldErrors('cap')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('cap'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <!-- Indirizzo -->\r\n @if (showIndirizzo) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + indirizzoColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.indirizzo }}</mat-label>\r\n <input\r\n matInput\r\n formControlName=\"indirizzo\"\r\n placeholder=\"Via, numero civico\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('indirizzo')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('indirizzo'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <!-- Mail -->\r\n @if (showMail) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + mailColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.mail }}</mat-label>\r\n <input\r\n matInput\r\n type=\"email\"\r\n formControlName=\"mail\"\r\n placeholder=\"esempio@email.com\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('mail')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('mail'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <!-- PEC -->\r\n @if (showPEC) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + pecColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.pec }}</mat-label>\r\n <input\r\n matInput\r\n type=\"email\"\r\n formControlName=\"pec\"\r\n placeholder=\"esempio@pec.it\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('pec')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('pec'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <!-- Telefono -->\r\n @if (showTelefono) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + telefonoColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.telefono }}</mat-label>\r\n <input\r\n matInput\r\n type=\"tel\"\r\n formControlName=\"telefono\"\r\n placeholder=\"+39 123 456 7890\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('telefono')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('telefono'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- ==================== CAMPO ESTERO ==================== -->\r\n @if (isForeign) {\r\n <div class=\"ui-location__field-row\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.comuneEstero }}</mat-label>\r\n <input\r\n matInput\r\n formControlName=\"comuneEstero\"\r\n placeholder=\"Inserisci citta/comune\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('comuneEstero')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('comuneEstero'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n forwardRef,\r\n OnInit,\r\n OnDestroy,\r\n OnChanges,\r\n SimpleChanges,\r\n ChangeDetectorRef,\r\n ViewChild,\r\n Injector,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n NG_VALIDATORS,\r\n Validator,\r\n AbstractControl,\r\n ValidationErrors,\r\n FormControl,\r\n NgControl,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { MatTableModule, MatTableDataSource } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiSpecificaTerritorialeComponent } from '../specifica-territoriale/specifica-territoriale.component';\r\nimport { UiLocationService } from '../../services/location.service';\r\nimport { UiButtonAreaComponent, UiButtonDescriptor } from '../../../button/index';\r\nimport {\r\n UiLocationTableConfig,\r\n UiLocationRow,\r\n UiLocationConfig,\r\n UiLocationValue,\r\n} from '../../types/territoriale.types';\r\n\r\n/**\r\n * Componente standalone per la gestione tabellare di location multiple.\r\n *\r\n * Permette l'inserimento, la modifica e l'eliminazione di righe\r\n * territoriali (italiane o estere) tramite una tabella Material\r\n * con form inline basato su `UiSpecificaTerritorialeComponent`.\r\n *\r\n * Implementa `ControlValueAccessor` e `Validator` per l'integrazione\r\n * con Angular Reactive Forms. Il valore e un array di `UiLocationRow`.\r\n *\r\n * @selector ui-table-territoriale\r\n *\r\n * @example\r\n * ```html\r\n * <ui-table-territoriale\r\n * [formControl]=\"sedeControl\"\r\n * [config]=\"{\r\n * tableLabel: 'Sedi operative',\r\n * subFieldConfig: { italyByDefault: true, cap: { show: true } }\r\n * }\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-table-territoriale',\r\n standalone: true,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatTableModule,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n UiSpecificaTerritorialeComponent,\r\n UiButtonAreaComponent,\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiTableTerritorialeComponent),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => UiTableTerritorialeComponent),\r\n multi: true,\r\n },\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: './table-territoriale.component.html',\r\n styleUrl: './table-territoriale.component.scss',\r\n})\r\nexport class UiTableTerritorialeComponent implements ControlValueAccessor, Validator, OnInit, OnDestroy, OnChanges {\r\n /** Configurazione della tabella. */\r\n @Input() config: UiLocationTableConfig = {};\r\n\r\n /** Stato disabilitato globale. */\r\n @Input() disabled = false;\r\n\r\n // ─── Stato interno ──────────────────────────────────────────────\r\n\r\n /** Righe della tabella. */\r\n rows: UiLocationRow[] = [];\r\n /** DataSource Material per la tabella. */\r\n dataSource = new MatTableDataSource<UiLocationRow>([]);\r\n\r\n /** Modalita editing attiva. */\r\n editMode = false;\r\n /** Modalita inserimento attiva. */\r\n insertMode = false;\r\n /** Riga in modifica. */\r\n editingRow: UiLocationRow | null = null;\r\n /** Indice della riga in modifica. */\r\n editingIndex: number | null = null;\r\n\r\n /** Colonne visualizzate nella tabella. */\r\n displayedColumns: string[] = [];\r\n /** Configurazione delle colonne. */\r\n columnConfig: Record<string, { label: string; show: boolean }> = {};\r\n\r\n /** Pulsanti per il form di inserimento/modifica. */\r\n formButtons: UiButtonDescriptor[] = [];\r\n /** Pulsante per aggiungere una nuova riga. */\r\n addButton: UiButtonDescriptor[] = [];\r\n\r\n /** NgControl per accedere alla validazione del form parent. */\r\n ngControl: NgControl | null = null;\r\n\r\n @ViewChild(UiSpecificaTerritorialeComponent)\r\n specificaForm!: UiSpecificaTerritorialeComponent;\r\n\r\n private readonly destroy$ = new Subject<void>();\r\n private onChange = (_value: UiLocationRow[]) => {};\r\n private onTouched = () => {};\r\n private onValidatorChange = () => {};\r\n\r\n constructor(\r\n private readonly cdr: ChangeDetectorRef,\r\n private readonly injector: Injector,\r\n private readonly locationService: UiLocationService,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.ngControl = this.injector.get(NgControl, null, { optional: true, self: true });\r\n this.initializeColumns();\r\n this.calculateActions();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config'] && !changes['config'].firstChange) {\r\n this.initializeColumns();\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n // ─── ControlValueAccessor ───────────────────────────────────────\r\n\r\n writeValue(value: UiLocationRow[] | null): void {\r\n this.rows = value ? [...value] : [];\r\n this.dataSource.data = this.rows;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n registerOnChange(fn: (value: UiLocationRow[]) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n // ─── Validator ──────────────────────────────────────────────────\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n if (control?.validator) {\r\n const errors = control.validator({} as AbstractControl);\r\n if (errors?.['required'] && (!this.rows || this.rows.length === 0)) {\r\n return { required: true };\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // ─── Getter calcolati ───────────────────────────────────────────\r\n\r\n get isRequired(): boolean {\r\n if (!this.ngControl?.control) return false;\r\n const validator = this.ngControl.control.validator;\r\n if (validator) {\r\n const errors = validator({} as AbstractControl);\r\n return !!errors?.['required'];\r\n }\r\n return false;\r\n }\r\n\r\n get hasValidationErrors(): boolean {\r\n return !!(this.ngControl?.control?.invalid && (this.ngControl.control.touched || this.ngControl.control.dirty));\r\n }\r\n\r\n get validationErrors(): string[] {\r\n if (!this.hasValidationErrors || !this.ngControl?.control?.errors) return [];\r\n const errors: string[] = [];\r\n if (this.ngControl.control.errors['required']) {\r\n errors.push(this.config.requiredMessage || 'Aggiungere almeno un elemento');\r\n }\r\n return errors;\r\n }\r\n\r\n // ─── Colonne dinamiche ─────────────────────────────────────────\r\n\r\n private initializeColumns(): void {\r\n const subConfig = this.config.subFieldConfig || {};\r\n\r\n // Colonne base - nasconde 'stato' quando italyByDefault e true\r\n this.columnConfig = {\r\n stato: { label: 'Stato', show: !subConfig.italyByDefault },\r\n provincia: { label: 'Provincia', show: true },\r\n comune: { label: 'Comune', show: true },\r\n };\r\n\r\n // Colonne dinamiche dalla configurazione\r\n if (subConfig.cap?.show) {\r\n this.columnConfig['cap'] = { label: subConfig.labels?.cap || 'CAP', show: true };\r\n }\r\n if (subConfig.indirizzo?.show) {\r\n this.columnConfig['indirizzo'] = { label: subConfig.labels?.indirizzo || 'Indirizzo', show: true };\r\n }\r\n if (subConfig.mail?.show) {\r\n this.columnConfig['mail'] = { label: subConfig.labels?.mail || 'Email', show: true };\r\n }\r\n if (subConfig.pec?.show) {\r\n this.columnConfig['pec'] = { label: subConfig.labels?.pec || 'PEC', show: true };\r\n }\r\n if (subConfig.telefono?.show) {\r\n this.columnConfig['telefono'] = { label: subConfig.labels?.telefono || 'Telefono', show: true };\r\n }\r\n\r\n // Colonna azioni sempre alla fine\r\n this.columnConfig['azioni'] = { label: 'Azioni', show: true };\r\n\r\n this.displayedColumns = Object.keys(this.columnConfig).filter((key) => this.columnConfig[key].show);\r\n }\r\n\r\n // ─── Azioni CRUD ───────────────────────────────────────────────\r\n\r\n /** Attiva la modalita inserimento. */\r\n activateInsertMode(): void {\r\n this.insertMode = true;\r\n this.editMode = false;\r\n this.editingRow = null;\r\n this.editingIndex = null;\r\n this.calculateActions();\r\n this.cdr.detectChanges();\r\n\r\n // Attende l'inizializzazione completa del componente figlio prima\r\n // di resettare il form. writeValue(null) gestisce internamente sia\r\n // il reset sia la riapplicazione della configurazione iniziale\r\n // (es. italyByDefault), quindi non serve chiamare resetComponentState()\r\n // separatamente (altrimenti annullerebbe lo stato impostato).\r\n setTimeout(async () => {\r\n if (this.specificaForm) {\r\n if (this.specificaForm.initializationPromise) {\r\n await this.specificaForm.initializationPromise;\r\n }\r\n this.specificaForm.writeValue(null);\r\n this.cdr.detectChanges();\r\n }\r\n }, 0);\r\n }\r\n\r\n /** Attiva la modalita modifica per una riga. */\r\n editRow(row: UiLocationRow, index: number): void {\r\n this.editMode = true;\r\n this.insertMode = false;\r\n this.editingRow = { ...row };\r\n this.editingIndex = index;\r\n this.calculateActions();\r\n this.cdr.detectChanges();\r\n\r\n // Attende l'inizializzazione completa del componente figlio\r\n // prima di scrivere il valore per la modifica.\r\n setTimeout(async () => {\r\n if (this.specificaForm) {\r\n if (this.specificaForm.initializationPromise) {\r\n await this.specificaForm.initializationPromise;\r\n }\r\n this.specificaForm.writeValue(this.mapRowToFormValue(row));\r\n this.cdr.detectChanges();\r\n }\r\n }, 0);\r\n }\r\n\r\n /** Annulla l'operazione in corso (inserimento o modifica). */\r\n cancelEdit(): void {\r\n this.editMode = false;\r\n this.insertMode = false;\r\n this.editingRow = null;\r\n this.editingIndex = null;\r\n this.calculateActions();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Rimuove una riga dalla tabella. */\r\n removeRow(index: number): void {\r\n this.rows.splice(index, 1);\r\n this.dataSource.data = this.rows;\r\n this.propagateChange();\r\n this.markAsTouched();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Salva la riga corrente (nuova o in modifica). */\r\n async saveRow(): Promise<void> {\r\n if (!this.specificaForm?.form.valid) {\r\n this.specificaForm?.markAsTouched();\r\n return;\r\n }\r\n\r\n const rawValue: UiLocationValue = this.specificaForm.form.getRawValue();\r\n const finalValue = rawValue.nazioneId || rawValue.cap ? rawValue : this.specificaForm.form.value;\r\n\r\n const row = await this.mapFormValueToRow(finalValue);\r\n\r\n if (this.editMode && this.editingIndex !== null) {\r\n row.refId = this.rows[this.editingIndex].refId;\r\n this.rows[this.editingIndex] = row;\r\n } else {\r\n row.refId = this.generateUUID();\r\n this.rows.push(row);\r\n }\r\n\r\n this.dataSource.data = this.rows;\r\n this.cancelEdit();\r\n this.propagateChange();\r\n this.markAsTouched();\r\n this.calculateActions();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Marca il componente come touched. */\r\n markAsTouched(): void {\r\n this.onTouched();\r\n this.ngControl?.control?.markAsTouched();\r\n }\r\n\r\n /** Resetta lo stato del componente. */\r\n resetComponentState(): void {\r\n this.rows = [];\r\n this.dataSource.data = this.rows;\r\n this.insertMode = false;\r\n this.editMode = false;\r\n this.editingRow = null;\r\n this.editingIndex = null;\r\n this.specificaForm?.resetComponentState();\r\n this.onChange(this.rows);\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Funzione track by per la tabella. */\r\n trackByFn(_index: number, item: UiLocationRow): string {\r\n return item.refId || String(_index);\r\n }\r\n\r\n // ─── Mappatura dati ────────────────────────────────────────────\r\n\r\n private mapRowToFormValue(row: UiLocationRow): UiLocationValue {\r\n if (row.stato?.codStatoPk === 'ITA') {\r\n return {\r\n nazioneId: 'ITA',\r\n provinciaId: row.provincia?.codiceProvinciaPk,\r\n comuneId: row.comuni?.codiceComunePk,\r\n cap: row.cap,\r\n indirizzo: row.indirizzo,\r\n mail: row.mail,\r\n pec: row.pec,\r\n telefono: row.telefono,\r\n };\r\n }\r\n return {\r\n nazioneId: row.stato?.codStatoPk,\r\n comuneEstero: row.comuniEsteri?.[0],\r\n indirizzo: row.indirizzo,\r\n mail: row.mail,\r\n pec: row.pec,\r\n telefono: row.telefono,\r\n };\r\n }\r\n\r\n private async mapFormValueToRow(value: UiLocationValue): Promise<UiLocationRow> {\r\n // Se italyByDefault e nazioneId mancante, forza ITA\r\n if (!value.nazioneId && this.config.subFieldConfig?.italyByDefault) {\r\n value.nazioneId = 'ITA';\r\n }\r\n\r\n try {\r\n const stato = await this.locationService.getLocationFullData('nazione', value.nazioneId!);\r\n\r\n if (value.nazioneId === 'ITA') {\r\n let provincia = null;\r\n let comune = null;\r\n\r\n if (value.provinciaId) {\r\n provincia = await this.locationService.getLocationFullData('provincia', value.provinciaId);\r\n }\r\n if (value.comuneId && value.provinciaId) {\r\n comune = await this.locationService.getLocationFullData('comune', value.comuneId, value.provinciaId);\r\n }\r\n\r\n return {\r\n stato,\r\n provincia,\r\n comuni: comune,\r\n comuniEsteri: [],\r\n cap: value.cap,\r\n indirizzo: value.indirizzo,\r\n mail: value.mail,\r\n pec: value.pec,\r\n telefono: value.telefono,\r\n };\r\n }\r\n\r\n return {\r\n stato,\r\n provincia: undefined,\r\n comuni: undefined,\r\n comuniEsteri: value.comuneEstero ? [value.comuneEstero] : [],\r\n indirizzo: value.indirizzo,\r\n mail: value.mail,\r\n pec: value.pec,\r\n telefono: value.telefono,\r\n };\r\n } catch (error) {\r\n console.error('[UiTableTerritoriale] Errore caricamento dati location:', error);\r\n return {\r\n stato: value.nazioneId ? { codStatoPk: value.nazioneId, descrizione: value.nazioneId } : undefined,\r\n provincia: value.provinciaId ? { codiceProvinciaPk: value.provinciaId } : undefined,\r\n comuni: value.comuneId ? { codiceComunePk: value.comuneId } : undefined,\r\n comuniEsteri: value.comuneEstero ? [value.comuneEstero] : [],\r\n cap: value.cap,\r\n indirizzo: value.indirizzo,\r\n mail: value.mail,\r\n pec: value.pec,\r\n telefono: value.telefono,\r\n };\r\n }\r\n }\r\n\r\n // ─── Utilita ───────────────────────────────────────────────────\r\n\r\n private propagateChange(): void {\r\n this.onChange([...this.rows]);\r\n this.onValidatorChange();\r\n }\r\n\r\n private generateUUID(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0; // NOSONAR - Used for non-cryptographic UUID generation in UI table rows\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n }\r\n\r\n private calculateActions(): void {\r\n this.calculateFormButtons();\r\n this.calculateAddButton();\r\n }\r\n\r\n private calculateFormButtons(): void {\r\n if (!this.editMode && !this.insertMode) {\r\n this.formButtons = [];\r\n return;\r\n }\r\n this.formButtons = [\r\n { label: 'Annulla', variant: 'outline', action: () => this.cancelEdit() },\r\n { label: 'Salva', variant: 'primary', action: () => this.saveRow() },\r\n ];\r\n }\r\n\r\n private calculateAddButton(): void {\r\n if (this.editMode || this.insertMode) {\r\n this.addButton = [];\r\n return;\r\n }\r\n this.addButton = [\r\n {\r\n label: this.config.emptyCtaLabel || 'Aggiungi un luogo',\r\n variant: 'outline',\r\n action: () => this.activateInsertMode(),\r\n },\r\n ];\r\n }\r\n}\r\n","<!--\r\n Tabella CRUD per location multiple.\r\n Utilizza UiSpecificaTerritorialeComponent per il form inline di aggiunta/modifica.\r\n-->\r\n<div\r\n class=\"ui-location-table\"\r\n [class.ui-location-table--has-errors]=\"hasValidationErrors\"\r\n>\r\n <!-- ==================== LABEL ==================== -->\r\n <p\r\n class=\"ui-location-table__label\"\r\n [class.ui-location-table__label--invalid]=\"hasValidationErrors\"\r\n >\r\n {{ config.tableLabel || 'Tabella territoriale' }}\r\n @if (isRequired) {\r\n <span class=\"ui-location-table__required\">*</span>\r\n }\r\n </p>\r\n\r\n <!-- ==================== STATO VUOTO ==================== -->\r\n @if (rows.length === 0 && !insertMode && !editMode) {\r\n <div class=\"ui-location-table__empty\">\r\n <span class=\"ui-location-table__empty-text\">\r\n {{ config.emptyPrompt || 'Nessun luogo aggiunto' }}\r\n </span>\r\n <div class=\"ui-location-table__empty-actions\">\r\n @if (hasValidationErrors) {\r\n <div class=\"ui-location-table__validation-errors\">\r\n @for (error of validationErrors; track $index) {\r\n <div class=\"ui-location-table__error-msg\">\r\n <lucide-icon name=\"alert-circle\" [size]=\"14\" />\r\n {{ error }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n <ui-button-area [buttons]=\"addButton\" align=\"end\" />\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- ==================== TABELLA ==================== -->\r\n @if (rows.length > 0 && !insertMode && !editMode) {\r\n <div class=\"ui-location-table__container\">\r\n <table mat-table [dataSource]=\"dataSource\" class=\"ui-location-table__table\" [trackBy]=\"trackByFn\">\r\n @for (column of displayedColumns; track column) {\r\n <ng-container [matColumnDef]=\"column\">\r\n <th\r\n mat-header-cell *matHeaderCellDef\r\n [style.text-align]=\"column === 'azioni' ? 'right' : 'left'\"\r\n >\r\n {{ columnConfig[column].label }}\r\n </th>\r\n <td\r\n mat-cell *matCellDef=\"let row; let i = index\"\r\n [style.text-align]=\"column === 'azioni' ? 'right' : 'left'\"\r\n >\r\n <!-- Stato -->\r\n @if (column === 'stato') {\r\n @if (row.stato?.codStatoPk === 'ITA') {\r\n Italia\r\n } @else if (row.stato?.codStatoPk) {\r\n {{ row.stato.descrizione }} ({{ row.stato.codStatoPk }})\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Provincia -->\r\n @if (column === 'provincia') {\r\n @if (row.stato?.codStatoPk === 'ITA') {\r\n @if (row.provincia?.nomeProvincia) {\r\n {{ row.provincia.nomeProvincia }}\r\n @if (row.provincia.siglaProvincia) {\r\n ({{ row.provincia.siglaProvincia }})\r\n }\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">Non specificata</span>\r\n }\r\n } @else if (row.stato?.codStatoPk) {\r\n <span class=\"ui-location-table__foreign-tag\">ESTERO</span>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Comune -->\r\n @if (column === 'comune') {\r\n @if (row.stato?.codStatoPk === 'ITA') {\r\n @if (row.comuni?.nomeComune) {\r\n {{ row.comuni.nomeComune }}\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n } @else if (row.comuniEsteri && row.comuniEsteri.length > 0) {\r\n {{ row.comuniEsteri.join(', ') }}\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- CAP -->\r\n @if (column === 'cap') {\r\n @if (row.cap) {\r\n <span class=\"ui-location-table__cap\">{{ row.cap }}</span>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Indirizzo -->\r\n @if (column === 'indirizzo') {\r\n @if (row.indirizzo) {\r\n <span class=\"ui-location-table__address\" [title]=\"row.indirizzo\">\r\n {{ row.indirizzo.length > 30 ? row.indirizzo.substring(0, 30) + '...' : row.indirizzo }}\r\n </span>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Mail -->\r\n @if (column === 'mail') {\r\n @if (row.mail) {\r\n <a [href]=\"'mailto:' + row.mail\" class=\"ui-location-table__link ui-location-table__link--email\"\r\n [title]=\"row.mail\" (click)=\"$event.stopPropagation()\">\r\n <lucide-icon name=\"mail\" [size]=\"14\" />\r\n {{ row.mail.length > 25 ? row.mail.substring(0, 25) + '...' : row.mail }}\r\n </a>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- PEC -->\r\n @if (column === 'pec') {\r\n @if (row.pec) {\r\n <a [href]=\"'mailto:' + row.pec\" class=\"ui-location-table__link ui-location-table__link--pec\"\r\n [title]=\"row.pec\" (click)=\"$event.stopPropagation()\">\r\n <lucide-icon name=\"shield-check\" [size]=\"14\" />\r\n {{ row.pec.length > 25 ? row.pec.substring(0, 25) + '...' : row.pec }}\r\n </a>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Telefono -->\r\n @if (column === 'telefono') {\r\n @if (row.telefono) {\r\n <a [href]=\"'tel:' + row.telefono\" class=\"ui-location-table__link ui-location-table__link--phone\"\r\n [title]=\"row.telefono\" (click)=\"$event.stopPropagation()\">\r\n <lucide-icon name=\"phone\" [size]=\"14\" />\r\n {{ row.telefono }}\r\n </a>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Azioni -->\r\n @if (column === 'azioni') {\r\n <div class=\"ui-location-table__actions\">\r\n <button\r\n class=\"ui-location-table__action-btn ui-location-table__action-btn--edit\"\r\n (click)=\"editRow(row, i)\"\r\n [disabled]=\"disabled\"\r\n [matTooltip]=\"'Modifica'\"\r\n type=\"button\"\r\n aria-label=\"Modifica riga\"\r\n >\r\n <lucide-icon name=\"pencil\" [size]=\"16\" />\r\n </button>\r\n <button\r\n class=\"ui-location-table__action-btn ui-location-table__action-btn--delete\"\r\n (click)=\"removeRow(i)\"\r\n [disabled]=\"disabled\"\r\n [matTooltip]=\"'Elimina'\"\r\n type=\"button\"\r\n aria-label=\"Elimina riga\"\r\n >\r\n <lucide-icon name=\"trash-2\" [size]=\"16\" />\r\n </button>\r\n </div>\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\r\n </table>\r\n </div>\r\n\r\n <!-- Pulsante aggiungi sotto la tabella -->\r\n <div class=\"ui-location-table__add-area\">\r\n <ui-button-area [buttons]=\"addButton\" align=\"end\" />\r\n </div>\r\n }\r\n\r\n <!-- ==================== FORM AGGIUNGI/MODIFICA ==================== -->\r\n @if (insertMode || editMode) {\r\n <div class=\"ui-location-table__form\">\r\n <ui-specifica-territoriale\r\n [config]=\"config.subFieldConfig || {}\"\r\n [disabled]=\"disabled\"\r\n #specificaForm\r\n />\r\n <div class=\"ui-location-table__form-actions\">\r\n <ui-button-area [buttons]=\"formButtons\" align=\"end\" />\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Observable, map } from 'rxjs';\r\nimport type {\r\n UiGeocodedForeignDetails,\r\n UiGeocodedItalianDetails,\r\n UiGeocodedLocationType,\r\n UiLocationGeocodedFieldConfig,\r\n} from '../types/geocoded-location.types';\r\n\r\n/** Risposta elementare dell'API search di Nominatim (format=json). */\r\ninterface NominatimSearchItem {\r\n place_id: number;\r\n lat: string;\r\n lon: string;\r\n display_name: string;\r\n importance?: number;\r\n boundingbox?: [string, string, string, string];\r\n address?: Record<string, string>;\r\n}\r\n\r\nconst DEFAULT_BASE = 'https://nominatim.openstreetmap.org';\r\n\r\n/**\r\n * Integrazione con l'API pubblica Nominatim (OpenStreetMap) per la ricerca indirizzi.\r\n * Mappa i risultati sul tipo {@link UiGeocodedLocationType}.\r\n *\r\n * In browser è consigliato usare un proxy same-origin per CORS e User-Agent;\r\n * vedi {@link UiLocationGeocodedFieldConfig.nominatimBaseUrl}.\r\n *\r\n * @providedIn root\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiNominatimGeocodingService {\r\n private readonly http = inject(HttpClient);\r\n\r\n /**\r\n * Cerca indirizzi in base alla query testuale.\r\n *\r\n * @param query - Testo libero inserito dall'utente\r\n * @param config - Opzioni di ricerca e base URL\r\n */\r\n search(query: string, config: UiLocationGeocodedFieldConfig = {}): Observable<UiGeocodedLocationType[]> {\r\n const trimmed = query.trim();\r\n const base = (config.nominatimBaseUrl ?? DEFAULT_BASE).replace(/\\/$/, '');\r\n const limit = config.limit ?? 5;\r\n\r\n let params = new HttpParams()\r\n .set('q', trimmed)\r\n .set('format', 'json')\r\n .set('addressdetails', '1')\r\n .set('limit', String(limit));\r\n\r\n if (config.biasCountry) {\r\n params = params.set('countrycodes', config.biasCountry.toLowerCase());\r\n }\r\n\r\n if (config.biasProximity) {\r\n const { lat, lng } = config.biasProximity;\r\n const pad = 0.05;\r\n const left = lng - pad;\r\n const right = lng + pad;\r\n const top = lat + pad;\r\n const bottom = lat - pad;\r\n params = params.set('viewbox', `${left},${top},${right},${bottom}`).set('bounded', '1');\r\n }\r\n\r\n const url = `${base}/search`;\r\n\r\n return this.http.get<NominatimSearchItem[]>(url, { params }).pipe(map((items) => items.map((item) => this.mapItem(item))));\r\n }\r\n\r\n /** Converte un risultato Nominatim in {@link UiGeocodedLocationType}. */\r\n mapItem(item: NominatimSearchItem): UiGeocodedLocationType {\r\n const addr = item.address ?? {};\r\n const lat = parseFloat(item.lat);\r\n const lon = parseFloat(item.lon);\r\n const bb = item.boundingbox;\r\n\r\n let boundingBox: UiGeocodedLocationType['boundingBox'];\r\n if (bb && bb.length >= 4) {\r\n const south = parseFloat(bb[0]);\r\n const north = parseFloat(bb[1]);\r\n const west = parseFloat(bb[2]);\r\n const east = parseFloat(bb[3]);\r\n if (!Number.isNaN(south + north + west + east)) {\r\n boundingBox = { south, north, west, east };\r\n }\r\n }\r\n\r\n const city =\r\n addr['city'] ||\r\n addr['town'] ||\r\n addr['village'] ||\r\n addr['municipality'] ||\r\n addr['hamlet'] ||\r\n addr['suburb'];\r\n\r\n const confidence =\r\n typeof item.importance === 'number' ? Math.min(1, Math.max(0, item.importance / 0.75)) : undefined;\r\n\r\n const ccRaw = addr['country_code'];\r\n const countryCode = typeof ccRaw === 'string' ? ccRaw.toUpperCase() : undefined;\r\n const isItalian = countryCode === 'IT';\r\n\r\n const italian: UiGeocodedItalianDetails | undefined = isItalian\r\n ? {\r\n comune: city,\r\n provincia: addr['county'] || addr['state_district'] || addr['province'],\r\n regione: addr['state'],\r\n }\r\n : undefined;\r\n\r\n const foreign: UiGeocodedForeignDetails | undefined = !isItalian\r\n ? {\r\n locality: city,\r\n adminArea: addr['state'] || addr['state_district'] || addr['county'],\r\n countryCode,\r\n }\r\n : undefined;\r\n\r\n return {\r\n label: item.display_name,\r\n latitude: lat,\r\n longitude: lon,\r\n formattedAddress: item.display_name,\r\n territory: isItalian ? 'italian' : 'foreign',\r\n italian,\r\n foreign,\r\n street: addr['road'] || addr['pedestrian'] || addr['path'],\r\n streetNumber: addr['house_number'],\r\n postalCode: addr['postcode'],\r\n city,\r\n municipality: addr['municipality'],\r\n province: addr['state_district'] || addr['county'],\r\n region: addr['state'],\r\n country: addr['country'],\r\n countryCode,\r\n placeId: String(item.place_id),\r\n confidence,\r\n boundingBox,\r\n source: 'nominatim',\r\n raw: item,\r\n };\r\n }\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n Input,\r\n OnInit,\r\n ViewChild,\r\n ViewEncapsulation,\r\n forwardRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n ControlValueAccessor,\r\n FormControl,\r\n NG_VALUE_ACCESSOR,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport {\r\n MatAutocompleteModule,\r\n MatAutocompleteSelectedEvent,\r\n MatAutocompleteTrigger,\r\n} from '@angular/material/autocomplete';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { NgForOf } from '@angular/common';\r\nimport { EMPTY, debounceTime, distinctUntilChanged, switchMap, tap, catchError, map, of } from 'rxjs';\r\nimport { UiNominatimGeocodingService } from '../../services/nominatim-geocoding.service';\r\nimport type {\r\n UiGeocodedLocationInput,\r\n UiGeocodedLocationType,\r\n UiLocationGeocodedFieldConfig,\r\n} from '../../types/geocoded-location.types';\r\n\r\n/** Stati UI per hint e messaggi accessibili. */\r\ntype UiGeocodedPanelState = 'idle' | 'loading' | 'results' | 'empty' | 'error';\r\n\r\n/**\r\n * Campo indirizzo con ricerca geocodificata (Nominatim) e selezione atomica da autocomplete.\r\n * Implementa `ControlValueAccessor`; il valore è {@link UiGeocodedLocationType} o `null`.\r\n *\r\n * L'applicazione host deve fornire `provideHttpClient()` (o `HttpClient` equivalente).\r\n */\r\n@Component({\r\n selector: 'ui-location-geocoded',\r\n standalone: true,\r\n imports: [\r\n NgForOf,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatAutocompleteModule,\r\n MatProgressSpinnerModule,\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiLocationGeocodedComponent),\r\n multi: true,\r\n },\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './location-geocoded.component.html',\r\n styleUrl: './location-geocoded.component.scss',\r\n})\r\nexport class UiLocationGeocodedComponent implements ControlValueAccessor, OnInit {\r\n private readonly nominatim = inject(UiNominatimGeocodingService);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly document = inject(DOCUMENT);\r\n\r\n /** Configurazione ricerca (URL base, debounce, limiti). */\r\n @Input() config: UiLocationGeocodedFieldConfig = {};\r\n\r\n /** Placeholder dell'input. */\r\n @Input() placeholder = '';\r\n\r\n /** Etichetta accessibile dell'input (se la label visibile è esterna al componente). */\r\n @Input() inputAriaLabel = 'Cerca indirizzo';\r\n\r\n /** `id` HTML dell'input (per associare la label esterna con `for`). */\r\n @Input() inputId = '';\r\n\r\n /** Disabilita il campo. */\r\n @Input() set disabled(v: boolean) {\r\n this._disabled = v;\r\n this.syncDisabled();\r\n }\r\n get disabled(): boolean {\r\n return this._disabled;\r\n }\r\n\r\n /** Input in sola lettura (testo non modificabile). */\r\n @Input() readonly = false;\r\n\r\n /** Trigger Material: serve a non trattare il blur verso il pannello come uscita senza selezione. */\r\n @ViewChild('autoTrigger') private autoTrigger?: MatAutocompleteTrigger;\r\n\r\n /** Testo digitabile e label selezionata (sempre stringa, compatibile con MatAutocomplete). */\r\n readonly searchControl = new FormControl<string>('', { nonNullable: true });\r\n\r\n /** Suggerimenti correnti per il pannello autocomplete. */\r\n suggestions: UiGeocodedLocationType[] = [];\r\n\r\n /** Ultima query usata per evidenziare i match nel pannello. */\r\n lastQueryForHighlight = '';\r\n\r\n panelState: UiGeocodedPanelState = 'idle';\r\n\r\n private _disabled = false;\r\n private selected: UiGeocodedLocationType | null = null;\r\n /** Evita che la selezione da autocomplete venga trattata come cancellazione del valore. */\r\n private selecting = false;\r\n /** `pointerdown` sul pannello overlay (fase capture): il blur dell'input avviene prima del click; senza questo si azzera il valore. */\r\n private pointerDownOnOverlay = false;\r\n private readonly resultCache = new Map<string, UiGeocodedLocationType[]>();\r\n private readonly maxCacheEntries = 40;\r\n\r\n private onChange: (v: UiGeocodedLocationType | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n ngOnInit(): void {\r\n const minChars = this.config.minChars ?? 3;\r\n const debounceMs = this.config.debounceMs ?? 200;\r\n\r\n this.document.addEventListener('pointerdown', this.onDocumentPointerDown, true);\r\n this.destroyRef.onDestroy(() => {\r\n this.document.removeEventListener('pointerdown', this.onDocumentPointerDown, true);\r\n });\r\n\r\n this.searchControl.valueChanges\r\n .pipe(\r\n tap((text) => {\r\n if (this.selecting) {\r\n return;\r\n }\r\n if (this.selected && text !== this.selected.label) {\r\n this.selected = null;\r\n this.onChange(null);\r\n }\r\n }),\r\n debounceTime(debounceMs),\r\n distinctUntilChanged(),\r\n switchMap((text) => {\r\n const t = text.trim();\r\n if (t.length < minChars) {\r\n this.suggestions = [];\r\n this.panelState = 'idle';\r\n this.lastQueryForHighlight = '';\r\n this.cdr.markForCheck();\r\n return EMPTY;\r\n }\r\n const cacheKey = t.toLowerCase();\r\n const cached = this.resultCache.get(cacheKey);\r\n if (cached) {\r\n return of({ q: t, items: cached });\r\n }\r\n this.panelState = 'loading';\r\n this.cdr.markForCheck();\r\n return this.nominatim.search(t, this.config).pipe(\r\n tap((items) => this.pushCache(cacheKey, items)),\r\n map((items) => ({ q: t, items })),\r\n catchError(() => {\r\n this.panelState = 'error';\r\n this.suggestions = [];\r\n this.cdr.markForCheck();\r\n return EMPTY;\r\n }),\r\n );\r\n }),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe((payload) => {\r\n this.lastQueryForHighlight = payload.q;\r\n this.suggestions = payload.items;\r\n this.panelState = payload.items.length ? 'results' : 'empty';\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n private pushCache(key: string, items: UiGeocodedLocationType[]): void {\r\n if (this.resultCache.size >= this.maxCacheEntries) {\r\n const first = this.resultCache.keys().next().value as string | undefined;\r\n if (first !== undefined) {\r\n this.resultCache.delete(first);\r\n }\r\n }\r\n this.resultCache.set(key, items);\r\n }\r\n\r\n onOptionSelected(event: MatAutocompleteSelectedEvent): void {\r\n this.pointerDownOnOverlay = false;\r\n const opts = event.source.options?.toArray() ?? [];\r\n const idx = opts.indexOf(event.option);\r\n let opt = idx >= 0 ? this.suggestions[idx] : undefined;\r\n if (!opt && typeof event.option.value === 'string') {\r\n opt = this.suggestions.find((o) => o.label === event.option.value);\r\n }\r\n if (!opt) {\r\n return;\r\n }\r\n this.selecting = true;\r\n this.selected = opt;\r\n this.searchControl.setValue(opt.label, { emitEvent: false });\r\n this.onChange(opt);\r\n this.onTouched();\r\n setTimeout(() => {\r\n this.selecting = false;\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Chiusura focus sull'input: differita così `optionSelected` può aggiornare il modello prima di eventuale reset.\r\n * `pointerDownOnOverlay` copre il caso blur → click sulla lista (relatedTarget spesso null).\r\n */\r\n onBlur(event: FocusEvent): void {\r\n const next = event.relatedTarget as HTMLElement | null;\r\n if (next?.closest?.('.cdk-overlay-container')) {\r\n return;\r\n }\r\n const hadPointerOnPanel = this.pointerDownOnOverlay;\r\n setTimeout(() => {\r\n this.pointerDownOnOverlay = false;\r\n if (this.selecting || this.autoTrigger?.panelOpen || hadPointerOnPanel) {\r\n return;\r\n }\r\n const text = this.searchControl.value?.trim() ?? '';\r\n if (!this.selected) {\r\n if (text.length > 0) {\r\n this.searchControl.setValue('', { emitEvent: false });\r\n }\r\n this.onChange(null);\r\n }\r\n this.onTouched();\r\n }, 0);\r\n }\r\n\r\n /** Imposta il flag prima del blur quando l'utente preme sul pannello (stesso gesto del click su `mat-option`). */\r\n private onDocumentPointerDown = (e: PointerEvent): void => {\r\n if (!this.autoTrigger?.panelOpen) {\r\n return;\r\n }\r\n const t = e.target;\r\n if (!(t instanceof Node)) {\r\n return;\r\n }\r\n if (this.document.querySelector('.cdk-overlay-container')?.contains(t)) {\r\n this.pointerDownOnOverlay = true;\r\n }\r\n };\r\n\r\n /**\r\n * Identità stabile per `@for` sui suggerimenti (evita `??` nel template e problemi di codegen).\r\n */\r\n trackSuggestion(opt: UiGeocodedLocationType): string {\r\n return String(opt.placeId ?? opt.label);\r\n }\r\n\r\n /** Segmenta la label per evidenziazione accessibile (match letterale case-insensitive). */\r\n highlightParts(label: string): { text: string; highlight: boolean }[] {\r\n const q = this.lastQueryForHighlight.trim();\r\n if (!q) {\r\n return [{ text: label, highlight: false }];\r\n }\r\n const lower = label.toLowerCase();\r\n const qi = lower.indexOf(q.toLowerCase());\r\n if (qi < 0) {\r\n return [{ text: label, highlight: false }];\r\n }\r\n const parts: { text: string; highlight: boolean }[] = [];\r\n if (qi > 0) {\r\n parts.push({ text: label.slice(0, qi), highlight: false });\r\n }\r\n parts.push({ text: label.slice(qi, qi + q.length), highlight: true });\r\n if (qi + q.length < label.length) {\r\n parts.push({ text: label.slice(qi + q.length), highlight: false });\r\n }\r\n return parts;\r\n }\r\n\r\n /** Messaggio per `aria-live` in base allo stato del pannello. */\r\n getStatusMessage(): string {\r\n switch (this.panelState) {\r\n case 'loading':\r\n return 'Ricerca indirizzi in corso';\r\n case 'results':\r\n return `${this.suggestions.length} suggerimenti disponibili`;\r\n case 'empty':\r\n return 'Nessun risultato per la ricerca';\r\n case 'error':\r\n return 'Errore durante la ricerca. Riprova.';\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n // ─── ControlValueAccessor ───────────────────────────────────────\r\n\r\n writeValue(value: UiGeocodedLocationInput | null): void {\r\n if (value && typeof value === 'object' && 'latitude' in value) {\r\n this.selected = this.ensureTerritory(value);\r\n this.searchControl.setValue(value.label, { emitEvent: false });\r\n } else {\r\n this.selected = null;\r\n this.searchControl.setValue('', { emitEvent: false });\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (v: UiGeocodedLocationType | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled = isDisabled;\r\n this.syncDisabled();\r\n }\r\n\r\n private syncDisabled(): void {\r\n if (this._disabled) {\r\n this.searchControl.disable({ emitEvent: false });\r\n } else {\r\n this.searchControl.enable({ emitEvent: false });\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Completa `territory` e gli slice `italian` / `foreign` se assenti (payload legacy o altri provider).\r\n */\r\n private ensureTerritory(v: UiGeocodedLocationInput): UiGeocodedLocationType {\r\n if (v.territory) {\r\n return { ...v, territory: v.territory };\r\n }\r\n const cc = v.countryCode?.toUpperCase();\r\n const isItalian = cc === 'IT';\r\n return {\r\n ...v,\r\n territory: isItalian ? 'italian' : 'foreign',\r\n italian: isItalian\r\n ? (v.italian ?? {\r\n comune: v.city,\r\n provincia: v.province,\r\n regione: v.region,\r\n })\r\n : undefined,\r\n foreign: !isItalian\r\n ? (v.foreign ?? {\r\n locality: v.city,\r\n adminArea: v.province ?? v.region,\r\n countryCode: cc,\r\n })\r\n : undefined,\r\n };\r\n }\r\n}\r\n","<div class=\"ui-location-geocoded\">\r\n <span class=\"cdk-visually-hidden\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {{ getStatusMessage() }}\r\n </span>\r\n\r\n <mat-form-field appearance=\"outline\" class=\"ui-location-geocoded__field\" subscriptSizing=\"dynamic\">\r\n <input\r\n #autoTrigger=\"matAutocompleteTrigger\"\r\n matInput\r\n type=\"text\"\r\n [attr.id]=\"inputId || null\"\r\n [formControl]=\"searchControl\"\r\n [matAutocomplete]=\"auto\"\r\n [placeholder]=\"placeholder\"\r\n [readonly]=\"readonly\"\r\n [attr.aria-label]=\"inputAriaLabel\"\r\n [attr.aria-invalid]=\"panelState === 'error'\"\r\n [attr.aria-busy]=\"panelState === 'loading'\"\r\n autocomplete=\"off\"\r\n autocorrect=\"off\"\r\n spellcheck=\"false\"\r\n (blur)=\"onBlur($event)\"\r\n />\r\n\r\n @if (panelState === 'loading') {\r\n <mat-spinner matSuffix class=\"ui-location-geocoded__spinner\" diameter=\"20\" />\r\n }\r\n\r\n <mat-autocomplete\r\n #auto=\"matAutocomplete\"\r\n class=\"ui-location-geocoded__panel\"\r\n (optionSelected)=\"onOptionSelected($event)\"\r\n [autoActiveFirstOption]=\"false\"\r\n >\r\n @for (opt of suggestions; track trackSuggestion(opt)) {\r\n <mat-option class=\"ui-location-geocoded__option\" [value]=\"opt.label\">\r\n <span class=\"ui-location-geocoded__option-text\">\r\n <ng-container *ngFor=\"let part of highlightParts(opt.label)\">\r\n <span [class.ui-location-geocoded__match]=\"part.highlight\">{{ part.text }}</span>\r\n </ng-container>\r\n </span>\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n\r\n @if (panelState !== 'error') {\r\n <mat-hint class=\"ui-location-geocoded__hint\">\r\n @if (config.biasCountry) {\r\n <span class=\"ui-location-geocoded__scope\">\r\n Ambito: solo paese {{ config.biasCountry.toUpperCase() }} — luoghi in altri paesi non compaiono tra i risultati.\r\n </span>\r\n }\r\n @if (panelState === 'idle') {\r\n Digita almeno {{ config.minChars ?? 3 }} caratteri per cercare.\r\n } @else if (panelState === 'loading') {\r\n Ricerca in corso...\r\n } @else if (panelState === 'empty') {\r\n @if (config.biasCountry) {\r\n Nessun risultato in questo paese. Per cercare fuori da questo paese rimuovi il filtro paese dalla configurazione del campo.\r\n } @else {\r\n Nessun indirizzo trovato. Modifica la ricerca.\r\n }\r\n } @else if (panelState === 'results') {\r\n {{ suggestions.length }} risultati. Usa frecce e Invio per selezionare.\r\n }\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n\r\n @if (panelState === 'error') {\r\n <div class=\"ui-location-geocoded__api-error\" role=\"alert\">\r\n Impossibile contattare il servizio di geocoding. Riprova.\r\n </div>\r\n }\r\n</div>\r\n","import { FormControl, FormGroupDirective, NgForm } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\n\r\n/**\r\n * ErrorStateMatcher condiviso tra form-builder e campi atomici.\r\n * Mostra errore quando il controllo è invalido e (touched o dirty).\r\n */\r\nexport class UiFormErrorStateMatcher implements ErrorStateMatcher {\r\n isErrorState(control: FormControl | null, _form: FormGroupDirective | NgForm | null): boolean {\r\n return !!(control && control.invalid && (control.touched || control.dirty));\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n ViewEncapsulation,\r\n inject,\r\n} from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiFormFieldErrorService } from '../../services/form-field-error.service';\r\nimport { UiFormErrorStateMatcher } from '../../services/form-error-state.matcher';\r\nimport { UiFormFieldDescriptor, UiFieldOption } from '../../types/field.types';\r\nimport { UiValidationRule } from '../../types/validation.types';\r\n\r\n/**\r\n * Campo atomico text / email / password — stesso rendering del form-builder.\r\n * Modalità builder: `field` + `formGroup`. Modalità standalone: `control` + `label`.\r\n *\r\n * @selector ui-form-text-field\r\n */\r\n@Component({\r\n selector: 'ui-form-text-field',\r\n standalone: true,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatAutocompleteModule,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [{ provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher }],\r\n templateUrl: './form-text-field.component.html',\r\n styleUrl: './form-fields.scss',\r\n})\r\nexport class UiFormTextFieldComponent {\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\n\r\n /** Descriptor schema (modalità builder). */\r\n @Input() field?: UiFormFieldDescriptor;\r\n /** FormGroup dell'istanza (modalità builder). */\r\n @Input() formGroup?: FormGroup;\r\n /** Readonly globale dal form-builder. */\r\n @Input() readonly = false;\r\n /** Errori pre-calcolati dal builder; se null, derivati dal controllo. */\r\n @Input() errors: string[] | null = null;\r\n\r\n /** Control diretto (modalità standalone / CVA). */\r\n @Input() control?: FormControl;\r\n @Input() label?: string;\r\n @Input() placeholder?: string;\r\n @Input() maxLength?: number;\r\n @Input() inputType: 'text' | 'email' | 'password' = 'text';\r\n @Input() validationRules?: UiValidationRule[];\r\n\r\n /** Opzioni autocomplete (campo text searchable nel builder). */\r\n @Input() options: UiFieldOption[] = [];\r\n @Output() optionsFilter = new EventEmitter<string>();\r\n @Output() blurred = new EventEmitter<void>();\r\n\r\n /** True se il campo schema è text searchable. */\r\n get isSearchableText(): boolean {\r\n return this.field?.searchable === true && this.field?.type === 'text';\r\n }\r\n\r\n /** Etichetta effettiva. */\r\n get effectiveLabel(): string {\r\n return this.field?.label ?? this.label ?? '';\r\n }\r\n\r\n /** Placeholder effettivo. */\r\n get effectivePlaceholder(): string {\r\n return this.field?.placeholder ?? this.placeholder ?? '';\r\n }\r\n\r\n /** Tipo input HTML nativo. */\r\n get nativeInputType(): string {\r\n if (this.field) {\r\n switch (this.field.type) {\r\n case 'password':\r\n return 'password';\r\n case 'email':\r\n return 'email';\r\n default:\r\n return 'text';\r\n }\r\n }\r\n return this.inputType;\r\n }\r\n\r\n /** Readonly effettivo sul campo. */\r\n get isReadonly(): boolean {\r\n return this.readonly || this.field?.readonly === true;\r\n }\r\n\r\n /** Controllo risolto per modalità standalone. */\r\n get resolvedControl(): FormControl | null {\r\n return this.control ?? null;\r\n }\r\n\r\n /** Regole validation per messaggi errore. */\r\n get effectiveRules(): UiValidationRule[] {\r\n return this.field?.validation ?? this.validationRules ?? [];\r\n }\r\n\r\n /** Max length da regole o input. */\r\n get effectiveMaxLength(): number | undefined {\r\n if (this.maxLength != null) return this.maxLength;\r\n return this.fieldErrorService.resolveMaxLength(this.effectiveRules);\r\n }\r\n\r\n /** Controllo del campo in modalità builder. */\r\n get fieldControl(): FormControl | null {\r\n if (!this.field || !this.formGroup) return null;\r\n const c = this.formGroup.get(this.field.key);\r\n return c instanceof FormControl ? c : null;\r\n }\r\n\r\n /** Messaggi errore da mostrare in mat-error. */\r\n resolvedErrors(control: FormControl | null): string[] {\r\n if (this.errors != null) return this.errors;\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\n }\r\n\r\n /** Conteggio caratteri (solo text con maxLength). */\r\n charCount(control: FormControl | null): { current: number; max: number } | null {\r\n if (this.field && this.field.type !== 'text') return null;\r\n return this.fieldErrorService.getCharCount(control, this.effectiveMaxLength);\r\n }\r\n\r\n onInput(query: string): void {\r\n this.optionsFilter.emit(query);\r\n }\r\n\r\n onBlur(): void {\r\n this.blurred.emit();\r\n }\r\n}\r\n","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-fb-text-ctx\">\r\n @if (isSearchableText) {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <input\r\n matInput\r\n [formControlName]=\"field.key\"\r\n [type]=\"nativeInputType\"\r\n [matAutocomplete]=\"textAuto\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <mat-autocomplete #textAuto=\"matAutocomplete\">\r\n @for (opt of options; track opt.value) {\r\n <mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\r\n }\r\n </mat-autocomplete>\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n } @else {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <input\r\n matInput\r\n [formControlName]=\"field.key\"\r\n [type]=\"nativeInputType\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (field.iconTooltip) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\"\r\n [attr.aria-label]=\"field.iconTooltip.text\"\r\n >\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"18\" />\r\n </button>\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n @if (charCount(fieldControl); as cc) {\r\n <mat-hint\r\n align=\"end\"\r\n class=\"ui-form-builder__char-count\"\r\n [class.ui-form-builder__char-count--warn]=\"cc.current > cc.max * 0.9\"\r\n [class.ui-form-builder__char-count--error]=\"cc.current > cc.max\"\r\n >\r\n {{ cc.current }} / {{ cc.max }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n }\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n <input\r\n matInput\r\n [formControl]=\"control\"\r\n [type]=\"nativeInputType\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [attr.maxlength]=\"effectiveMaxLength\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n @if (charCount(control); as cc) {\r\n <mat-hint\r\n align=\"end\"\r\n class=\"ui-form-builder__char-count\"\r\n [class.ui-form-builder__char-count--warn]=\"cc.current > cc.max * 0.9\"\r\n [class.ui-form-builder__char-count--error]=\"cc.current > cc.max\"\r\n >\r\n {{ cc.current }} / {{ cc.max }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n </div>\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n ViewEncapsulation,\r\n inject,\r\n} from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiFormFieldErrorService } from '../../services/form-field-error.service';\r\nimport { UiFormErrorStateMatcher } from '../../services/form-error-state.matcher';\r\nimport { UiFormFieldDescriptor } from '../../types/field.types';\r\nimport { UiValidationRule } from '../../types/validation.types';\r\n\r\n/**\r\n * Campo atomico textarea — stesso rendering del form-builder.\r\n *\r\n * @selector ui-form-textarea-field\r\n */\r\n@Component({\r\n selector: 'ui-form-textarea-field',\r\n standalone: true,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [{ provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher }],\r\n templateUrl: './form-textarea-field.component.html',\r\n styleUrl: './form-fields.scss',\r\n})\r\nexport class UiFormTextareaFieldComponent {\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\n\r\n @Input() field?: UiFormFieldDescriptor;\r\n @Input() formGroup?: FormGroup;\r\n @Input() readonly = false;\r\n @Input() errors: string[] | null = null;\r\n\r\n @Input() control?: FormControl;\r\n @Input() label?: string;\r\n @Input() placeholder?: string;\r\n @Input() rows = 4;\r\n @Input() maxLength?: number;\r\n @Input() validationRules?: UiValidationRule[];\r\n\r\n @Output() blurred = new EventEmitter<void>();\r\n\r\n get effectiveLabel(): string {\r\n return this.field?.label ?? this.label ?? '';\r\n }\r\n\r\n get effectivePlaceholder(): string {\r\n return this.field?.placeholder ?? this.placeholder ?? '';\r\n }\r\n\r\n get isReadonly(): boolean {\r\n return this.readonly || this.field?.readonly === true;\r\n }\r\n\r\n get effectiveRules(): UiValidationRule[] {\r\n return this.field?.validation ?? this.validationRules ?? [];\r\n }\r\n\r\n /** Controllo del campo in modalità builder. */\r\n get fieldControl(): FormControl | null {\r\n if (!this.field || !this.formGroup) return null;\r\n const c = this.formGroup.get(this.field.key);\r\n return c instanceof FormControl ? c : null;\r\n }\r\n\r\n get effectiveMaxLength(): number | undefined {\r\n if (this.maxLength != null) return this.maxLength;\r\n return this.fieldErrorService.resolveMaxLength(this.effectiveRules);\r\n }\r\n\r\n resolvedErrors(control: FormControl | null): string[] {\r\n if (this.errors != null) return this.errors;\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\n }\r\n\r\n charCount(control: FormControl | null): { current: number; max: number } | null {\r\n return this.fieldErrorService.getCharCount(control, this.effectiveMaxLength);\r\n }\r\n\r\n onBlur(): void {\r\n this.blurred.emit();\r\n }\r\n}\r\n","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-form-builder__textarea-wrapper\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <textarea\r\n matInput\r\n [formControlName]=\"field.key\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n [rows]=\"rows\"\r\n (blur)=\"onBlur()\"\r\n ></textarea>\r\n @if (field.iconTooltip) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\"\r\n [attr.aria-label]=\"field.iconTooltip.text\"\r\n >\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"18\" />\r\n </button>\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n @if (charCount(fieldControl); as cc) {\r\n <mat-hint\r\n align=\"end\"\r\n class=\"ui-form-builder__char-count\"\r\n [class.ui-form-builder__char-count--warn]=\"cc.current > cc.max * 0.9\"\r\n [class.ui-form-builder__char-count--error]=\"cc.current > cc.max\"\r\n >\r\n {{ cc.current }} / {{ cc.max }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom ui-form-builder__textarea-wrapper\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n <textarea\r\n matInput\r\n [formControl]=\"control\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [rows]=\"rows\"\r\n [attr.maxlength]=\"effectiveMaxLength\"\r\n (blur)=\"onBlur()\"\r\n ></textarea>\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n @if (charCount(control); as cc) {\r\n <mat-hint\r\n align=\"end\"\r\n class=\"ui-form-builder__char-count\"\r\n [class.ui-form-builder__char-count--warn]=\"cc.current > cc.max * 0.9\"\r\n [class.ui-form-builder__char-count--error]=\"cc.current > cc.max\"\r\n >\r\n {{ cc.current }} / {{ cc.max }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n </div>\r\n}\r\n","import { Directive, ElementRef, HostListener, Input, OnInit, Renderer2, forwardRef } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n/**\r\n * Direttiva per formattazione input valuta.\r\n *\r\n * Formatta il valore numerico con separatori italiani (1.234,56)\r\n * e simbolo valuta opzionale. In fase di focus l'utente modifica\r\n * il valore raw, al blur viene riformattato.\r\n *\r\n * Implementa `ControlValueAccessor` per integrazione con Reactive Forms.\r\n *\r\n * @selector [uiCurrencyInput]\r\n *\r\n * @example\r\n * ```html\r\n * <input uiCurrencyInput currencySymbol=\"EUR\" [decimalPlaces]=\"2\" />\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[uiCurrencyInput]',\r\n standalone: true,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiCurrencyInputDirective),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class UiCurrencyInputDirective implements ControlValueAccessor, OnInit {\r\n /** Simbolo valuta visualizzato. @default 'EUR' */\r\n @Input() currencySymbol = 'EUR';\r\n\r\n /** Numero di decimali. @default 2 */\r\n @Input() decimalPlaces = 2;\r\n\r\n private rawValue: number | null = null;\r\n private onChange: (value: number | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n private isFocused = false;\r\n\r\n constructor(\r\n private el: ElementRef<HTMLInputElement>,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.renderer.setStyle(this.el.nativeElement, 'text-align', 'right');\r\n }\r\n\r\n // ── ControlValueAccessor ──\r\n\r\n writeValue(value: any): void {\r\n this.rawValue = value != null ? Number(value) : null;\r\n if (!this.isFocused) {\r\n this.displayFormatted();\r\n }\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.renderer.setProperty(this.el.nativeElement, 'disabled', isDisabled);\r\n }\r\n\r\n // ── Gestione eventi ──\r\n\r\n @HostListener('focus')\r\n onFocus(): void {\r\n this.isFocused = true;\r\n this.renderer.setStyle(this.el.nativeElement, 'text-align', 'left');\r\n // Mostra valore raw per editing\r\n if (this.rawValue != null) {\r\n this.el.nativeElement.value = this.rawValue.toString().replace('.', ',');\r\n } else {\r\n this.el.nativeElement.value = '';\r\n }\r\n }\r\n\r\n @HostListener('blur')\r\n onBlur(): void {\r\n this.isFocused = false;\r\n this.onTouched();\r\n this.parseInput();\r\n this.displayFormatted();\r\n this.renderer.setStyle(this.el.nativeElement, 'text-align', 'right');\r\n }\r\n\r\n @HostListener('input', ['$event.target.value'])\r\n onInput(value: string): void {\r\n // Permetti solo cifre, virgola e punto (come separatore decimale)\r\n const sanitized = value.replace(/[^0-9,.\\-]/g, '');\r\n if (sanitized !== value) {\r\n this.el.nativeElement.value = sanitized;\r\n }\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent): void {\r\n const allowed = [\r\n 'Backspace',\r\n 'Delete',\r\n 'Tab',\r\n 'Escape',\r\n 'Enter',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'Home',\r\n 'End',\r\n ];\r\n if (allowed.includes(event.key)) return;\r\n\r\n // Permetti Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X\r\n if (event.ctrlKey || event.metaKey) return;\r\n\r\n // Permetti cifre\r\n if (/^\\d$/.test(event.key)) return;\r\n\r\n // Permetti virgola e punto (un solo separatore decimale)\r\n if ((event.key === ',' || event.key === '.') && !this.el.nativeElement.value.includes(',')) {\r\n return;\r\n }\r\n\r\n // Permetti segno meno solo all'inizio\r\n if (event.key === '-' && this.el.nativeElement.selectionStart === 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n }\r\n\r\n // ── Utilita interne ──\r\n\r\n private parseInput(): void {\r\n const input = this.el.nativeElement.value.trim();\r\n if (!input) {\r\n this.rawValue = null;\r\n this.onChange(null);\r\n return;\r\n }\r\n\r\n // Normalizza: rimuovi punti migliaia, sostituisci virgola con punto\r\n const normalized = input.replace(/\\./g, '').replace(',', '.');\r\n const num = parseFloat(normalized);\r\n\r\n if (isNaN(num)) {\r\n this.rawValue = null;\r\n this.onChange(null);\r\n } else {\r\n this.rawValue = num;\r\n this.onChange(num);\r\n }\r\n }\r\n\r\n /** Mostra il valore formattato con separatori italiani e simbolo. */\r\n private displayFormatted(): void {\r\n if (this.rawValue == null) {\r\n this.el.nativeElement.value = '';\r\n return;\r\n }\r\n\r\n const formatted = this.formatItalian(this.rawValue, this.decimalPlaces);\r\n this.el.nativeElement.value = this.currencySymbol ? `${formatted} ${this.currencySymbol}` : formatted;\r\n }\r\n\r\n /** Formattazione italiana: 1.234,56 */\r\n private formatItalian(value: number, decimals: number): string {\r\n const parts = value.toFixed(decimals).split('.');\r\n const intPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.'); // NOSONAR - Used on controlled number strings from toFixed(), low ReDoS risk\r\n return decimals > 0 ? `${intPart},${parts[1]}` : intPart;\r\n }\r\n}\r\n","import {\r\n\r\n ChangeDetectionStrategy,\r\n\r\n Component,\r\n\r\n EventEmitter,\r\n\r\n Input,\r\n\r\n Output,\r\n\r\n ViewEncapsulation,\r\n\r\n inject,\r\n\r\n} from '@angular/core';\r\n\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\n\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\n\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { LucideAngularModule } from 'lucide-angular';\r\n\r\nimport { UiCurrencyInputDirective } from '../../directives/currency-input.directive';\r\n\r\nimport { UiFormErrorStateMatcher } from '../../services/form-error-state.matcher';\r\n\r\nimport { UiFormFieldErrorService } from '../../services/form-field-error.service';\r\n\r\nimport { UiFormFieldDescriptor } from '../../types/field.types';\r\n\r\nimport { UiValidationRule } from '../../types/validation.types';\r\n\r\n\r\n\r\n/**\r\n\r\n * Campo atomico number / currency — stesso rendering del form-builder.\r\n\r\n *\r\n\r\n * @selector ui-form-number-field\r\n\r\n */\r\n\r\n@Component({\r\n\r\n selector: 'ui-form-number-field',\r\n\r\n standalone: true,\r\n\r\n imports: [\r\n\r\n ReactiveFormsModule,\r\n\r\n MatFormFieldModule,\r\n\r\n MatInputModule,\r\n\r\n MatTooltipModule,\r\n\r\n LucideAngularModule,\r\n\r\n UiCurrencyInputDirective,\r\n\r\n ],\r\n\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n\r\n encapsulation: ViewEncapsulation.None,\r\n\r\n providers: [{ provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher }],\r\n\r\n templateUrl: './form-number-field.component.html',\r\n\r\n styleUrl: './form-fields.scss',\r\n\r\n})\r\n\r\nexport class UiFormNumberFieldComponent {\r\n\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\n\r\n\r\n\r\n @Input() field?: UiFormFieldDescriptor;\r\n\r\n @Input() formGroup?: FormGroup;\r\n\r\n @Input() readonly = false;\r\n\r\n @Input() errors: string[] | null = null;\r\n\r\n\r\n\r\n @Input() control?: FormControl;\r\n\r\n @Input() label?: string;\r\n\r\n @Input() placeholder?: string;\r\n\r\n @Input() validationRules?: UiValidationRule[];\r\n\r\n /** Modalità valuta standalone (equivalente a `field.metadata.type === 'currency'`). */\r\n\r\n @Input() currencyMode = false;\r\n\r\n @Input() currencySymbol = 'EUR';\r\n\r\n @Input() decimalPlaces = 2;\r\n\r\n\r\n\r\n @Output() blurred = new EventEmitter<void>();\r\n\r\n\r\n\r\n get effectiveLabel(): string {\r\n\r\n return this.field?.label ?? this.label ?? '';\r\n\r\n }\r\n\r\n\r\n\r\n get effectivePlaceholder(): string {\r\n\r\n return this.field?.placeholder ?? this.placeholder ?? '';\r\n\r\n }\r\n\r\n\r\n\r\n get isReadonly(): boolean {\r\n\r\n return this.readonly || this.field?.readonly === true;\r\n\r\n }\r\n\r\n\r\n\r\n get isCurrency(): boolean {\r\n\r\n if (this.field?.metadata?.['type'] === 'currency') return true;\r\n\r\n return this.currencyMode;\r\n\r\n }\r\n\r\n\r\n\r\n get effectiveCurrencySymbol(): string {\r\n\r\n return (this.field?.metadata?.['currency'] as string) || this.currencySymbol;\r\n\r\n }\r\n\r\n\r\n\r\n get effectiveDecimalPlaces(): number {\r\n\r\n const fromField = this.field?.metadata?.['decimals'];\r\n\r\n return fromField != null ? Number(fromField) : this.decimalPlaces;\r\n\r\n }\r\n\r\n\r\n\r\n get effectiveRules(): UiValidationRule[] {\r\n\r\n return this.field?.validation ?? this.validationRules ?? [];\r\n\r\n }\r\n\r\n\r\n\r\n get fieldControl(): FormControl | null {\r\n\r\n if (!this.field || !this.formGroup) return null;\r\n\r\n const c = this.formGroup.get(this.field.key);\r\n\r\n return c instanceof FormControl ? c : null;\r\n\r\n }\r\n\r\n\r\n\r\n resolvedErrors(control: FormControl | null): string[] {\r\n\r\n if (this.errors != null) return this.errors;\r\n\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\n\r\n }\r\n\r\n\r\n\r\n onBlur(): void {\r\n\r\n this.blurred.emit();\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-fb-field-ctx\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n @if (isCurrency) {\r\n <input\r\n matInput\r\n type=\"text\"\r\n [formControlName]=\"field.key\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n uiCurrencyInput\r\n [currencySymbol]=\"effectiveCurrencySymbol\"\r\n [decimalPlaces]=\"effectiveDecimalPlaces\"\r\n (blur)=\"onBlur()\"\r\n />\r\n } @else {\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControlName]=\"field.key\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n (blur)=\"onBlur()\"\r\n />\r\n }\r\n @if (field.iconTooltip) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\"\r\n [attr.aria-label]=\"field.iconTooltip.text\"\r\n >\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"18\" />\r\n </button>\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n @if (isCurrency) {\r\n <input\r\n matInput\r\n type=\"text\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n uiCurrencyInput\r\n [currencySymbol]=\"effectiveCurrencySymbol\"\r\n [decimalPlaces]=\"effectiveDecimalPlaces\"\r\n (blur)=\"onBlur()\"\r\n />\r\n } @else {\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n (blur)=\"onBlur()\"\r\n />\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n}\r\n","import {\r\n\r\n ChangeDetectionStrategy,\r\n\r\n Component,\r\n\r\n EventEmitter,\r\n\r\n Input,\r\n\r\n Output,\r\n\r\n ViewEncapsulation,\r\n\r\n inject,\r\n\r\n} from '@angular/core';\r\n\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\n\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\n\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\n\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { MatSelectModule } from '@angular/material/select';\r\n\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { LucideAngularModule } from 'lucide-angular';\r\n\r\nimport { UiFormErrorStateMatcher } from '../../services/form-error-state.matcher';\r\n\r\nimport { UiFormFieldErrorService } from '../../services/form-field-error.service';\r\n\r\nimport { UiFieldOption, UiFormFieldDescriptor } from '../../types/field.types';\r\n\r\nimport { UiValidationRule } from '../../types/validation.types';\r\n\r\n\r\n\r\n/**\r\n\r\n * Campo atomico select (mat-select o autocomplete searchable).\r\n\r\n *\r\n\r\n * @selector ui-form-select-field\r\n\r\n */\r\n\r\n@Component({\r\n\r\n selector: 'ui-form-select-field',\r\n\r\n standalone: true,\r\n\r\n imports: [\r\n\r\n ReactiveFormsModule,\r\n\r\n MatFormFieldModule,\r\n\r\n MatInputModule,\r\n\r\n MatSelectModule,\r\n\r\n MatAutocompleteModule,\r\n\r\n MatTooltipModule,\r\n\r\n LucideAngularModule,\r\n\r\n ],\r\n\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n\r\n encapsulation: ViewEncapsulation.None,\r\n\r\n providers: [{ provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher }],\r\n\r\n templateUrl: './form-select-field.component.html',\r\n\r\n styleUrl: './form-fields.scss',\r\n\r\n})\r\n\r\nexport class UiFormSelectFieldComponent {\r\n\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\n\r\n\r\n\r\n @Input() field?: UiFormFieldDescriptor;\r\n\r\n @Input() formGroup?: FormGroup;\r\n\r\n @Input() readonly = false;\r\n\r\n @Input() errors: string[] | null = null;\r\n\r\n @Input() options: UiFieldOption[] = [];\r\n\r\n\r\n\r\n @Input() control?: FormControl;\r\n\r\n @Input() label?: string;\r\n\r\n @Input() placeholder?: string;\r\n\r\n @Input() searchable = false;\r\n\r\n @Input() hideEmptyOption = false;\r\n\r\n @Input() validationRules?: UiValidationRule[];\r\n\r\n\r\n\r\n @Output() optionsFilter = new EventEmitter<string>();\r\n\r\n @Output() blurred = new EventEmitter<void>();\r\n\r\n\r\n\r\n get effectiveLabel(): string {\r\n\r\n return this.field?.label ?? this.label ?? '';\r\n\r\n }\r\n\r\n\r\n\r\n get effectivePlaceholder(): string {\r\n\r\n return this.field?.placeholder ?? this.placeholder ?? '';\r\n\r\n }\r\n\r\n\r\n\r\n get isReadonly(): boolean {\r\n\r\n return this.readonly || this.field?.readonly === true;\r\n\r\n }\r\n\r\n\r\n\r\n get isSearchable(): boolean {\r\n\r\n return this.field?.searchable === true || this.searchable;\r\n\r\n }\r\n\r\n\r\n\r\n get showEmptyOption(): boolean {\r\n\r\n if (this.field) return !this.field.hideEmptyOption;\r\n\r\n return !this.hideEmptyOption;\r\n\r\n }\r\n\r\n\r\n\r\n get effectiveOptions(): UiFieldOption[] {\r\n\r\n return this.options;\r\n\r\n }\r\n\r\n\r\n\r\n get effectiveRules(): UiValidationRule[] {\r\n\r\n return this.field?.validation ?? this.validationRules ?? [];\r\n\r\n }\r\n\r\n\r\n\r\n get fieldControl(): FormControl | null {\r\n\r\n if (!this.field || !this.formGroup) return null;\r\n\r\n const c = this.formGroup.get(this.field.key);\r\n\r\n return c instanceof FormControl ? c : null;\r\n\r\n }\r\n\r\n\r\n\r\n resolvedErrors(control: FormControl | null): string[] {\r\n\r\n if (this.errors != null) return this.errors;\r\n\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\n\r\n }\r\n\r\n\r\n\r\n displayWith = (value: unknown): string => {\r\n\r\n const opt = this.effectiveOptions.find((o) => o.value === value);\r\n\r\n return opt?.label ?? '';\r\n\r\n };\r\n\r\n\r\n\r\n onInput(query: string): void {\r\n\r\n this.optionsFilter.emit(query);\r\n\r\n }\r\n\r\n\r\n\r\n onBlur(): void {\r\n\r\n this.blurred.emit();\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-fb-field-ctx\">\r\n @if (isSearchable) {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <input\r\n matInput\r\n [formControlName]=\"field.key\"\r\n [matAutocomplete]=\"selectAuto\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <mat-autocomplete #selectAuto=\"matAutocomplete\" [displayWith]=\"displayWith\">\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" class=\"ui-form-builder__option-icon\" />\r\n }\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n } @else {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <mat-select [formControlName]=\"field.key\" [placeholder]=\"effectivePlaceholder\">\r\n @if (showEmptyOption) {\r\n <mat-option [value]=\"null\">--</mat-option>\r\n }\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" class=\"ui-form-builder__option-icon\" />\r\n }\r\n {{ opt.label }}\r\n @if (opt.tooltip) {\r\n <lucide-icon\r\n name=\"info\"\r\n [size]=\"14\"\r\n [matTooltip]=\"opt.tooltip\"\r\n class=\"ui-form-builder__option-info\"\r\n />\r\n }\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (field.iconTooltip) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\"\r\n [attr.aria-label]=\"field.iconTooltip.text\"\r\n >\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"18\" />\r\n </button>\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom\">\r\n @if (isSearchable) {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n <input\r\n matInput\r\n [formControl]=\"control\"\r\n [matAutocomplete]=\"selectAutoStandalone\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <mat-autocomplete #selectAutoStandalone=\"matAutocomplete\" [displayWith]=\"displayWith\">\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" class=\"ui-form-builder__option-icon\" />\r\n }\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n } @else {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n <mat-select [formControl]=\"control\" [placeholder]=\"effectivePlaceholder\">\r\n @if (showEmptyOption) {\r\n <mat-option [value]=\"null\">--</mat-option>\r\n }\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" class=\"ui-form-builder__option-icon\" />\r\n }\r\n {{ opt.label }}\r\n @if (opt.tooltip) {\r\n <lucide-icon\r\n name=\"info\"\r\n [size]=\"14\"\r\n [matTooltip]=\"opt.tooltip\"\r\n class=\"ui-form-builder__option-info\"\r\n />\r\n }\r\n </mat-option>\r\n }\r\n </mat-select>\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n </div>\r\n}\r\n","import {\r\n\r\n ChangeDetectionStrategy,\r\n\r\n Component,\r\n\r\n EventEmitter,\r\n\r\n Input,\r\n\r\n Output,\r\n\r\n ViewEncapsulation,\r\n\r\n inject,\r\n\r\n} from '@angular/core';\r\n\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { MatRadioModule } from '@angular/material/radio';\r\n\r\nimport { LucideAngularModule } from 'lucide-angular';\r\n\r\nimport { UiFormFieldErrorService, UiFieldErrorDisplayOptions } from '../../services/form-field-error.service';\r\n\r\nimport { UiFieldOption, UiFormFieldDescriptor } from '../../types/field.types';\r\n\r\nimport { UiValidationRule } from '../../types/validation.types';\r\n\r\n\r\n\r\n/**\r\n\r\n * Campo atomico radio group — stesso rendering del form-builder.\r\n\r\n *\r\n\r\n * @selector ui-form-radio-field\r\n\r\n */\r\n\r\n@Component({\r\n\r\n selector: 'ui-form-radio-field',\r\n\r\n standalone: true,\r\n\r\n imports: [ReactiveFormsModule, MatRadioModule, LucideAngularModule],\r\n\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n\r\n encapsulation: ViewEncapsulation.None,\r\n\r\n templateUrl: './form-radio-field.component.html',\r\n\r\n styleUrl: './form-fields.scss',\r\n\r\n})\r\n\r\nexport class UiFormRadioFieldComponent {\r\n\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\n\r\n\r\n\r\n @Input() field?: UiFormFieldDescriptor;\r\n\r\n @Input() formGroup?: FormGroup;\r\n\r\n @Input() readonly = false;\r\n\r\n @Input() errors: string[] | null = null;\r\n\r\n @Input() options: UiFieldOption[] = [];\r\n\r\n /** Indica asterisco obbligatorio (builder: `isFieldRequired`). */\r\n\r\n @Input() required = false;\r\n\r\n /** Override visibilità errori; se null deriva dal controllo. */\r\n\r\n @Input() showErrors: boolean | null = null;\r\n\r\n @Input() errorDisplayOptions: UiFieldErrorDisplayOptions = {};\r\n\r\n\r\n\r\n @Input() control?: FormControl;\r\n\r\n @Input() label?: string;\r\n\r\n @Input() validationRules?: UiValidationRule[];\r\n\r\n @Input() color: 'primary' | 'accent' | 'warn' = 'primary';\r\n\r\n\r\n\r\n @Output() blurred = new EventEmitter<void>();\r\n\r\n\r\n\r\n get effectiveLabel(): string {\r\n\r\n return this.field?.label ?? this.label ?? '';\r\n\r\n }\r\n\r\n\r\n\r\n get isDisabled(): boolean {\r\n\r\n return this.readonly || this.field?.readonly === true || this.field?.disabled === true;\r\n\r\n }\r\n\r\n\r\n\r\n get effectiveOptions(): UiFieldOption[] {\r\n\r\n return this.options;\r\n\r\n }\r\n\r\n\r\n\r\n get effectiveColor(): 'primary' | 'accent' | 'warn' {\r\n\r\n return this.field?.appearance?.color ?? this.color;\r\n\r\n }\r\n\r\n\r\n\r\n get effectiveRules(): UiValidationRule[] {\r\n\r\n return this.field?.validation ?? this.validationRules ?? [];\r\n\r\n }\r\n\r\n\r\n\r\n get showRequiredMarker(): boolean {\r\n\r\n if (this.required) return true;\r\n\r\n return this.effectiveRules.some((r) => r.type === 'required' && !r.conditions?.length);\r\n\r\n }\r\n\r\n\r\n\r\n get fieldControl(): FormControl | null {\r\n\r\n if (!this.field || !this.formGroup) return null;\r\n\r\n const c = this.formGroup.get(this.field.key);\r\n\r\n return c instanceof FormControl ? c : null;\r\n\r\n }\r\n\r\n\r\n\r\n resolvedErrors(control: FormControl | null): string[] {\r\n\r\n if (this.errors != null) return this.errors;\r\n\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\n\r\n }\r\n\r\n\r\n\r\n shouldShowErrors(control: FormControl | null): boolean {\r\n\r\n if (this.showErrors != null) return this.showErrors;\r\n\r\n return this.fieldErrorService.shouldShowFieldErrors(control, this.errorDisplayOptions);\r\n\r\n }\r\n\r\n\r\n\r\n onBlur(): void {\r\n\r\n this.blurred.emit();\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-fb-field-ctx\">\r\n <div class=\"ui-form-builder__radio-wrapper\">\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ effectiveLabel }}\r\n @if (showRequiredMarker) {\r\n <span class=\"ui-form-builder__required\">*</span>\r\n }\r\n </label>\r\n <mat-radio-group\r\n [formControlName]=\"field.key\"\r\n [color]=\"effectiveColor\"\r\n (blur)=\"onBlur()\"\r\n >\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-radio-button [value]=\"opt.value\" [disabled]=\"opt.disabled || isDisabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" />\r\n }\r\n {{ opt.label }}\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n @if (shouldShowErrors(fieldControl)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom ui-form-builder__radio-wrapper\">\r\n @if (effectiveLabel) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ effectiveLabel }}\r\n @if (showRequiredMarker) {\r\n <span class=\"ui-form-builder__required\">*</span>\r\n }\r\n </label>\r\n }\r\n <mat-radio-group [formControl]=\"control\" [color]=\"effectiveColor\" (blur)=\"onBlur()\">\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-radio-button [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" />\r\n }\r\n {{ opt.label }}\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n @if (shouldShowErrors(control)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of resolvedErrors(control); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder\r\n * Adapter e formati per il datepicker italiano (DD/MM/YYYY).\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { NativeDateAdapter, MatDateFormats } from '@angular/material/core';\r\n\r\n/**\r\n * Adapter personalizzato per il parsing delle date in formato italiano DD/MM/YYYY.\r\n *\r\n * Estende il NativeDateAdapter di Angular Material per gestire:\r\n * - Parsing: converte stringhe DD/MM/YYYY in oggetti Date\r\n * - Formattazione: visualizza le date nel formato italiano\r\n * - Primo giorno della settimana: Lunedi (1)\r\n */\r\n@Injectable()\r\nexport class UiItalianDateAdapter extends NativeDateAdapter {\r\n /**\r\n * Il primo giorno della settimana e Lunedi (1).\r\n */\r\n override getFirstDayOfWeek(): number {\r\n return 1;\r\n }\r\n\r\n /**\r\n * Parsing di una stringa di data in formato DD/MM/YYYY.\r\n * Supporta sia il formato con separatore `/` che `-`.\r\n */\r\n override parse(value: any): Date | null {\r\n if (typeof value === 'string' && value.length > 0) {\r\n // Gestisci formato DD/MM/YYYY o DD-MM-YYYY\r\n const parts = value.split(/[\\/\\-]/);\r\n if (parts.length === 3) {\r\n const day = parseInt(parts[0], 10);\r\n const month = parseInt(parts[1], 10) - 1; // Mesi 0-based\r\n const year = parseInt(parts[2], 10);\r\n\r\n if (!isNaN(day) && !isNaN(month) && !isNaN(year)) {\r\n // Validazione base\r\n if (day >= 1 && day <= 31 && month >= 0 && month <= 11 && year >= 1900 && year <= 2100) {\r\n return new Date(year, month, day);\r\n }\r\n }\r\n }\r\n }\r\n return super.parse(value);\r\n }\r\n\r\n /**\r\n * Formatta una data in formato DD/MM/YYYY per la visualizzazione.\r\n */\r\n override format(date: Date, displayFormat: object): string {\r\n if ((displayFormat as any) === 'input') {\r\n const day = date.getDate().toString().padStart(2, '0');\r\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const year = date.getFullYear();\r\n return `${day}/${month}/${year}`;\r\n }\r\n return date.toLocaleDateString('it-IT', {\r\n year: 'numeric',\r\n month: 'long',\r\n day: 'numeric',\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Formati data italiani per Angular Material.\r\n * Configura il datepicker per usare DD/MM/YYYY.\r\n */\r\nexport const UI_IT_DATE_FORMATS: MatDateFormats = {\r\n parse: {\r\n dateInput: 'input',\r\n },\r\n display: {\r\n dateInput: 'input',\r\n monthYearLabel: { year: 'numeric', month: 'short' },\r\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\r\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\r\n },\r\n};\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnInit,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n ViewEncapsulation,\r\n inject,\r\n ElementRef,\r\n TemplateRef,\r\n} from '@angular/core';\r\nimport {\r\n FormGroup,\r\n FormControl,\r\n FormArray,\r\n ReactiveFormsModule,\r\n Validators,\r\n AbstractControl,\r\n} from '@angular/forms';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport {\r\n MatNativeDateModule,\r\n DateAdapter,\r\n MAT_DATE_FORMATS,\r\n MAT_DATE_LOCALE,\r\n ErrorStateMatcher,\r\n} from '@angular/material/core';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { UiAccordionComponent, UiAccordionDescriptor } from '../accordion/index';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { Subject, Subscription, Observable } from 'rxjs';\r\nimport { debounceTime, takeUntil, distinctUntilChanged, filter as rxFilter } from 'rxjs/operators';\r\nimport { UiButtonComponent, UiButtonDescriptor } from '../../components/button/index';\r\nimport { UiButtonAreaComponent } from '../../components/button/button-area.component';\r\nimport { UiBlackboxService } from '../blackbox/blackbox.service';\r\nimport { UiLoggerService } from '../../core/logging/logger.service';\r\nimport { Router } from '@angular/router';\r\n\r\nimport { UiFormSchema, UiFormSection, UiFormData, UiFormCustomEvent, UiFormBuilderConfig, UiRepeatableConfig } from './types/schema.types';\r\nimport {\r\n UiFormFieldDescriptor,\r\n UiFieldOption,\r\n UiFieldType,\r\n UiCustomFieldTemplateContext,\r\n} from './types/field.types';\r\nimport {\r\n UiFormValidationState,\r\n UiFormErrorDetail,\r\n UiValidationRule,\r\n UI_FORM_NESTED_FIELD_ERRORS_KEY,\r\n} from './types/validation.types';\r\nimport { UiFieldCondition } from './types/condition.types';\r\nimport { UiFormConditionService } from './services/form-condition.service';\r\nimport { UiFormValidationService } from './services/form-validation.service';\r\nimport { UiFormFieldErrorService } from './services/form-field-error.service';\r\nimport { UiFormErrorSummaryComponent } from './sub-components/error-summary/form-error-summary.component';\r\nimport { UiFileInputComponent } from './sub-components/file-input/file-input.component';\r\nimport { UiSpecificaTerritorialeComponent } from './sub-components/specifica-territoriale/specifica-territoriale.component';\r\nimport { UiTableTerritorialeComponent } from './sub-components/table-territoriale/table-territoriale.component';\r\nimport { UiLocationGeocodedComponent } from './sub-components/location-geocoded/location-geocoded.component';\r\nimport { UiFormTextFieldComponent, UiFormTextareaFieldComponent, UiFormNumberFieldComponent, UiFormSelectFieldComponent, UiFormRadioFieldComponent } from './sub-components/form-fields/index';\r\nimport { UiFormErrorStateMatcher } from './services/form-error-state.matcher';\r\nimport { UiItalianDateAdapter, UI_IT_DATE_FORMATS } from './adapters/it-date-adapter';\r\n\r\n/**\r\n * Form builder data-driven e schema-based.\r\n *\r\n * Genera un form completo a partire da uno schema dichiarativo (`UiFormSchema`).\r\n * Supporta i tipi di campo del form builder, validazione condizionale, cross-field validation,\r\n * date con offset, opzioni dipendenti/dinamiche, sezioni collapsibili,\r\n * error summary con scroll-to-field e button override.\r\n *\r\n * @selector ui-form-builder\r\n *\r\n * @example\r\n * ```html\r\n * <ui-form-builder\r\n * [schema]=\"formSchema\"\r\n * [initialData]=\"userData\"\r\n * (formSubmit)=\"onSubmit($event)\"\r\n * (valueChange)=\"onChange($event)\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-form-builder',\r\n standalone: true,\r\n imports: [\r\n ReactiveFormsModule,\r\n NgTemplateOutlet,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatCheckboxModule,\r\n MatSlideToggleModule,\r\n MatRadioModule,\r\n MatDatepickerModule,\r\n MatNativeDateModule,\r\n MatAutocompleteModule,\r\n MatChipsModule,\r\n UiAccordionComponent,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n UiButtonComponent,\r\n UiButtonAreaComponent,\r\n UiFormErrorSummaryComponent,\r\n UiFileInputComponent,\r\n UiSpecificaTerritorialeComponent,\r\n UiTableTerritorialeComponent,\r\n UiLocationGeocodedComponent,\r\n UiFormTextFieldComponent,\r\n UiFormTextareaFieldComponent,\r\n UiFormNumberFieldComponent,\r\n UiFormSelectFieldComponent,\r\n UiFormRadioFieldComponent,\r\n ],\r\n providers: [\r\n { provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher },\r\n // Locale italiano per il datepicker Material\r\n { provide: MAT_DATE_LOCALE, useValue: 'it-IT' },\r\n // Adapter personalizzato per parsing DD/MM/YYYY\r\n { provide: DateAdapter, useClass: UiItalianDateAdapter },\r\n // Formati data italiani (DD/MM/YYYY)\r\n { provide: MAT_DATE_FORMATS, useValue: UI_IT_DATE_FORMATS },\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n host: { class: 'ui-form-builder-host' },\r\n templateUrl: './form-builder.component.html',\r\n styleUrl: './form-builder.component.scss',\r\n})\r\nexport class UiFormBuilderComponent implements OnInit, OnChanges, OnDestroy, AfterViewInit {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly elRef = inject(ElementRef);\r\n private readonly conditionService = inject(UiFormConditionService);\r\n private readonly validationService = inject(UiFormValidationService);\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\n\r\n /** @internal Optional BlackBox service — auto-tracks form events when available. */\r\n private readonly blackbox = inject(UiBlackboxService, { optional: true });\r\n /** @internal Router inject for BlackBox route context. */\r\n private readonly bbRouter = inject(Router, { optional: true });\r\n /** @internal Optional Logger service — logs form actions when available. */\r\n private readonly logger = inject(UiLoggerService, { optional: true });\r\n\r\n private readonly destroy$ = new Subject<void>();\r\n private valueChangeSub?: Subscription;\r\n /** @internal Listener cleanup for BlackBox focus/blur tracking. */\r\n private bbFocusHandler: ((e: FocusEvent) => void) | null = null;\r\n private bbBlurHandler: ((e: FocusEvent) => void) | null = null;\r\n\r\n /** ID schema corrente -- usato per evitare rebuild superflui. */\r\n private currentSchemaId: string | null = null;\r\n\r\n // ─── Input ──────────────────────────────────────────────────────\r\n\r\n /** Schema del form. */\r\n @Input() schema!: UiFormSchema;\r\n\r\n /** Dati iniziali per la prevalorizzazione. */\r\n @Input() initialData: UiFormData = {};\r\n\r\n /** Modalita sola lettura globale. */\r\n @Input() readonly = false;\r\n\r\n /** Stato disabilitato globale. */\r\n @Input() disabled = false;\r\n\r\n /** Override dei pulsanti di default. */\r\n @Input() buttonsOverride?: UiButtonDescriptor[];\r\n\r\n /** Chiave del pulsante in stato di caricamento. */\r\n @Input() loadingFor: string | null = null;\r\n\r\n /**\r\n * Mappa chiave logica → template per campi `type: 'custom'`.\r\n * La chiave si risolve con `customConfig.templateKey`, poi `customConfig.component`, poi `field.key`.\r\n */\r\n @Input() customFieldTemplates: Record<string, TemplateRef<unknown>> = {};\r\n\r\n /**\r\n * Template usato quando non esiste una voce in `customFieldTemplates` per la chiave risolta\r\n * (es. un unico `ng-template` con `@switch` sul campo).\r\n */\r\n @Input() customFieldTemplateFallback?: TemplateRef<unknown>;\r\n\r\n // ─── Output ─────────────────────────────────────────────────────\r\n\r\n @Output() valueChange = new EventEmitter<UiFormData>();\r\n @Output() validationChange = new EventEmitter<UiFormValidationState>();\r\n @Output() formSubmit = new EventEmitter<UiFormData>();\r\n @Output() formReset = new EventEmitter<void>();\r\n @Output() customEvent = new EventEmitter<UiFormCustomEvent>();\r\n\r\n // ─── Stato interno ──────────────────────────────────────────────\r\n\r\n formGroup!: FormGroup;\r\n\r\n /** Mappa campo -> opzioni filtrate (per autocomplete e dependent). */\r\n filteredOptions: Record<string, UiFieldOption[]> = {};\r\n\r\n /** Campi prevalorizzati (mostrano errori subito). */\r\n prevalorizedFields = new Set<string>();\r\n\r\n /** Mappa campo -> regole di validazione (per lookup rapido). */\r\n private validationRulesMap: Record<string, UiValidationRule[]> = {};\r\n\r\n /** Mappa dipendenze: campoTarget -> campi dipendenti. */\r\n private fieldDependencies = new Map<string, Set<string>>();\r\n\r\n /** @internal Accordion descriptors per le sezioni collapsibili. */\r\n sectionAccordionMap = new Map<string, UiAccordionDescriptor[]>();\r\n\r\n /** @internal Accordion descriptors per le istanze repeatable (sectionId -> descriptors). */\r\n repeatableAccordionMap = new Map<string, UiAccordionDescriptor[]>();\r\n\r\n /** Flag per evitare emissioni durante l'inizializzazione. */\r\n private isInitializing = true;\r\n\r\n // ─── Getter calcolati ───────────────────────────────────────────\r\n\r\n /** Tutti i campi di tutte le sezioni (incluse repeatable). */\r\n get allFields(): UiFormFieldDescriptor[] {\r\n return this.schema?.sections?.flatMap((s) => s.fields) || [];\r\n }\r\n\r\n /** Campi delle sole sezioni non-repeatable (piatti nel root FormGroup). */\r\n get allFlatFields(): UiFormFieldDescriptor[] {\r\n return this.schema?.sections?.filter((s) => !s.repeatable).flatMap((s) => s.fields) || [];\r\n }\r\n\r\n /** Sezioni con configurazione repeatable. */\r\n get repeatableSections(): UiFormSection[] {\r\n return this.schema?.sections?.filter((s) => !!s.repeatable) || [];\r\n }\r\n\r\n get formErrors(): UiFormErrorDetail[] {\r\n return this.getDetailedFormErrors();\r\n }\r\n\r\n get formButtons(): UiButtonDescriptor[] {\r\n if (this.buttonsOverride) return this.buttonsOverride;\r\n if (!this.schema?.config?.showButtons && this.schema?.config?.showButtons !== undefined) return [];\r\n return [\r\n { label: this.schema?.config?.buttonLabels?.reset || 'Reset', variant: 'outline', action: () => this.onReset() },\r\n {\r\n label: this.schema?.config?.buttonLabels?.submit || 'Invia',\r\n variant: 'primary',\r\n action: () => this.onSubmit(),\r\n },\r\n ];\r\n }\r\n\r\n // ─── Lifecycle ──────────────────────────────────────────────────\r\n //\r\n // ORDINE LIFECYCLE ANGULAR:\r\n // 1. constructor\r\n // 2. ngOnChanges (prima chiamata con valori iniziali)\r\n // 3. ngOnInit\r\n // 4. ngAfterViewInit\r\n // 5. ngOnChanges (chiamate successive per cambio input)\r\n //\r\n // PER IL WIZARD:\r\n // Il wizard crea un nuovo schema (con id diverso) ad ogni cambio step.\r\n // Lo schema viene cachato nel wizard per evitare rebuild infiniti.\r\n // ngOnChanges rileva il cambio di schema.id e ricostruisce il form.\r\n\r\n ngOnInit(): void {\r\n this.logger?.logFormAction('init', { schemaId: this.schema?.id ?? 'unknown', hasFormGroup: !!this.formGroup });\r\n if (!this.schema) {\r\n this.logger?.logFormAction('init', { schemaId: 'unknown', error: 'schema non presente' });\r\n return;\r\n }\r\n this.initFormFromSchema();\r\n }\r\n\r\n /**\r\n * Rileva cambiamenti sugli @Input.\r\n * Ricostruisce il form quando cambia lo schema (id diverso).\r\n * Cruciale per il wizard che cambia schema ad ogni step.\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['schema'] && !changes['schema'].firstChange) {\r\n const newSchema = changes['schema'].currentValue as UiFormSchema;\r\n if (newSchema && newSchema.id !== this.currentSchemaId) {\r\n this.logger?.debug('form', 'schemaRebuild', {\r\n schemaId: newSchema?.id,\r\n previousSchemaId: this.currentSchemaId,\r\n });\r\n this.destroyForm();\r\n this.initFormFromSchema();\r\n }\r\n }\r\n\r\n // Aggiorna lo stato disabled/readonly globalmente\r\n if (changes['disabled'] && !changes['disabled'].firstChange && this.formGroup) {\r\n this.allFlatFields.forEach((field) => {\r\n const control = this.formGroup.get(field.key);\r\n if (!control) return;\r\n if (this.disabled && control.enabled) {\r\n control.disable({ emitEvent: false });\r\n } else if (!this.disabled && control.disabled && !field.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n });\r\n\r\n // Aggiorna disabled anche nelle istanze repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n for (const field of section.fields) {\r\n const control = instanceFg.get(field.key);\r\n if (!control) continue;\r\n if (this.disabled && control.enabled) {\r\n control.disable({ emitEvent: false });\r\n } else if (!this.disabled && control.disabled && !field.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.logger?.debug('form', 'afterViewInit', {\r\n schemaId: this.schema?.id,\r\n hasFormGroup: !!this.formGroup,\r\n fieldCount: this.formGroup ? Object.keys(this.formGroup.controls).length : 0,\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.logger?.logFormAction('destroy', { schemaId: this.currentSchemaId ?? 'unknown' });\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n this.valueChangeSub?.unsubscribe();\r\n\r\n // BlackBox: cleanup DOM listeners\r\n if (this.bbFocusHandler) {\r\n this.elRef.nativeElement.removeEventListener('focusin', this.bbFocusHandler, true);\r\n }\r\n if (this.bbBlurHandler) {\r\n this.elRef.nativeElement.removeEventListener('focusout', this.bbBlurHandler, true);\r\n }\r\n }\r\n\r\n /**\r\n * Inizializza il form dallo schema corrente.\r\n * Estratto per poter essere richiamato sia da ngOnInit che da ngOnChanges.\r\n */\r\n private initFormFromSchema(): void {\r\n if (!this.schema) {\r\n this.logger?.logFormAction('init', { schemaId: 'unknown', error: 'schema nullo' });\r\n return;\r\n }\r\n const totalFields = this.schema.sections?.reduce((sum, s) => sum + s.fields.length, 0) ?? 0;\r\n this.logger?.logFormAction('init', {\r\n schemaId: this.schema.id,\r\n sectionCount: this.schema.sections?.length,\r\n fieldCount: totalFields,\r\n });\r\n this.currentSchemaId = this.schema.id;\r\n this.buildSectionAccordionMap();\r\n this.buildForm();\r\n // Dopo il FormArray reale, allinea i descriptor accordion (max tra min e righe initialData).\r\n for (const section of this.repeatableSections) {\r\n this.rebuildRepeatableAccordion(section);\r\n }\r\n this.isInitializing = false;\r\n this.logger?.debug('form', 'formBuilt', {\r\n schemaId: this.schema.id,\r\n controlKeys: Object.keys(this.formGroup.controls),\r\n });\r\n }\r\n\r\n /**\r\n * Pulisce lo stato del form prima di un rebuild.\r\n */\r\n private destroyForm(): void {\r\n this.logger?.debug('form', 'destroyForm', { schemaId: this.currentSchemaId });\r\n this.valueChangeSub?.unsubscribe();\r\n this.valueChangeSub = undefined;\r\n this.filteredOptions = {};\r\n this.prevalorizedFields.clear();\r\n this.validationRulesMap = {};\r\n this.fieldDependencies.clear();\r\n this.sectionAccordionMap.clear();\r\n this.isInitializing = true;\r\n this.currentSchemaId = null;\r\n }\r\n\r\n // ─── Costruzione form ───────────────────────────────────────────\r\n\r\n private buildForm(): void {\r\n const controls: Record<string, AbstractControl> = {};\r\n\r\n // Campi piatti (sezioni non-repeatable)\r\n for (const field of this.allFlatFields) {\r\n const initialValue = this.initialData?.[field.key] ?? field.defaultValue ?? null;\r\n const isDisabled = field.disabled || this.disabled;\r\n\r\n const control = new FormControl({ value: initialValue, disabled: isDisabled });\r\n\r\n if (field.validation?.length) {\r\n this.validationRulesMap[field.key] = field.validation;\r\n }\r\n\r\n if (initialValue != null && initialValue !== '' && initialValue !== false) {\r\n this.prevalorizedFields.add(field.key);\r\n }\r\n\r\n if (field.options && !this.isObservable(field.options)) {\r\n this.filteredOptions[field.key] = [...(field.options as UiFieldOption[])];\r\n }\r\n\r\n controls[field.key] = control;\r\n }\r\n\r\n // FormArray per sezioni repeatable\r\n for (const section of this.repeatableSections) {\r\n const initialArray = this.initialData?.[section.id] as Record<string, any>[] | undefined;\r\n const count = this.getRepeatableInitialInstanceCount(section);\r\n\r\n const groups: FormGroup[] = [];\r\n for (let i = 0; i < count; i++) {\r\n groups.push(this.buildInstanceFormGroup(section, initialArray?.[i]));\r\n }\r\n controls[section.id] = new FormArray(groups);\r\n }\r\n\r\n this.formGroup = new FormGroup(controls);\r\n\r\n // Applica validatori iniziali\r\n this.applyAllValidators();\r\n\r\n // Registra dipendenze\r\n this.buildDependencyMap();\r\n\r\n // Sottoscrivi ai cambiamenti di valore\r\n this.valueChangeSub = this.formGroup.valueChanges.pipe(debounceTime(50), takeUntil(this.destroy$)).subscribe(() => {\r\n this.evaluateAllConditions();\r\n this.updateDependentOptions();\r\n if (!this.isInitializing) {\r\n this.valueChange.emit(this.getFormValue());\r\n this.validationChange.emit(this.getValidationState());\r\n this.cdr.markForCheck();\r\n }\r\n });\r\n\r\n // Valutazione condizioni iniziale\r\n this.evaluateAllConditions();\r\n\r\n // BlackBox: setup form event tracking\r\n this.setupBlackboxTracking();\r\n }\r\n\r\n /** Costruisce un FormGroup per una singola istanza di sezione repeatable. */\r\n private buildInstanceFormGroup(section: UiFormSection, data?: Record<string, any>): FormGroup {\r\n const controls: Record<string, FormControl> = {};\r\n\r\n for (const field of section.fields) {\r\n const initialValue = data?.[field.key] ?? field.defaultValue ?? null;\r\n const isDisabled = field.disabled || this.disabled;\r\n controls[field.key] = new FormControl({ value: initialValue, disabled: isDisabled });\r\n\r\n if (field.options && !this.isObservable(field.options)) {\r\n this.filteredOptions[field.key] = [...(field.options as UiFieldOption[])];\r\n }\r\n }\r\n\r\n const fg = new FormGroup(controls);\r\n\r\n // Applica validatori all'istanza\r\n for (const field of section.fields) {\r\n if (field.validation?.length) {\r\n const formData = fg.getRawValue();\r\n this.validationService.updateFieldValidators(fg.get(field.key)!, field.validation, formData);\r\n }\r\n }\r\n\r\n return fg;\r\n }\r\n\r\n // ─── BlackBox form tracking ──────────────────────────────────────\r\n\r\n /**\r\n * Sets up BlackBox form event tracking.\r\n * - Focus/blur: DOM event delegation on the host element\r\n * - Value changes: per-field subscriptions with debounce\r\n * - Validation errors: per-field statusChanges subscriptions\r\n * @internal\r\n */\r\n private setupBlackboxTracking(): void {\r\n if (!this.blackbox) return;\r\n const config = this.blackbox.getConfig().formTracking;\r\n const currentRoute = this.bbRouter?.url ?? '';\r\n const formId = this.schema?.id ?? 'unknown';\r\n\r\n // Focus tracking via event delegation\r\n if (config.trackFocus) {\r\n this.bbFocusHandler = (e: FocusEvent) => {\r\n const fieldKey = this.resolveFieldKeyFromEvent(e);\r\n if (!fieldKey) return;\r\n this.blackbox!.trackFormEvent({\r\n timestamp: Date.now(),\r\n route: this.bbRouter?.url ?? currentRoute,\r\n formId,\r\n fieldKey,\r\n eventType: 'focus',\r\n });\r\n };\r\n this.elRef.nativeElement.addEventListener('focusin', this.bbFocusHandler, true);\r\n }\r\n\r\n // Blur tracking via event delegation\r\n if (config.trackBlur) {\r\n this.bbBlurHandler = (e: FocusEvent) => {\r\n const fieldKey = this.resolveFieldKeyFromEvent(e);\r\n if (!fieldKey) return;\r\n this.blackbox!.trackFormEvent({\r\n timestamp: Date.now(),\r\n route: this.bbRouter?.url ?? currentRoute,\r\n formId,\r\n fieldKey,\r\n eventType: 'blur',\r\n });\r\n };\r\n this.elRef.nativeElement.addEventListener('focusout', this.bbBlurHandler, true);\r\n }\r\n\r\n // Per-field value change + validation tracking\r\n for (const field of this.allFields) {\r\n const control = this.formGroup.get(field.key);\r\n if (!control) continue;\r\n\r\n // Value changes\r\n if (config.trackValueChanges) {\r\n control.valueChanges\r\n .pipe(\r\n debounceTime(config.debounceMs),\r\n distinctUntilChanged(),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe((value) => {\r\n this.blackbox!.trackFormEvent({\r\n timestamp: Date.now(),\r\n route: this.bbRouter?.url ?? currentRoute,\r\n formId,\r\n fieldKey: field.key,\r\n eventType: 'valueChange',\r\n metadata: {\r\n value: config.trackValues ? value : undefined,\r\n valid: control.valid,\r\n formValues: config.trackValues ? this.formGroup.getRawValue() : undefined,\r\n },\r\n });\r\n });\r\n }\r\n\r\n // Validation errors\r\n if (config.trackValidation) {\r\n control.statusChanges\r\n .pipe(\r\n rxFilter((status) => status === 'INVALID'),\r\n distinctUntilChanged(),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe(() => {\r\n const errors = control.errors\r\n ? Object.keys(control.errors)\r\n : [];\r\n this.blackbox!.trackFormEvent({\r\n timestamp: Date.now(),\r\n route: this.bbRouter?.url ?? currentRoute,\r\n formId,\r\n fieldKey: field.key,\r\n eventType: 'validationError',\r\n metadata: {\r\n valid: false,\r\n errors,\r\n },\r\n });\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resolve the form field key from a focus/blur DOM event.\r\n * Walks up from the event target looking for `formControlName` or `data-field-key`.\r\n * @internal\r\n */\r\n private resolveFieldKeyFromEvent(e: FocusEvent): string | null {\r\n let target = e.target as HTMLElement | null;\r\n const maxDepth = 5;\r\n let depth = 0;\r\n\r\n while (target && depth < maxDepth) {\r\n // formControlName attribute\r\n const fcn = target.getAttribute('formControlName');\r\n if (fcn) return fcn;\r\n\r\n // data-field-key attribute\r\n const dfk = target.getAttribute('data-field-key');\r\n if (dfk) return dfk;\r\n\r\n target = target.parentElement;\r\n depth++;\r\n }\r\n return null;\r\n }\r\n\r\n // ─── Validazione ────────────────────────────────────────────────\r\n\r\n private applyAllValidators(): void {\r\n // Campi piatti\r\n for (const field of this.allFlatFields) {\r\n if (field.validation?.length) {\r\n const formData = this.formGroup.getRawValue();\r\n this.validationService.updateFieldValidators(this.formGroup.get(field.key)!, field.validation, formData);\r\n }\r\n }\r\n\r\n // Campi nelle istanze repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n for (const field of section.fields) {\r\n if (field.validation?.length) {\r\n const formData = instanceFg.getRawValue();\r\n this.validationService.updateFieldValidators(instanceFg.get(field.key)!, field.validation, formData);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ─── Condizioni ─────────────────────────────────────────────────\r\n\r\n private evaluateAllConditions(): void {\r\n const formData = this.formGroup.getRawValue();\r\n\r\n // Campi piatti\r\n for (const field of this.allFlatFields) {\r\n this.evaluateFieldConditions(field, this.formGroup, formData);\r\n }\r\n\r\n // Campi nelle istanze repeatable (scope intra-istanza)\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n const instanceData = instanceFg.getRawValue();\r\n for (const field of section.fields) {\r\n this.evaluateFieldConditions(field, instanceFg, instanceData);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Valuta condizioni di visibilita/disabilitazione per un singolo campo nel contesto del FormGroup dato. */\r\n private evaluateFieldConditions(field: UiFormFieldDescriptor, fg: FormGroup, formData: Record<string, any>): void {\r\n if (field.conditions?.length) {\r\n const visible = this.conditionService.evaluateConditions(field.conditions, formData);\r\n const control = fg.get(field.key);\r\n if (control) {\r\n if (!visible && control.enabled) {\r\n control.disable({ emitEvent: false });\r\n if (!field.freezeValueOnDisable) {\r\n control.setValue(field.defaultValue ?? null, { emitEvent: false });\r\n }\r\n } else if (visible && control.disabled && !field.disabled && !this.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n }\r\n }\r\n\r\n if (field.disableConditions?.length && !field.conditions?.length) {\r\n const shouldDisable = this.conditionService.evaluateConditions(field.disableConditions, formData);\r\n const control = fg.get(field.key);\r\n if (control) {\r\n if (shouldDisable && control.enabled) {\r\n control.disable({ emitEvent: false });\r\n if (!field.freezeValueOnDisable) {\r\n control.setValue(field.defaultValue ?? null, { emitEvent: false });\r\n }\r\n } else if (!shouldDisable && control.disabled && !field.disabled && !this.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n }\r\n }\r\n\r\n if (field.validation?.some((r) => r.conditions?.length)) {\r\n this.validationService.updateFieldValidators(fg.get(field.key)!, field.validation!, formData);\r\n }\r\n }\r\n\r\n // ─── Dipendenze opzioni ─────────────────────────────────────────\r\n\r\n private buildDependencyMap(): void {\r\n for (const field of this.allFields) {\r\n if (field.dependentOptions?.dependsOn) {\r\n const depKey = field.dependentOptions.dependsOn;\r\n if (!this.fieldDependencies.has(depKey)) {\r\n this.fieldDependencies.set(depKey, new Set());\r\n }\r\n this.fieldDependencies.get(depKey)!.add(field.key);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Costruisce la mappa dei descriptors accordion per le sezioni collapsibili.\r\n * Ogni sezione collapsibile viene mappata a un singolo UiAccordionDescriptor.\r\n * @internal\r\n */\r\n private buildSectionAccordionMap(): void {\r\n this.sectionAccordionMap.clear();\r\n this.repeatableAccordionMap.clear();\r\n\r\n for (const section of this.schema.sections) {\r\n if (section.repeatable) {\r\n this.rebuildRepeatableAccordion(section);\r\n } else if (section.collapsible) {\r\n this.sectionAccordionMap.set(section.id, [{\r\n id: section.id,\r\n title: section.title || '',\r\n icon: section.icon,\r\n expanded: !section.collapsed,\r\n subtitle: section.description,\r\n }]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Numero di istanze repeatable da creare al build/reset:\r\n * almeno `repeatable.min` (se `min > 0` o omesso default 1), mai meno delle righe in `initialData[section.id]`.\r\n * Con `min: 0` non si aggiungono righe oltre a quelle già presenti nei dati iniziali.\r\n */\r\n private getRepeatableInitialInstanceCount(section: UiFormSection): number {\r\n const cfg = section.repeatable;\r\n if (!cfg) return 0;\r\n const initialArray = this.initialData?.[section.id] as Record<string, any>[] | undefined;\r\n const initialLen = initialArray?.length ?? 0;\r\n const minReq = cfg.min;\r\n if (minReq === 0) {\r\n return initialLen;\r\n }\r\n const minInstances = minReq ?? 1;\r\n return Math.max(initialLen, minInstances);\r\n }\r\n\r\n /** Ricostruisce i descriptor accordion per le istanze di una sezione repeatable. */\r\n private rebuildRepeatableAccordion(section: UiFormSection): void {\r\n const arr = this.getRepeatableArray(section.id);\r\n const count = arr?.length ?? this.getRepeatableInitialInstanceCount(section);\r\n const titleTemplate = section.repeatable!.instanceTitle || (section.title ? `${section.title} {index}` : 'Elemento {index}');\r\n const items: UiAccordionDescriptor[] = [];\r\n\r\n for (let i = 0; i < count; i++) {\r\n items.push({\r\n id: `${section.id}-${i}`,\r\n title: titleTemplate.replace('{index}', String(i + 1)),\r\n icon: section.icon,\r\n expanded: true,\r\n index: i,\r\n });\r\n }\r\n\r\n this.repeatableAccordionMap.set(section.id, items);\r\n }\r\n\r\n private updateDependentOptions(): void {\r\n const formData = this.formGroup.getRawValue();\r\n\r\n for (const field of this.allFields) {\r\n // Dynamic options\r\n if (field.dynamicOptions) {\r\n if (field.dynamicOptions.type === 'year-range') {\r\n const min = field.dynamicOptions.minYear || new Date().getFullYear() - 10;\r\n const max = field.dynamicOptions.maxYear || new Date().getFullYear();\r\n const opts: UiFieldOption[] = [];\r\n for (let y = max; y >= min; y--) {\r\n opts.push({ value: y, label: String(y) });\r\n }\r\n this.filteredOptions[field.key] = opts;\r\n } else if (field.dynamicOptions.generator) {\r\n this.filteredOptions[field.key] = field.dynamicOptions.generator(formData);\r\n }\r\n }\r\n\r\n // Dependent options\r\n if (field.dependentOptions && field.options && !this.isObservable(field.options)) {\r\n const dep = field.dependentOptions;\r\n const depValue = formData[dep.dependsOn];\r\n const allOptions = field.options as UiFieldOption[];\r\n\r\n if (depValue == null || depValue === '') {\r\n this.filteredOptions[field.key] = [...allOptions];\r\n continue;\r\n }\r\n\r\n this.filteredOptions[field.key] = allOptions.filter((opt) => {\r\n if (dep.filterType === 'custom' && dep.filterFn) {\r\n return dep.filterFn(opt, depValue, formData);\r\n }\r\n const optVal = Number(opt.value);\r\n const depVal = Number(depValue);\r\n if (isNaN(optVal) || isNaN(depVal)) return true;\r\n\r\n switch (dep.filterType) {\r\n case 'greater_than':\r\n return optVal > depVal;\r\n case 'greater_equal':\r\n return optVal >= depVal;\r\n case 'less_than':\r\n return optVal < depVal;\r\n case 'less_equal':\r\n return optVal <= depVal;\r\n case 'equals':\r\n return optVal === depVal;\r\n case 'not_equals':\r\n return optVal !== depVal;\r\n default:\r\n return true;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // ─── API pubblica ───────────────────────────────────────────────\r\n\r\n /** Verifica se un campo e visibile (opzionalmente nel contesto di un FormGroup specifico). */\r\n isFieldVisible(fieldKey: string, fg?: FormGroup): boolean {\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n if (!field?.conditions?.length) return true;\r\n const target = fg || this.formGroup;\r\n return this.conditionService.evaluateConditions(field.conditions, target.getRawValue());\r\n }\r\n\r\n /** Verifica se un campo e obbligatorio (include validazione condizionale). */\r\n isFieldRequired(fieldKey: string, fg?: FormGroup): boolean {\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n if (field?.required) return true;\r\n\r\n const rules = field?.validation || [];\r\n const target = fg || this.formGroup;\r\n const formData = target.getRawValue();\r\n return rules.some((r) => {\r\n if (r.type !== 'required') return false;\r\n if (!r.conditions?.length) return true;\r\n return this.conditionService.evaluateConditions(r.conditions, formData);\r\n });\r\n }\r\n\r\n /** Verifica se una sezione e visibile. */\r\n isSectionVisible(sectionId: string): boolean {\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section?.conditions?.length) return true;\r\n return this.conditionService.evaluateConditions(section.conditions, this.formGroup.getRawValue());\r\n }\r\n\r\n /** Descriptors accordion per una sezione collapsibile. */\r\n getSectionAccordionItems(sectionId: string): UiAccordionDescriptor[] {\r\n return this.sectionAccordionMap.get(sectionId) || [];\r\n }\r\n\r\n /** Descriptors accordion per le istanze di una sezione repeatable. */\r\n getRepeatableAccordionItems(sectionId: string): UiAccordionDescriptor[] {\r\n return this.repeatableAccordionMap.get(sectionId) || [];\r\n }\r\n\r\n /** Verifica se mostrare errori per un campo. */\r\n shouldShowFieldErrors(fieldKey: string, fg?: FormGroup): boolean {\r\n const target = fg || this.formGroup;\r\n const control = target.get(fieldKey);\r\n return this.fieldErrorService.shouldShowFieldErrors(control, {\r\n treatAsPrevalorized: this.prevalorizedFields.has(fieldKey),\r\n });\r\n }\r\n\r\n /** Errori di un campo come array di messaggi. */\r\n getFieldErrors(fieldKey: string, fg?: FormGroup): string[] {\r\n const target = fg || this.formGroup;\r\n const control = target.get(fieldKey);\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n return this.fieldErrorService.getFieldErrors(control, field?.validation);\r\n }\r\n\r\n /** Valore completo del form (include campi disabilitati). */\r\n getFormValue(): UiFormData {\r\n return this.formGroup.getRawValue();\r\n }\r\n\r\n /** Il form e valido. */\r\n isFormValid(): boolean {\r\n return this.formGroup.valid;\r\n }\r\n\r\n /**\r\n * True se tutti i controlli sono validi, ignorando le chiavi indicate\r\n * (flat e dentro ogni istanza repeatable).\r\n */\r\n isFormValidExcludingFieldKeys(excludedKeys: ReadonlySet<string>): boolean {\r\n return this.isFormGroupValidExcluding(this.formGroup, excludedKeys);\r\n }\r\n\r\n /**\r\n * Risolve la chiave per `customFieldTemplates` (`templateKey` → `component` → `field.key`).\r\n */\r\n resolveCustomTemplateKey(field: UiFormFieldDescriptor): string {\r\n const cc = field.customConfig;\r\n return cc?.templateKey ?? cc?.component ?? field.key;\r\n }\r\n\r\n /**\r\n * Template Angular registrato per il campo custom, o fallback globale.\r\n */\r\n getCustomTemplateRef(field: UiFormFieldDescriptor): TemplateRef<unknown> | null {\r\n const key = this.resolveCustomTemplateKey(field);\r\n return this.customFieldTemplates[key] ?? this.customFieldTemplateFallback ?? null;\r\n }\r\n\r\n /**\r\n * Contesto passato a `ngTemplateOutlet` per il campo custom (CVA sul `control`).\r\n */\r\n getCustomFieldOutletContext(\r\n field: UiFormFieldDescriptor,\r\n fg: FormGroup,\r\n nestedErrorKeyPrefix?: string,\r\n ): UiCustomFieldTemplateContext {\r\n const control = fg.get(field.key) as FormControl;\r\n return {\r\n $implicit: field,\r\n field,\r\n formGroup: fg,\r\n control,\r\n config: field.customConfig?.config ?? {},\r\n nestedErrorKeyPrefix,\r\n emitCustomEvent: (event: string, data?: unknown) => {\r\n this.customEvent.emit({ field: field.key, event, data });\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Template e contesto in un solo oggetto (evita doppie valutazioni nel template).\r\n */\r\n getCustomFieldOutlet(\r\n field: UiFormFieldDescriptor,\r\n fg: FormGroup,\r\n nestedErrorKeyPrefix?: string,\r\n ): { template: TemplateRef<unknown>; context: UiCustomFieldTemplateContext } | null {\r\n const template = this.getCustomTemplateRef(field);\r\n if (!template) return null;\r\n return { template, context: this.getCustomFieldOutletContext(field, fg, nestedErrorKeyPrefix) };\r\n }\r\n\r\n /** Prefisso chiavi errore per campi custom annidati (flat o repeatable). */\r\n buildNestedErrorKeyPrefix(fieldKey: string, instanceKeyPrefix?: string): string {\r\n const base = instanceKeyPrefix ? `${instanceKeyPrefix}${fieldKey}` : fieldKey;\r\n return `${base}__`;\r\n }\r\n\r\n /** Merge errori nested da CVA custom nel dettaglio error-summary. */\r\n private appendCustomNestedFieldErrors(\r\n details: UiFormErrorDetail[],\r\n field: UiFormFieldDescriptor,\r\n control: AbstractControl,\r\n labelPrefix: string,\r\n nestedErrorKeyPrefix: string,\r\n ): void {\r\n if (field.type !== 'custom') return;\r\n const nested = control.errors?.[UI_FORM_NESTED_FIELD_ERRORS_KEY];\r\n if (!Array.isArray(nested) || nested.length === 0) return;\r\n\r\n for (const item of nested as UiFormErrorDetail[]) {\r\n if (!item?.errors?.length) continue;\r\n const relativeKey = item.fieldKey ?? '';\r\n details.push({\r\n fieldKey: relativeKey ? `${nestedErrorKeyPrefix}${relativeKey}` : nestedErrorKeyPrefix.slice(0, -2),\r\n fieldLabel: `${labelPrefix} > ${item.fieldLabel}`,\r\n errors: item.errors,\r\n });\r\n }\r\n }\r\n\r\n private isFormGroupValidExcluding(group: FormGroup, excludedKeys: ReadonlySet<string>): boolean {\r\n for (const key of Object.keys(group.controls)) {\r\n const c = group.get(key);\r\n if (!c) continue;\r\n if (c instanceof FormArray) {\r\n for (let i = 0; i < c.length; i++) {\r\n const row = c.at(i);\r\n if (row instanceof FormGroup && !this.isFormGroupValidExcluding(row, excludedKeys)) {\r\n return false;\r\n }\r\n }\r\n } else if (c instanceof FormGroup) {\r\n if (!this.isFormGroupValidExcluding(c, excludedKeys)) return false;\r\n } else if (c instanceof FormControl) {\r\n if (excludedKeys.has(key)) continue;\r\n if (c.invalid) return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Stato di validazione completo. */\r\n getValidationState(): UiFormValidationState {\r\n const errors: Record<string, string[]> = {};\r\n const dirty: string[] = [];\r\n const touched: string[] = [];\r\n\r\n for (const field of this.allFlatFields) {\r\n const control = this.formGroup.get(field.key);\r\n if (!control) continue;\r\n if (control.dirty) dirty.push(field.key);\r\n if (control.touched) touched.push(field.key);\r\n const fieldErrors = this.getFieldErrors(field.key);\r\n if (fieldErrors.length) errors[field.key] = fieldErrors;\r\n }\r\n\r\n // Includi errori delle istanze repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n for (const field of section.fields) {\r\n const control = instanceFg.get(field.key);\r\n if (!control) continue;\r\n const prefixedKey = `${section.id}[${i}].${field.key}`;\r\n if (control.dirty) dirty.push(prefixedKey);\r\n if (control.touched) touched.push(prefixedKey);\r\n const fieldErrors = this.getFieldErrors(field.key, instanceFg);\r\n if (fieldErrors.length) errors[prefixedKey] = fieldErrors;\r\n }\r\n }\r\n }\r\n\r\n return { valid: this.formGroup.valid, errors, dirty, touched };\r\n }\r\n\r\n /** Errori dettagliati per l'error summary. */\r\n getDetailedFormErrors(): UiFormErrorDetail[] {\r\n const details: UiFormErrorDetail[] = [];\r\n\r\n // Campi piatti\r\n for (const field of this.allFlatFields) {\r\n if (field.type === 'flag' || field.type === 'divider') continue;\r\n if (!this.isFieldVisible(field.key)) continue;\r\n const control = this.formGroup.get(field.key);\r\n if (!control?.errors) continue;\r\n\r\n const nestedPrefix = this.buildNestedErrorKeyPrefix(field.key);\r\n this.appendCustomNestedFieldErrors(details, field, control, field.label, nestedPrefix);\r\n\r\n if (field.type === 'custom' && control.errors[UI_FORM_NESTED_FIELD_ERRORS_KEY]) {\r\n continue;\r\n }\r\n\r\n const errors = this.getFieldErrors(field.key);\r\n if (errors.length) {\r\n details.push({ fieldKey: field.key, fieldLabel: field.label, errors });\r\n }\r\n }\r\n\r\n // Campi nelle istanze repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n const titleTemplate = section.repeatable!.instanceTitle || (section.title ? `${section.title} {index}` : 'Elemento {index}');\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n const instanceLabel = titleTemplate.replace('{index}', String(i + 1));\r\n const instanceKeyPrefix = `${section.id}[${i}].`;\r\n for (const field of section.fields) {\r\n if (field.type === 'flag' || field.type === 'divider') continue;\r\n if (!this.isFieldVisible(field.key, instanceFg)) continue;\r\n const control = instanceFg.get(field.key);\r\n if (!control?.errors) continue;\r\n\r\n const nestedPrefix = this.buildNestedErrorKeyPrefix(field.key, instanceKeyPrefix);\r\n this.appendCustomNestedFieldErrors(\r\n details,\r\n field,\r\n control,\r\n `${instanceLabel} > ${field.label}`,\r\n nestedPrefix,\r\n );\r\n\r\n if (field.type === 'custom' && control.errors[UI_FORM_NESTED_FIELD_ERRORS_KEY]) {\r\n continue;\r\n }\r\n\r\n const errors = this.getFieldErrors(field.key, instanceFg);\r\n if (errors.length) {\r\n details.push({\r\n fieldKey: `${section.id}[${i}].${field.key}`,\r\n fieldLabel: `${instanceLabel} > ${field.label}`,\r\n errors,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return details;\r\n }\r\n\r\n /** Conta errori totali. */\r\n getFormErrorsCount(): number {\r\n return this.getDetailedFormErrors().reduce((sum, d) => sum + d.errors.length, 0);\r\n }\r\n\r\n /** Controlla se ci sono errori. */\r\n hasFormErrors(): boolean {\r\n return this.getFormErrorsCount() > 0;\r\n }\r\n\r\n /** Controllo per un campo. */\r\n getFieldControl(key: string): FormControl | null {\r\n return (this.formGroup.get(key) as FormControl) ?? null;\r\n }\r\n\r\n /** Aggiorna il valore di un campo programmaticamente. */\r\n updateFieldValue(key: string, value: any): void {\r\n const control = this.formGroup.get(key);\r\n if (control) {\r\n control.setValue(value);\r\n control.markAsDirty();\r\n }\r\n }\r\n\r\n /** Forza la validazione di tutti i campi (incluse istanze repeatable). */\r\n validateAllFields(): void {\r\n // Campi piatti\r\n Object.keys(this.formGroup.controls).forEach((key) => {\r\n const control = this.formGroup.get(key);\r\n if (control instanceof FormArray) {\r\n for (let i = 0; i < control.length; i++) {\r\n const fg = control.at(i) as FormGroup;\r\n Object.keys(fg.controls).forEach((fk) => {\r\n const c = fg.get(fk);\r\n c?.markAsTouched();\r\n c?.markAsDirty();\r\n c?.updateValueAndValidity();\r\n });\r\n }\r\n } else {\r\n control?.markAsTouched();\r\n control?.markAsDirty();\r\n control?.updateValueAndValidity();\r\n }\r\n });\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ─── API Repeatable ────────────────────────────────────────────\r\n\r\n /** Restituisce il FormArray di una sezione repeatable. */\r\n getRepeatableArray(sectionId: string): FormArray | null {\r\n const control = this.formGroup?.get(sectionId);\r\n return control instanceof FormArray ? control : null;\r\n }\r\n\r\n /** Restituisce il FormGroup di una specifica istanza repeatable. */\r\n getInstanceFormGroup(sectionId: string, index: number): FormGroup | null {\r\n const arr = this.getRepeatableArray(sectionId);\r\n return arr?.at(index) as FormGroup ?? null;\r\n }\r\n\r\n /** Verifica se e possibile aggiungere nuove istanze. */\r\n canAddInstance(sectionId: string): boolean {\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section?.repeatable) return false;\r\n const arr = this.getRepeatableArray(sectionId);\r\n if (!arr) return false;\r\n return section.repeatable.max == null || arr.length < section.repeatable.max;\r\n }\r\n\r\n /** Verifica se e possibile rimuovere istanze. */\r\n canRemoveInstance(sectionId: string): boolean {\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section?.repeatable) return false;\r\n const arr = this.getRepeatableArray(sectionId);\r\n if (!arr) return false;\r\n return arr.length > (section.repeatable.min ?? 1);\r\n }\r\n\r\n /** Aggiunge una nuova istanza vuota a una sezione repeatable. */\r\n addRepeatableInstance(sectionId: string): void {\r\n if (!this.canAddInstance(sectionId)) return;\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section) return;\r\n\r\n const arr = this.getRepeatableArray(sectionId)!;\r\n arr.push(this.buildInstanceFormGroup(section));\r\n this.rebuildRepeatableAccordion(section);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Rimuove un'istanza da una sezione repeatable. */\r\n removeRepeatableInstance(sectionId: string, index: number): void {\r\n if (!this.canRemoveInstance(sectionId)) return;\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section?.repeatable) return;\r\n\r\n if (section.repeatable.confirmRemove) {\r\n const msg = section.repeatable.confirmMessage ?? 'Sei sicuro di voler rimuovere questa sezione?';\r\n if (!confirm(msg)) return;\r\n }\r\n\r\n const arr = this.getRepeatableArray(sectionId)!;\r\n arr.removeAt(index);\r\n this.rebuildRepeatableAccordion(section);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Duplica un'istanza esistente con i suoi valori. */\r\n duplicateRepeatableInstance(sectionId: string, index: number): void {\r\n if (!this.canAddInstance(sectionId)) return;\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section) return;\r\n\r\n const arr = this.getRepeatableArray(sectionId)!;\r\n const sourceData = (arr.at(index) as FormGroup).getRawValue();\r\n const newGroup = this.buildInstanceFormGroup(section, sourceData);\r\n arr.insert(index + 1, newGroup);\r\n this.rebuildRepeatableAccordion(section);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Titolo di un'istanza repeatable. */\r\n getInstanceTitle(section: UiFormSection, index: number): string {\r\n const template = section.repeatable?.instanceTitle || (section.title ? `${section.title} {index}` : 'Elemento {index}');\r\n return template.replace('{index}', String(index + 1));\r\n }\r\n\r\n /** Scrolla al campo e lo evidenzia. */\r\n scrollToField(fieldKey: string): void {\r\n const control = this.formGroup.get(fieldKey);\r\n if (control) {\r\n control.markAsTouched();\r\n control.markAsDirty();\r\n control.updateValueAndValidity();\r\n }\r\n\r\n setTimeout(() => {\r\n const selectors = [`[data-field-key=\"${fieldKey}\"]`, `[formControlName=\"${fieldKey}\"]`];\r\n let targetElement: HTMLElement | null = null;\r\n for (const sel of selectors) {\r\n targetElement = this.elRef.nativeElement.querySelector(sel);\r\n if (targetElement) break;\r\n }\r\n if (!targetElement) return;\r\n\r\n // Se trovato il formControlName, risali al wrapper\r\n if (targetElement.hasAttribute('formControlName')) {\r\n const wrapper = targetElement.closest('.ui-form-builder__field-wrapper, mat-form-field');\r\n if (wrapper) targetElement = wrapper as HTMLElement;\r\n }\r\n\r\n targetElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n\r\n // Aggiungi classe highlight e rimuovila dopo l'animazione\r\n targetElement.classList.add('ui-form-field--highlight');\r\n setTimeout(() => targetElement!.classList.remove('ui-form-field--highlight'), 2000);\r\n }, 100);\r\n }\r\n\r\n /** Submit del form. */\r\n onSubmit(): void {\r\n this.validateAllFields();\r\n const formValue = this.getFormValue();\r\n const isValid = this.formGroup.valid;\r\n this.logger?.logFormAction('submit', {\r\n schemaId: this.schema?.id ?? 'unknown',\r\n valid: isValid,\r\n fieldCount: Object.keys(formValue).length,\r\n });\r\n if (isValid) {\r\n this.formSubmit.emit(formValue);\r\n }\r\n }\r\n\r\n /** Reset del form. */\r\n onReset(): void {\r\n // Resetta campi piatti\r\n for (const field of this.allFlatFields) {\r\n const value = this.initialData?.[field.key] ?? field.defaultValue ?? null;\r\n const control = this.formGroup.get(field.key);\r\n control?.setValue(value, { emitEvent: false });\r\n control?.markAsPristine();\r\n control?.markAsUntouched();\r\n }\r\n\r\n // Resetta sezioni repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n const initialArray = this.initialData?.[section.id] as Record<string, any>[] | undefined;\r\n const count = this.getRepeatableInitialInstanceCount(section);\r\n\r\n arr.clear();\r\n for (let i = 0; i < count; i++) {\r\n arr.push(this.buildInstanceFormGroup(section, initialArray?.[i]));\r\n }\r\n this.rebuildRepeatableAccordion(section);\r\n }\r\n\r\n this.formGroup.updateValueAndValidity();\r\n this.formReset.emit();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ─── Template helpers ───────────────────────────────────────────\r\n\r\n /** Opzioni per un campo (filtrando per autocomplete query). */\r\n getFieldOptions(field: UiFormFieldDescriptor): UiFieldOption[] {\r\n return this.filteredOptions[field.key] || [];\r\n }\r\n\r\n /** Filtra opzioni per autocomplete. */\r\n filterOptions(field: UiFormFieldDescriptor, query: string): void {\r\n if (!query) {\r\n if (field.options && !this.isObservable(field.options)) {\r\n this.filteredOptions[field.key] = [...(field.options as UiFieldOption[])];\r\n }\r\n return;\r\n }\r\n\r\n const lowerQuery = query.toLowerCase();\r\n\r\n if (field.asyncOptions) {\r\n field.asyncOptions(query).then((opts) => {\r\n this.filteredOptions[field.key] = opts;\r\n this.cdr.markForCheck();\r\n });\r\n } else if (field.options && !this.isObservable(field.options)) {\r\n this.filteredOptions[field.key] = (field.options as UiFieldOption[]).filter((o) =>\r\n o.label.toLowerCase().includes(lowerQuery),\r\n );\r\n }\r\n }\r\n\r\n /** Display fn per autocomplete. */\r\n displayFn(options: UiFieldOption[]): (value: any) => string {\r\n return (value: any) => {\r\n const opt = options.find((o) => o.value === value);\r\n return opt?.label || '';\r\n };\r\n }\r\n\r\n /** Seleziona tutte le opzioni per multiselect. */\r\n selectAll(field: UiFormFieldDescriptor): void {\r\n const options = this.getFieldOptions(field);\r\n const allValues = options.filter((o) => !o.disabled).map((o) => o.value);\r\n this.formGroup.get(field.key)?.setValue(allValues);\r\n }\r\n\r\n /** Aggiunge un chip al freemultiselect (da token: Enter o virgola). */\r\n addFreeChip(field: UiFormFieldDescriptor, event: any): void {\r\n const value = (event.value || '').trim();\r\n if (!value) return;\r\n\r\n const current = this.formGroup.get(field.key)?.value || [];\r\n if (!current.includes(value)) {\r\n this.formGroup.get(field.key)?.setValue([...current, value]);\r\n }\r\n event.chipInput?.clear();\r\n }\r\n\r\n /** Aggiunge un chip al freemultiselect sull'evento blur dell'input. */\r\n addFreeChipOnBlur(field: UiFormFieldDescriptor, event: FocusEvent): void {\r\n const input = event.target as HTMLInputElement;\r\n const value = (input.value || '').trim();\r\n if (!value) return;\r\n\r\n const current = this.formGroup.get(field.key)?.value || [];\r\n if (!current.includes(value)) {\r\n this.formGroup.get(field.key)?.setValue([...current, value]);\r\n }\r\n input.value = '';\r\n }\r\n\r\n /** Rimuove un chip dal freemultiselect. */\r\n removeFreeChip(field: UiFormFieldDescriptor, chipValue: string): void {\r\n const current = this.formGroup.get(field.key)?.value || [];\r\n const protected_ = field.metadata?.['cantDeleteList'] || [];\r\n if (protected_.includes(chipValue)) return;\r\n this.formGroup.get(field.key)?.setValue(current.filter((v: string) => v !== chipValue));\r\n }\r\n\r\n /** Verifica se un chip e protetto dalla cancellazione. */\r\n isChipProtected(field: UiFormFieldDescriptor, chipValue: string): boolean {\r\n return (field.metadata?.['cantDeleteList'] || []).includes(chipValue);\r\n }\r\n\r\n /** Rimuove chip da multiselect. */\r\n removeMultiselectChip(field: UiFormFieldDescriptor, chipValue: any): void {\r\n const current = this.formGroup.get(field.key)?.value || [];\r\n this.formGroup.get(field.key)?.setValue(current.filter((v: any) => v !== chipValue));\r\n }\r\n\r\n /** Trova label di un'opzione dal valore. */\r\n getOptionLabel(field: UiFormFieldDescriptor, value: any): string {\r\n const options = this.getFieldOptions(field);\r\n return options.find((o) => o.value === value)?.label || String(value);\r\n }\r\n\r\n /** Tipo di input nativo per il campo. */\r\n getNativeInputType(field: UiFormFieldDescriptor): string {\r\n switch (field.type) {\r\n case 'password':\r\n return 'password';\r\n case 'email':\r\n return 'email';\r\n default:\r\n return 'text';\r\n }\r\n }\r\n\r\n /**\r\n * Genera le classi CSS per il wrapper di un campo,\r\n * combinando eventuali cssClasses dallo schema con le classi\r\n * responsive per il sistema a griglia base-12.\r\n *\r\n * Mobile-first: tutti i campi sono span-12 di default (100%).\r\n * Le classi `ui-col-{breakpoint}-{n}` attivano la larghezza\r\n * configurata solo dal breakpoint indicato in su.\r\n *\r\n * Breakpoint supportati: sm (≥576px), md (≥768px), lg (≥1024px), xl (≥1280px).\r\n */\r\n getFieldWrapperClasses(field: UiFormFieldDescriptor): string {\r\n const classes: string[] = [];\r\n\r\n if (field.cssClasses?.length) {\r\n classes.push(...field.cssClasses);\r\n }\r\n\r\n // layout.columns → classe per il breakpoint md (default desktop)\r\n if (field.layout?.columns) {\r\n classes.push(`ui-col-md-${field.layout.columns}`);\r\n }\r\n\r\n // layout.breakpoints → classi per breakpoint specifici\r\n if (field.layout?.breakpoints) {\r\n for (const [bp, cols] of Object.entries(field.layout.breakpoints)) {\r\n classes.push(`ui-col-${bp}-${cols}`);\r\n }\r\n }\r\n\r\n return classes.join(' ');\r\n }\r\n\r\n /** Character count per textarea/text con maxLength. */\r\n getCharCount(fieldKey: string, fg?: FormGroup): { current: number; max: number } | null {\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n const maxLength = this.fieldErrorService.resolveMaxLength(field?.validation);\r\n if (maxLength == null) return null;\r\n\r\n const target = fg || this.formGroup;\r\n return this.fieldErrorService.getCharCount(target.get(fieldKey), maxLength);\r\n }\r\n\r\n // ─── Utilita private ────────────────────────────────────────────\r\n\r\n private isObservable(value: any): value is Observable<any> {\r\n return value && typeof value.subscribe === 'function';\r\n }\r\n\r\n getRepeatableAddButtons(section: UiFormSection): UiButtonDescriptor[] {\r\n return [{\r\n label: section.repeatable?.addLabel || '+ Aggiungi',\r\n icon: section.repeatable?.addIcon || 'plus',\r\n variant: 'outline',\r\n action: () => this.addRepeatableInstance(section.id)\r\n }];\r\n }\r\n}\r\n","<!--\r\n ============================================================\r\n UI FORM BUILDER - TEMPLATE PRINCIPALE\r\n ============================================================\r\n ARCHITETTURA:\r\n Ogni <ng-template> che contiene direttive [formControlName]\r\n DEVE wrappare il proprio contenuto in un <div [formGroup]>.\r\n Questo perche Angular risolve l'injector di formControlName\r\n dal CONTESTO DI DICHIARAZIONE del template, non dal punto\r\n di inserimento (ngTemplateOutlet).\r\n\r\n Il FormGroup viene passato tramite context per supportare\r\n sia campi piatti (root FormGroup) che campi in istanze\r\n repeatable (instance FormGroup).\r\n\r\n Senza questo wrapper, formControlName non trova il\r\n FormGroupDirective e lancia NG01050.\r\n ============================================================\r\n-->\r\n\r\n@if (schema && formGroup) {\r\n<div class=\"ui-form-builder\" [formGroup]=\"formGroup\" [class]=\"schema.config?.cssClasses?.join(' ')\">\r\n\r\n <!-- ==================== HEADER ==================== -->\r\n @if (schema.title || schema.description) {\r\n <div class=\"ui-form-builder__header\">\r\n @if (schema.title) {\r\n <h2 class=\"ui-form-builder__title\">{{ schema.title }}</h2>\r\n }\r\n @if (schema.description) {\r\n <p class=\"ui-form-builder__description\">{{ schema.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- ==================== SEZIONI ==================== -->\r\n <div class=\"ui-form-builder__sections\">\r\n @for (section of schema.sections; track section.id) {\r\n @if (isSectionVisible(section.id)) {\r\n\r\n <!-- ─── Sezione REPEATABLE ─── -->\r\n @if (section.repeatable) {\r\n <div class=\"ui-form-builder__section ui-form-builder__section--repeatable\" [class]=\"section.cssClasses?.join(' ')\">\r\n @if (section.title || section.description) {\r\n <div class=\"ui-form-builder__section-header\">\r\n @if (section.title) {\r\n <h3 class=\"ui-form-builder__section-title\">{{ section.title }}</h3>\r\n }\r\n @if (section.description) {\r\n <p class=\"ui-form-builder__section-description\">{{ section.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <ui-accordion [items]=\"getRepeatableAccordionItems(section.id)\" [itemTemplate]=\"repeatableBodyTpl\"\r\n [actionsTemplate]=\"repeatableActionsTpl\" mode=\"multi\" class=\"ui-form-builder__repeatable-accordion\">\r\n <!-- Contenuto di ogni istanza -->\r\n <ng-template #repeatableBodyTpl let-item>\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key, getInstanceFormGroup(section.id, item.index)!) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: getInstanceFormGroup(section.id, item.index), nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key, section.id + '[' + item.index + '].') }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Azioni per ogni istanza (duplica / elimina) -->\r\n <ng-template #repeatableActionsTpl let-item>\r\n @if (canAddInstance(section.id)) {\r\n <button type=\"button\" class=\"ui-form-builder__repeatable-action\"\r\n (click)=\"duplicateRepeatableInstance(section.id, item.index)\" aria-label=\"Duplica\">\r\n <lucide-icon name=\"copy\" [size]=\"15\" />\r\n </button>\r\n }\r\n @if (canRemoveInstance(section.id)) {\r\n <button type=\"button\" class=\"ui-form-builder__repeatable-action ui-form-builder__repeatable-action--danger\"\r\n (click)=\"removeRepeatableInstance(section.id, item.index)\" aria-label=\"Elimina\">\r\n <lucide-icon name=\"trash-2\" [size]=\"15\" />\r\n </button>\r\n }\r\n </ng-template>\r\n </ui-accordion>\r\n\r\n @if (canAddInstance(section.id)) {\r\n <div class=\"ui-form-builder__repeatable-add\">\r\n <ui-button-area [buttons]=\"getRepeatableAddButtons(section)\" align=\"end\" />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- ─── Sezione COLLASSABILE ─── -->\r\n } @else if (section.collapsible) {\r\n <ui-accordion [items]=\"getSectionAccordionItems(section.id)\" [itemTemplate]=\"collapsibleTpl\" mode=\"multi\"\r\n class=\"ui-form-builder__section ui-form-builder__section--collapsible\" [class]=\"section.cssClasses?.join(' ')\">\r\n <ng-template #collapsibleTpl let-item>\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: formGroup, nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key) }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </ui-accordion>\r\n\r\n <!-- ─── Sezione STANDARD ─── -->\r\n } @else {\r\n <div class=\"ui-form-builder__section\" [class]=\"section.cssClasses?.join(' ')\">\r\n @if (section.title || section.description) {\r\n <div class=\"ui-form-builder__section-header\">\r\n @if (section.title) {\r\n <h3 class=\"ui-form-builder__section-title\">{{ section.title }}</h3>\r\n }\r\n @if (section.description) {\r\n <p class=\"ui-form-builder__section-description\">{{ section.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: formGroup, nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key) }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n\r\n <!-- ==================== FOOTER ==================== -->\r\n <div class=\"ui-form-builder__footer\">\r\n @if (!schema.config?.hideErrorSummary) {\r\n <ui-form-error-summary [errors]=\"formErrors\" [totalErrorCount]=\"getFormErrorsCount()\"\r\n [validMessage]=\"schema.config?.errorSummaryValidMessage ?? 'Il form è compilato correttamente'\"\r\n (fieldClick)=\"scrollToField($event)\" />\r\n }\r\n @if (!schema.config?.hideFooter) {\r\n <ui-button-area [buttons]=\"formButtons\" align=\"end\" [loadingIds]=\"loadingFor\" />\r\n }\r\n </div>\r\n</div>\r\n}\r\n\r\n<!-- ============================================================ -->\r\n<!-- FIELD TEMPLATE -->\r\n<!-- ============================================================ -->\r\n<!--\r\n CRITICO: Questo template e dichiarato FUORI dal <div [formGroup]>.\r\n Angular risolve l'injector dal contesto di DICHIARAZIONE.\r\n Il FormGroup viene passato via context (fg) per supportare\r\n sia il root FormGroup che i FormGroup delle istanze repeatable.\r\n-->\r\n<ng-template #fieldTpl let-field let-fg=\"formGroup\" let-nestedErrorKeyPrefix=\"nestedErrorKeyPrefix\">\r\n @if (fg) {\r\n <div [formGroup]=\"fg\" class=\"ui-fb-field-ctx\">\r\n @switch (field.type) {\r\n\r\n <!-- TEXT / EMAIL / PASSWORD -->\r\n @case ('text') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n (optionsFilter)=\"filterOptions(field, $event)\"\r\n />\r\n }\r\n @case ('email') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n @case ('password') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- NUMBER -->\r\n @case ('number') {\r\n <ui-form-number-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- TEXTAREA -->\r\n @case ('textarea') {\r\n <ui-form-textarea-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- SELECT -->\r\n @case ('select') {\r\n <ui-form-select-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n (optionsFilter)=\"filterOptions(field, $event)\"\r\n />\r\n }\r\n\r\n <!-- MULTISELECT -->\r\n @case ('multiselect') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <mat-select [formControlName]=\"field.key\" multiple [placeholder]=\"field.placeholder || ''\">\r\n @if (field.allowSelectAll) {\r\n <mat-option (click)=\"selectAll(field)\" (keydown.enter)=\"selectAll(field)\" (keydown.space)=\"selectAll(field)\">\r\n <em>Seleziona tutto</em>\r\n </mat-option>\r\n }\r\n @for (opt of getFieldOptions(field); track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n @if (fg.get(field.key)?.value?.length) {\r\n <div class=\"ui-form-builder__chips-preview\">\r\n @for (val of fg.get(field.key)!.value; track val) {\r\n <span class=\"ui-form-builder__chip\">\r\n {{ getOptionLabel(field, val) }}\r\n <button type=\"button\" (click)=\"removeMultiselectChip(field, val)\" class=\"ui-form-builder__chip-remove\"\r\n aria-label=\"Rimuovi\">\r\n <lucide-icon name=\"x\" [size]=\"12\" />\r\n </button>\r\n </span>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- FREEMULTISELECT -->\r\n @case ('freemultiselect') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width ui-form-builder__free-multi-field\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <mat-chip-grid #chipGrid [formControlName]=\"field.key\">\r\n @for (chip of fg.get(field.key)?.value || []; track chip) {\r\n <mat-chip-row [removable]=\"!isChipProtected(field, chip)\" (removed)=\"removeFreeChip(field, chip)\">\r\n {{ chip }}\r\n @if (!isChipProtected(field, chip)) {\r\n <button matChipRemove aria-label=\"Rimuovi\">\r\n <lucide-icon name=\"x\" [size]=\"14\" />\r\n </button>\r\n }\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input matInput [matChipInputFor]=\"chipGrid\" [placeholder]=\"field.placeholder || 'Aggiungi...'\"\r\n [readonly]=\"field.readonly || readonly\" (matChipInputTokenEnd)=\"addFreeChip(field, $event)\"\r\n (blur)=\"addFreeChipOnBlur(field, $event)\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- CHECKBOX -->\r\n @case ('checkbox') {\r\n @if (field.appearance?.style === 'switch') {\r\n <mat-slide-toggle [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n </mat-slide-toggle>\r\n } @else {\r\n <mat-checkbox [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\" [matTooltip]=\"field.iconTooltip.text\"\r\n class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-checkbox>\r\n }\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- SWITCH -->\r\n @case ('switch') {\r\n <mat-slide-toggle [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\" [matTooltip]=\"field.iconTooltip.text\"\r\n class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-slide-toggle>\r\n }\r\n\r\n <!-- RADIO -->\r\n @case ('radio') {\r\n <ui-form-radio-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n [required]=\"isFieldRequired(field.key, fg)\"\r\n [showErrors]=\"shouldShowFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- DATE -->\r\n @case ('date') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput [matDatepicker]=\"datepicker\" [formControlName]=\"field.key\"\r\n [placeholder]=\"field.placeholder || 'GG/MM/AAAA'\" [readonly]=\"field.readonly || readonly\" />\r\n <mat-datepicker-toggle matSuffix [for]=\"datepicker\" />\r\n <mat-datepicker #datepicker [startView]=\"field.customConfig?.config?.['monthView'] ? 'year' : 'month'\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- DATETIME -->\r\n @case ('datetime') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput type=\"datetime-local\" [formControlName]=\"field.key\" [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly || readonly\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- FILE -->\r\n @case ('file') {\r\n <div class=\"ui-form-builder__file-wrapper\">\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n <ui-file-input [formControlName]=\"field.key\" [config]=\"field.fileConfig\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- DIVIDER -->\r\n @case ('divider') {\r\n <div class=\"ui-form-builder__divider\">\r\n @if (field.label) {\r\n <span class=\"ui-form-builder__divider-label\">{{ field.label }}</span>\r\n }\r\n <hr class=\"ui-form-builder__divider-line\" />\r\n </div>\r\n }\r\n\r\n <!-- LOCATION (selezione territorio) -->\r\n @case ('location') {\r\n <div class=\"ui-form-builder__location-wrapper\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-specifica-territoriale [formControlName]=\"field.key\" [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- LOCATION-TABLE (tabella CRUD di location) -->\r\n @case ('location-table') {\r\n <div class=\"ui-form-builder__location-table-wrapper\">\r\n <ui-table-territoriale [formControlName]=\"field.key\" [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- LOCATION-GEOCODED (ricerca indirizzo Nominatim) -->\r\n @case ('location-geocoded') {\r\n <div class=\"ui-form-builder__location-geocoded-wrapper\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\" [attr.for]=\"'ui-loc-' + field.key\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-location-geocoded [formControlName]=\"field.key\" [config]=\"field.locationGeocodedConfig || {}\"\r\n [placeholder]=\"field.placeholder || 'Cerca indirizzo...'\"\r\n [inputAriaLabel]=\"field.label || field.placeholder || 'Indirizzo'\"\r\n [inputId]=\"'ui-loc-' + field.key\"\r\n [readonly]=\"field.readonly || readonly\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- CUSTOM -->\r\n @case ('custom') {\r\n <div class=\"ui-form-builder__custom-wrapper\" [attr.data-component]=\"field.customConfig?.component\"\r\n [attr.data-template-key]=\"resolveCustomTemplateKey(field)\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n @if (getCustomFieldOutlet(field, fg, nestedErrorKeyPrefix); as customOutlet) {\r\n <ng-container *ngTemplateOutlet=\"customOutlet.template; context: customOutlet.context\" />\r\n } @else {\r\n <div class=\"ui-form-builder__custom-placeholder\" role=\"status\">\r\n <span>Nessun template registrato per «{{ resolveCustomTemplateKey(field) }}»</span>\r\n </div>\r\n }\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n</ng-template>","import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiButtonComponent } from '../../../button/index';\r\n\r\n/**\r\n * Pannello overlay in basso nell'anteprima che mostra i valori correnti\r\n * del form in formato JSON modificabile.\r\n *\r\n * Permette di visualizzare, modificare, formattare e resettare i valori\r\n * del form durante la fase di anteprima nell'editor.\r\n *\r\n * @selector ui-editor-form-values-panel\r\n */\r\n@Component({\r\n selector: 'ui-editor-form-values-panel',\r\n standalone: true,\r\n imports: [FormsModule, MatFormFieldModule, MatInputModule, LucideAngularModule, UiButtonComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div\r\n class=\"form-values-panel\"\r\n [class.form-values-panel--open]=\"isOpen\"\r\n >\r\n <!-- Intestazione con toggle e azioni -->\r\n <div class=\"form-values-panel__header\" (click)=\"toggle.emit()\">\r\n <div class=\"form-values-panel__header-left\">\r\n <lucide-icon name=\"code\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span class=\"form-values-panel__title\">Valori Form</span>\r\n </div>\r\n\r\n <div class=\"form-values-panel__header-actions\" (click)=\"$event.stopPropagation()\">\r\n <!-- Aggiorna valori -->\r\n <ui-button\r\n icon=\"refresh-cw\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n tooltip=\"Aggiorna valori\"\r\n ariaLabel=\"Aggiorna valori\"\r\n (click)=\"refreshValues.emit()\"\r\n />\r\n\r\n <!-- Pulisci valori -->\r\n <ui-button\r\n icon=\"trash-2\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n tooltip=\"Pulisci valori\"\r\n ariaLabel=\"Pulisci valori\"\r\n (click)=\"clearValues()\"\r\n />\r\n\r\n <!-- Formatta JSON -->\r\n <ui-button\r\n icon=\"align-left\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n tooltip=\"Formatta JSON\"\r\n ariaLabel=\"Formatta JSON\"\r\n (click)=\"formatJson()\"\r\n />\r\n\r\n <!-- Freccia toggle apertura/chiusura -->\r\n <ui-button\r\n [icon]=\"isOpen ? 'chevron-down' : 'chevron-up'\"\r\n variant=\"ghost\"\r\n size=\"xs\"\r\n tooltip=\"Chiudi pannello\"\r\n ariaLabel=\"Chiudi pannello\"\r\n (click)=\"toggle.emit()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Corpo del pannello (visibile solo quando aperto) -->\r\n @if (isOpen) {\r\n <div class=\"form-values-panel__body\">\r\n <mat-form-field appearance=\"outline\" class=\"form-values-panel__textarea-wrapper\">\r\n <mat-label>JSON</mat-label>\r\n <textarea\r\n matInput\r\n class=\"form-values-panel__textarea\"\r\n [ngModel]=\"jsonText\"\r\n (ngModelChange)=\"onJsonInput($event)\"\r\n rows=\"8\"\r\n spellcheck=\"false\"\r\n placeholder='{ \"chiave\": \"valore\" }'\r\n ></textarea>\r\n </mat-form-field>\r\n\r\n <!-- Indicatore di errore di parsing -->\r\n @if (jsonError) {\r\n <div class=\"form-values-panel__error\">\r\n <lucide-icon name=\"alert-triangle\" [size]=\"14\" aria-hidden=\"true\" />\r\n <span>{{ jsonError }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n /* Contenitore principale del pannello valori */\r\n .form-values-panel {\r\n border-top: 1px solid var(--ui-color-border, #e0e0e0);\r\n background: var(--ui-color-surface, #fff);\r\n transition: max-height 200ms ease-in-out;\r\n overflow: hidden;\r\n }\r\n\r\n /* Intestazione cliccabile per toggle */\r\n .form-values-panel__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: var(--ui-spacing-2, 8px) var(--ui-spacing-3, 12px);\r\n cursor: pointer;\r\n user-select: none;\r\n transition: background-color 150ms;\r\n }\r\n\r\n .form-values-panel__header:hover {\r\n background: var(--ui-color-bg-subtle, #fafafa);\r\n }\r\n\r\n .form-values-panel__header-left {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n }\r\n\r\n .form-values-panel__title {\r\n font-weight: 600;\r\n font-size: var(--ui-font-size-xs, 0.75rem);\r\n color: var(--ui-color-text-secondary, #616161);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n }\r\n\r\n .form-values-panel__header-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1, 4px);\r\n }\r\n\r\n /* Corpo del pannello con textarea */\r\n .form-values-panel__body {\r\n padding: 0 var(--ui-spacing-3, 12px) var(--ui-spacing-3, 12px);\r\n }\r\n\r\n /* Wrapper della textarea */\r\n .form-values-panel__textarea-wrapper {\r\n width: 100%;\r\n }\r\n\r\n /* Textarea per il JSON */\r\n .form-values-panel__textarea {\r\n font-family: 'Fira Code', 'Consolas', 'Monaco', monospace;\r\n font-size: var(--ui-font-size-xs, 0.75rem);\r\n line-height: 1.5;\r\n resize: vertical;\r\n }\r\n\r\n /* Messaggio di errore JSON */\r\n .form-values-panel__error {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1, 4px);\r\n padding: var(--ui-spacing-1, 4px) var(--ui-spacing-2, 8px);\r\n margin-top: var(--ui-spacing-1, 4px);\r\n border-radius: var(--ui-radius-sm, 4px);\r\n background: color-mix(in srgb, var(--ui-color-warn, #f44336) 10%, transparent);\r\n color: var(--ui-color-warn, #f44336);\r\n font-size: var(--ui-font-size-xs, 0.75rem);\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiEditorFormValuesPanelComponent {\r\n /** Valori correnti del form da visualizzare. */\r\n @Input()\r\n set formValues(value: any) {\r\n this._formValues = value;\r\n this.updateJsonText();\r\n }\r\n get formValues(): any {\r\n return this._formValues;\r\n }\r\n\r\n /** Stato di apertura/chiusura del pannello. */\r\n @Input() isOpen = false;\r\n\r\n /** Emesso quando i valori vengono modificati dall'utente via JSON. */\r\n @Output() valuesChange = new EventEmitter<any>();\r\n\r\n /** Emesso alla richiesta di aggiornamento dei valori. */\r\n @Output() refreshValues = new EventEmitter<void>();\r\n\r\n /** Emesso alla richiesta di apertura/chiusura del pannello. */\r\n @Output() toggle = new EventEmitter<void>();\r\n\r\n /** Testo JSON visualizzato nella textarea. */\r\n jsonText = '{}';\r\n\r\n /** Messaggio di errore per JSON non valido. */\r\n jsonError: string | null = null;\r\n\r\n /** @internal Valori interni del form. */\r\n private _formValues: any = {};\r\n\r\n /**\r\n * Gestisce l'input dell'utente nella textarea JSON.\r\n * Prova a parsare il JSON e aggiorna i valori se valido.\r\n * @param text - Testo JSON inserito dall'utente\r\n */\r\n onJsonInput(text: string): void {\r\n this.jsonText = text;\r\n try {\r\n const parsed = JSON.parse(text);\r\n this.jsonError = null;\r\n this.valuesChange.emit(parsed);\r\n } catch (e) {\r\n this.jsonError = 'JSON non valido: controlla la sintassi';\r\n }\r\n }\r\n\r\n /**\r\n * Pulisce i valori del form resettando a oggetto vuoto.\r\n */\r\n clearValues(): void {\r\n this._formValues = {};\r\n this.jsonText = '{}';\r\n this.jsonError = null;\r\n this.valuesChange.emit({});\r\n }\r\n\r\n /**\r\n * Formatta il JSON con indentazione per una migliore leggibilita.\r\n */\r\n formatJson(): void {\r\n try {\r\n const parsed = JSON.parse(this.jsonText);\r\n this.jsonText = JSON.stringify(parsed, null, 2);\r\n this.jsonError = null;\r\n } catch (e) {\r\n this.jsonError = 'Impossibile formattare: JSON non valido';\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Aggiorna il testo JSON dalla rappresentazione interna dei valori.\r\n */\r\n private updateJsonText(): void {\r\n try {\r\n this.jsonText = JSON.stringify(this._formValues, null, 2);\r\n this.jsonError = null;\r\n } catch {\r\n this.jsonText = '{}';\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnChanges,\r\n SimpleChanges,\r\n ViewChild,\r\n inject,\r\n} from '@angular/core';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiButtonComponent } from '../../../button/index';\r\n\r\nimport { UiFormSchema } from '../../../form-builder/types/index';\r\nimport { UiFormBuilderComponent } from '../../../form-builder/form-builder.component';\r\nimport { UiEditorFormValuesPanelComponent } from '../form-values-panel/form-values-panel.component';\r\n\r\n/**\r\n * Contenitore per l'anteprima live del form in fase di editing.\r\n *\r\n * Mostra una preview del form builder generato dallo schema corrente,\r\n * con possibilita di aggiornamento forzato e pannello dei valori.\r\n *\r\n * @selector ui-editor-preview-container\r\n */\r\n@Component({\r\n selector: 'ui-editor-preview-container',\r\n standalone: true,\r\n imports: [LucideAngularModule, UiButtonComponent, UiFormBuilderComponent, UiEditorFormValuesPanelComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"preview-container\">\r\n <!-- Intestazione con azioni -->\r\n <div class=\"preview-container__header\">\r\n <div class=\"preview-container__header-left\">\r\n <lucide-icon name=\"eye\" [size]=\"18\" aria-hidden=\"true\" />\r\n <span class=\"preview-container__title\">Anteprima Form</span>\r\n </div>\r\n\r\n <div class=\"preview-container__header-actions\">\r\n <!-- Aggiorna anteprima -->\r\n <ui-button\r\n icon=\"refresh-cw\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n tooltip=\"Aggiorna anteprima\"\r\n ariaLabel=\"Aggiorna anteprima\"\r\n (click)=\"refresh.emit()\"\r\n />\r\n\r\n <!-- Mostra/nascondi pannello valori -->\r\n <ui-button\r\n icon=\"code\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n tooltip=\"Mostra/nascondi valori form\"\r\n ariaLabel=\"Mostra/nascondi valori form\"\r\n (click)=\"toggleValuesPanel()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Contenuto anteprima -->\r\n <div class=\"preview-container__content\">\r\n @if (!previewSchema || !previewSchema.sections || previewSchema.sections.length === 0) {\r\n <!-- Stato vuoto: nessuno schema -->\r\n <div class=\"preview-container__empty\">\r\n <lucide-icon name=\"layout-template\" [size]=\"40\" aria-hidden=\"true\" />\r\n <p class=\"preview-container__empty-text\">\r\n Aggiungi sezioni e campi per visualizzare l'anteprima\r\n </p>\r\n </div>\r\n } @else {\r\n <!-- Rendering del form builder con snapshot dello schema -->\r\n <div class=\"preview-container__form-wrapper\">\r\n <ui-form-builder\r\n [schema]=\"previewSchema\"\r\n (valueChange)=\"onFormBuilderValueChange($event)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Pannello valori in basso -->\r\n <ui-editor-form-values-panel\r\n [formValues]=\"currentFormValues\"\r\n [isOpen]=\"isValuesPanelOpen\"\r\n (valuesChange)=\"onFormValuesChange($event)\"\r\n (refreshValues)=\"onRefreshValues()\"\r\n (toggle)=\"toggleValuesPanel()\"\r\n />\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n /* Contenitore principale dell'anteprima */\r\n .preview-container {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n background: var(--ui-color-bg-subtle, #fafafa);\r\n position: relative;\r\n }\r\n\r\n /* Intestazione dell'anteprima */\r\n .preview-container__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: var(--ui-spacing-2, 8px) var(--ui-spacing-4, 16px);\r\n border-bottom: 1px solid var(--ui-color-border, #e0e0e0);\r\n background: var(--ui-color-surface, #fff);\r\n }\r\n\r\n .preview-container__header-left {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-2, 8px);\r\n }\r\n\r\n .preview-container__title {\r\n font-weight: 600;\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n color: var(--ui-color-text, #212121);\r\n }\r\n\r\n .preview-container__header-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--ui-spacing-1, 4px);\r\n }\r\n\r\n /* Area di contenuto scrollabile */\r\n .preview-container__content {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: var(--ui-spacing-4, 16px);\r\n }\r\n\r\n /* Stato vuoto: nessuno schema disponibile */\r\n .preview-container__empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--ui-spacing-3, 12px);\r\n padding: var(--ui-spacing-8, 64px) var(--ui-spacing-4, 16px);\r\n text-align: center;\r\n color: var(--ui-color-text-muted, #9e9e9e);\r\n }\r\n\r\n .preview-container__empty-text {\r\n font-size: var(--ui-font-size-sm, 0.875rem);\r\n margin: 0;\r\n }\r\n\r\n /* Wrapper del form builder renderizzato */\r\n .preview-container__form-wrapper {\r\n background: var(--ui-color-surface, #fff);\r\n border-radius: var(--ui-radius-md, 8px);\r\n padding: var(--ui-spacing-4, 16px);\r\n box-shadow: var(--ui-shadow-sm, 0 1px 3px rgba(0,0,0,0.1));\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiEditorPreviewContainerComponent implements OnChanges {\r\n /** @internal Change detector per OnPush. */\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n /** Riferimento all'istanza del form builder per leggere i valori. */\r\n @ViewChild(UiFormBuilderComponent) formBuilderRef?: UiFormBuilderComponent;\r\n\r\n /** Schema del form ricevuto dal parent (cambia ad ogni modifica nell'editor). */\r\n @Input() schema: UiFormSchema | null = null;\r\n\r\n /**\r\n * Chiave per forzare la ri-creazione del form builder.\r\n * Viene incrementata dal componente padre per invalidare l'anteprima.\r\n */\r\n @Input() key: number = 0;\r\n\r\n /** Emesso alla richiesta di aggiornamento forzato dell'anteprima. */\r\n @Output() refresh = new EventEmitter<void>();\r\n\r\n /**\r\n * Snapshot immutabile dello schema usato per il rendering.\r\n * Viene aggiornato SOLO al primo caricamento, al cambio tab\r\n * (quando `key` cambia) o al refresh esplicito.\r\n * Questo evita che le modifiche nell'editor ricostruiscano\r\n * continuamente il form, perdendo lo stato dell'utente.\r\n */\r\n previewSchema: UiFormSchema | null = null;\r\n\r\n /** Stato di apertura del pannello valori in basso. */\r\n isValuesPanelOpen = false;\r\n\r\n /** Valori correnti del form nell'anteprima. */\r\n currentFormValues: any = {};\r\n\r\n /** @internal Ultimo valore di `key` applicato allo snapshot. */\r\n private lastAppliedKey = -1;\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const keyChanged = changes['key'] && this.key !== this.lastAppliedKey;\r\n const firstSchema = changes['schema']?.firstChange;\r\n\r\n if (keyChanged || firstSchema) {\r\n this.applySchemaSnapshot();\r\n }\r\n }\r\n\r\n /**\r\n * Riceve i valori aggiornati dal form builder ad ogni interazione.\r\n * @param values - Valori correnti del form (inclusi campi disabilitati)\r\n */\r\n onFormBuilderValueChange(values: any): void {\r\n this.currentFormValues = values;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Alterna la visibilita del pannello dei valori del form. */\r\n toggleValuesPanel(): void {\r\n this.isValuesPanelOpen = !this.isValuesPanelOpen;\r\n }\r\n\r\n /**\r\n * Gestisce il cambiamento dei valori dal pannello JSON.\r\n * @param values - Nuovi valori parsati dal JSON\r\n */\r\n onFormValuesChange(values: any): void {\r\n this.currentFormValues = values;\r\n }\r\n\r\n /**\r\n * Aggiorna i valori leggendo lo stato corrente dal form builder.\r\n */\r\n onRefreshValues(): void {\r\n if (this.formBuilderRef) {\r\n this.currentFormValues = this.formBuilderRef.getFormValue();\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Crea una copia profonda dello schema corrente come snapshot\r\n * per il rendering dell'anteprima. L'id viene reso univoco\r\n * per forzare il rebuild del form builder (che ricostruisce\r\n * solo quando `schema.id` cambia).\r\n */\r\n private applySchemaSnapshot(): void {\r\n if (this.schema) {\r\n const snapshot = structuredClone(this.schema);\r\n snapshot.id = `${snapshot.id}__preview_${this.key}`;\r\n this.previewSchema = snapshot;\r\n } else {\r\n this.previewSchema = null;\r\n }\r\n this.lastAppliedKey = this.key;\r\n this.currentFormValues = {};\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder-editor\r\n * Componente principale dell'editor visuale del form builder.\r\n *\r\n * Layout a tre pannelli:\r\n * - Sinistra: palette dei tipi di campo (drag source)\r\n * - Centro: sezioni con campi (drop target + editor inline)\r\n * - Destra: pannello di configurazione del campo selezionato\r\n *\r\n * Funzionalita principali:\r\n * - Drag & drop dei campi dalla palette alle sezioni\r\n * - Riordino campi all'interno e tra sezioni\r\n * - Configurazione campi in tempo reale\r\n * - Preview live del form\r\n * - Import/export JSON\r\n * - Auto-save su localStorage\r\n */\r\n\r\nimport {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnInit,\r\n OnDestroy,\r\n inject,\r\n Optional,\r\n Inject,\r\n} from '@angular/core';\r\nimport { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { Subject, interval } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\n\r\nimport { UiFormSchema, UiFormSection, UiFormFieldDescriptor } from '../form-builder/types/index';\r\n\r\nimport {\r\n UiEditorState,\r\n UiEditorBreadcrumbItem,\r\n UiEditorFieldPaletteItem,\r\n UiEditorAvailableField,\r\n UiEditorDialogData,\r\n} from './types/editor.types';\r\n\r\nimport { UiEditorStateService } from './services/editor-state.service';\r\nimport { UiEditorPersistenceService } from './services/editor-persistence.service';\r\nimport { UiEditorFieldFactoryService } from './services/field-factory.service';\r\n\r\n// Sotto-componenti\r\nimport { UiEditorToolbarComponent } from './sub-components/editor-toolbar/editor-toolbar.component';\r\nimport { UiFieldPaletteComponent } from './sub-components/field-palette/field-palette.component';\r\nimport { UiSectionEditorComponent } from './sub-components/section-editor/section-editor.component';\r\nimport { UiEditorFieldConfigPanelComponent } from './sub-components/field-config-panel/field-config-panel.component';\r\nimport { UiEditorPreviewContainerComponent } from './sub-components/preview-container/preview-container.component';\r\nimport { UiButtonComponent } from '../button/index';\r\n\r\n@Component({\r\n selector: 'ui-form-builder-editor',\r\n standalone: true,\r\n imports: [\r\n DragDropModule,\r\n MatSnackBarModule,\r\n MatTabsModule,\r\n LucideAngularModule,\r\n UiEditorToolbarComponent,\r\n UiFieldPaletteComponent,\r\n UiSectionEditorComponent,\r\n UiEditorFieldConfigPanelComponent,\r\n UiEditorPreviewContainerComponent,\r\n UiButtonComponent,\r\n ],\r\n providers: [UiEditorStateService, UiEditorPersistenceService, UiEditorFieldFactoryService],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"editor-root\" [class.dialog-mode]=\"isDialogMode\">\r\n <!-- Header con chiusura (solo in modale) -->\r\n @if (isDialogMode) {\r\n <div class=\"editor-dialog-header\">\r\n <h2>Form Builder - Editor Visuale</h2>\r\n <ui-button\r\n icon=\"x\"\r\n variant=\"ghost\"\r\n size=\"md\"\r\n ariaLabel=\"Chiudi editor\"\r\n tooltip=\"Chiudi editor\"\r\n (click)=\"closeDialog()\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Toolbar -->\r\n <ui-editor-toolbar\r\n [breadcrumb]=\"breadcrumb\"\r\n [isDirty]=\"state.isDirty\"\r\n [lastSaved]=\"state.lastSaved\"\r\n (newForm)=\"onNewForm()\"\r\n (importJson)=\"onImportJson()\"\r\n (exportJson)=\"onExportJson()\"\r\n (save)=\"onSave()\"\r\n (clear)=\"onClear()\"\r\n (addSection)=\"onAddSection()\"\r\n />\r\n\r\n <!-- Tabs: Editor / Preview -->\r\n <mat-tab-group\r\n [selectedIndex]=\"selectedTabIndex\"\r\n (selectedIndexChange)=\"onTabChange($event)\"\r\n class=\"editor-tabs\"\r\n >\r\n <!-- Tab Editor -->\r\n <mat-tab label=\"Editor\">\r\n <div class=\"editor-layout\" cdkDropListGroup>\r\n <!-- Palette (sidebar sinistra) -->\r\n <div\r\n class=\"editor-sidebar left\"\r\n [style.width.px]=\"leftSidebarWidth\"\r\n >\r\n <ui-field-palette />\r\n <div\r\n class=\"resize-handle resize-handle--right\"\r\n [class.resizing]=\"isResizingLeft\"\r\n (mousedown)=\"onLeftResizeStart($event)\"\r\n ></div>\r\n </div>\r\n\r\n <!-- Area centrale con sezioni -->\r\n <div class=\"editor-main\">\r\n <div class=\"sections-container\">\r\n @for (section of state.schema.sections; track section.id) {\r\n <ui-section-editor\r\n [section]=\"section\"\r\n [isSelected]=\"state.selectedSectionId === section.id\"\r\n [selectedFieldKey]=\"state.selectedFieldKey\"\r\n (sectionUpdate)=\"\r\n stateService.updateSection(section.id, $event)\r\n \"\r\n (sectionDelete)=\"onSectionDelete(section.id)\"\r\n (sectionDuplicate)=\"onSectionDuplicate(section.id)\"\r\n (fieldSelect)=\"onFieldSelect(section.id, $event)\"\r\n (fieldDuplicate)=\"onFieldDuplicate(section.id, $event)\"\r\n (fieldDelete)=\"onFieldDelete(section.id, $event)\"\r\n (fieldDrop)=\"onFieldDrop($event)\"\r\n />\r\n }\r\n\r\n @if (state.schema.sections.length === 0) {\r\n <div class=\"empty-state\">\r\n <lucide-icon\r\n name=\"layout-template\"\r\n [size]=\"64\"\r\n ></lucide-icon>\r\n <h3>Nessuna sezione presente</h3>\r\n <p>\r\n Clicca su \"Sezione\" nella toolbar per aggiungere la prima\r\n sezione\r\n </p>\r\n <ui-button\r\n label=\"Aggiungi Prima Sezione\"\r\n variant=\"primary\"\r\n icon=\"plus\"\r\n (click)=\"onAddSection()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Config panel (sidebar destra) -->\r\n <div\r\n class=\"editor-sidebar right\"\r\n [style.width.px]=\"rightSidebarWidth\"\r\n >\r\n <div\r\n class=\"resize-handle\"\r\n [class.resizing]=\"isResizing\"\r\n (mousedown)=\"onResizeStart($event)\"\r\n ></div>\r\n <ui-editor-field-config-panel\r\n [field]=\"selectedField\"\r\n [availableFields]=\"availableFields\"\r\n (fieldUpdate)=\"\r\n onFieldUpdate(\r\n selectedFieldSectionId!,\r\n state.selectedFieldKey!,\r\n $event\r\n )\r\n \"\r\n />\r\n </div>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- Tab Preview -->\r\n <mat-tab label=\"Anteprima\">\r\n <ui-editor-preview-container\r\n [schema]=\"state.schema\"\r\n [key]=\"previewKey\"\r\n (refresh)=\"refreshPreview()\"\r\n />\r\n </mat-tab>\r\n </mat-tab-group>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n @use '../../core/tokens/mixins' as ui;\r\n\r\n .editor-root {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100vh;\r\n background: var(--ui-color-bg-subtle);\r\n\r\n &.dialog-mode {\r\n height: 100%;\r\n }\r\n }\r\n\r\n .editor-dialog-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: var(--ui-spacing-3) var(--ui-spacing-4);\r\n background: var(--ui-color-surface);\r\n border-bottom: 1px solid var(--ui-color-border);\r\n box-shadow: var(--ui-shadow-sm);\r\n\r\n h2 {\r\n margin: 0;\r\n font-size: var(--ui-font-size-lg);\r\n font-weight: 500;\r\n color: var(--ui-color-text);\r\n }\r\n\r\n /* Stile per il pulsante di chiusura (gestito da UiButton) */\r\n }\r\n\r\n .editor-tabs {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n\r\n /* Stile intestazione tab */\r\n ::ng-deep .mat-mdc-tab-header {\r\n background: var(--ui-color-surface);\r\n border-bottom: 1px solid var(--ui-color-border);\r\n }\r\n\r\n /* Stile etichetta tab */\r\n ::ng-deep .mat-mdc-tab .mdc-tab__text-label {\r\n color: var(--ui-color-text-secondary);\r\n font-weight: 500;\r\n font-size: var(--ui-font-size-sm);\r\n letter-spacing: 0.02em;\r\n }\r\n\r\n /* Tab attivo: testo evidenziato */\r\n ::ng-deep .mat-mdc-tab.mdc-tab--active .mdc-tab__text-label {\r\n color: var(--ui-color-primary);\r\n font-weight: 600;\r\n }\r\n\r\n /* Indicatore tab attivo (ink bar) */\r\n ::ng-deep .mat-mdc-tab-header .mdc-tab-indicator__content--underline {\r\n border-color: var(--ui-color-primary);\r\n border-width: 3px;\r\n }\r\n\r\n ::ng-deep .mat-mdc-tab-body-wrapper {\r\n flex: 1;\r\n overflow: hidden;\r\n }\r\n\r\n ::ng-deep .mat-mdc-tab-body {\r\n height: 100%;\r\n }\r\n\r\n ::ng-deep .mat-mdc-tab-body-content {\r\n height: 100%;\r\n overflow: hidden;\r\n }\r\n }\r\n\r\n .editor-layout {\r\n display: flex;\r\n height: 100%;\r\n overflow: hidden;\r\n }\r\n\r\n .editor-sidebar {\r\n height: 100%;\r\n overflow-y: auto;\r\n background: var(--ui-color-surface);\r\n flex-shrink: 0;\r\n\r\n &.left {\r\n position: relative;\r\n border-right: 1px solid var(--ui-color-border);\r\n min-width: 200px;\r\n max-width: 500px;\r\n }\r\n\r\n &.right {\r\n position: relative;\r\n border-left: 1px solid var(--ui-color-border);\r\n min-width: 400px;\r\n max-width: 1200px;\r\n }\r\n }\r\n\r\n .editor-main {\r\n flex: 1;\r\n min-width: 0;\r\n height: 100%;\r\n overflow-y: auto;\r\n padding: var(--ui-spacing-4);\r\n background: var(--ui-color-bg-subtle);\r\n }\r\n\r\n .sections-container {\r\n max-width: 1200px;\r\n margin: 0 auto;\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--ui-spacing-4);\r\n }\r\n\r\n .resize-handle {\r\n position: absolute;\r\n top: 0;\r\n bottom: 0;\r\n width: 6px;\r\n cursor: ew-resize;\r\n z-index: 10;\r\n transition: background-color var(--ui-transition-fast);\r\n\r\n /* Handle sinistro (per sidebar destra) */\r\n left: 0;\r\n\r\n &::before {\r\n content: '';\r\n position: absolute;\r\n left: -3px;\r\n top: 0;\r\n bottom: 0;\r\n width: 12px;\r\n }\r\n\r\n &:hover,\r\n &.resizing {\r\n background-color: color-mix(\r\n in srgb,\r\n var(--ui-color-primary) 30%,\r\n transparent\r\n );\r\n }\r\n\r\n &.resizing {\r\n background-color: color-mix(\r\n in srgb,\r\n var(--ui-color-primary) 50%,\r\n transparent\r\n );\r\n }\r\n }\r\n\r\n /* Handle destro (per sidebar sinistra) */\r\n .resize-handle--right {\r\n left: auto;\r\n right: 0;\r\n\r\n &::before {\r\n left: auto;\r\n right: -3px;\r\n }\r\n }\r\n\r\n .empty-state {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--ui-spacing-12) var(--ui-spacing-8);\r\n text-align: center;\r\n color: var(--ui-color-text-muted);\r\n\r\n lucide-icon {\r\n opacity: 0.4;\r\n }\r\n\r\n h3 {\r\n margin: 0 0 var(--ui-spacing-2) 0;\r\n font-size: var(--ui-font-size-xl);\r\n font-weight: 400;\r\n color: var(--ui-color-text-secondary);\r\n }\r\n\r\n p {\r\n margin: 0 0 var(--ui-spacing-6) 0;\r\n font-size: var(--ui-font-size-md);\r\n color: var(--ui-color-text-muted);\r\n }\r\n }\r\n\r\n /* Responsive */\r\n @media (max-width: 1280px) {\r\n .editor-sidebar.left {\r\n width: 250px;\r\n }\r\n }\r\n\r\n @media (max-width: 960px) {\r\n .editor-layout {\r\n flex-direction: column;\r\n }\r\n\r\n .editor-sidebar {\r\n &.left {\r\n display: none;\r\n }\r\n\r\n &.right {\r\n position: fixed;\r\n right: 0;\r\n top: 64px;\r\n width: 100% !important;\r\n max-width: 350px;\r\n height: calc(100vh - 64px);\r\n z-index: 1000;\r\n box-shadow: var(--ui-shadow-lg);\r\n transform: translateX(100%);\r\n transition: transform var(--ui-transition-normal);\r\n\r\n .resize-handle {\r\n display: none;\r\n }\r\n }\r\n }\r\n }\r\n `,\r\n ],\r\n})\r\nexport class UiFormBuilderEditorComponent implements OnInit, OnDestroy {\r\n /** @internal Servizio per lo stato dell'editor. */\r\n readonly stateService = inject(UiEditorStateService);\r\n\r\n /** @internal Servizio per la persistenza. */\r\n private readonly persistenceService = inject(UiEditorPersistenceService);\r\n\r\n /** @internal Factory per i campi. */\r\n private readonly fieldFactory = inject(UiEditorFieldFactoryService);\r\n\r\n /** @internal Snack bar per i messaggi. */\r\n private readonly snackBar = inject(MatSnackBar);\r\n\r\n /** @internal Change detector. */\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n /** @internal Subject per la distruzione. */\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n /** Stato corrente dell'editor. */\r\n state: UiEditorState;\r\n\r\n /** Indice del tab selezionato (0=Editor, 1=Preview). */\r\n selectedTabIndex = 0;\r\n\r\n /** Breadcrumb di navigazione. */\r\n breadcrumb: UiEditorBreadcrumbItem[] = [];\r\n\r\n /** Se il componente e aperto in modalita dialog. */\r\n isDialogMode = false;\r\n\r\n /** Chiave per forzare il re-render del preview. */\r\n previewKey = 0;\r\n\r\n /** Campi disponibili per le condizioni (cache). */\r\n availableFields: UiEditorAvailableField[] = [];\r\n\r\n /** Larghezza della sidebar sinistra (px). */\r\n leftSidebarWidth = 280;\r\n\r\n /** Larghezza della sidebar destra (px). */\r\n rightSidebarWidth = 460;\r\n\r\n /** Se e in corso il resize della sidebar destra. */\r\n isResizing = false;\r\n\r\n /** Se e in corso il resize della sidebar sinistra. */\r\n isResizingLeft = false;\r\n\r\n /** @internal Limiti di resize sidebar destra. */\r\n private readonly MIN_SIDEBAR_WIDTH = 400;\r\n private readonly MAX_SIDEBAR_WIDTH = 1200;\r\n\r\n /** @internal Limiti di resize sidebar sinistra. */\r\n private readonly MIN_LEFT_SIDEBAR_WIDTH = 200;\r\n private readonly MAX_LEFT_SIDEBAR_WIDTH = 500;\r\n\r\n private resizeStartX = 0;\r\n private resizeStartWidth = 0;\r\n private readonly SIDEBAR_WIDTH_KEY = 'ui-editor-right-sidebar-width';\r\n private readonly LEFT_SIDEBAR_WIDTH_KEY = 'ui-editor-left-sidebar-width';\r\n\r\n constructor(\r\n @Optional() public dialogRef: MatDialogRef<UiFormBuilderEditorComponent>,\r\n @Optional() @Inject(MAT_DIALOG_DATA) public dialogData: UiEditorDialogData,\r\n ) {\r\n this.state = this.stateService.getCurrentState();\r\n this.isDialogMode = !!this.dialogRef;\r\n\r\n // Carica schema iniziale se fornito via dialog data\r\n if (this.dialogData?.initialSchema) {\r\n this.stateService.setSchema(this.dialogData.initialSchema);\r\n }\r\n\r\n this.loadSidebarWidth();\r\n }\r\n\r\n ngOnInit(): void {\r\n // Sottoscrizione allo stato\r\n this.stateService.state$.pipe(takeUntil(this.destroy$)).subscribe((state) => {\r\n this.state = state;\r\n this.updateBreadcrumb();\r\n this.updateAvailableFields();\r\n this.cdr.markForCheck();\r\n });\r\n\r\n // Controlla salvataggi precedenti da recuperare\r\n this.checkForRecovery();\r\n\r\n // Auto-save ogni 30 secondi\r\n interval(30000)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n if (this.state.isDirty) {\r\n this.autoSave();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n // ─── Toolbar actions ─────────────────────────────────────────\r\n\r\n /** Aggiunge una nuova sezione. */\r\n onAddSection(): void {\r\n this.stateService.addSection();\r\n this.showMessage('Sezione aggiunta');\r\n }\r\n\r\n /** Salva nel localStorage. */\r\n onSave(): void {\r\n try {\r\n this.persistenceService.saveToLocalStorage(this.state.schema);\r\n this.stateService.markAsSaved();\r\n this.showMessage('Salvato con successo');\r\n } catch (error: any) {\r\n this.showMessage(error.message || 'Errore durante il salvataggio', true);\r\n }\r\n }\r\n\r\n /** Crea un nuovo form. */\r\n onNewForm(): void {\r\n if (this.state.isDirty && !confirm('Ci sono modifiche non salvate. Continuare?')) {\r\n return;\r\n }\r\n this.stateService.reset();\r\n this.showMessage('Nuovo form creato');\r\n }\r\n\r\n /** Importa da file JSON. */\r\n onImportJson(): void {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.accept = '.json';\r\n\r\n input.onchange = async (e: any) => {\r\n const file = e.target.files[0];\r\n if (!file) return;\r\n\r\n try {\r\n const schema = await this.persistenceService.importFromJSON(file);\r\n if (this.state.isDirty && !confirm('Ci sono modifiche non salvate. Sovrascrivere?')) {\r\n return;\r\n }\r\n this.stateService.setSchema(schema);\r\n this.showMessage('Schema importato con successo');\r\n } catch (error: any) {\r\n this.showMessage(error.message || \"Errore durante l'import\", true);\r\n }\r\n };\r\n\r\n input.click();\r\n }\r\n\r\n /** Esporta come file JSON. */\r\n onExportJson(): void {\r\n try {\r\n const validation = this.stateService.validateSchema();\r\n if (!validation.valid) {\r\n const message = `Schema con errori:\\n${validation.errors.map((e) => e.message).join('\\n')}`;\r\n if (!confirm(`${message}\\n\\nEsportare comunque?`)) return;\r\n }\r\n this.persistenceService.exportToJSON(this.state.schema);\r\n this.showMessage('Schema esportato con successo');\r\n } catch (error: any) {\r\n this.showMessage(error.message || \"Errore durante l'export\", true);\r\n }\r\n }\r\n\r\n /** Pulisce tutto lo schema. */\r\n onClear(): void {\r\n if (!confirm('Vuoi davvero eliminare tutto? Questa azione non puo essere annullata.')) return;\r\n this.persistenceService.createBackup(this.state.schema);\r\n this.stateService.clearSchema();\r\n this.showMessage('Schema pulito');\r\n }\r\n\r\n // ─── Sezioni ─────────────────────────────────────────────────\r\n\r\n onSectionDuplicate(sectionId: string): void {\r\n this.stateService.duplicateSection(sectionId);\r\n this.showMessage('Sezione duplicata');\r\n }\r\n\r\n onSectionDelete(sectionId: string): void {\r\n if (!confirm('Vuoi davvero eliminare questa sezione?')) return;\r\n this.stateService.removeSection(sectionId);\r\n this.showMessage('Sezione eliminata');\r\n }\r\n\r\n // ─── Campi ───────────────────────────────────────────────────\r\n\r\n onFieldSelect(sectionId: string, fieldKey: string): void {\r\n this.stateService.selectField(sectionId, fieldKey);\r\n }\r\n\r\n onFieldDuplicate(sectionId: string, fieldKey: string): void {\r\n this.stateService.duplicateField(sectionId, fieldKey);\r\n this.showMessage('Campo duplicato');\r\n }\r\n\r\n onFieldDelete(sectionId: string, fieldKey: string): void {\r\n if (!confirm('Vuoi davvero eliminare questo campo?')) return;\r\n this.stateService.removeField(sectionId, fieldKey);\r\n this.showMessage('Campo eliminato');\r\n }\r\n\r\n onFieldUpdate(sectionId: string, fieldKey: string, updates: Partial<UiFormFieldDescriptor>): void {\r\n this.stateService.updateField(sectionId, fieldKey, updates);\r\n }\r\n\r\n /** Gestisce il drop di un campo (dalla palette o tra sezioni). */\r\n onFieldDrop(event: CdkDragDrop<any>): void {\r\n const prevId = event.previousContainer.id;\r\n\r\n if (prevId.startsWith('palette-')) {\r\n // Drop dalla palette\r\n const paletteItem: UiEditorFieldPaletteItem = event.item.data;\r\n const section: UiFormSection = event.container.data;\r\n const newField = this.fieldFactory.createDefaultField(paletteItem.type);\r\n this.stateService.addFieldAtIndex(section.id, newField, event.currentIndex);\r\n this.showMessage(`Campo ${paletteItem.label} aggiunto`);\r\n } else if (event.previousContainer !== event.container) {\r\n // Spostamento tra sezioni\r\n const field: UiFormFieldDescriptor = event.item.data;\r\n const fromSection: UiFormSection = event.previousContainer.data;\r\n const toSection: UiFormSection = event.container.data;\r\n this.stateService.moveFieldBetweenSections(fromSection.id, toSection.id, field.key, event.currentIndex);\r\n this.showMessage('Campo spostato');\r\n } else {\r\n // Riordino nella stessa sezione\r\n const section: UiFormSection = event.container.data;\r\n this.stateService.moveFieldInSection(section.id, event.previousIndex, event.currentIndex);\r\n }\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ─── Computed properties ─────────────────────────────────────\r\n\r\n /** Campo attualmente selezionato. */\r\n get selectedField(): UiFormFieldDescriptor | null {\r\n if (!this.state.selectedFieldKey) return null;\r\n return this.stateService.findFieldByKey(this.state.selectedFieldKey);\r\n }\r\n\r\n /** ID della sezione del campo selezionato. */\r\n get selectedFieldSectionId(): string | null {\r\n if (!this.state.selectedFieldKey) return null;\r\n return this.stateService.findSectionByFieldKey(this.state.selectedFieldKey)?.id || null;\r\n }\r\n\r\n // ─── Tab / Preview ───────────────────────────────────────────\r\n\r\n onTabChange(index: number): void {\r\n this.selectedTabIndex = index;\r\n if (index === 1) this.refreshPreview();\r\n }\r\n\r\n refreshPreview(): void {\r\n this.previewKey++;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ─── Dialog ──────────────────────────────────────────────────\r\n\r\n /** Chiude la modale restituendo lo schema corrente. */\r\n closeDialog(): void {\r\n this.dialogRef?.close(this.state.schema);\r\n }\r\n\r\n // ─── Resize sidebar ──────────────────────────────────────────\r\n\r\n onResizeStart(event: MouseEvent): void {\r\n event.preventDefault();\r\n this.isResizing = true;\r\n this.resizeStartX = event.clientX;\r\n this.resizeStartWidth = this.rightSidebarWidth;\r\n\r\n document.addEventListener('mousemove', this.onResizeMove);\r\n document.addEventListener('mouseup', this.onResizeEnd);\r\n document.body.style.cursor = 'ew-resize';\r\n document.body.style.userSelect = 'none';\r\n }\r\n\r\n private onResizeMove = (event: MouseEvent): void => {\r\n if (!this.isResizing) return;\r\n const delta = this.resizeStartX - event.clientX;\r\n this.rightSidebarWidth = Math.max(\r\n this.MIN_SIDEBAR_WIDTH,\r\n Math.min(this.MAX_SIDEBAR_WIDTH, this.resizeStartWidth + delta),\r\n );\r\n this.cdr.markForCheck();\r\n };\r\n\r\n private onResizeEnd = (): void => {\r\n if (!this.isResizing) return;\r\n this.isResizing = false;\r\n document.removeEventListener('mousemove', this.onResizeMove);\r\n document.removeEventListener('mouseup', this.onResizeEnd);\r\n document.body.style.cursor = '';\r\n document.body.style.userSelect = '';\r\n this.saveSidebarWidth();\r\n };\r\n\r\n // ─── Resize sidebar sinistra ─────────────────────────────────\r\n\r\n onLeftResizeStart(event: MouseEvent): void {\r\n event.preventDefault();\r\n this.isResizingLeft = true;\r\n this.resizeStartX = event.clientX;\r\n this.resizeStartWidth = this.leftSidebarWidth;\r\n\r\n document.addEventListener('mousemove', this.onLeftResizeMove);\r\n document.addEventListener('mouseup', this.onLeftResizeEnd);\r\n document.body.style.cursor = 'ew-resize';\r\n document.body.style.userSelect = 'none';\r\n }\r\n\r\n private onLeftResizeMove = (event: MouseEvent): void => {\r\n if (!this.isResizingLeft) return;\r\n const delta = event.clientX - this.resizeStartX;\r\n this.leftSidebarWidth = Math.max(\r\n this.MIN_LEFT_SIDEBAR_WIDTH,\r\n Math.min(this.MAX_LEFT_SIDEBAR_WIDTH, this.resizeStartWidth + delta),\r\n );\r\n this.cdr.markForCheck();\r\n };\r\n\r\n private onLeftResizeEnd = (): void => {\r\n if (!this.isResizingLeft) return;\r\n this.isResizingLeft = false;\r\n document.removeEventListener('mousemove', this.onLeftResizeMove);\r\n document.removeEventListener('mouseup', this.onLeftResizeEnd);\r\n document.body.style.cursor = '';\r\n document.body.style.userSelect = '';\r\n this.saveLeftSidebarWidth();\r\n };\r\n\r\n // ─── Private ─────────────────────────────────────────────────\r\n\r\n private checkForRecovery(): void {\r\n if (this.persistenceService.hasLocalStorageData()) {\r\n const age = this.persistenceService.getLocalStorageAge();\r\n const message = age\r\n ? `Trovato salvataggio del ${age.toLocaleString('it-IT')}. Vuoi recuperarlo?`\r\n : 'Trovato salvataggio precedente. Vuoi recuperarlo?';\r\n\r\n const ref = this.snackBar.open(message, 'Recupera', { duration: 10000 });\r\n ref.onAction().subscribe(() => {\r\n const schema = this.persistenceService.loadFromLocalStorage();\r\n if (schema) {\r\n this.stateService.setSchema(schema);\r\n this.showMessage('Schema recuperato');\r\n }\r\n });\r\n }\r\n }\r\n\r\n private autoSave(): void {\r\n try {\r\n this.persistenceService.saveToLocalStorage(this.state.schema);\r\n this.stateService.markAsSaved();\r\n } catch {\r\n // Silenzioso per auto-save\r\n }\r\n }\r\n\r\n private updateBreadcrumb(): void {\r\n this.breadcrumb = [\r\n {\r\n label: this.state.schema.title || 'Form',\r\n id: this.state.schema.id,\r\n type: 'form',\r\n active: !this.state.selectedSectionId && !this.state.selectedFieldKey,\r\n },\r\n ];\r\n\r\n if (this.state.selectedSectionId) {\r\n const section = this.state.schema.sections.find((s) => s.id === this.state.selectedSectionId);\r\n if (section) {\r\n this.breadcrumb.push({\r\n label: section.title || 'Sezione',\r\n id: section.id,\r\n type: 'section',\r\n active: !this.state.selectedFieldKey,\r\n });\r\n }\r\n }\r\n\r\n if (this.state.selectedFieldKey) {\r\n const field = this.stateService.findFieldByKey(this.state.selectedFieldKey);\r\n if (field) {\r\n this.breadcrumb.push({\r\n label: field.label,\r\n id: field.key,\r\n type: 'field',\r\n active: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n private updateAvailableFields(): void {\r\n const fields: UiEditorAvailableField[] = [];\r\n this.state.schema.sections.forEach((section) => {\r\n section.fields.forEach((field) => {\r\n const af: UiEditorAvailableField = {\r\n key: field.key,\r\n label: field.label,\r\n type: field.type,\r\n };\r\n if (field.options && Array.isArray(field.options) && field.options.length > 0) {\r\n af.options = field.options.map((opt) => ({\r\n value: opt.value,\r\n label: opt.label,\r\n }));\r\n }\r\n fields.push(af);\r\n });\r\n });\r\n this.availableFields = fields;\r\n }\r\n\r\n private showMessage(message: string, isError = false): void {\r\n this.snackBar.open(message, 'Chiudi', {\r\n duration: 3000,\r\n panelClass: isError ? ['ui-snackbar-error'] : [],\r\n });\r\n }\r\n\r\n private loadSidebarWidth(): void {\r\n try {\r\n const savedRight = localStorage.getItem(this.SIDEBAR_WIDTH_KEY);\r\n if (savedRight) {\r\n const w = parseInt(savedRight, 10);\r\n if (!isNaN(w) && w >= this.MIN_SIDEBAR_WIDTH && w <= this.MAX_SIDEBAR_WIDTH) {\r\n this.rightSidebarWidth = w;\r\n }\r\n }\r\n const savedLeft = localStorage.getItem(this.LEFT_SIDEBAR_WIDTH_KEY);\r\n if (savedLeft) {\r\n const w = parseInt(savedLeft, 10);\r\n if (!isNaN(w) && w >= this.MIN_LEFT_SIDEBAR_WIDTH && w <= this.MAX_LEFT_SIDEBAR_WIDTH) {\r\n this.leftSidebarWidth = w;\r\n }\r\n }\r\n } catch {\r\n // Silenzioso\r\n }\r\n }\r\n\r\n private saveSidebarWidth(): void {\r\n try {\r\n localStorage.setItem(this.SIDEBAR_WIDTH_KEY, this.rightSidebarWidth.toString());\r\n } catch {\r\n // Silenzioso\r\n }\r\n }\r\n\r\n private saveLeftSidebarWidth(): void {\r\n try {\r\n localStorage.setItem(this.LEFT_SIDEBAR_WIDTH_KEY, this.leftSidebarWidth.toString());\r\n } catch {\r\n // Silenzioso\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n inject,\r\n} from '@angular/core';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiModalConfig } from './modal.types';\r\n\r\n/**\r\n * Componente modale standalone con struttura header/body/footer.\r\n *\r\n * Da utilizzare come wrapper all'interno di componenti aperti\r\n * tramite `UiModalService.open()`. Fornisce la struttura visuale\r\n * e gestisce la chiusura programmatica.\r\n *\r\n * **Content projection:**\r\n * - Contenuto di default: va nel body\r\n * - `[uiModalHeader]`: sostituisce il titolo nell'header\r\n * - `[uiModalFooter]`: azioni nel footer\r\n *\r\n * @selector ui-modal\r\n *\r\n * @example\r\n * ```html\r\n * <ui-modal [config]=\"{ title: 'Dettagli', size: 'md' }\">\r\n * <p>Contenuto del body della modale.</p>\r\n * <div uiModalFooter>\r\n * <ui-button label=\"Chiudi\" variant=\"ghost\" (click)=\"close()\" />\r\n * <ui-button label=\"Salva\" variant=\"primary\" (click)=\"save()\" />\r\n * </div>\r\n * </ui-modal>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-modal',\r\n standalone: true,\r\n imports: [LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'ui-modal-host',\r\n role: 'dialog',\r\n 'aria-modal': 'true',\r\n '[attr.aria-label]': 'config.title || null',\r\n },\r\n template: `\r\n <!-- Header -->\r\n @if (config.title || config.showCloseButton !== false) {\r\n <div class=\"ui-modal__header\">\r\n <div class=\"ui-modal__header-content\">\r\n <ng-content select=\"[uiModalHeader]\">\r\n @if (config.title) {\r\n <h2 class=\"ui-modal__title\">{{ config.title }}</h2>\r\n }\r\n </ng-content>\r\n </div>\r\n @if (config.showCloseButton !== false) {\r\n <button\r\n class=\"ui-modal__close\"\r\n (click)=\"close()\"\r\n aria-label=\"Chiudi modale\"\r\n type=\"button\"\r\n >\r\n <lucide-icon name=\"x\" [size]=\"18\" aria-hidden=\"true\" />\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Body -->\r\n <div class=\"ui-modal__body\">\r\n <ng-content />\r\n </div>\r\n\r\n <!-- Footer -->\r\n @if (!config.hideFooter) {\r\n <div class=\"ui-modal__footer\">\r\n <ng-content select=\"[uiModalFooter]\" />\r\n </div>\r\n }\r\n `,\r\n styleUrl: './modal.component.scss',\r\n})\r\nexport class UiModalComponent {\r\n /** Configurazione strutturale della modale. */\r\n @Input() config: UiModalConfig = {};\r\n\r\n /**\r\n * Emesso quando la modale viene chiusa.\r\n * Utile se il componente e usato direttamente nel template\r\n * senza UiModalService.\r\n */\r\n @Output() closed = new EventEmitter<unknown>();\r\n\r\n /** @internal Riferimento al dialogo Material per la chiusura. */\r\n private dialogRef = inject(MatDialogRef, { optional: true });\r\n\r\n /** Chiude la modale con un risultato opzionale. */\r\n close(result?: unknown): void {\r\n if (this.dialogRef) {\r\n this.dialogRef.close(result);\r\n } else {\r\n this.closed.emit(result);\r\n }\r\n }\r\n}\r\n","import { Component, ChangeDetectionStrategy, ViewEncapsulation, inject } from '@angular/core';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiButtonComponent } from '../button/button.component';\r\nimport { UiConfirmDialogData, UiConfirmVariant, UiIconName, UiVariant } from './modal.types';\r\n\r\n/** @internal Mappatura variante -> icona Lucide di default. */\r\nconst VARIANT_ICON_MAP: Record<UiConfirmVariant, UiIconName> = {\r\n confirm: 'check-circle',\r\n delete: 'trash-2',\r\n warn: 'alert-triangle',\r\n info: 'info',\r\n};\r\n\r\n/** @internal Mappatura variante -> colore pulsante di conferma. */\r\nconst VARIANT_BUTTON_MAP: Record<UiConfirmVariant, UiVariant> = {\r\n confirm: 'primary',\r\n delete: 'warn',\r\n warn: 'warn',\r\n info: 'primary',\r\n};\r\n\r\n/**\r\n * Dialogo di conferma leggero per azioni condizionali.\r\n *\r\n * Non va utilizzato direttamente nel template: viene aperto\r\n * programmaticamente tramite `UiModalService.confirm()` e i suoi\r\n * metodi scorciatoia (`confirmDelete`, `confirmDiscard`, `confirmSave`).\r\n *\r\n * Supporta quattro varianti semantiche — confirm, delete, warn, info —\r\n * ciascuna con icona e colore preconfigurati.\r\n *\r\n * @selector ui-confirm-dialog\r\n *\r\n * @example\r\n * ```typescript\r\n * // Apertura tramite servizio\r\n * this.modalService.confirm({\r\n * title: 'Conferma eliminazione',\r\n * message: 'Questa azione non puo essere annullata.',\r\n * variant: 'delete',\r\n * }).subscribe(confirmed => {\r\n * if (confirmed) this.deleteItem();\r\n * });\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-confirm-dialog',\r\n standalone: true,\r\n imports: [LucideAngularModule, UiButtonComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'ui-confirm-dialog-host',\r\n role: 'alertdialog',\r\n 'aria-modal': 'true',\r\n '[attr.aria-labelledby]': '\"ui-confirm-title\"',\r\n '[attr.aria-describedby]': '\"ui-confirm-message\"',\r\n },\r\n template: `\r\n <div class=\"ui-confirm-dialog\">\r\n <!-- Icona -->\r\n <div [class]=\"iconClasses\">\r\n <lucide-icon [name]=\"iconName\" [size]=\"32\" aria-hidden=\"true\" />\r\n </div>\r\n\r\n <!-- Contenuto -->\r\n <div class=\"ui-confirm-dialog__content\">\r\n @if (data.title) {\r\n <h3 class=\"ui-confirm-dialog__title\" id=\"ui-confirm-title\">{{ data.title }}</h3>\r\n }\r\n <p class=\"ui-confirm-dialog__message\" id=\"ui-confirm-message\">{{ data.message }}</p>\r\n </div>\r\n\r\n <!-- Azioni -->\r\n <div class=\"ui-confirm-dialog__actions\">\r\n <ui-button\r\n [label]=\"data.cancelText || 'Annulla'\"\r\n variant=\"ghost\"\r\n size=\"md\"\r\n (click)=\"cancel()\"\r\n />\r\n <ui-button\r\n [label]=\"data.confirmText || 'Conferma'\"\r\n [variant]=\"confirmButtonVariant\"\r\n size=\"md\"\r\n (click)=\"confirm()\"\r\n />\r\n </div>\r\n </div>\r\n `,\r\n styleUrl: './confirm-dialog.component.scss',\r\n})\r\nexport class UiConfirmDialogComponent {\r\n /** @internal Dati iniettati dal servizio modale. */\r\n readonly data: UiConfirmDialogData = inject(MAT_DIALOG_DATA);\r\n\r\n /** @internal Riferimento al dialogo per la chiusura. */\r\n private readonly dialogRef = inject(MatDialogRef);\r\n\r\n /** Variante semantica corrente. */\r\n get variant(): UiConfirmVariant {\r\n return this.data.variant || 'confirm';\r\n }\r\n\r\n /** Nome icona Lucide da visualizzare. */\r\n get iconName(): UiIconName {\r\n return this.data.icon || VARIANT_ICON_MAP[this.variant];\r\n }\r\n\r\n /** Variante del pulsante di conferma. */\r\n get confirmButtonVariant(): UiVariant {\r\n return VARIANT_BUTTON_MAP[this.variant];\r\n }\r\n\r\n /** Classi CSS per il contenitore icona. */\r\n get iconClasses(): string {\r\n return `ui-confirm-dialog__icon ui-confirm-dialog__icon--${this.variant}`;\r\n }\r\n\r\n /** Conferma e chiude il dialogo con `true`. */\r\n confirm(): void {\r\n this.dialogRef.close(true);\r\n }\r\n\r\n /** Annulla e chiude il dialogo con `false`. */\r\n cancel(): void {\r\n this.dialogRef.close(false);\r\n }\r\n}\r\n","import { Injectable, inject, Type } from '@angular/core';\r\nimport { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\r\nimport { Observable, map } from 'rxjs';\r\nimport { UiConfirmDialogComponent } from './confirm-dialog.component';\r\nimport { UiConfirmDialogData, UiModalOpenConfig, UiModalSize } from './modal.types';\r\n\r\n/** @internal Mappatura dimensione -> larghezza CSS per il pannello overlay. */\r\nconst SIZE_WIDTH_MAP: Record<UiModalSize, string> = {\r\n sm: '400px',\r\n md: '560px',\r\n lg: '720px',\r\n xl: '900px',\r\n fullscreen: '95vw',\r\n};\r\n\r\n/**\r\n * Servizio per aprire modali e dialoghi di conferma.\r\n *\r\n * Gestisce lo stacking intelligente: una modale regolare puo\r\n * ospitare al massimo un dialogo di conferma sopra di se.\r\n * Non e possibile stackare due modali regolari.\r\n *\r\n * @usageNotes\r\n *\r\n * ### Aprire una modale personalizzata\r\n * ```typescript\r\n * const ref = this.modalService.open(MyDialogComponent, {\r\n * size: 'lg',\r\n * data: { userId: 123 },\r\n * });\r\n *\r\n * ref.afterClosed().subscribe(result => {\r\n * console.log('Risultato:', result);\r\n * });\r\n * ```\r\n *\r\n * ### Conferma rapida\r\n * ```typescript\r\n * this.modalService.confirm('Confermi questa azione?')\r\n * .subscribe(ok => { if (ok) this.procedi(); });\r\n * ```\r\n *\r\n * ### Preset di conferma\r\n * ```typescript\r\n * this.modalService.confirmDelete('Progetto Alpha')\r\n * .subscribe(ok => { if (ok) this.elimina(); });\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiModalService {\r\n /** @internal Istanza MatDialog per la gestione overlay. */\r\n private readonly dialog = inject(MatDialog);\r\n\r\n /** @internal Stack delle modali regolari aperte. */\r\n private _modalStack: MatDialogRef<unknown>[] = [];\r\n\r\n /** @internal Traccia se un dialogo di conferma e attualmente aperto. */\r\n private _confirmOpen = false;\r\n\r\n /**\r\n * Apre una modale con un componente personalizzato.\r\n *\r\n * Il componente aperto puo iniettare `MAT_DIALOG_DATA` per accedere\r\n * ai dati e `MatDialogRef` per chiudere la modale.\r\n *\r\n * @param component - Componente standalone da renderizzare nella modale\r\n * @param config - Configurazione (dimensione, dati, comportamento)\r\n * @returns Riferimento alla modale aperta\r\n */\r\n open<T, D = unknown, R = unknown>(component: Type<T>, config?: UiModalOpenConfig<D>): MatDialogRef<T, R> {\r\n // Regola di stacking: non stackare due modali regolari\r\n if (this._modalStack.length > 0) {\r\n console.warn(\r\n '[UiModalService] Una modale e gia aperta. ' +\r\n 'Usa confirm() per aprire un dialogo di conferma sopra la modale corrente.',\r\n );\r\n }\r\n\r\n const size = config?.size || 'md';\r\n\r\n const dialogConfig: MatDialogConfig<D> = {\r\n width: SIZE_WIDTH_MAP[size],\r\n maxWidth: size === 'fullscreen' ? '95vw' : '90vw',\r\n maxHeight: size === 'fullscreen' ? '95vh' : '90vh',\r\n height: size === 'fullscreen' ? '95vh' : undefined,\r\n disableClose: config?.disableClose ?? false,\r\n autoFocus: true,\r\n restoreFocus: true,\r\n data: config?.data as D,\r\n panelClass: ['ui-modal-panel', `ui-modal-panel--${size}`, ...(config?.panelClass ? [config.panelClass] : [])],\r\n hasBackdrop: true,\r\n backdropClass: ['cdk-overlay-dark-backdrop', 'ui-modal-backdrop'],\r\n };\r\n\r\n const ref = this.dialog.open(component, dialogConfig) as MatDialogRef<T, R>;\r\n\r\n this._modalStack.push(ref as MatDialogRef<unknown>);\r\n ref.afterClosed().subscribe(() => {\r\n this._modalStack = this._modalStack.filter((r) => r !== (ref as MatDialogRef<unknown>));\r\n });\r\n\r\n return ref;\r\n }\r\n\r\n /**\r\n * Apre un dialogo di conferma.\r\n *\r\n * Accetta una stringa semplice (messaggio) o un oggetto di\r\n * configurazione completo. Puo essere aperto sopra una modale\r\n * esistente (stacking consentito).\r\n *\r\n * @param messageOrConfig - Messaggio o configurazione completa\r\n * @returns Observable che emette `true` se confermato, `false` se annullato\r\n */\r\n confirm(messageOrConfig: string | UiConfirmDialogData): Observable<boolean> {\r\n const data: UiConfirmDialogData =\r\n typeof messageOrConfig === 'string' ? { message: messageOrConfig } : messageOrConfig;\r\n\r\n // Un solo dialogo di conferma alla volta\r\n if (this._confirmOpen) {\r\n console.warn('[UiModalService] Un dialogo di conferma e gia aperto.');\r\n return new Observable((subscriber) => {\r\n subscriber.next(false);\r\n subscriber.complete();\r\n });\r\n }\r\n\r\n this._confirmOpen = true;\r\n\r\n const dialogConfig: MatDialogConfig<UiConfirmDialogData> = {\r\n width: '420px',\r\n maxWidth: '90vw',\r\n disableClose: false,\r\n autoFocus: false,\r\n restoreFocus: true,\r\n data,\r\n panelClass: ['ui-confirm-panel'],\r\n hasBackdrop: true,\r\n backdropClass:\r\n this._modalStack.length > 0\r\n ? ['cdk-overlay-dark-backdrop', 'ui-confirm-backdrop--stacked']\r\n : ['cdk-overlay-dark-backdrop', 'ui-modal-backdrop'],\r\n };\r\n\r\n const ref = this.dialog.open(UiConfirmDialogComponent, dialogConfig);\r\n\r\n return ref.afterClosed().pipe(\r\n map((result) => {\r\n this._confirmOpen = false;\r\n return !!result;\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Scorciatoia: conferma eliminazione.\r\n * Variante `delete` con icona cestino e pulsante warn.\r\n *\r\n * @param itemName - Nome opzionale dell'elemento da eliminare\r\n */\r\n confirmDelete(itemName?: string): Observable<boolean> {\r\n return this.confirm({\r\n title: 'Conferma eliminazione',\r\n message: itemName\r\n ? `Sei sicuro di voler eliminare \"${itemName}\"? Questa azione non puo essere annullata.`\r\n : 'Sei sicuro di voler eliminare questo elemento? Questa azione non puo essere annullata.',\r\n confirmText: 'Elimina',\r\n cancelText: 'Annulla',\r\n variant: 'delete',\r\n });\r\n }\r\n\r\n /**\r\n * Scorciatoia: conferma abbandono modifiche.\r\n * Variante `warn` con icona avviso.\r\n */\r\n confirmDiscard(): Observable<boolean> {\r\n return this.confirm({\r\n title: 'Modifiche non salvate',\r\n message: 'Ci sono modifiche non salvate. Sei sicuro di voler uscire senza salvare?',\r\n confirmText: 'Esci senza salvare',\r\n cancelText: 'Rimani',\r\n variant: 'warn',\r\n });\r\n }\r\n\r\n /**\r\n * Scorciatoia: conferma salvataggio.\r\n * Variante `confirm` con icona check.\r\n */\r\n confirmSave(): Observable<boolean> {\r\n return this.confirm({\r\n title: 'Conferma salvataggio',\r\n message: 'Sei sicuro di voler salvare le modifiche?',\r\n confirmText: 'Salva',\r\n cancelText: 'Annulla',\r\n variant: 'confirm',\r\n });\r\n }\r\n\r\n /** Chiude tutte le modali e dialoghi aperti. */\r\n closeAll(): void {\r\n this.dialog.closeAll();\r\n this._modalStack = [];\r\n this._confirmOpen = false;\r\n }\r\n\r\n /** Indica se ci sono modali o dialoghi attualmente aperti. */\r\n get hasOpenDialogs(): boolean {\r\n return this.dialog.openDialogs.length > 0;\r\n }\r\n\r\n /** Numero di modali regolari attualmente aperte. */\r\n get openModalCount(): number {\r\n return this._modalStack.length;\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder-editor\r\n * Servizio per aprire l'editor visuale in una modale fullscreen.\r\n */\r\n\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { UiFormSchema } from '../form-builder/types/index';\r\nimport { UiModalService } from '../modal/index';\r\nimport { UiFormBuilderEditorComponent } from './form-builder-editor.component';\r\n\r\n/**\r\n * Servizio per aprire l'editor visuale del form builder\r\n * in una modale fullscreen tramite il UiModalService.\r\n *\r\n * @usageNotes\r\n *\r\n * ### Apertura base\r\n * ```typescript\r\n * const ref = this.editorService.open();\r\n * ref.afterClosed().subscribe(schema => {\r\n * if (schema) console.log('Schema risultante:', schema);\r\n * });\r\n * ```\r\n *\r\n * ### Apertura con schema iniziale\r\n * ```typescript\r\n * this.editorService.open(myExistingSchema)\r\n * .afterClosed()\r\n * .subscribe(schema => { ... });\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiFormBuilderEditorService {\r\n /** @internal Servizio modale per l'apertura. */\r\n private readonly modalService = inject(UiModalService);\r\n\r\n /**\r\n * Apre l'editor in una modale fullscreen.\r\n *\r\n * @param initialSchema - Schema iniziale da caricare nell'editor\r\n * @returns Riferimento alla dialog per gestire chiusura e risultato\r\n */\r\n open(initialSchema?: UiFormSchema): MatDialogRef<UiFormBuilderEditorComponent, UiFormSchema | null> {\r\n return this.modalService.open<UiFormBuilderEditorComponent, any, UiFormSchema | null>(\r\n UiFormBuilderEditorComponent,\r\n {\r\n size: 'fullscreen',\r\n disableClose: false,\r\n data: { initialSchema },\r\n panelClass: 'ui-form-builder-editor-dialog',\r\n },\r\n );\r\n }\r\n}\r\n","/**\n * @module ng-ui-system/form-builder-editor\n * Tipi e interfacce per l'editor visuale del form builder.\n */\n\nimport { UiFieldType, UiFormSchema } from '../../form-builder/types/index';\nimport { UiIconName } from '../../../core/types';\n\n// ─── Stato dell'editor ───────────────────────────────────────────\n\n/**\n * Stato corrente dell'editor.\n * Gestito dal servizio UiEditorStateService tramite BehaviorSubject.\n */\nexport interface UiEditorState {\n /** Schema del form in fase di editing. */\n schema: UiFormSchema;\n /** ID della sezione attualmente selezionata. */\n selectedSectionId: string | null;\n /** Chiave del campo attualmente selezionato. */\n selectedFieldKey: string | null;\n /** Indica se lo schema e stato modificato dall'ultimo salvataggio. */\n isDirty: boolean;\n /** Data dell'ultimo salvataggio. */\n lastSaved: Date | null;\n}\n\n// ─── Palette ─────────────────────────────────────────────────────\n\n/**\n * Categorie per raggruppare i tipi di campo nella palette.\n */\nexport type UiEditorFieldCategory = 'basic' | 'choice' | 'datetime' | 'advanced' | 'custom';\n\n/**\n * Elemento della palette dei tipi di campo.\n * Rappresenta un tipo di campo trascinabile nella palette laterale.\n */\nexport interface UiEditorFieldPaletteItem {\n /** Tipo di campo. */\n type: UiFieldType;\n /** Nome visualizzato nella palette. */\n label: string;\n /** Icona Lucide da mostrare. */\n icon: UiIconName;\n /** Descrizione breve del tipo di campo. */\n description: string;\n /** Categoria di appartenenza. */\n category: UiEditorFieldCategory;\n}\n\n/**\n * Campo disponibile per la selezione nelle condizioni.\n * Versione semplificata del field descriptor per le select.\n */\nexport interface UiEditorAvailableField {\n /** Chiave univoca del campo. */\n key: string;\n /** Label visualizzata. */\n label: string;\n /** Tipo di campo. */\n type: string;\n /** Opzioni (per campi select, radio, etc.). */\n options?: { value: any; label: string }[];\n}\n\n// ─── Breadcrumb ──────────────────────────────────────────────────\n\n/**\n * Elemento del breadcrumb di navigazione dell'editor.\n */\nexport interface UiEditorBreadcrumbItem {\n /** Label visualizzata. */\n label: string;\n /** ID dell'elemento (form, sezione o campo). */\n id: string;\n /** Tipo di elemento. */\n type: 'form' | 'section' | 'field';\n /** Se e l'elemento attualmente attivo. */\n active: boolean;\n}\n\n// ─── Persistenza ─────────────────────────────────────────────────\n\n/**\n * Struttura dati per il salvataggio nel localStorage.\n */\nexport interface UiEditorStorageData {\n /** Schema salvato. */\n schema: UiFormSchema;\n /** Timestamp del salvataggio (epoch ms). */\n timestamp: number;\n /** Versione dello storage per compatibilita futura. */\n version: string;\n}\n\n// ─── Validazione dello schema ────────────────────────────────────\n\n/**\n * Risultato della validazione dello schema nell'editor.\n */\nexport interface UiEditorSchemaValidationResult {\n /** Se lo schema e valido. */\n valid: boolean;\n /** Errori di validazione. */\n errors: UiEditorSchemaValidationError[];\n /** Warning di validazione. */\n warnings: UiEditorSchemaValidationWarning[];\n}\n\n/**\n * Errore di validazione dello schema.\n */\nexport interface UiEditorSchemaValidationError {\n /** Tipo di errore. */\n type: 'duplicate_key' | 'invalid_type' | 'missing_required' | 'invalid_reference' | 'invalid_format';\n /** Messaggio di errore. */\n message: string;\n /** Path dell'elemento con errore (es. `sections[0].fields[2].key`). */\n path: string;\n}\n\n/**\n * Warning di validazione dello schema.\n */\nexport interface UiEditorSchemaValidationWarning {\n /** Tipo di warning. */\n type: 'missing_label' | 'empty_options' | 'unused_field' | 'circular_condition';\n /** Messaggio di warning. */\n message: string;\n /** Path dell'elemento con warning. */\n path: string;\n}\n\n// ─── Configurazione editor ───────────────────────────────────────\n\n/**\n * Dati passati alla modale dell'editor.\n * Iniettabili tramite MAT_DIALOG_DATA.\n */\nexport interface UiEditorDialogData {\n /** Schema iniziale da caricare nell'editor. */\n initialSchema?: UiFormSchema;\n}\n","/**\n * @module ng-ui-system/form-builder-editor\n * Preset di schemi per l'editor del form builder.\n *\n * Raccolta di scenari comuni che dimostrano le capacità del descrittore:\n * - Validazione avanzata (required, pattern, cross-field)\n * - Condizioni di visibilità e disabilitazione\n * - Layout multi-colonna con breakpoints\n * - Campi select/radio/multiselect con opzioni\n * - Sezioni multiple organizzate per contesto\n * - File upload, switch, divider, textarea\n *\n * Utilizzabili sia nella variante Material che Bootstrap Italia.\n */\n\nimport type { UiFormSchema } from '../../form-builder/types/index';\n\n// ────────────────────────────────────────────────────────────────────\n// 1 · Anagrafica dipendente — form HR\n// ────────────────────────────────────────────────────────────────────\n\nexport const PRESET_ANAGRAFICA: UiFormSchema = {\n id: 'preset-anagrafica',\n title: 'Scheda Anagrafica Dipendente',\n description: 'Form HR per onboarding dipendente con dati personali, contatti e documenti.',\n sections: [\n {\n id: 'dati-personali',\n title: 'Dati Personali',\n fields: [\n {\n key: 'nome', type: 'text', label: 'Nome', required: true,\n placeholder: 'Mario', layout: { columns: 4 },\n validation: [{ type: 'required', message: 'Nome obbligatorio' }],\n },\n {\n key: 'cognome', type: 'text', label: 'Cognome', required: true,\n placeholder: 'Rossi', layout: { columns: 4 },\n validation: [{ type: 'required', message: 'Cognome obbligatorio' }],\n },\n {\n key: 'codice_fiscale', type: 'text', label: 'Codice Fiscale', required: true,\n placeholder: 'RSSMRA85M01H501Z', layout: { columns: 4 },\n validation: [\n { type: 'required', message: 'CF obbligatorio' },\n { type: 'pattern', value: '^[A-Z]{6}\\\\d{2}[A-Z]\\\\d{2}[A-Z]\\\\d{3}[A-Z]$', message: 'Formato CF non valido' },\n ],\n },\n {\n key: 'data_nascita', type: 'date', label: 'Data di nascita', required: true,\n layout: { columns: 4 },\n },\n {\n key: 'sesso', type: 'radio', label: 'Sesso', layout: { columns: 4 },\n options: [\n { value: 'M', label: 'Maschio' },\n { value: 'F', label: 'Femmina' },\n { value: 'X', label: 'Non specificato' },\n ],\n },\n {\n key: 'stato_civile', type: 'select', label: 'Stato civile', layout: { columns: 4 },\n options: [\n { value: 'celibe', label: 'Celibe/Nubile' },\n { value: 'coniugato', label: 'Coniugato/a' },\n { value: 'divorziato', label: 'Divorziato/a' },\n { value: 'vedovo', label: 'Vedovo/a' },\n ],\n },\n ],\n },\n {\n id: 'contatti',\n title: 'Contatti',\n fields: [\n {\n key: 'email', type: 'email', label: 'Email aziendale', required: true,\n placeholder: 'mario.rossi@azienda.it', layout: { columns: 6 },\n validation: [\n { type: 'required', message: 'Email obbligatoria' },\n { type: 'email', message: 'Formato email non valido' },\n ],\n },\n {\n key: 'telefono', type: 'text', label: 'Telefono', layout: { columns: 6 },\n placeholder: '+39 333 1234567',\n validation: [\n { type: 'pattern', value: '^\\\\+?[\\\\d\\\\s-]{8,15}$', message: 'Formato telefono non valido' },\n ],\n },\n { key: 'div-indirizzo', type: 'divider', label: 'Indirizzo di residenza' },\n {\n key: 'indirizzo', type: 'text', label: 'Via e numero', layout: { columns: 8 },\n placeholder: 'Via Roma 42',\n },\n {\n key: 'cap', type: 'text', label: 'CAP', layout: { columns: 4 },\n validation: [{ type: 'pattern', value: '^\\\\d{5}$', message: 'CAP: 5 cifre' }],\n },\n {\n key: 'citta', type: 'text', label: 'Città', layout: { columns: 6 },\n },\n {\n key: 'provincia', type: 'text', label: 'Provincia', layout: { columns: 2 },\n placeholder: 'RM',\n validation: [{ type: 'maxLength', value: 2, message: 'Max 2 caratteri' }],\n },\n ],\n },\n {\n id: 'documenti',\n title: 'Documenti',\n fields: [\n {\n key: 'tipo_documento', type: 'select', label: 'Tipo documento', layout: { columns: 4 },\n options: [\n { value: 'ci', label: 'Carta d\\'identità' },\n { value: 'passaporto', label: 'Passaporto' },\n { value: 'patente', label: 'Patente di guida' },\n ],\n },\n {\n key: 'numero_documento', type: 'text', label: 'Numero documento', layout: { columns: 4 },\n conditions: [{ field: 'tipo_documento', operator: 'is_not_empty' }],\n },\n {\n key: 'scadenza_documento', type: 'date', label: 'Scadenza', layout: { columns: 4 },\n conditions: [{ field: 'tipo_documento', operator: 'is_not_empty' }],\n },\n {\n key: 'allegato', type: 'file', label: 'Scansione documento',\n fileConfig: { maxFileSize: 5_000_000, acceptedTypes: ['application/pdf', 'image/*'], maxFiles: 2 },\n conditions: [{ field: 'tipo_documento', operator: 'is_not_empty' }],\n },\n ],\n },\n ],\n config: { columns: 12, showButtons: false },\n};\n\n// ────────────────────────────────────────────────────────────────────\n// 2 · Richiesta intervento tecnico\n// ────────────────────────────────────────────────────────────────────\n\nexport const PRESET_TICKET: UiFormSchema = {\n id: 'preset-ticket',\n title: 'Richiesta Intervento Tecnico',\n description: 'Ticket di assistenza tecnica con priorità, categoria e allegati.',\n sections: [\n {\n id: 'info-richiesta',\n title: 'Informazioni Richiesta',\n fields: [\n {\n key: 'oggetto', type: 'text', label: 'Oggetto', required: true,\n placeholder: 'Breve descrizione del problema',\n validation: [\n { type: 'required', message: 'Oggetto obbligatorio' },\n { type: 'minLength', value: 10, message: 'Minimo 10 caratteri' },\n ],\n },\n {\n key: 'priorita', type: 'radio', label: 'Priorità', required: true,\n layout: { columns: 6 },\n options: [\n { value: 'bassa', label: '🟢 Bassa' },\n { value: 'media', label: '🟡 Media' },\n { value: 'alta', label: '🟠 Alta' },\n { value: 'critica', label: '🔴 Critica' },\n ],\n },\n {\n key: 'categoria', type: 'select', label: 'Categoria', required: true,\n layout: { columns: 6 },\n options: [\n { value: 'hardware', label: 'Hardware' },\n { value: 'software', label: 'Software' },\n { value: 'rete', label: 'Rete / Connettività' },\n { value: 'account', label: 'Account / Permessi' },\n { value: 'altro', label: 'Altro' },\n ],\n },\n {\n key: 'categoria_altro', type: 'text', label: 'Specifica categoria',\n placeholder: 'Descrivi la categoria',\n conditions: [{ field: 'categoria', operator: 'equals', value: 'altro' }],\n },\n {\n key: 'descrizione', type: 'textarea', label: 'Descrizione dettagliata', required: true,\n placeholder: 'Descrivi il problema nel dettaglio, includendo passaggi per riprodurlo...',\n validation: [\n { type: 'required', message: 'Descrizione obbligatoria' },\n { type: 'minLength', value: 30, message: 'Fornisci almeno 30 caratteri' },\n ],\n },\n ],\n },\n {\n id: 'dettagli-tecnici',\n title: 'Dettagli Tecnici',\n fields: [\n {\n key: 'sistema_operativo', type: 'select', label: 'Sistema operativo', layout: { columns: 6 },\n options: [\n { value: 'win11', label: 'Windows 11' },\n { value: 'win10', label: 'Windows 10' },\n { value: 'macos', label: 'macOS' },\n { value: 'linux', label: 'Linux' },\n ],\n },\n {\n key: 'data_primo_evento', type: 'datetime', label: 'Primo evento', layout: { columns: 6 },\n tooltip: 'Quando si è verificato il problema per la prima volta?',\n },\n {\n key: 'riproducibile', type: 'switch', label: 'Il problema è riproducibile?',\n layout: { columns: 6 },\n },\n {\n key: 'frequenza', type: 'select', label: 'Frequenza', layout: { columns: 6 },\n conditions: [{ field: 'riproducibile', operator: 'equals', value: true }],\n options: [\n { value: 'sempre', label: 'Sempre' },\n { value: 'spesso', label: 'Spesso (>50%)' },\n { value: 'occasionale', label: 'Occasionalmente' },\n { value: 'raro', label: 'Raramente' },\n ],\n },\n {\n key: 'screenshot', type: 'file', label: 'Screenshot / Allegati',\n fileConfig: { maxFileSize: 10_000_000, acceptedTypes: ['image/*', 'application/pdf'], maxFiles: 5, multiple: true },\n },\n ],\n },\n {\n id: 'consenso',\n title: 'Consenso e Invio',\n fields: [\n {\n key: 'accesso_remoto', type: 'checkbox', label: 'Autorizzo l\\'accesso remoto alla mia postazione',\n },\n {\n key: 'privacy', type: 'checkbox', label: 'Ho letto e accetto l\\'informativa sulla privacy', required: true,\n validation: [{ type: 'required', message: 'Devi accettare l\\'informativa' }],\n },\n {\n key: 'note_aggiuntive', type: 'textarea', label: 'Note aggiuntive',\n placeholder: 'Informazioni extra utili per la risoluzione...',\n },\n ],\n },\n ],\n config: { columns: 12, showButtons: false },\n};\n\n// ────────────────────────────────────────────────────────────────────\n// 3 · Questionario di valutazione\n// ────────────────────────────────────────────────────────────────────\n\nexport const PRESET_SURVEY: UiFormSchema = {\n id: 'preset-survey',\n title: 'Questionario di Valutazione',\n description: 'Survey di soddisfazione con branching condizionale e scala Likert.',\n sections: [\n {\n id: 'profilo',\n title: 'Profilo Rispondente',\n fields: [\n {\n key: 'ruolo', type: 'select', label: 'Il tuo ruolo', required: true,\n layout: { columns: 6 },\n options: [\n { value: 'dipendente', label: 'Dipendente' },\n { value: 'manager', label: 'Manager / Responsabile' },\n { value: 'dirigente', label: 'Dirigente' },\n { value: 'esterno', label: 'Collaboratore esterno' },\n ],\n },\n {\n key: 'anzianita', type: 'select', label: 'Anzianità in azienda', layout: { columns: 6 },\n options: [\n { value: '<1', label: 'Meno di 1 anno' },\n { value: '1-3', label: '1-3 anni' },\n { value: '3-5', label: '3-5 anni' },\n { value: '5-10', label: '5-10 anni' },\n { value: '>10', label: 'Oltre 10 anni' },\n ],\n },\n {\n key: 'dipartimento', type: 'multiselect', label: 'Dipartimento/i di riferimento',\n options: [\n { value: 'it', label: 'IT' },\n { value: 'hr', label: 'Risorse Umane' },\n { value: 'finance', label: 'Amministrazione' },\n { value: 'sales', label: 'Commerciale' },\n { value: 'ops', label: 'Operations' },\n { value: 'legal', label: 'Legale' },\n ],\n },\n ],\n },\n {\n id: 'soddisfazione',\n title: 'Soddisfazione Generale',\n fields: [\n {\n key: 'soddisfazione_globale', type: 'radio', label: 'Quanto sei soddisfatto complessivamente?', required: true,\n options: [\n { value: 1, label: '1 — Molto insoddisfatto' },\n { value: 2, label: '2 — Insoddisfatto' },\n { value: 3, label: '3 — Neutrale' },\n { value: 4, label: '4 — Soddisfatto' },\n { value: 5, label: '5 — Molto soddisfatto' },\n ],\n },\n {\n key: 'motivo_insoddisfazione', type: 'textarea', label: 'Cosa potremmo migliorare?',\n placeholder: 'Descrivi i motivi della tua insoddisfazione...',\n conditions: [\n { field: 'soddisfazione_globale', operator: 'less_than', value: 3 },\n ],\n validation: [{ type: 'required', message: 'Aiutaci a capire cosa migliorare' }],\n },\n {\n key: 'ambiente_lavoro', type: 'radio', label: 'Ambiente di lavoro',\n options: [\n { value: 1, label: '1 — Pessimo' },\n { value: 2, label: '2 — Scarso' },\n { value: 3, label: '3 — Sufficiente' },\n { value: 4, label: '4 — Buono' },\n { value: 5, label: '5 — Eccellente' },\n ],\n layout: { columns: 6 },\n },\n {\n key: 'work_life_balance', type: 'radio', label: 'Work-Life Balance',\n options: [\n { value: 1, label: '1 — Pessimo' },\n { value: 2, label: '2 — Scarso' },\n { value: 3, label: '3 — Sufficiente' },\n { value: 4, label: '4 — Buono' },\n { value: 5, label: '5 — Eccellente' },\n ],\n layout: { columns: 6 },\n },\n ],\n },\n {\n id: 'formazione',\n title: 'Formazione e Crescita',\n fields: [\n {\n key: 'formazione_adeguata', type: 'switch', label: 'La formazione ricevuta è adeguata al tuo ruolo?',\n },\n {\n key: 'aree_formazione', type: 'freemultiselect', label: 'In quali aree vorresti formazione?',\n placeholder: 'Digita e premi Invio per aggiungere...',\n conditions: [{ field: 'formazione_adeguata', operator: 'equals', value: false }],\n },\n {\n key: 'crescita_professionale', type: 'radio', label: 'Opportunità di crescita professionale',\n options: [\n { value: 1, label: '1 — Pessima' },\n { value: 2, label: '2 — Scarsa' },\n { value: 3, label: '3 — Sufficiente' },\n { value: 4, label: '4 — Buona' },\n { value: 5, label: '5 — Eccellente' },\n ],\n },\n {\n key: 'suggerimenti', type: 'textarea', label: 'Suggerimenti liberi',\n placeholder: 'Qualsiasi commento, suggerimento o proposta...',\n },\n {\n key: 'anonimo', type: 'switch', label: 'Rispondi in forma anonima',\n defaultValue: true,\n },\n ],\n },\n ],\n config: { columns: 12, showButtons: false },\n};\n\n// ────────────────────────────────────────────────────────────────────\n// Indice export\n// ────────────────────────────────────────────────────────────────────\n\nexport interface EditorPresetInfo {\n key: string;\n label: string;\n description: string;\n schema: UiFormSchema;\n}\n\nexport const EDITOR_PRESETS: EditorPresetInfo[] = [\n {\n key: 'anagrafica',\n label: 'Anagrafica Dipendente',\n description: 'Form HR multi-sezione: dati personali, contatti, documenti con condizioni e validazione pattern.',\n schema: PRESET_ANAGRAFICA,\n },\n {\n key: 'ticket',\n label: 'Ticket Assistenza',\n description: 'Richiesta intervento tecnico con priorità, condizioni, switch e file upload.',\n schema: PRESET_TICKET,\n },\n {\n key: 'survey',\n label: 'Questionario Valutazione',\n description: 'Survey con scala Likert, branching condizionale, multiselect e freemultiselect.',\n schema: PRESET_SURVEY,\n },\n];\n","// ── Componente principale ──\r\nexport { UiFormBuilderEditorComponent } from './form-builder-editor.component';\r\n\r\n// ── Servizio apertura modale ──\r\nexport { UiFormBuilderEditorService } from './form-builder-editor.service';\r\n\r\n// ── Servizi interni (esposti per uso avanzato) ──\r\nexport { UiEditorStateService } from './services/editor-state.service';\r\nexport { UiEditorPersistenceService } from './services/editor-persistence.service';\r\nexport { UiEditorFieldFactoryService } from './services/field-factory.service';\r\n\r\n// ── Sotto-componenti (esposti per composizione custom) ──\r\nexport { UiEditorToolbarComponent } from './sub-components/editor-toolbar/editor-toolbar.component';\r\nexport { UiFieldPaletteComponent } from './sub-components/field-palette/field-palette.component';\r\nexport { UiSectionEditorComponent } from './sub-components/section-editor/section-editor.component';\r\nexport { UiEditorFieldConfigPanelComponent } from './sub-components/field-config-panel/field-config-panel.component';\r\nexport { UiEditorPreviewContainerComponent } from './sub-components/preview-container/preview-container.component';\r\nexport { UiValidationEditorComponent } from './sub-components/validation-editor/validation-editor.component';\r\nexport { UiConditionEditorComponent } from './sub-components/condition-editor/condition-editor.component';\r\nexport { UiOptionsEditorComponent } from './sub-components/options-editor/options-editor.component';\r\nexport { UiEditorFormValuesPanelComponent } from './sub-components/form-values-panel/form-values-panel.component';\r\n\r\n// ── Tipi ──\r\nexport * from './types/editor.types';\r\n\r\n// ── Preset ──\r\nexport { PRESET_ANAGRAFICA, PRESET_TICKET, PRESET_SURVEY, EDITOR_PRESETS } from './presets/editor-presets';\r\nexport type { EditorPresetInfo } from './presets/editor-presets';\r\n","/**\n * Bootstrap del secondary entry `@gnggln/ng-ui-system/form-builder-editor`. Form Builder Editor.\n */\nexport * from './lib/components/form-builder-editor/index';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './entry-form-builder-editor';\n"],"names":["i2","i1","i5","i3","i4","i6","i7","isDateValid","i1.UiFormConditionService","takeUntil","i2.UiLocationService","i1.UiLocationService","debounceTime","i8","distinctUntilChanged","rxFilter","i10","i11"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}