@gnggln/ng-ui-system 1.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/gnggln-ng-ui-system.mjs +5 -0
- package/esm2022/lib/components/accordion/accordion.component.mjs +353 -0
- package/esm2022/lib/components/accordion/accordion.types.mjs +6 -0
- package/esm2022/lib/components/accordion/index.mjs +2 -0
- package/esm2022/lib/components/base-layout/base-layout.component.mjs +218 -0
- package/esm2022/lib/components/base-layout/base-layout.types.mjs +6 -0
- package/esm2022/lib/components/base-layout/index.mjs +14 -0
- package/esm2022/lib/components/button/button-area.component.mjs +196 -0
- package/esm2022/lib/components/button/button.component.mjs +164 -0
- package/esm2022/lib/components/button/button.types.mjs +6 -0
- package/esm2022/lib/components/button/index.mjs +16 -0
- package/esm2022/lib/components/crud-table/crud-table.component.mjs +789 -0
- package/esm2022/lib/components/crud-table/crud-table.types.mjs +6 -0
- package/esm2022/lib/components/crud-table/index.mjs +16 -0
- package/esm2022/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
- package/esm2022/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
- package/esm2022/lib/components/form-builder/form-builder.component.mjs +824 -0
- package/esm2022/lib/components/form-builder/form-wizard.component.mjs +510 -0
- package/esm2022/lib/components/form-builder/index.mjs +19 -0
- package/esm2022/lib/components/form-builder/services/form-condition.service.mjs +132 -0
- package/esm2022/lib/components/form-builder/services/form-validation.service.mjs +381 -0
- package/esm2022/lib/components/form-builder/services/location.service.mjs +140 -0
- package/esm2022/lib/components/form-builder/services/wizard-sync.service.mjs +84 -0
- package/esm2022/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +161 -0
- package/esm2022/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
- package/esm2022/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
- package/esm2022/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
- package/esm2022/lib/components/form-builder/types/condition.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/field.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/index.mjs +2 -0
- package/esm2022/lib/components/form-builder/types/schema.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/territoriale.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/validation.types.mjs +6 -0
- package/esm2022/lib/components/form-builder-editor/form-builder-editor.component.mjs +730 -0
- package/esm2022/lib/components/form-builder-editor/form-builder-editor.service.mjs +56 -0
- package/esm2022/lib/components/form-builder-editor/index.mjs +21 -0
- package/esm2022/lib/components/form-builder-editor/services/editor-persistence.service.mjs +190 -0
- package/esm2022/lib/components/form-builder-editor/services/editor-state.service.mjs +324 -0
- package/esm2022/lib/components/form-builder-editor/services/field-factory.service.mjs +188 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.mjs +667 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.mjs +317 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.mjs +611 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.mjs +267 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.mjs +276 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.mjs +323 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +238 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +472 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.mjs +473 -0
- package/esm2022/lib/components/form-builder-editor/types/editor.types.mjs +6 -0
- package/esm2022/lib/components/layout-builder/index.mjs +18 -0
- package/esm2022/lib/components/layout-builder/layout-builder.component.mjs +1730 -0
- package/esm2022/lib/components/layout-builder/layout-builder.types.mjs +9 -0
- package/esm2022/lib/components/layout-builder/layout.service.mjs +239 -0
- package/esm2022/lib/components/modal/confirm-dialog.component.mjs +151 -0
- package/esm2022/lib/components/modal/index.mjs +4 -0
- package/esm2022/lib/components/modal/modal.component.mjs +139 -0
- package/esm2022/lib/components/modal/modal.service.mjs +194 -0
- package/esm2022/lib/components/modal/modal.types.mjs +6 -0
- package/esm2022/lib/components/page-header/breadcrumb.service.mjs +242 -0
- package/esm2022/lib/components/page-header/index.mjs +20 -0
- package/esm2022/lib/components/page-header/page-header.component.mjs +243 -0
- package/esm2022/lib/components/page-header/page-header.types.mjs +21 -0
- package/esm2022/lib/components/table/index.mjs +2 -0
- package/esm2022/lib/components/table/paginated-table.component.mjs +407 -0
- package/esm2022/lib/components/table/table.types.mjs +6 -0
- package/esm2022/lib/core/types/index.mjs +6 -0
- package/esm2022/lib/core/utils/index.mjs +53 -0
- package/esm2022/lib/sources/location-data.opt.json +8942 -0
- package/esm2022/lib/sources/nazioni.opt.json +215 -0
- package/esm2022/public-api.mjs +34 -0
- package/fesm2022/gnggln-ng-ui-system.mjs +55752 -0
- package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/accordion/accordion.component.d.ts +118 -0
- package/lib/components/accordion/accordion.types.d.ts +62 -0
- package/lib/components/accordion/index.d.ts +2 -0
- package/lib/components/base-layout/base-layout.component.d.ts +83 -0
- package/lib/components/base-layout/base-layout.types.d.ts +26 -0
- package/lib/components/base-layout/index.d.ts +13 -0
- package/lib/components/button/button-area.component.d.ts +88 -0
- package/lib/components/button/button.component.d.ts +55 -0
- package/lib/components/button/button.types.d.ts +70 -0
- package/lib/components/button/index.d.ts +15 -0
- package/lib/components/crud-table/crud-table.component.d.ts +143 -0
- package/lib/components/crud-table/crud-table.types.d.ts +207 -0
- package/lib/components/crud-table/index.d.ts +15 -0
- package/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
- package/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
- package/lib/components/form-builder/form-builder.component.d.ts +183 -0
- package/lib/components/form-builder/form-wizard.component.d.ts +87 -0
- package/lib/components/form-builder/index.d.ts +13 -0
- package/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
- package/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
- package/lib/components/form-builder/services/location.service.d.ts +83 -0
- package/lib/components/form-builder/services/wizard-sync.service.d.ts +63 -0
- package/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +28 -0
- package/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
- package/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
- package/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
- package/lib/components/form-builder/types/condition.types.d.ts +51 -0
- package/lib/components/form-builder/types/field.types.d.ts +288 -0
- package/lib/components/form-builder/types/index.d.ts +5 -0
- package/lib/components/form-builder/types/schema.types.d.ts +227 -0
- package/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
- package/lib/components/form-builder/types/validation.types.d.ts +174 -0
- package/lib/components/form-builder-editor/form-builder-editor.component.d.ts +117 -0
- package/lib/components/form-builder-editor/form-builder-editor.service.d.ts +38 -0
- package/lib/components/form-builder-editor/index.d.ts +15 -0
- package/lib/components/form-builder-editor/services/editor-persistence.service.d.ts +42 -0
- package/lib/components/form-builder-editor/services/editor-state.service.d.ts +66 -0
- package/lib/components/form-builder-editor/services/field-factory.service.d.ts +28 -0
- package/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.d.ts +139 -0
- package/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.d.ts +43 -0
- package/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.d.ts +83 -0
- package/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.d.ts +40 -0
- package/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.d.ts +51 -0
- package/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.d.ts +63 -0
- package/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.d.ts +68 -0
- package/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.d.ts +82 -0
- package/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.d.ts +112 -0
- package/lib/components/form-builder-editor/types/editor.types.d.ts +124 -0
- package/lib/components/layout-builder/index.d.ts +16 -0
- package/lib/components/layout-builder/layout-builder.component.d.ts +85 -0
- package/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
- package/lib/components/layout-builder/layout.service.d.ts +100 -0
- package/lib/components/modal/confirm-dialog.component.d.ts +46 -0
- package/lib/components/modal/index.d.ts +4 -0
- package/lib/components/modal/modal.component.d.ts +44 -0
- package/lib/components/modal/modal.service.d.ts +93 -0
- package/lib/components/modal/modal.types.d.ts +110 -0
- package/lib/components/page-header/breadcrumb.service.d.ts +96 -0
- package/lib/components/page-header/index.d.ts +16 -0
- package/lib/components/page-header/page-header.component.d.ts +59 -0
- package/lib/components/page-header/page-header.types.d.ts +96 -0
- package/lib/components/table/index.d.ts +2 -0
- package/lib/components/table/paginated-table.component.d.ts +85 -0
- package/lib/components/table/table.types.d.ts +81 -0
- package/lib/core/types/index.d.ts +57 -0
- package/lib/core/utils/index.d.ts +29 -0
- package/package.json +44 -0
- package/public-api.d.ts +22 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gnggln-ng-ui-system.mjs","sources":["../../../packages/ng-ui-system/src/lib/core/types/index.ts","../../../packages/ng-ui-system/src/lib/core/utils/index.ts","../../../packages/ng-ui-system/src/lib/components/button/button.component.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/accordion/accordion.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/table/paginated-table.component.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/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/directives/currency-input.directive.ts","../../../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/crud-table/crud-table.component.ts","../../../packages/ng-ui-system/src/lib/components/crud-table/index.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/services/wizard-sync.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/form-wizard.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/index.ts","../../../packages/ng-ui-system/src/lib/components/page-header/page-header.types.ts","../../../packages/ng-ui-system/src/lib/components/page-header/breadcrumb.service.ts","../../../packages/ng-ui-system/src/lib/components/page-header/page-header.component.ts","../../../packages/ng-ui-system/src/lib/components/page-header/index.ts","../../../packages/ng-ui-system/src/lib/components/base-layout/base-layout.component.ts","../../../packages/ng-ui-system/src/lib/components/base-layout/index.ts","../../../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/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/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/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/index.ts","../../../packages/ng-ui-system/src/lib/components/layout-builder/layout.service.ts","../../../packages/ng-ui-system/src/lib/components/layout-builder/layout-builder.component.ts","../../../packages/ng-ui-system/src/lib/components/layout-builder/index.ts","../../../packages/ng-ui-system/src/public-api.ts","../../../packages/ng-ui-system/src/gnggln-ng-ui-system.ts"],"sourcesContent":["/**\r\n * Shared types for ng-ui-system components.\r\n * These types are used across multiple components to ensure consistency.\r\n */\r\n\r\n/** Standard size variants used across components. */\r\nexport type UiSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/** Visual style variants for components. */\r\nexport type UiVariant = 'primary' | 'accent' | 'warn' | 'neutral' | 'ghost' | 'outline';\r\n\r\n/** Semantic color palette tokens. */\r\nexport type UiColor = 'primary' | 'accent' | 'warn' | 'success' | 'info' | 'neutral';\r\n\r\n/** Layout direction. */\r\nexport type UiDirection = 'horizontal' | 'vertical';\r\n\r\n/** Horizontal alignment. */\r\nexport type UiAlign = 'start' | 'center' | 'end' | 'stretch';\r\n\r\n/** Component density options for compact or spacious layouts. */\r\nexport type UiDensity = 'compact' | 'default' | 'comfortable';\r\n\r\n/**\r\n * Common Lucide icon names with autocomplete support.\r\n * Accepts any valid Lucide icon name as a string.\r\n *\r\n * Provides IntelliSense for the most frequently used enterprise icons.\r\n * For the full icon catalogue, visit https://lucide.dev/icons\r\n *\r\n * @example\r\n * ```typescript\r\n * const myIcon: UiIconName = 'arrow-right'; // autocomplete ✓\r\n * const custom: UiIconName = 'my-custom-icon'; // still valid\r\n * ```\r\n */\r\nexport type UiIconName =\r\n // ── Navigation ──\r\n | 'arrow-right'\r\n | 'arrow-left'\r\n | 'arrow-up'\r\n | 'arrow-down'\r\n | 'chevron-right'\r\n | 'chevron-left'\r\n | 'chevron-up'\r\n | 'chevron-down'\r\n | 'external-link'\r\n | 'corner-down-left'\r\n | 'corner-down-right'\r\n // ── Actions ──\r\n | 'check'\r\n | 'x'\r\n | 'plus'\r\n | 'minus'\r\n | 'search'\r\n | 'refresh-cw'\r\n | 'download'\r\n | 'upload'\r\n | 'save'\r\n | 'trash-2'\r\n | 'pencil'\r\n | 'copy'\r\n | 'clipboard'\r\n | 'share-2'\r\n | 'send'\r\n | 'log-in'\r\n | 'log-out'\r\n // ── Communication ──\r\n | 'mail'\r\n | 'message-circle'\r\n | 'phone'\r\n | 'bell'\r\n // ── Users & Identity ──\r\n | 'user'\r\n | 'users'\r\n | 'lock'\r\n | 'unlock'\r\n | 'key'\r\n | 'shield'\r\n // ── Files & Media ──\r\n | 'file'\r\n | 'file-text'\r\n | 'file-spreadsheet'\r\n | 'file-archive'\r\n | 'folder'\r\n | 'image'\r\n | 'camera'\r\n | 'paperclip'\r\n // ── Feedback & Status ──\r\n | 'info'\r\n | 'alert-triangle'\r\n | 'alert-circle'\r\n | 'check-circle'\r\n | 'x-circle'\r\n | 'help-circle'\r\n | 'loader-2'\r\n // ── Layout & UI ──\r\n | 'menu'\r\n | 'more-horizontal'\r\n | 'more-vertical'\r\n | 'grid'\r\n | 'list'\r\n | 'filter'\r\n | 'sliders'\r\n | 'columns'\r\n | 'maximize-2'\r\n | 'minimize-2'\r\n // ── Misc ──\r\n | 'home'\r\n | 'settings'\r\n | 'star'\r\n | 'heart'\r\n | 'bookmark'\r\n | 'calendar'\r\n | 'clock'\r\n | 'map-pin'\r\n | 'eye'\r\n | 'eye-off'\r\n | 'sun'\r\n | 'moon'\r\n | 'monitor'\r\n // ── Accepts any string for custom / unlisted icons ──\r\n | (string & Record<never, never>);\r\n\r\n/** Status values used for feedback components (badges, alerts, indicators). */\r\nexport type UiStatus = 'idle' | 'loading' | 'success' | 'error' | 'warning' | 'info';\r\n\r\n/**\r\n * Generic key-value pair used in select options, dropdowns, etc.\r\n * @template T - The type of the value.\r\n */\r\nexport interface UiOption<T = string> {\r\n /** The display label. */\r\n label: string;\r\n /** The underlying value. */\r\n value: T;\r\n /** Whether this option is disabled. */\r\n disabled?: boolean;\r\n /** Optional icon name (Lucide icon). */\r\n icon?: UiIconName;\r\n /** Optional grouping key for grouped selects. */\r\n group?: string;\r\n}\r\n\r\n/**\r\n * Result wrapper for async operations.\r\n * @template T - The type of the data payload.\r\n */\r\nexport interface UiAsyncState<T = unknown> {\r\n status: UiStatus;\r\n data: T | null;\r\n error: string | null;\r\n}\r\n","/**\r\n * Shared utility functions for ng-ui-system components.\r\n */\r\n\r\n/**\r\n * Generates a unique ID with an optional prefix.\r\n * Uses crypto.randomUUID() when available for better randomness, falls back to crypto.getRandomValues().\r\n * Useful for linking labels to form controls, ARIA attributes, etc.\r\n *\r\n * @param prefix - Optional prefix for the generated ID.\r\n * @returns A unique string ID.\r\n */\r\nexport function uiUniqueId(prefix = 'ui'): string {\r\n let randomPart: string;\r\n\r\n // Try crypto.randomUUID() first (modern browsers/Node 19+)\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n randomPart = crypto.randomUUID().substring(0, 8);\r\n }\r\n // Fallback to crypto.getRandomValues()\r\n else if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\r\n const array = new Uint8Array(4);\r\n crypto.getRandomValues(array);\r\n randomPart = Array.from(array, (byte) => byte.toString(36))\r\n .join('')\r\n .substring(0, 8);\r\n }\r\n // Final fallback to Math.random() for older environments\r\n else {\r\n randomPart = Math.random().toString(36).substring(2, 9); // NOSONAR - Fallback for environments without crypto API\r\n }\r\n\r\n return `${prefix}-${randomPart}`;\r\n}\r\n\r\n/**\r\n * Coerces a value to a boolean.\r\n * Useful for handling string boolean attributes in templates.\r\n *\r\n * @param value - The value to coerce.\r\n * @returns The boolean representation.\r\n */\r\nexport function uiCoerceBoolean(value: unknown): boolean {\r\n return value != null && `${value}` !== 'false';\r\n}\r\n\r\n/**\r\n * Clamps a number between a minimum and maximum value.\r\n *\r\n * @param value - The value to clamp.\r\n * @param min - The minimum allowed value.\r\n * @param max - The maximum allowed value.\r\n * @returns The clamped value.\r\n */\r\nexport function uiClamp(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, value));\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 -->\r\n * <ui-button icon=\"trash-2\" variant=\"warn\" ariaLabel=\"Delete item\" (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]=\"ariaLabel || 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 /** 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","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\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 * @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 [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 /** 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: calls action callback and/or navigates. */\r\n handleButtonClick(button: UiButtonDescriptor, event: MouseEvent): void {\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 * 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 {\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 -->\r\n <button\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 [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 (click)=\"toggle(item)\"\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\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 </button>\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 tra il titolo e il chevron.\r\n */\r\n @Input() headerTemplate: 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 gli header button del DOM. */\r\n private getHeaders(): HTMLButtonElement[] {\r\n return Array.from(document.querySelectorAll<HTMLButtonElement>('.ui-accordion__header: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","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 backdropClass: this._modalStack.length > 0 ? 'ui-confirm-backdrop--stacked' : '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","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n TemplateRef,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiTableColumn, UiTableSortEvent, UiTablePageEvent } from './table.types';\r\nimport { uiUniqueId } from '../../core/utils';\r\n\r\n/**\r\n * Tabella paginata standalone con ordinamento, colonne sticky,\r\n * ellipsis automatica, stato di caricamento e template personalizzabili.\r\n *\r\n * Progettata per paginazione server-side: emette eventi di cambio pagina\r\n * e ordinamento che il componente genitore gestisce per il recupero dati.\r\n *\r\n * @selector ui-paginated-table\r\n *\r\n * @example\r\n * ```html\r\n * <ui-paginated-table\r\n * [data]=\"users\"\r\n * [columns]=\"columns\"\r\n * [totalItems]=\"totalUsers\"\r\n * [pageSize]=\"10\"\r\n * [loading]=\"isLoading\"\r\n * (pageChange)=\"onPageChange($event)\"\r\n * (sortChange)=\"onSort($event)\"\r\n * (rowClick)=\"onUserClick($event)\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-paginated-table',\r\n standalone: true,\r\n imports: [NgTemplateOutlet, MatPaginatorModule, MatTooltipModule, LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: { class: 'ui-paginated-table-host' },\r\n template: `\r\n <div class=\"ui-table\" [attr.id]=\"tableId\">\r\n <div class=\"ui-table__container\">\r\n @if (data.length > 0) {\r\n <table class=\"ui-table__table\" role=\"grid\" [attr.aria-busy]=\"loading\">\r\n <thead>\r\n <tr>\r\n @for (col of columns; track col.property) {\r\n <th\r\n [class]=\"getHeaderClasses(col)\"\r\n [style.width]=\"col.width || null\"\r\n [style.text-align]=\"col.align || 'left'\"\r\n [attr.aria-sort]=\"getAriaSort(col)\"\r\n [attr.role]=\"col.sortable ? 'columnheader button' : 'columnheader'\"\r\n [attr.tabindex]=\"col.sortable ? 0 : null\"\r\n (click)=\"onHeaderClick(col)\"\r\n (keydown.enter)=\"onHeaderClick(col)\"\r\n (keydown.space)=\"onHeaderClick(col); $event.preventDefault()\"\r\n >\r\n <div class=\"ui-table__header-content\">\r\n <span class=\"ui-table__header-text\">{{ col.header }}</span>\r\n @if (col.sortable) {\r\n <span class=\"ui-table__sort-icon\" aria-hidden=\"true\">\r\n @if (isColumnSorted(col)) {\r\n @if (currentSortDirection === 'asc') {\r\n <lucide-icon name=\"chevron-up\" [size]=\"14\" />\r\n } @else {\r\n <lucide-icon name=\"chevron-down\" [size]=\"14\" />\r\n }\r\n } @else {\r\n <span class=\"ui-table__sort-hint\">\r\n <lucide-icon name=\"chevron-up\" [size]=\"10\" />\r\n <lucide-icon name=\"chevron-down\" [size]=\"10\" />\r\n </span>\r\n }\r\n </span>\r\n }\r\n </div>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of data; track trackRow($index, row)) {\r\n <tr\r\n class=\"ui-table__row\"\r\n [class.ui-table__row--clickable]=\"rowClick.observed\"\r\n (click)=\"onRowClick(row)\"\r\n [attr.tabindex]=\"rowClick.observed ? 0 : null\"\r\n (keydown.enter)=\"rowClick.observed ? onRowClick(row) : null\"\r\n >\r\n @for (col of columns; track col.property) {\r\n <td\r\n [class]=\"getCellClasses(col)\"\r\n [style.text-align]=\"col.align || 'left'\"\r\n >\r\n @if (col.template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, column: col }\"\r\n />\r\n } @else if (col.ellipsis && shouldTruncate(row[col.property], col)) {\r\n <span\r\n class=\"ui-table__ellipsis\"\r\n [matTooltip]=\"'' + row[col.property]\"\r\n >{{ truncateText(row[col.property], col) }}</span>\r\n } @else {\r\n {{ row[col.property] }}\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @else if (!loading) {\r\n <div class=\"ui-table__empty\" role=\"status\">\r\n @if (emptyTemplate) {\r\n <ng-container [ngTemplateOutlet]=\"emptyTemplate\" />\r\n } @else {\r\n <lucide-icon name=\"info\" [size]=\"24\" class=\"ui-table__empty-icon\" aria-hidden=\"true\" />\r\n <p class=\"ui-table__empty-text\">{{ emptyMessage }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n @if (loading) {\r\n <div class=\"ui-table__loading\" aria-live=\"polite\">\r\n <span class=\"ui-table__spinner\" aria-hidden=\"true\"></span>\r\n <span class=\"ui-table__sr-only\">Caricamento in corso</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (showPaginator && totalItems > 0) {\r\n <mat-paginator\r\n [length]=\"totalItems\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n [pageIndex]=\"pageIndex\"\r\n (page)=\"onPageChange($event)\"\r\n showFirstLastButtons\r\n />\r\n }\r\n </div>\r\n `,\r\n styleUrl: './paginated-table.component.scss',\r\n})\r\nexport class UiPaginatedTableComponent {\r\n /** @internal Identificatore univoco per l'istanza. */\r\n readonly tableId = uiUniqueId('ui-table');\r\n\r\n // ── Inputs dati ──────────────────────────────────────────────\r\n\r\n /** Array di righe da visualizzare nella pagina corrente. */\r\n @Input() data: Record<string, any>[] = [];\r\n\r\n /** Definizione delle colonne della tabella. */\r\n @Input() columns: UiTableColumn[] = [];\r\n\r\n /** Numero totale di elementi (per la paginazione server-side). */\r\n @Input() totalItems = 0;\r\n\r\n // ── Inputs paginazione ───────────────────────────────────────\r\n\r\n /** Numero di righe per pagina. */\r\n @Input() pageSize = 10;\r\n\r\n /** Opzioni selezionabili per il numero di righe per pagina. */\r\n @Input() pageSizeOptions: number[] = [5, 10, 25, 50];\r\n\r\n /** Indice della pagina corrente (0-based). */\r\n @Input() pageIndex = 0;\r\n\r\n /** Mostra il paginatore sotto la tabella. */\r\n @Input() showPaginator = true;\r\n\r\n // ── Inputs stato ─────────────────────────────────────────────\r\n\r\n /** Mostra l'overlay di caricamento sopra la tabella. */\r\n @Input() loading = false;\r\n\r\n /** Messaggio visualizzato quando non ci sono dati. */\r\n @Input() emptyMessage = 'Nessun risultato trovato';\r\n\r\n /** Template personalizzato per lo stato vuoto. */\r\n @Input() emptyTemplate: TemplateRef<unknown> | null = null;\r\n\r\n // ── Outputs ──────────────────────────────────────────────────\r\n\r\n /** Emesso quando l'utente cambia pagina o numero di righe. */\r\n @Output() pageChange = new EventEmitter<UiTablePageEvent>();\r\n\r\n /** Emesso quando l'utente ordina una colonna. */\r\n @Output() sortChange = new EventEmitter<UiTableSortEvent>();\r\n\r\n /** Emesso quando l'utente clicca su una riga. */\r\n @Output() rowClick = new EventEmitter<Record<string, any>>();\r\n\r\n // ── Stato ordinamento interno ────────────────────────────────\r\n\r\n /** @internal Colonna attualmente ordinata. */\r\n currentSortColumn: string | null = null;\r\n\r\n /** @internal Direzione ordinamento corrente. */\r\n currentSortDirection: 'asc' | 'desc' | null = null;\r\n\r\n // ── Gestione header ──────────────────────────────────────────\r\n\r\n /** @internal Gestisce il click su un'intestazione di colonna. */\r\n onHeaderClick(col: UiTableColumn): void {\r\n if (!col.sortable) return;\r\n\r\n if (this.currentSortColumn === col.property) {\r\n this.currentSortDirection = this.nextSortDirection(this.currentSortDirection);\r\n if (this.currentSortDirection === null) {\r\n this.currentSortColumn = null;\r\n }\r\n } else {\r\n this.currentSortColumn = col.property;\r\n this.currentSortDirection = 'asc';\r\n }\r\n\r\n this.sortChange.emit({\r\n column: col.property,\r\n direction: this.currentSortDirection,\r\n sortType: col.sortType || 'text',\r\n });\r\n }\r\n\r\n /** @internal Indica se la colonna e attualmente ordinata. */\r\n isColumnSorted(col: UiTableColumn): boolean {\r\n return col.sortable === true && col.property === this.currentSortColumn && this.currentSortDirection !== null;\r\n }\r\n\r\n /** @internal Attributo aria-sort per accessibilita. */\r\n getAriaSort(col: UiTableColumn): string | null {\r\n if (!col.sortable) return null;\r\n if (!this.isColumnSorted(col)) return 'none';\r\n return this.currentSortDirection === 'asc' ? 'ascending' : 'descending';\r\n }\r\n\r\n // ── Gestione paginazione ─────────────────────────────────────\r\n\r\n /** @internal Gestisce il cambio pagina dal MatPaginator. */\r\n onPageChange(event: PageEvent): void {\r\n this.pageIndex = event.pageIndex;\r\n this.pageSize = event.pageSize;\r\n this.pageChange.emit({\r\n pageIndex: event.pageIndex,\r\n pageSize: event.pageSize,\r\n length: event.length,\r\n });\r\n }\r\n\r\n // ── Gestione righe ───────────────────────────────────────────\r\n\r\n /** @internal Gestisce il click su una riga. */\r\n onRowClick(row: Record<string, any>): void {\r\n this.rowClick.emit(row);\r\n }\r\n\r\n /** @internal Track function per il loop @for sulle righe. */\r\n trackRow(index: number, row: Record<string, any>): unknown {\r\n return row['id'] ?? index;\r\n }\r\n\r\n // ── Ellipsis ─────────────────────────────────────────────────\r\n\r\n /** @internal Verifica se il testo deve essere troncato. */\r\n shouldTruncate(value: unknown, col: UiTableColumn): boolean {\r\n if (value == null) return false;\r\n return String(value).length > (col.maxLength ?? 50);\r\n }\r\n\r\n /** @internal Tronca il testo con ellipsis. */\r\n truncateText(value: unknown, col: UiTableColumn): string {\r\n if (value == null) return '';\r\n const str = String(value);\r\n const max = col.maxLength ?? 50;\r\n return str.length > max ? str.substring(0, max) + '\\u2026' : str;\r\n }\r\n\r\n // ── Classi CSS ───────────────────────────────────────────────\r\n\r\n /** @internal Classi CSS per l'header di colonna. */\r\n getHeaderClasses(col: UiTableColumn): string {\r\n return [\r\n 'ui-table__th',\r\n col.sortable ? 'ui-table__th--sortable' : '',\r\n this.isColumnSorted(col) ? 'ui-table__th--sorted' : '',\r\n col.sticky ? 'ui-table__th--sticky' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n /** @internal Classi CSS per una cella. */\r\n getCellClasses(col: UiTableColumn): string {\r\n return ['ui-table__td', col.sticky ? 'ui-table__td--sticky' : ''].filter(Boolean).join(' ');\r\n }\r\n\r\n // ── Utilita private ──────────────────────────────────────────\r\n\r\n /** @internal Calcola la prossima direzione nel ciclo asc -> desc -> null. */\r\n private nextSortDirection(current: 'asc' | 'desc' | null): 'asc' | 'desc' | null {\r\n const cycle: ('asc' | 'desc' | null)[] = ['asc', 'desc', null];\r\n return cycle[(cycle.indexOf(current) + 1) % cycle.length];\r\n }\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 { 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 * Componente per il riepilogo errori del form.\r\n *\r\n * Mostra un indicatore con il conteggio degli errori e un dropdown\r\n * con il dettaglio per campo. Click su un errore emette `fieldClick`\r\n * per consentire lo scroll-to-field con highlight nel form builder.\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 @if (errors.length > 0) {\r\n <div\r\n class=\"ui-form-error-summary\"\r\n (mouseenter)=\"showDropdown = true\"\r\n (mouseleave)=\"showDropdown = false\"\r\n >\r\n <!-- Indicatore errori con icona e messaggio -->\r\n <div class=\"ui-form-error-summary__heading\"\r\n (click)=\"showDropdown = !showDropdown\"\r\n role=\"button\"\r\n tabindex=\"0\"\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 <!-- Dropdown dettaglio -->\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 }\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 /** 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. */\r\n showDropdown = false;\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 nazioniData from '../../../sources/nazioni.opt.json';\r\nimport * as locationData from '../../../sources/location-data.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 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 { 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","/**\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} from '@angular/core';\r\nimport {\r\n FormGroup,\r\n FormControl,\r\n FormGroupDirective,\r\n NgForm,\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 ErrorStateMatcher,\r\n DateAdapter,\r\n MAT_DATE_FORMATS,\r\n MAT_DATE_LOCALE,\r\n} from '@angular/material/core';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { Subject, Subscription, Observable } from 'rxjs';\r\nimport { debounceTime, takeUntil } from 'rxjs/operators';\r\nimport { UiButtonComponent, UiButtonDescriptor } from '../../components/button/index';\r\nimport { UiButtonAreaComponent } from '../../components/button/button-area.component';\r\n\r\nimport { UiFormSchema, UiFormSection, UiFormData, UiFormCustomEvent, UiFormBuilderConfig } from './types/schema.types';\r\nimport { UiFormFieldDescriptor, UiFieldOption, UiFieldType } from './types/field.types';\r\nimport { UiFormValidationState, UiFormErrorDetail, UiValidationRule } 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 { 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 { UiCurrencyInputDirective } from './directives/currency-input.directive';\r\nimport { UiItalianDateAdapter, UI_IT_DATE_FORMATS } from './adapters/it-date-adapter';\r\n\r\n/**\r\n * ErrorStateMatcher custom per il form builder.\r\n * Mostra lo stato di errore quando il campo e invalido E (touched OPPURE dirty).\r\n * Sostituisce il matcher di default di Angular Material.\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\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 16 tipi di campo, 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 MatExpansionModule,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n UiButtonAreaComponent,\r\n UiFormErrorSummaryComponent,\r\n UiFileInputComponent,\r\n UiSpecificaTerritorialeComponent,\r\n UiTableTerritorialeComponent,\r\n UiCurrencyInputDirective,\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\r\n private readonly destroy$ = new Subject<void>();\r\n private valueChangeSub?: Subscription;\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 // ─── 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 /** Flag per evitare emissioni durante l'inizializzazione. */\r\n private isInitializing = true;\r\n\r\n // ─── Getter calcolati ───────────────────────────────────────────\r\n\r\n get allFields(): UiFormFieldDescriptor[] {\r\n return this.schema?.sections?.flatMap((s) => s.fields) || [];\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 // [DEBUG] Verifica che lo schema sia disponibile al momento di ngOnInit\r\n console.debug('[UiFormBuilder] ngOnInit - schema:', this.schema?.id, '| formGroup definito:', !!this.formGroup);\r\n if (!this.schema) {\r\n console.warn('[UiFormBuilder] ngOnInit - schema non presente, il form non verra costruito ora');\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 // [DEBUG] Log di tutti i cambiamenti degli Input\r\n const changedInputs = Object.keys(changes)\r\n .map((k) => `${k}(firstChange=${changes[k].firstChange})`)\r\n .join(', ');\r\n console.debug('[UiFormBuilder] ngOnChanges -', changedInputs);\r\n\r\n if (changes['schema'] && !changes['schema'].firstChange) {\r\n const newSchema = changes['schema'].currentValue as UiFormSchema;\r\n console.debug('[UiFormBuilder] ngOnChanges - nuovo schema:', newSchema?.id, '| corrente:', this.currentSchemaId);\r\n if (newSchema && newSchema.id !== this.currentSchemaId) {\r\n console.debug('[UiFormBuilder] ngOnChanges - REBUILD: id diverso, ricostruisco il form');\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.allFields.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 }\r\n\r\n ngAfterViewInit(): void {\r\n // [DEBUG] Verifica stato dopo la prima renderizzazione della vista\r\n console.debug(\r\n '[UiFormBuilder] ngAfterViewInit - formGroup definito:',\r\n !!this.formGroup,\r\n '| campi:',\r\n this.formGroup ? Object.keys(this.formGroup.controls).length : 0,\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n console.debug('[UiFormBuilder] ngOnDestroy - schema:', this.currentSchemaId);\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n this.valueChangeSub?.unsubscribe();\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 console.warn('[UiFormBuilder] initFormFromSchema - schema nullo, skip');\r\n return;\r\n }\r\n console.debug(\r\n '[UiFormBuilder] initFormFromSchema - costruisco form per:',\r\n this.schema.id,\r\n '| sezioni:',\r\n this.schema.sections?.length,\r\n '| campi totali:',\r\n this.schema.sections?.reduce((sum, s) => sum + s.fields.length, 0),\r\n );\r\n this.currentSchemaId = this.schema.id;\r\n this.buildForm();\r\n this.isInitializing = false;\r\n console.debug(\r\n '[UiFormBuilder] initFormFromSchema - form costruito. Controls:',\r\n 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 console.debug('[UiFormBuilder] destroyForm - pulizia stato per schema:', 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.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, FormControl> = {};\r\n\r\n for (const field of this.allFields) {\r\n const initialValue = this.initialData?.[field.key] ?? field.defaultValue ?? null;\r\n const isDisabled = field.disabled || this.disabled;\r\n\r\n // Crea il FormControl\r\n const control = new FormControl({ value: initialValue, disabled: isDisabled });\r\n\r\n // Registra le regole di validazione\r\n if (field.validation?.length) {\r\n this.validationRulesMap[field.key] = field.validation;\r\n }\r\n\r\n // Traccia campi prevalorizzati\r\n if (initialValue != null && initialValue !== '' && initialValue !== false) {\r\n this.prevalorizedFields.add(field.key);\r\n }\r\n\r\n // Inizializza opzioni filtrate per select/multiselect\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 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\r\n // ─── Validazione ────────────────────────────────────────────────\r\n\r\n private applyAllValidators(): void {\r\n for (const field of this.allFields) {\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\r\n // ─── Condizioni ─────────────────────────────────────────────────\r\n\r\n private evaluateAllConditions(): void {\r\n const formData = this.formGroup.getRawValue();\r\n\r\n for (const field of this.allFields) {\r\n // Visibilita\r\n if (field.conditions?.length) {\r\n const visible = this.conditionService.evaluateConditions(field.conditions, formData);\r\n const control = this.formGroup.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 // Disabilita condizionale\r\n if (field.disableConditions?.length && !field.conditions?.length) {\r\n const shouldDisable = this.conditionService.evaluateConditions(field.disableConditions, formData);\r\n const control = this.formGroup.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 // Aggiorna validatori condizionali\r\n if (field.validation?.some((r) => r.conditions?.length)) {\r\n this.validationService.updateFieldValidators(this.formGroup.get(field.key)!, field.validation, formData);\r\n }\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 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. */\r\n isFieldVisible(fieldKey: string): boolean {\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n if (!field?.conditions?.length) return true;\r\n return this.conditionService.evaluateConditions(field.conditions, this.formGroup.getRawValue());\r\n }\r\n\r\n /** Verifica se un campo e obbligatorio (include validazione condizionale). */\r\n isFieldRequired(fieldKey: string): 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 formData = this.formGroup.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 /** Verifica se mostrare errori per un campo. */\r\n shouldShowFieldErrors(fieldKey: string): boolean {\r\n const control = this.formGroup.get(fieldKey);\r\n if (!control) return false;\r\n return control.invalid && (control.dirty || control.touched || this.prevalorizedFields.has(fieldKey));\r\n }\r\n\r\n /** Errori di un campo come array di messaggi. */\r\n getFieldErrors(fieldKey: string): string[] {\r\n const control = this.formGroup.get(fieldKey);\r\n if (!control?.errors) return [];\r\n\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n const rules = field?.validation || [];\r\n const messages: string[] = [];\r\n\r\n for (const [errorKey] of Object.entries(control.errors)) {\r\n // Angular usa chiavi lowercase (es. \"minlength\"), lo schema usa camelCase (es. \"minLength\").\r\n // Normalizziamo per trovare la corrispondenza corretta.\r\n const rule = rules.find(\r\n (r) =>\r\n this.normalizeValidationKey(r.type) === errorKey || (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, control.errors![errorKey]));\r\n }\r\n }\r\n return messages;\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 /** 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.allFields) {\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 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 for (const field of this.allFields) {\r\n if (field.type === 'flag' || field.type === 'divider') continue;\r\n if (!this.isFieldVisible(field.key)) continue;\r\n\r\n const control = this.formGroup.get(field.key);\r\n if (!control?.errors) continue;\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 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. */\r\n validateAllFields(): void {\r\n Object.keys(this.formGroup.controls).forEach((key) => {\r\n const control = this.formGroup.get(key);\r\n control?.markAsTouched();\r\n control?.markAsDirty();\r\n control?.updateValueAndValidity();\r\n });\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Scrolla al campo e lo evidenzia. */\r\n scrollToField(fieldKey: string): void {\r\n // Forza lo stato dirty e touched per mostrare immediatamente gli errori\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 // Delay per lasciare che Angular Material aggiorni il DOM\r\n setTimeout(() => {\r\n // Cerca l'elemento tramite diversi selettori in ordine di priorita\r\n const selectors = [`[data-field-key=\"${fieldKey}\"]`, `[formControlName=\"${fieldKey}\"]`];\r\n\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 if (this.formGroup.valid) {\r\n this.formSubmit.emit(this.getFormValue());\r\n }\r\n }\r\n\r\n /** Reset del form. */\r\n onReset(): void {\r\n // Resetta a valori iniziali o default\r\n for (const field of this.allFields) {\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 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): { current: number; max: number } | null {\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n const maxRule = field?.validation?.find((r) => r.type === 'maxLength');\r\n if (!maxRule?.value) return null;\r\n\r\n const control = this.formGroup.get(fieldKey);\r\n return {\r\n current: (control?.value || '').length,\r\n max: Number(maxRule.value),\r\n };\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 /**\r\n * Normalizza la chiave del tipo di validazione dallo schema (camelCase)\r\n * alla chiave di errore usata da Angular (lowercase).\r\n * Es: \"minLength\" -> \"minlength\", \"maxLength\" -> \"maxlength\".\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: any): string {\r\n // Se il valore dell'errore e gia un messaggio descrittivo (stringa),\r\n // lo restituisce direttamente. Questo supporta i validatori personalizzati\r\n // (es. location, location-table) che forniscono messaggi espliciti come\r\n // valore dell'errore (es. { nazioneRequired: 'Seleziona una nazione' }).\r\n if (typeof errorValue === 'string') {\r\n return errorValue;\r\n }\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: ${errorValue.min}`;\r\n case 'max':\r\n return `Valore massimo: ${errorValue.max}`;\r\n case 'minlength':\r\n return `Lunghezza minima: ${errorValue.requiredLength} caratteri`;\r\n case 'maxlength':\r\n return `Lunghezza massima: ${errorValue.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 errorValue?.message || 'Data troppo remota';\r\n case 'date-max':\r\n return errorValue?.message || 'Data troppo avanzata';\r\n case 'fileSize':\r\n return `Dimensione massima: ${errorValue?.maxSizeFormatted}`;\r\n case 'fileType':\r\n return 'Formato file non accettato';\r\n case 'fileCount':\r\n return `Massimo ${errorValue?.maxCount} file`;\r\n default:\r\n return 'Valore non valido';\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 Senza questo wrapper, formControlName non trova il\r\n FormGroupDirective e lancia NG01050.\r\n\r\n Ref: versione tailored (ang-ms-webapp) usa lo stesso pattern.\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 <!-- DEBUG: Verifica che formGroup sia inizializzato -->\r\n <!-- [formGroup] e sul div padre; tutti i formControlName INLINE funzionano -->\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 collassabile -->\r\n @if (section.collapsible) {\r\n <mat-expansion-panel\r\n class=\"ui-form-builder__section ui-form-builder__section--collapsible\"\r\n [class]=\"section.cssClasses?.join(' ')\"\r\n [expanded]=\"!section.collapsed\"\r\n >\r\n <mat-expansion-panel-header>\r\n @if (section.title) {\r\n <mat-panel-title>{{ section.title }}</mat-panel-title>\r\n }\r\n @if (section.description) {\r\n <mat-panel-description>{{ section.description }}</mat-panel-description>\r\n }\r\n </mat-expansion-panel-header>\r\n\r\n <div class=\"ui-form-builder__section-content\" [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\r\n class=\"ui-form-builder__field-wrapper\"\r\n [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\"\r\n [attr.data-field-key]=\"field.key\"\r\n >\r\n <!-- OUTLET: il template fieldTpl ha il proprio [formGroup] wrapper -->\r\n <ng-container\r\n *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field }\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </mat-expansion-panel>\r\n } @else {\r\n <!-- Sezione non collassabile -->\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\" [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\r\n class=\"ui-form-builder__field-wrapper\"\r\n [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\"\r\n [attr.data-field-key]=\"field.key\"\r\n >\r\n <!-- OUTLET: il template fieldTpl ha il proprio [formGroup] wrapper -->\r\n <ng-container\r\n *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field }\"\r\n />\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 @if (!schema.config?.hideFooter) {\r\n <div class=\"ui-form-builder__footer\">\r\n <ui-form-error-summary\r\n [errors]=\"formErrors\"\r\n [totalErrorCount]=\"getFormErrorsCount()\"\r\n (fieldClick)=\"scrollToField($event)\"\r\n />\r\n <ui-button-area\r\n [buttons]=\"formButtons\"\r\n align=\"end\"\r\n [loadingIds]=\"loadingFor\"\r\n />\r\n </div>\r\n }\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 Quindi DOBBIAMO wrappare il contenuto in un <div [formGroup]>\r\n per fornire un FormGroupDirective ai formControlName figli.\r\n Senza questo wrapper -> errore NG01050.\r\n-->\r\n<ng-template #fieldTpl let-field>\r\n @if (formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-fb-field-ctx\">\r\n @switch (field.type) {\r\n\r\n <!-- TEXT / EMAIL / PASSWORD -->\r\n @case ('text') { <ng-container *ngTemplateOutlet=\"textFieldTpl; context: { $implicit: field }\" /> }\r\n @case ('email') { <ng-container *ngTemplateOutlet=\"textFieldTpl; context: { $implicit: field }\" /> }\r\n @case ('password') { <ng-container *ngTemplateOutlet=\"textFieldTpl; context: { $implicit: field }\" /> }\r\n\r\n <!-- NUMBER -->\r\n @case ('number') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n @if (field.metadata?.type === 'currency') {\r\n <input matInput type=\"text\" [formControlName]=\"field.key\"\r\n [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly || readonly\"\r\n uiCurrencyInput\r\n [currencySymbol]=\"field.metadata?.currency || 'EUR'\"\r\n [decimalPlaces]=\"field.metadata?.decimals ?? 2\"\r\n />\r\n } @else {\r\n <input matInput type=\"number\" [formControlName]=\"field.key\"\r\n [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly || readonly\"\r\n />\r\n }\r\n @if (field.iconTooltip) {\r\n <button matSuffix mat-icon-button type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\" [attr.aria-label]=\"field.iconTooltip.text\">\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 getFieldErrors(field.key); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- TEXTAREA -->\r\n @case ('textarea') {\r\n <div class=\"ui-form-builder__textarea-wrapper\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <textarea matInput [formControlName]=\"field.key\"\r\n [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly || readonly\"\r\n rows=\"4\"\r\n ></textarea>\r\n @if (field.iconTooltip) {\r\n <button matSuffix mat-icon-button type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\" [attr.aria-label]=\"field.iconTooltip.text\">\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 getFieldErrors(field.key); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n @if (getCharCount(field.key); as cc) {\r\n <span 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 {{ cc.current }} / {{ cc.max }}\r\n </span>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- SELECT -->\r\n @case ('select') {\r\n @if (field.searchable) {\r\n <!-- Autocomplete select -->\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 [formControlName]=\"field.key\"\r\n [matAutocomplete]=\"auto\"\r\n [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly || readonly\"\r\n (input)=\"filterOptions(field, $any($event.target).value)\"\r\n />\r\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayFn(getFieldOptions(field))\">\r\n @for (opt of getFieldOptions(field); 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 getFieldErrors(field.key); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n } @else {\r\n <!-- Standard select -->\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\" [placeholder]=\"field.placeholder || ''\">\r\n @if (!field.hideEmptyOption) {\r\n <mat-option [value]=\"null\">--</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 @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 name=\"info\" [size]=\"14\"\r\n [matTooltip]=\"opt.tooltip\" class=\"ui-form-builder__option-info\" />\r\n }\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (field.iconTooltip) {\r\n <button matSuffix mat-icon-button type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\" [attr.aria-label]=\"field.iconTooltip.text\">\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 getFieldErrors(field.key); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\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); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n <!-- Chips preview sotto il select -->\r\n @if (formGroup.get(field.key)?.value?.length) {\r\n <div class=\"ui-form-builder__chips-preview\">\r\n @for (val of formGroup.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)\"\r\n class=\"ui-form-builder__chip-remove\" 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 formGroup.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\r\n [matChipInputFor]=\"chipGrid\"\r\n [placeholder]=\"field.placeholder || 'Aggiungi...'\"\r\n [readonly]=\"field.readonly || readonly\"\r\n (matChipInputTokenEnd)=\"addFreeChip(field, $event)\"\r\n (blur)=\"addFreeChipOnBlur(field, $event)\"\r\n />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key); 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\r\n [formControlName]=\"field.key\"\r\n [color]=\"field.appearance?.color || 'primary'\"\r\n >\r\n {{ field.label }}\r\n </mat-slide-toggle>\r\n } @else {\r\n <mat-checkbox\r\n [formControlName]=\"field.key\"\r\n [color]=\"field.appearance?.color || 'primary'\"\r\n >\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\"\r\n [matTooltip]=\"field.iconTooltip.text\" class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-checkbox>\r\n }\r\n @if (shouldShowFieldErrors(field.key)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key); 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\r\n [formControlName]=\"field.key\"\r\n [color]=\"field.appearance?.color || 'primary'\"\r\n >\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\"\r\n [matTooltip]=\"field.iconTooltip.text\" 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 <div class=\"ui-form-builder__radio-wrapper\">\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n <mat-radio-group [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n @for (opt of getFieldOptions(field); 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 (shouldShowFieldErrors(field.key)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\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'\"\r\n [readonly]=\"field.readonly || readonly\"\r\n />\r\n <mat-datepicker-toggle matSuffix [for]=\"datepicker\" />\r\n <mat-datepicker #datepicker\r\n [startView]=\"field.customConfig?.config?.['monthView'] ? 'year' : 'month'\"\r\n />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key); 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\"\r\n [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly || readonly\"\r\n />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key); 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)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n <ui-file-input\r\n [formControlName]=\"field.key\"\r\n [config]=\"field.fileConfig\"\r\n />\r\n @if (shouldShowFieldErrors(field.key)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key); 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)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-specifica-territoriale\r\n [formControlName]=\"field.key\"\r\n [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\"\r\n />\r\n @if (shouldShowFieldErrors(field.key)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key); 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\r\n [formControlName]=\"field.key\"\r\n [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\"\r\n />\r\n @if (shouldShowFieldErrors(field.key)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key); 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 @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">{{ field.label }}</label>\r\n }\r\n <!-- I componenti custom devono essere proiettati dall'applicazione host -->\r\n <div class=\"ui-form-builder__custom-placeholder\">\r\n <span>Componente custom: {{ field.customConfig?.component }}</span>\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n<!-- ============================================================ -->\r\n<!-- TEXT / EMAIL / PASSWORD template -->\r\n<!-- ============================================================ -->\r\n<!--\r\n CRITICO: Anche questo template necessita del wrapper [formGroup].\r\n Viene invocato da fieldTpl che gia ha il wrapper, ma siccome\r\n questo e un SECONDO ng-template, Angular crea un NUOVO contesto\r\n di dichiarazione. Il wrapper di fieldTpl non e sufficiente.\r\n-->\r\n<ng-template #textFieldTpl let-field>\r\n @if (formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-fb-text-ctx\">\r\n @if (field.searchable && field.type === 'text') {\r\n <!-- Autocomplete text -->\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 [formControlName]=\"field.key\"\r\n [type]=\"getNativeInputType(field)\"\r\n [matAutocomplete]=\"textAuto\"\r\n [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly || readonly\"\r\n (input)=\"filterOptions(field, $any($event.target).value)\"\r\n />\r\n <mat-autocomplete #textAuto=\"matAutocomplete\">\r\n @for (opt of getFieldOptions(field); 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 getFieldErrors(field.key); 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\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput [formControlName]=\"field.key\"\r\n [type]=\"getNativeInputType(field)\"\r\n [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly || readonly\"\r\n />\r\n @if (field.iconTooltip) {\r\n <button matSuffix mat-icon-button type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\" [attr.aria-label]=\"field.iconTooltip.text\">\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 getFieldErrors(field.key); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n @if (field.type === 'text' && getCharCount(field.key); as cc) {\r\n <span 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 {{ cc.current }} / {{ cc.max }}\r\n </span>\r\n }\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ViewChild,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n ViewEncapsulation,\r\n OnInit,\r\n OnDestroy,\r\n inject,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { Subject } from 'rxjs';\r\n\r\nimport { UiButtonAreaComponent } from '../button/button-area.component';\r\nimport { UiButtonDescriptor } from '../button/button.types';\r\nimport { UiFormBuilderComponent } from '../form-builder/form-builder.component';\r\nimport { UiModalService } from '../modal/modal.service';\r\nimport { UiFormData } from '../form-builder/types/schema.types';\r\n\r\nimport {\r\n UiCrudTableColumn,\r\n UiCrudTableConfig,\r\n UiCrudMode,\r\n UiCrudEditEvent,\r\n UiCrudDeleteEvent,\r\n} from './crud-table.types';\r\n\r\n/**\r\n * Tabella CRUD standalone con form builder integrato.\r\n *\r\n * Gestisce il ciclo completo delle operazioni CRUD:\r\n * inserimento, modifica, duplicazione, eliminazione e\r\n * visualizzazione in sola lettura. Il form e generato\r\n * automaticamente dallo schema `UiFormSchema`.\r\n *\r\n * Utilizza `UiModalService` per la conferma di eliminazione\r\n * e `UiFormBuilderComponent` per la gestione del form.\r\n *\r\n * @selector ui-crud-table\r\n *\r\n * @example\r\n * ```html\r\n * <ui-crud-table\r\n * [data]=\"items\"\r\n * [columns]=\"columns\"\r\n * [config]=\"crudConfig\"\r\n * (dataChange)=\"onDataChange($event)\"\r\n * (itemAdd)=\"onAdd($event)\"\r\n * (itemEdit)=\"onEdit($event)\"\r\n * (itemDelete)=\"onDelete($event)\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-crud-table',\r\n standalone: true,\r\n imports: [NgTemplateOutlet, MatTooltipModule, LucideAngularModule, UiButtonAreaComponent, UiFormBuilderComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: { class: 'ui-crud-table-host' },\r\n template: `\r\n <div class=\"ui-crud-table\">\r\n\r\n <!-- ═══ Stato vuoto ═══════════════════════════════════════ -->\r\n @if (currentMode === 'view' && (!data || data.length === 0) && !loading) {\r\n <div class=\"ui-crud-table__empty\">\r\n <div class=\"ui-crud-table__empty-message\">\r\n <lucide-icon name=\"info\" [size]=\"20\" class=\"ui-crud-table__empty-icon\" aria-hidden=\"true\" />\r\n <span>{{ config?.emptyMessage || 'Nessun elemento presente' }}</span>\r\n </div>\r\n <ui-button-area [buttons]=\"addButton\" align=\"end\" gap=\"xs\" />\r\n </div>\r\n }\r\n\r\n <!-- ═══ Stato di caricamento ══════════════════════════════ -->\r\n @if (loading && currentMode === 'view') {\r\n <div class=\"ui-crud-table__loading\" role=\"status\" aria-live=\"polite\">\r\n <span class=\"ui-crud-table__spinner\" aria-hidden=\"true\"></span>\r\n <span class=\"ui-crud-table__sr-only\">Caricamento in corso</span>\r\n </div>\r\n }\r\n\r\n <!-- ═══ Vista tabella ═════════════════════════════════════ -->\r\n @if (currentMode === 'view' && data && data.length > 0 && !loading) {\r\n <div class=\"ui-crud-table__container\">\r\n <table class=\"ui-crud-table__table\" role=\"grid\" [attr.aria-label]=\"config?.tableLabel || 'Tabella CRUD'\">\r\n <thead>\r\n <tr>\r\n @for (col of columns; track col.key) {\r\n <th\r\n class=\"ui-crud-table__th\"\r\n [style.width]=\"col.width || null\"\r\n [style.text-align]=\"col.align || 'left'\"\r\n >\r\n @if (col.headerTemplate) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"col.headerTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: col, column: col }\"\r\n />\r\n } @else {\r\n {{ col.header }}\r\n }\r\n </th>\r\n }\r\n @if (!disabled && hasAnyActions()) {\r\n <th class=\"ui-crud-table__th ui-crud-table__th--actions\">\r\n Azioni\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (item of data; track trackByFn($index, item); let i = $index) {\r\n <tr\r\n [class]=\"getRowClasses(item, i)\"\r\n (click)=\"onRowClick(item)\"\r\n >\r\n @for (col of columns; track col.key) {\r\n <td\r\n class=\"ui-crud-table__td\"\r\n [style.text-align]=\"col.align || 'left'\"\r\n >\r\n @if (col.template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: item,\r\n row: item,\r\n column: col,\r\n index: i,\r\n value: item[col.key]\r\n }\"\r\n />\r\n } @else if (col.ellipsis && shouldShowEllipsis(col, item[col.key])) {\r\n <span\r\n class=\"ui-crud-table__ellipsis\"\r\n [matTooltip]=\"getFullText(item[col.key])\"\r\n >{{ truncateText(col, item[col.key]) }}</span>\r\n } @else {\r\n <span class=\"ui-crud-table__cell-text\">{{ item[col.key] ?? '\\u2014' }}</span>\r\n }\r\n </td>\r\n }\r\n\r\n <!-- Colonna azioni -->\r\n @if (!disabled && hasAnyActions()) {\r\n <td class=\"ui-crud-table__td ui-crud-table__td--actions\">\r\n <div class=\"ui-crud-table__actions\">\r\n @if (config?.allowView === true) {\r\n <button\r\n class=\"ui-crud-table__action-btn\"\r\n [class.ui-crud-table__action-btn--disabled]=\"!canViewItem(item)\"\r\n [matTooltip]=\"getViewTooltip(item)\"\r\n (click)=\"onViewBtnClick($event, item, i)\"\r\n type=\"button\"\r\n >\r\n <lucide-icon name=\"eye\" [size]=\"16\" aria-hidden=\"true\" />\r\n </button>\r\n }\r\n @if (config?.allowEdit !== false) {\r\n <button\r\n class=\"ui-crud-table__action-btn\"\r\n [class.ui-crud-table__action-btn--disabled]=\"!canEditItem(item)\"\r\n [matTooltip]=\"getEditTooltip(item)\"\r\n (click)=\"onEditBtnClick($event, item, i)\"\r\n type=\"button\"\r\n >\r\n <lucide-icon name=\"pencil\" [size]=\"16\" aria-hidden=\"true\" />\r\n </button>\r\n }\r\n @if (config?.allowDuplicate === true) {\r\n <button\r\n class=\"ui-crud-table__action-btn\"\r\n [class.ui-crud-table__action-btn--disabled]=\"!canDuplicateItem(item)\"\r\n [matTooltip]=\"getDuplicateTooltip(item)\"\r\n (click)=\"onDuplicateBtnClick($event, item)\"\r\n type=\"button\"\r\n >\r\n <lucide-icon name=\"copy\" [size]=\"16\" aria-hidden=\"true\" />\r\n </button>\r\n }\r\n @if (config?.allowDelete !== false) {\r\n <button\r\n class=\"ui-crud-table__action-btn ui-crud-table__action-btn--warn\"\r\n [class.ui-crud-table__action-btn--disabled]=\"!canDeleteItem(item)\"\r\n [matTooltip]=\"getDeleteTooltip(item)\"\r\n (click)=\"onDeleteBtnClick($event, item, i)\"\r\n type=\"button\"\r\n >\r\n <lucide-icon name=\"trash-2\" [size]=\"16\" aria-hidden=\"true\" />\r\n </button>\r\n }\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <!-- Footer con pulsante aggiungi -->\r\n <div class=\"ui-crud-table__footer\">\r\n <ui-button-area [buttons]=\"addButton\" align=\"end\" gap=\"xs\" />\r\n </div>\r\n }\r\n\r\n <!-- ═══ Vista form (insert/edit/duplicate/readonly) ══════ -->\r\n @if (isFormMode) {\r\n <div class=\"ui-crud-table__form\">\r\n <div class=\"ui-crud-table__form-header\">\r\n <h4 class=\"ui-crud-table__form-title\">\r\n @switch (currentMode) {\r\n @case ('insert') { Nuovo elemento }\r\n @case ('edit') { Modifica elemento }\r\n @case ('duplicate') { Duplica elemento }\r\n @case ('readonly') { Visualizza elemento }\r\n }\r\n </h4>\r\n </div>\r\n <div class=\"ui-crud-table__form-content\">\r\n <ui-form-builder\r\n [schema]=\"config.formSchema\"\r\n [initialData]=\"formInitialData\"\r\n [readonly]=\"isReadonlyMode\"\r\n [buttonsOverride]=\"formButtons\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styleUrl: './crud-table.component.scss',\r\n})\r\nexport class UiCrudTableComponent<T extends Record<string, any> = Record<string, any>> implements OnInit, OnDestroy {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly modalService = inject(UiModalService);\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n // ── Inputs ──────────────────────────────────────────────────────\r\n\r\n /** Array di dati da visualizzare nella tabella. */\r\n @Input() data: T[] = [];\r\n\r\n /** Definizione delle colonne. */\r\n @Input() columns: UiCrudTableColumn[] = [];\r\n\r\n /** Configurazione CRUD (schema form, permessi, label). */\r\n @Input() config!: UiCrudTableConfig;\r\n\r\n /** Mostra l'overlay di caricamento. */\r\n @Input() loading = false;\r\n\r\n /** Disabilita tutte le azioni CRUD. */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Funzione di mappatura applicata ai dati di un elemento\r\n * prima di passarli come `initialData` al form builder.\r\n * Utile per trasformare la struttura dati dell'oggetto.\r\n */\r\n @Input() initMapper?: (originalData: T) => Record<string, any>;\r\n\r\n // ── Outputs ─────────────────────────────────────────────────────\r\n\r\n /** Emesso ogni volta che la lista dati cambia (insert/edit/duplicate). */\r\n @Output() dataChange = new EventEmitter<T[]>();\r\n\r\n /** Emesso quando viene inserito un nuovo elemento. */\r\n @Output() itemAdd = new EventEmitter<T>();\r\n\r\n /** Emesso quando viene modificato un elemento. */\r\n @Output() itemEdit = new EventEmitter<UiCrudEditEvent<T>>();\r\n\r\n /** Emesso quando viene eliminato un elemento (dopo conferma). */\r\n @Output() itemDelete = new EventEmitter<UiCrudDeleteEvent<T>>();\r\n\r\n /** Emesso quando viene duplicato un elemento. */\r\n @Output() itemDuplicate = new EventEmitter<T>();\r\n\r\n /** Emesso quando l'utente clicca su una riga in modalita view. */\r\n @Output() rowClick = new EventEmitter<T>();\r\n\r\n // ── Stato interno ───────────────────────────────────────────────\r\n\r\n /** @internal Modalita corrente. */\r\n currentMode: UiCrudMode = 'view';\r\n\r\n /** @internal Elemento in fase di modifica/visualizzazione. */\r\n editingItem: T | null = null;\r\n\r\n /** @internal Indice dell'elemento in modifica. */\r\n editingIndex: number | null = null;\r\n\r\n /** @internal Dati originali dell'elemento prima della modifica. */\r\n private lastOriginalData: any = null;\r\n\r\n /** @internal Cache per i dati iniziali del form. */\r\n private _formInitialData: UiFormData = {};\r\n private _lastCacheKey: string | null = null;\r\n\r\n /** @internal Riferimento al form builder. */\r\n @ViewChild(UiFormBuilderComponent) formBuilder!: UiFormBuilderComponent;\r\n\r\n /** @internal Pulsanti per il form. */\r\n formButtons: UiButtonDescriptor[] = [];\r\n\r\n /** @internal Pulsante aggiungi. */\r\n addButton: UiButtonDescriptor[] = [];\r\n\r\n // ── Lifecycle ───────────────────────────────────────────────────\r\n\r\n ngOnInit(): void {\r\n this.setupButtons();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n // ── Getter calcolati ────────────────────────────────────────────\r\n\r\n /** La tabella e in modalita form (insert/edit/duplicate/readonly). */\r\n get isFormMode(): boolean {\r\n return this.currentMode !== 'view';\r\n }\r\n\r\n /** La tabella e in modalita sola lettura. */\r\n get isReadonlyMode(): boolean {\r\n return this.currentMode === 'readonly';\r\n }\r\n\r\n /** Dati iniziali calcolati per il form builder. */\r\n get formInitialData(): UiFormData {\r\n const cacheKey = this.generateCacheKey();\r\n if (this._lastCacheKey === cacheKey && this._formInitialData) {\r\n return this._formInitialData;\r\n }\r\n\r\n let data: UiFormData = {};\r\n if (this.currentMode === 'edit' || this.currentMode === 'duplicate' || this.currentMode === 'readonly') {\r\n data = this.initMapper ? this.initMapper(this.editingItem as T) : (this.editingItem as UiFormData) || {};\r\n }\r\n\r\n this._formInitialData = data;\r\n this._lastCacheKey = cacheKey;\r\n return this._formInitialData;\r\n }\r\n\r\n // ── Permessi ────────────────────────────────────────────────────\r\n\r\n /** Verifica se ci sono azioni disponibili (per mostrare la colonna azioni). */\r\n hasAnyActions(): boolean {\r\n return (\r\n this.config?.allowEdit !== false ||\r\n this.config?.allowDuplicate === true ||\r\n this.config?.allowDelete !== false ||\r\n this.config?.allowView === true\r\n );\r\n }\r\n\r\n /** Verifica se l'elemento puo essere modificato. */\r\n canEditItem(item: any): boolean {\r\n if (this.config?.canEdit) {\r\n return this.config.canEdit(item, this.currentMode === 'readonly');\r\n }\r\n return this.config?.allowEdit !== false;\r\n }\r\n\r\n /** Verifica se l'elemento puo essere eliminato. */\r\n canDeleteItem(item: any): boolean {\r\n if (this.config?.canDelete) {\r\n return this.config.canDelete(item, this.currentMode === 'readonly');\r\n }\r\n return this.config?.allowDelete !== false;\r\n }\r\n\r\n /** Verifica se l'elemento puo essere duplicato. */\r\n canDuplicateItem(item: any): boolean {\r\n if (this.config?.canDuplicate) {\r\n return this.config.canDuplicate(item, this.currentMode === 'readonly');\r\n }\r\n return this.config?.allowDuplicate === true;\r\n }\r\n\r\n /** Verifica se l'elemento puo essere visualizzato in readonly. */\r\n canViewItem(item: any): boolean {\r\n if (this.config?.canView) {\r\n return this.config.canView(item);\r\n }\r\n return this.config?.allowView === true;\r\n }\r\n\r\n // ── Tooltip ─────────────────────────────────────────────────────\r\n\r\n getEditTooltip(item: any): string {\r\n if (this.config?.getEditTooltip) return this.config.getEditTooltip(item);\r\n return this.canEditItem(item) ? 'Modifica' : 'Modifica non disponibile';\r\n }\r\n\r\n getDeleteTooltip(item: any): string {\r\n if (this.config?.getDeleteTooltip) return this.config.getDeleteTooltip(item);\r\n return this.canDeleteItem(item) ? 'Elimina' : 'Eliminazione non disponibile';\r\n }\r\n\r\n getDuplicateTooltip(item: any): string {\r\n if (this.config?.getDuplicateTooltip) return this.config.getDuplicateTooltip(item);\r\n return this.canDuplicateItem(item) ? 'Duplica' : 'Duplicazione non disponibile';\r\n }\r\n\r\n getViewTooltip(item: any): string {\r\n if (this.config?.getViewTooltip) return this.config.getViewTooltip(item);\r\n return this.canViewItem(item) ? 'Visualizza' : 'Visualizzazione non disponibile';\r\n }\r\n\r\n // ── Classi CSS per riga ─────────────────────────────────────────\r\n\r\n getRowClasses(item: any, index: number): string {\r\n let classes = 'ui-crud-table__row';\r\n if (this.config?.getRowClass) {\r\n const extra = this.config.getRowClass(item, index);\r\n if (Array.isArray(extra)) {\r\n classes += ' ' + extra.join(' ');\r\n } else if (extra) {\r\n classes += ' ' + extra;\r\n }\r\n }\r\n return classes;\r\n }\r\n\r\n // ── Ellipsis ────────────────────────────────────────────────────\r\n\r\n shouldShowEllipsis(col: UiCrudTableColumn, value: any): boolean {\r\n if (!col.ellipsis || value == null) return false;\r\n return String(value).length > (col.maxLength || 50);\r\n }\r\n\r\n truncateText(col: UiCrudTableColumn, value: any): string {\r\n if (value == null) return '\\u2014';\r\n const str = String(value);\r\n const max = col.maxLength || 50;\r\n return str.length > max ? str.substring(0, max) + '\\u2026' : str;\r\n }\r\n\r\n getFullText(value: any): string {\r\n return String(value ?? '\\u2014');\r\n }\r\n\r\n // ── Operazioni CRUD ─────────────────────────────────────────────\r\n\r\n /** Attiva la modalita inserimento. */\r\n activateInsertMode(): void {\r\n this.config?.onBeforeFormOpen?.('insert', null, this.data);\r\n this.currentMode = 'insert';\r\n this.editingItem = null;\r\n this.editingIndex = null;\r\n this.invalidateFormCache();\r\n this.setupButtons();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Attiva la modalita modifica per un elemento. */\r\n activateEditMode(item: T, index: number): void {\r\n if (!this.canEditItem(item)) return;\r\n this.config?.onBeforeFormOpen?.('edit', item, this.data);\r\n this.currentMode = 'edit';\r\n this.lastOriginalData = item;\r\n this.editingItem = { ...item };\r\n this.editingIndex = index;\r\n this.invalidateFormCache();\r\n this.setupButtons();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Attiva la modalita visualizzazione readonly per un elemento. */\r\n activateViewMode(item: T, index: number): void {\r\n if (!this.canViewItem(item)) return;\r\n this.currentMode = 'readonly';\r\n this.lastOriginalData = item;\r\n this.editingItem = { ...item };\r\n this.editingIndex = index;\r\n this.invalidateFormCache();\r\n this.setupButtons();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Attiva la modalita duplicazione per un elemento. */\r\n activateDuplicateMode(item: T): void {\r\n if (!this.canDuplicateItem(item)) return;\r\n this.config?.onBeforeFormOpen?.('duplicate', item, this.data);\r\n this.currentMode = 'duplicate';\r\n this.editingItem = { ...item };\r\n this.editingIndex = null;\r\n this.invalidateFormCache();\r\n this.setupButtons();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Annulla il form e torna alla vista tabella. */\r\n cancelForm(): void {\r\n this.currentMode = 'view';\r\n this.editingItem = null;\r\n this.editingIndex = null;\r\n this.lastOriginalData = null;\r\n this.invalidateFormCache();\r\n this.setupButtons();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Salva i dati del form (insert/edit/duplicate). */\r\n saveForm(): void {\r\n if (!this.formBuilder) return;\r\n if (!this.formBuilder.isFormValid()) {\r\n this.formBuilder.validateAllFields();\r\n return;\r\n }\r\n\r\n const formData = this.formBuilder.getFormValue() as T;\r\n const newData = [...this.data];\r\n\r\n switch (this.currentMode) {\r\n case 'insert':\r\n newData.push(formData);\r\n this.itemAdd.emit(formData);\r\n break;\r\n case 'duplicate':\r\n newData.push(formData);\r\n this.itemDuplicate.emit(formData);\r\n break;\r\n case 'edit':\r\n if (this.editingIndex !== null) {\r\n newData[this.editingIndex] = formData;\r\n this.itemEdit.emit({\r\n item: formData,\r\n index: this.editingIndex,\r\n originalData: this.lastOriginalData,\r\n });\r\n }\r\n break;\r\n }\r\n\r\n this.data = newData;\r\n this.dataChange.emit(this.data);\r\n this.cancelForm();\r\n }\r\n\r\n /** Elimina un elemento con conferma tramite UiModalService. */\r\n deleteItem(item: T, index: number): void {\r\n if (!this.canDeleteItem(item)) return;\r\n\r\n const message = this.config?.deleteConfirmMessage || 'Sei sicuro di voler eliminare questo elemento?';\r\n\r\n this.modalService\r\n .confirm({\r\n title: 'Conferma eliminazione',\r\n message,\r\n confirmText: 'Elimina',\r\n cancelText: 'Annulla',\r\n variant: 'delete',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) {\r\n this.itemDelete.emit({ item, index });\r\n }\r\n });\r\n }\r\n\r\n // ── Event handlers template ─────────────────────────────────────\r\n\r\n onRowClick(item: T): void {\r\n if (this.currentMode === 'view') {\r\n this.rowClick.emit(item);\r\n }\r\n }\r\n\r\n /** @internal */\r\n onViewBtnClick(event: Event, item: T, index: number): void {\r\n event.stopPropagation();\r\n if (this.disabled || !this.canViewItem(item)) return;\r\n this.activateViewMode(item, index);\r\n }\r\n\r\n /** @internal */\r\n onEditBtnClick(event: Event, item: T, index: number): void {\r\n event.stopPropagation();\r\n if (this.disabled || !this.canEditItem(item)) return;\r\n this.activateEditMode(item, index);\r\n }\r\n\r\n /** @internal */\r\n onDuplicateBtnClick(event: Event, item: T): void {\r\n event.stopPropagation();\r\n if (this.disabled || !this.canDuplicateItem(item)) return;\r\n this.activateDuplicateMode(item);\r\n }\r\n\r\n /** @internal */\r\n onDeleteBtnClick(event: Event, item: T, index: number): void {\r\n event.stopPropagation();\r\n if (this.disabled || !this.canDeleteItem(item)) return;\r\n this.deleteItem(item, index);\r\n }\r\n\r\n /** @internal Track function per il loop @for. */\r\n trackByFn = (index: number, item: any): any => {\r\n const trackBy = this.config?.trackByProperty || 'id';\r\n return item[trackBy] ?? index;\r\n };\r\n\r\n // ── Utilita private ─────────────────────────────────────────────\r\n\r\n /** @internal Genera una chiave per la cache dei dati del form. */\r\n private generateCacheKey(): string {\r\n if (this.currentMode === 'view' || this.currentMode === 'insert') {\r\n return this.currentMode;\r\n }\r\n const itemId = this.editingItem ? JSON.stringify(this.editingItem) : 'null';\r\n return `${this.currentMode}-${itemId}`;\r\n }\r\n\r\n /** @internal Invalida la cache dei dati del form. */\r\n private invalidateFormCache(): void {\r\n this._formInitialData = {};\r\n this._lastCacheKey = null;\r\n }\r\n\r\n /** @internal Configura i pulsanti in base alla modalita corrente. */\r\n private setupButtons(): void {\r\n // Pulsante \"Aggiungi\" (visibile solo in modalita view)\r\n this.addButton =\r\n this.currentMode === 'view' && this.config?.allowAdd !== false && !this.disabled\r\n ? [\r\n {\r\n id: 'crud-add',\r\n label: this.config?.addButtonLabel || 'Aggiungi',\r\n variant: 'outline',\r\n icon: 'plus',\r\n action: () => this.activateInsertMode(),\r\n },\r\n ]\r\n : [];\r\n\r\n // Pulsanti form (visibili in modalita form)\r\n this.formButtons = this.isFormMode\r\n ? [\r\n {\r\n id: 'crud-cancel',\r\n label: this.isReadonlyMode ? 'Chiudi' : this.config?.cancelButtonLabel || 'Annulla',\r\n variant: 'outline',\r\n action: () => this.cancelForm(),\r\n },\r\n ...(this.isReadonlyMode\r\n ? []\r\n : [\r\n {\r\n id: 'crud-save',\r\n label: this.getSaveButtonLabel(),\r\n variant: 'primary' as const,\r\n icon: 'check' as const,\r\n action: () => this.saveForm(),\r\n },\r\n ]),\r\n ]\r\n : [];\r\n }\r\n\r\n /** @internal Restituisce la label del pulsante salva in base alla modalita. */\r\n private getSaveButtonLabel(): string {\r\n switch (this.currentMode) {\r\n case 'edit':\r\n return this.config?.updateButtonLabel || 'Aggiorna';\r\n case 'duplicate':\r\n return this.config?.duplicateButtonLabel || 'Duplica';\r\n default:\r\n return this.config?.saveButtonLabel || 'Salva';\r\n }\r\n }\r\n}\r\n","/**\r\n * ng-ui-system — CRUD Table entry point.\r\n *\r\n * @example\r\n * ```typescript\r\n * import {\r\n * UiCrudTableComponent,\r\n * UiCrudTableColumn,\r\n * UiCrudTableConfig,\r\n * UiCrudMode,\r\n * } from 'ng-ui-system';\r\n * ```\r\n */\r\n\r\n// Componente\r\nexport { UiCrudTableComponent } from './crud-table.component';\r\n\r\n// Tipi\r\nexport {\r\n UiCrudTableColumn,\r\n UiCrudTableConfig,\r\n UiCrudMode,\r\n UiCrudEditEvent,\r\n UiCrudDeleteEvent,\r\n} from './crud-table.types';\r\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { UiWizardState, UiFormSchema } from '../types/schema.types';\n\n/**\n * Dati sincronizzati tra istanze wizard.\n * Usato per la funzionalita \"wireless heading\" che permette\n * a un componente esterno di controllare la visualizzazione\n * dell'header del wizard.\n */\nexport interface UiWizardSyncData {\n /** ID del wizard. */\n wizardId: string;\n /** Stato corrente del wizard. */\n wizardState: UiWizardState;\n /** Configurazioni degli step. */\n wizardSteps: { title?: string; description?: string }[];\n /** Se il wizard e attivo. */\n isWizardMode: boolean;\n /** Schema corrente del form. */\n schema: UiFormSchema | null;\n}\n\n/**\n * Servizio per la sincronizzazione dello stato del wizard\n * tra istanze multiple (es. header esterno e form wizard).\n *\n * Utilizza BehaviorSubject per mantenere lo stato corrente\n * e notificare i sottoscrittori in tempo reale.\n *\n * @providedIn 'root'\n *\n * @example\n * ```typescript\n * // Nel componente header esterno\n * this.wizardSync.getWizardState$('my-wizard')\n * .subscribe(data => {\n * this.currentStep = data?.wizardState.currentStep;\n * this.totalSteps = data?.wizardState.totalSteps;\n * });\n *\n * // Navigazione da header esterno\n * this.wizardSync.navigateToStep('my-wizard', 2);\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class UiWizardSyncService {\n private readonly instances = new Map<string, BehaviorSubject<UiWizardSyncData | null>>();\n\n /** Registra un nuovo wizard o aggiorna uno esistente. */\n registerWizard(wizardId: string, data: UiWizardSyncData): void {\n if (!this.instances.has(wizardId)) {\n this.instances.set(wizardId, new BehaviorSubject<UiWizardSyncData | null>(null));\n }\n this.instances.get(wizardId)!.next(data);\n }\n\n /** Ottiene un observable per monitorare lo stato di un wizard. */\n getWizardState$(wizardId: string): Observable<UiWizardSyncData | null> {\n if (!this.instances.has(wizardId)) {\n this.instances.set(wizardId, new BehaviorSubject<UiWizardSyncData | null>(null));\n }\n return this.instances.get(wizardId)!.asObservable();\n }\n\n /** Ottiene lo stato corrente (snapshot). */\n getCurrentWizardState(wizardId: string): UiWizardSyncData | null {\n return this.instances.get(wizardId)?.value ?? null;\n }\n\n /** Rimuove un wizard dal registro (cleanup su destroy). */\n unregisterWizard(wizardId: string): void {\n const subject = this.instances.get(wizardId);\n if (subject) {\n subject.complete();\n this.instances.delete(wizardId);\n }\n }\n\n /** Aggiorna parzialmente lo stato del wizard. */\n updateWizardState(wizardId: string, partial: Partial<UiWizardState>): void {\n const subject = this.instances.get(wizardId);\n const current = subject?.value;\n if (current) {\n subject!.next({\n ...current,\n wizardState: { ...current.wizardState, ...partial },\n });\n }\n }\n\n /** Emette un evento di navigazione verso uno step specifico. */\n navigateToStep(wizardId: string, stepIndex: number): void {\n const current = this.getCurrentWizardState(wizardId);\n if (current) {\n this.updateWizardState(wizardId, {\n currentStep: stepIndex,\n visitedSteps: new Set([...current.wizardState.visitedSteps, stepIndex]),\n });\n }\n }\n}\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectorRef,\r\n ViewEncapsulation,\r\n ViewChild,\r\n inject,\r\n} from '@angular/core';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { UiButtonComponent } from '../../components/button/index';\r\n\r\nimport { UiFormBuilderComponent } from './form-builder.component';\r\nimport {\r\n UiFormSchema,\r\n UiFormSection,\r\n UiFormData,\r\n UiWizardConfig,\r\n UiWizardState,\r\n UiWizardStepChangeEvent,\r\n UiWizardStepCompleteEvent,\r\n UiWizardValidationFn,\r\n UiFormCustomEvent,\r\n} from './types/schema.types';\r\nimport { UiFormValidationState } from './types/validation.types';\r\nimport { UiWizardSyncService, UiWizardSyncData } from './services/wizard-sync.service';\r\n\r\n/**\r\n * Componente wizard che wrappa `UiFormBuilderComponent`\r\n * aggiungendo navigazione multi-step, barra di progresso,\r\n * validazione per step e sincronizzazione wireless.\r\n *\r\n * @selector ui-form-wizard\r\n *\r\n * @example\r\n * ```html\r\n * <ui-form-wizard\r\n * [schema]=\"wizardSchema\"\r\n * [wizardConfig]=\"wizardConfig\"\r\n * (wizardComplete)=\"onComplete($event)\"\r\n * (stepChange)=\"onStepChange($event)\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-form-wizard',\r\n standalone: true,\r\n imports: [LucideAngularModule, UiButtonComponent, UiFormBuilderComponent],\r\n encapsulation: ViewEncapsulation.None,\r\n template: `\r\n @if (schema && wizardConfig) {\r\n <div class=\"ui-form-wizard\">\r\n\r\n <!-- Header wizard (nascosto se wireless) -->\r\n @if (!wizardConfig.wirelessHeading) {\r\n <div class=\"ui-form-wizard__header\">\r\n\r\n @if (wizardConfig.showProgress !== false) {\r\n <!-- Barra progresso lineare -->\r\n @if (wizardConfig.progressStyle !== 'steps') {\r\n <div class=\"ui-form-wizard__progress-bar\">\r\n <div class=\"ui-form-wizard__progress-fill\"\r\n [style.width.%]=\"progressPercent\"></div>\r\n </div>\r\n <span class=\"ui-form-wizard__progress-text\">\r\n {{ progressPercent }}% completato\r\n </span>\r\n } @else {\r\n <!-- Step indicators -->\r\n <div class=\"ui-form-wizard__steps\">\r\n @for (step of wizardSteps; track $index; let i = $index) {\r\n <div class=\"ui-form-wizard__step\"\r\n [class.ui-form-wizard__step--current]=\"i === state.currentStep\"\r\n [class.ui-form-wizard__step--completed]=\"state.completedSteps.has(i)\"\r\n [class.ui-form-wizard__step--visited]=\"state.visitedSteps.has(i)\"\r\n >\r\n <div class=\"ui-form-wizard__step-circle\">\r\n @if (state.completedSteps.has(i)) {\r\n <lucide-icon name=\"check\" [size]=\"16\" />\r\n } @else {\r\n <span>{{ i + 1 }}</span>\r\n }\r\n </div>\r\n <div class=\"ui-form-wizard__step-label\">\r\n {{ step.wizardStep?.stepTitle || step.title || 'Step ' + (i + 1) }}\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Info step corrente -->\r\n <div class=\"ui-form-wizard__step-info\">\r\n <h2 class=\"ui-form-wizard__step-title\">{{ currentStepTitle }}</h2>\r\n @if (currentStepDescription) {\r\n <p class=\"ui-form-wizard__step-description\">{{ currentStepDescription }}</p>\r\n }\r\n <span class=\"ui-form-wizard__step-counter\">\r\n Passo {{ state.currentStep + 1 }} di {{ state.totalSteps }}\r\n </span>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Form builder per lo step corrente -->\r\n <ui-form-builder\r\n [schema]=\"currentStepSchema!\"\r\n [initialData]=\"initialData\"\r\n [readonly]=\"readonly\"\r\n [disabled]=\"disabled\"\r\n [loadingFor]=\"loadingFor\"\r\n (valueChange)=\"onValueChange($event)\"\r\n (validationChange)=\"onValidationChange($event)\"\r\n (customEvent)=\"customEvent.emit($event)\"\r\n />\r\n\r\n <!-- Footer navigazione -->\r\n @if (wizardConfig.showNavigationButtons !== false) {\r\n <div class=\"ui-form-wizard__footer\">\r\n @if (wizardConfig.allowBackNavigation !== false && state.currentStep > 0) {\r\n <ui-button\r\n label=\"{{ wizardConfig.buttonLabels?.previous || 'Indietro' }}\"\r\n variant=\"outline\"\r\n icon=\"chevron-left\"\r\n (click)=\"goToPreviousStep()\"\r\n />\r\n } @else {\r\n <div></div>\r\n }\r\n\r\n <div class=\"ui-form-wizard__footer-right\">\r\n @if (wizardConfig.autoSave && wizardConfig.buttonLabels?.save) {\r\n <ui-button\r\n [label]=\"wizardConfig.buttonLabels!.save!\"\r\n variant=\"outline\"\r\n (click)=\"saveCurrentStep()\"\r\n />\r\n }\r\n @if (isLastStep) {\r\n <ui-button\r\n label=\"{{ wizardConfig.buttonLabels?.finish || 'Completa' }}\"\r\n variant=\"primary\"\r\n icon=\"check\"\r\n iconPosition=\"trailing\"\r\n (click)=\"finishWizard()\"\r\n />\r\n } @else {\r\n <ui-button\r\n label=\"{{ wizardConfig.buttonLabels?.next || 'Avanti' }}\"\r\n variant=\"primary\"\r\n icon=\"chevron-right\"\r\n iconPosition=\"trailing\"\r\n (click)=\"goToNextStep()\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n `,\r\n styleUrl: './form-wizard.component.scss',\r\n})\r\nexport class UiFormWizardComponent implements OnInit, OnDestroy {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly wizardSync = inject(UiWizardSyncService);\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n @ViewChild(UiFormBuilderComponent) formBuilder?: UiFormBuilderComponent;\r\n\r\n // ─── Input ──────────────────────────────────────────────────────\r\n\r\n /** Schema completo del form (tutte le sezioni con wizardStep). */\r\n @Input() schema!: UiFormSchema;\r\n\r\n /** Configurazione del wizard. */\r\n @Input() wizardConfig!: UiWizardConfig;\r\n\r\n /** Metodi di validazione custom per step. */\r\n @Input() customValidationMethods: Record<string, UiWizardValidationFn> = {};\r\n\r\n /** Dati iniziali. */\r\n @Input() initialData: UiFormData = {};\r\n\r\n /** Modalita sola lettura. */\r\n @Input() readonly = false;\r\n\r\n /** Stato disabilitato. */\r\n @Input() disabled = false;\r\n\r\n /** Pulsante in caricamento. */\r\n @Input() loadingFor: string | null = null;\r\n\r\n // ─── Output ─────────────────────────────────────────────────────\r\n\r\n @Output() stepChange = new EventEmitter<UiWizardStepChangeEvent>();\r\n @Output() stepComplete = new EventEmitter<UiWizardStepCompleteEvent>();\r\n @Output() stepValidationFailed = new EventEmitter<{ step: number; errors: string[] }>();\r\n @Output() wizardComplete = new EventEmitter<UiFormData>();\r\n @Output() valueChange = new EventEmitter<UiFormData>();\r\n @Output() validationChange = new EventEmitter<UiFormValidationState>();\r\n @Output() customEvent = new EventEmitter<UiFormCustomEvent>();\r\n\r\n // ─── Stato ──────────────────────────────────────────────────────\r\n\r\n state: UiWizardState = {\r\n currentStep: 0,\r\n totalSteps: 0,\r\n completedSteps: new Set<number>(),\r\n visitedSteps: new Set<number>([0]),\r\n isValid: false,\r\n stepErrors: {},\r\n };\r\n\r\n /** Step ordinati per stepNumber. */\r\n wizardSteps: UiFormSection[] = [];\r\n\r\n /** Dati accumulati del form. */\r\n private accumulatedData: UiFormData = {};\r\n\r\n /**\r\n * Schema cachato per lo step corrente.\r\n * Evita di creare un nuovo oggetto ad ogni ciclo di change detection,\r\n * cosa che causerebbe rebuild infiniti nel form builder.\r\n */\r\n _cachedStepSchema: UiFormSchema | null = null;\r\n private _cachedStepIndex: number = -1;\r\n\r\n // ─── Getter calcolati ───────────────────────────────────────────\r\n\r\n get currentStepSchema(): UiFormSchema | null {\r\n // Se lo step non e cambiato, restituisci lo schema cachato\r\n if (this._cachedStepIndex === this.state.currentStep && this._cachedStepSchema) {\r\n return this._cachedStepSchema;\r\n }\r\n\r\n const step = this.wizardSteps[this.state.currentStep];\r\n if (!step) return null;\r\n\r\n this._cachedStepSchema = {\r\n id: this.schema.id + '-step-' + this.state.currentStep,\r\n sections: [step],\r\n config: { ...this.schema.config, hideFooter: true, showButtons: false },\r\n };\r\n this._cachedStepIndex = this.state.currentStep;\r\n return this._cachedStepSchema;\r\n }\r\n\r\n get currentStepTitle(): string {\r\n const step = this.wizardSteps[this.state.currentStep];\r\n return step?.wizardStep?.stepTitle || step?.title || '';\r\n }\r\n\r\n get currentStepDescription(): string {\r\n const step = this.wizardSteps[this.state.currentStep];\r\n return step?.wizardStep?.stepDescription || step?.description || '';\r\n }\r\n\r\n get isLastStep(): boolean {\r\n return this.state.currentStep >= this.state.totalSteps - 1;\r\n }\r\n\r\n get progressPercent(): number {\r\n if (this.state.totalSteps <= 1) return 100;\r\n return Math.round((this.state.currentStep / (this.state.totalSteps - 1)) * 100);\r\n }\r\n\r\n // ─── Lifecycle ──────────────────────────────────────────────────\r\n\r\n ngOnInit(): void {\r\n if (!this.schema) return;\r\n\r\n // Estrai e ordina gli step\r\n this.wizardSteps = this.schema.sections\r\n .filter((s) => s.wizardStep)\r\n .sort((a, b) => (a.wizardStep!.stepNumber || 0) - (b.wizardStep!.stepNumber || 0));\r\n\r\n this.state.totalSteps = this.wizardSteps.length;\r\n this.accumulatedData = { ...this.initialData };\r\n\r\n // Sincronizzazione wireless\r\n if (this.wizardConfig.wizardId) {\r\n this.syncWizardState();\r\n\r\n // Ascolta navigazione esterna\r\n this.wizardSync\r\n .getWizardState$(this.wizardConfig.wizardId)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((data) => {\r\n if (data && data.wizardState.currentStep !== this.state.currentStep) {\r\n this.navigateToStep(data.wizardState.currentStep);\r\n }\r\n });\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n if (this.wizardConfig?.wizardId) {\r\n this.wizardSync.unregisterWizard(this.wizardConfig.wizardId);\r\n }\r\n }\r\n\r\n // ─── Navigazione ────────────────────────────────────────────────\r\n\r\n /** Vai allo step successivo con validazione. */\r\n async goToNextStep(): Promise<void> {\r\n if (this.isLastStep) return;\r\n\r\n // Valida step corrente\r\n if (!(await this.validateCurrentStep())) return;\r\n\r\n // Salva dati step corrente\r\n this.state.completedSteps.add(this.state.currentStep);\r\n await this.autoSaveIfNeeded();\r\n\r\n this.navigateToStep(this.state.currentStep + 1);\r\n }\r\n\r\n /** Torna allo step precedente. */\r\n goToPreviousStep(): void {\r\n if (this.state.currentStep <= 0) return;\r\n this.navigateToStep(this.state.currentStep - 1);\r\n }\r\n\r\n /** Completa il wizard. */\r\n async finishWizard(): Promise<void> {\r\n if (!(await this.validateCurrentStep())) return;\r\n\r\n this.state.completedSteps.add(this.state.currentStep);\r\n await this.autoSaveIfNeeded();\r\n\r\n this.wizardComplete.emit(this.accumulatedData);\r\n }\r\n\r\n /** Salva lo step corrente manualmente. */\r\n async saveCurrentStep(): Promise<void> {\r\n if (this.wizardConfig.onStepSave) {\r\n const data = this.formBuilder?.getFormValue() || {};\r\n await this.wizardConfig.onStepSave(data, this.state.currentStep);\r\n }\r\n }\r\n\r\n // ─── Callback form builder ─────────────────────────────────────\r\n\r\n onValueChange(data: UiFormData): void {\r\n this.accumulatedData = { ...this.accumulatedData, ...data };\r\n this.valueChange.emit(this.accumulatedData);\r\n }\r\n\r\n onValidationChange(state: UiFormValidationState): void {\r\n this.state.isValid = state.valid;\r\n this.validationChange.emit(state);\r\n }\r\n\r\n // ─── Navigazione interna ───────────────────────────────────────\r\n\r\n private navigateToStep(targetStep: number): void {\r\n if (targetStep < 0 || targetStep >= this.state.totalSteps) return;\r\n\r\n const from = this.state.currentStep;\r\n this.state.currentStep = targetStep;\r\n this.state.visitedSteps.add(targetStep);\r\n\r\n // Invalida la cache per forzare la creazione di un nuovo schema\r\n this._cachedStepSchema = null;\r\n this._cachedStepIndex = -1;\r\n\r\n this.stepChange.emit({\r\n from,\r\n to: targetStep,\r\n direction: targetStep > from ? 'next' : 'previous',\r\n });\r\n\r\n this.syncWizardState();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private async validateCurrentStep(): Promise<boolean> {\r\n // Validazione form standard\r\n this.formBuilder?.validateAllFields();\r\n const isFormValid = this.formBuilder?.isFormValid() ?? true;\r\n\r\n // Validazione custom per step\r\n const step = this.wizardSteps[this.state.currentStep];\r\n const customFnName = step?.wizardStep?.customValidationFn;\r\n\r\n if (customFnName && this.customValidationMethods[customFnName]) {\r\n const customValid = await this.customValidationMethods[customFnName](\r\n this.accumulatedData,\r\n this.state.currentStep,\r\n isFormValid,\r\n );\r\n\r\n if (!customValid) {\r\n this.stepValidationFailed.emit({\r\n step: this.state.currentStep,\r\n errors: ['Validazione custom fallita'],\r\n });\r\n return false;\r\n }\r\n }\r\n\r\n // Se il form non e valido, blocca la navigazione\r\n if (!isFormValid && step?.wizardStep?.validation?.required !== false) {\r\n const errors = this.formBuilder?.getDetailedFormErrors().flatMap((e) => e.errors) || [];\r\n this.stepValidationFailed.emit({\r\n step: this.state.currentStep,\r\n errors,\r\n });\r\n return false;\r\n }\r\n\r\n this.stepComplete.emit({\r\n step: this.state.currentStep,\r\n data: this.formBuilder?.getFormValue() || {},\r\n });\r\n\r\n return true;\r\n }\r\n\r\n private async autoSaveIfNeeded(): Promise<void> {\r\n if (this.wizardConfig.autoSave && this.wizardConfig.onStepSave) {\r\n const data = this.formBuilder?.getFormValue() || {};\r\n await this.wizardConfig.onStepSave(data, this.state.currentStep);\r\n }\r\n }\r\n\r\n private syncWizardState(): void {\r\n if (!this.wizardConfig.wizardId) return;\r\n\r\n const syncData: UiWizardSyncData = {\r\n wizardId: this.wizardConfig.wizardId,\r\n wizardState: { ...this.state },\r\n wizardSteps: this.wizardSteps.map((s) => ({\r\n title: s.wizardStep?.stepTitle || s.title,\r\n description: s.wizardStep?.stepDescription || s.description,\r\n })),\r\n isWizardMode: true,\r\n schema: this.schema,\r\n };\r\n\r\n this.wizardSync.registerWizard(this.wizardConfig.wizardId, syncData);\r\n }\r\n}\r\n","// ── Componenti ──\r\nexport { UiFormBuilderComponent, UiFormErrorStateMatcher } from './form-builder.component';\r\nexport { UiFormWizardComponent } from './form-wizard.component';\r\nexport { UiFormErrorSummaryComponent } from './sub-components/error-summary/form-error-summary.component';\r\nexport { UiFileInputComponent } from './sub-components/file-input/file-input.component';\r\nexport { UiSpecificaTerritorialeComponent } from './sub-components/specifica-territoriale/specifica-territoriale.component';\r\nexport { UiTableTerritorialeComponent } from './sub-components/table-territoriale/table-territoriale.component';\r\n\r\n// ── Servizi ──\r\nexport { UiFormConditionService } from './services/form-condition.service';\r\nexport { UiFormValidationService } from './services/form-validation.service';\r\nexport {\r\n UiLocationService,\r\n type UiNazione,\r\n type UiProvincia,\r\n type UiComune,\r\n} from './services/location.service';\r\nexport {\r\n UiWizardSyncService,\r\n type UiWizardSyncData,\r\n} from './services/wizard-sync.service';\r\n\r\n// ── Direttive ──\r\nexport { UiCurrencyInputDirective } from './directives/currency-input.directive';\r\n\r\n// ── Adapter e formati data ──\r\nexport { UiItalianDateAdapter, UI_IT_DATE_FORMATS } from './adapters/it-date-adapter';\r\n\r\n// ── Tipi ──\r\nexport * from './types/index';\r\n","/**\r\n * @module ng-ui-system/page-header\r\n * Types and interfaces for UiPageHeader and UiBreadcrumbService.\r\n */\r\n\r\nimport { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Single breadcrumb item rendered in the navigation trail.\r\n *\r\n * @usageNotes\r\n * ### Structure\r\n * ```typescript\r\n * const item: UiBreadcrumbItem = {\r\n * label: 'Dashboard',\r\n * url: '/dashboard',\r\n * isLast: false,\r\n * };\r\n * ```\r\n */\r\nexport interface UiBreadcrumbItem {\r\n /** Display text for the breadcrumb link. */\r\n label: string;\r\n /** Navigation URL (Angular Router path). */\r\n url: string;\r\n /** Whether this is the last (current) breadcrumb in the trail. */\r\n isLast: boolean;\r\n}\r\n\r\n/**\r\n * Internal route configuration stored by UiBreadcrumbService.\r\n * Built from Angular route `data` properties.\r\n *\r\n * @usageNotes\r\n * ### Route data convention\r\n * ```typescript\r\n * {\r\n * path: 'users/:userId',\r\n * data: {\r\n * id: 'user-detail',\r\n * title: 'Dettaglio utente',\r\n * breadcrumbs: ['users-list'],\r\n * },\r\n * component: UserDetailComponent,\r\n * }\r\n * ```\r\n */\r\nexport interface UiBreadcrumbConfig {\r\n /** Unique route identifier (from `route.data.id`). */\r\n id: string;\r\n /** Resolved route path pattern (may contain `:param` placeholders). */\r\n path: string;\r\n /** Display label (from `route.data.title` or fallback). */\r\n label: string;\r\n /** Ordered array of parent route IDs for building the breadcrumb chain. */\r\n parentIds: string[];\r\n /** Fully resolved URL captured at navigation time. */\r\n fullPath?: string;\r\n /** Raw route data metadata. */\r\n metadata?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Function signature for resolving route parameter values to human-readable labels.\r\n *\r\n * Consumers can provide a custom implementation via `UI_BREADCRUMB_LABEL_RESOLVER`\r\n * to translate cryptic parameter values (e.g. UUIDs, slugs) into user-friendly text.\r\n *\r\n * @param paramName - The route parameter name (e.g. `'userId'`).\r\n * @param paramValue - The raw parameter value from the URL (e.g. `'abc-123'`).\r\n * @returns A human-readable label, or the original value if no mapping exists.\r\n *\r\n * @usageNotes\r\n * ### Custom resolver\r\n * ```typescript\r\n * const myResolver: UiLabelResolverFn = (name, value) => {\r\n * if (name === 'status') {\r\n * return { pending: 'In attesa', active: 'Attivo' }[value] ?? value;\r\n * }\r\n * return value;\r\n * };\r\n *\r\n * providers: [\r\n * { provide: UI_BREADCRUMB_LABEL_RESOLVER, useValue: myResolver },\r\n * ]\r\n * ```\r\n */\r\nexport type UiLabelResolverFn = (paramName: string, paramValue: string) => string;\r\n\r\n/**\r\n * Injection token for providing a custom label resolver to UiBreadcrumbService.\r\n *\r\n * When not provided, parameters are displayed as-is (identity function).\r\n *\r\n * @example\r\n * ```typescript\r\n * // In your app.config.ts or module providers:\r\n * { provide: UI_BREADCRUMB_LABEL_RESOLVER, useValue: myLabelResolver }\r\n * ```\r\n */\r\nexport const UI_BREADCRUMB_LABEL_RESOLVER = new InjectionToken<UiLabelResolverFn>('UI_BREADCRUMB_LABEL_RESOLVER', {\r\n providedIn: 'root',\r\n factory: () => (_name: string, value: string) => value,\r\n});\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ActivatedRoute, NavigationEnd, Router, Routes } from '@angular/router';\r\nimport { filter } from 'rxjs/operators';\r\nimport {\r\n UiBreadcrumbConfig,\r\n UiBreadcrumbItem,\r\n UiLabelResolverFn,\r\n UI_BREADCRUMB_LABEL_RESOLVER,\r\n} from './page-header.types';\r\n\r\n/**\r\n * Service that builds a nested breadcrumb trail from Angular route configuration.\r\n *\r\n * Routes must define `data.id`, `data.title`, and optionally `data.breadcrumbs`\r\n * (an array of parent route IDs) for the chain to resolve correctly.\r\n *\r\n * Supports lazy-loaded routes: the internal route map is rebuilt automatically\r\n * whenever new routes are loaded via `NavigationEnd`.\r\n *\r\n * Label resolution for route parameters (`:param`) is delegated to an injectable\r\n * `UiLabelResolverFn` via the `UI_BREADCRUMB_LABEL_RESOLVER` token.\r\n *\r\n * @usageNotes\r\n * ### Route configuration\r\n * ```typescript\r\n * const routes: Routes = [\r\n * {\r\n * path: 'users',\r\n * data: { id: 'users', title: 'Utenti' },\r\n * children: [\r\n * {\r\n * path: ':userId',\r\n * data: { id: 'user-detail', title: ':userId', breadcrumbs: ['users'] },\r\n * component: UserDetailComponent,\r\n * },\r\n * ],\r\n * },\r\n * ];\r\n * ```\r\n *\r\n * ### Custom label resolver\r\n * ```typescript\r\n * providers: [\r\n * {\r\n * provide: UI_BREADCRUMB_LABEL_RESOLVER,\r\n * useValue: (name: string, value: string) =>\r\n * name === 'userId' ? `User #${value}` : value,\r\n * },\r\n * ]\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiBreadcrumbService {\r\n private readonly router = inject(Router);\r\n private readonly labelResolver = inject(UI_BREADCRUMB_LABEL_RESOLVER);\r\n\r\n /** @internal Map of route ID → breadcrumb configuration. */\r\n private breadcrumbMap = new Map<string, UiBreadcrumbConfig>();\r\n /** @internal Tracks route count to detect lazy-loaded route additions. */\r\n private lastRouteConfigLength = 0;\r\n /** @internal Last computed breadcrumbs for navigateBack. */\r\n private lastBreadcrumbs: UiBreadcrumbItem[] = [];\r\n\r\n constructor() {\r\n this.rebuildRouteMap();\r\n\r\n this.router.events\r\n .pipe(filter((event) => event instanceof NavigationEnd))\r\n .subscribe(() => this.rebuildRouteMapIfNeeded());\r\n }\r\n\r\n /**\r\n * Computes the breadcrumb trail for the currently active route.\r\n *\r\n * @param route - The root `ActivatedRoute` (typically injected in the component).\r\n * @returns Ordered array of breadcrumb items from root to current route.\r\n */\r\n getBreadcrumbsForRoute(route: ActivatedRoute): UiBreadcrumbItem[] {\r\n let deepestRoute = route;\r\n while (deepestRoute.firstChild) {\r\n deepestRoute = deepestRoute.firstChild;\r\n }\r\n\r\n let routeWithId: ActivatedRoute | null = deepestRoute;\r\n while (routeWithId && !routeWithId.snapshot.data['id']) {\r\n routeWithId = routeWithId.parent;\r\n }\r\n const routeId = routeWithId?.snapshot.data['id'];\r\n if (!routeId) {\r\n this.lastBreadcrumbs = [];\r\n return [];\r\n }\r\n\r\n const params = this.collectParamsFromPath(route);\r\n const breadcrumbs = this.buildBreadcrumbChain(routeId, params);\r\n this.lastBreadcrumbs = breadcrumbs;\r\n return breadcrumbs;\r\n }\r\n\r\n /**\r\n * Navigates to the previous breadcrumb (parent route).\r\n * Falls back to `fallbackUrl` (default: `/`) when no parent exists.\r\n */\r\n navigateBack(fallbackUrl = '/'): void {\r\n const prev = this.lastBreadcrumbs.length > 1 ? this.lastBreadcrumbs[this.lastBreadcrumbs.length - 2] : null;\r\n const target = prev?.url ?? fallbackUrl;\r\n this.router.navigateByUrl(target);\r\n }\r\n\r\n /** @internal Collects all route params from the full path (including parents). */\r\n private collectParamsFromPath(route: ActivatedRoute): Record<string, string> {\r\n const params: Record<string, string> = {};\r\n for (const r of route.pathFromRoot) {\r\n Object.assign(params, r.snapshot.params);\r\n }\r\n return params;\r\n }\r\n\r\n // ─── Private helpers ─────────────────────────────────────────────\r\n\r\n /** @internal Rebuilds the map only when new lazy routes appear. */\r\n private rebuildRouteMapIfNeeded(): void {\r\n const currentLength = this.countRoutes(this.router.config);\r\n if (currentLength !== this.lastRouteConfigLength) {\r\n this.rebuildRouteMap();\r\n }\r\n }\r\n\r\n /** @internal Recursively counts routes including lazy-loaded children. */\r\n private countRoutes(routes: Routes): number {\r\n let count = routes.length;\r\n for (const route of routes) {\r\n if (route.children) {\r\n count += this.countRoutes(route.children);\r\n }\r\n if ((route as any)._loadedRoutes) {\r\n count += this.countRoutes((route as any)._loadedRoutes);\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n /** @internal Clears and rebuilds the full route → breadcrumb map. */\r\n private rebuildRouteMap(): void {\r\n this.breadcrumbMap.clear();\r\n this.buildRouteMap(this.router.config);\r\n this.lastRouteConfigLength = this.countRoutes(this.router.config);\r\n }\r\n\r\n /** @internal Recursively walks route tree to build the breadcrumb map. */\r\n private buildRouteMap(routes: Routes, parentPath = ''): void {\r\n for (const route of routes) {\r\n const currentPath = parentPath + '/' + (route.path || '');\r\n\r\n if (route.data?.['id']) {\r\n const fullPath = this.normalizePath(currentPath);\r\n this.breadcrumbMap.set(route.data['id'], {\r\n id: route.data['id'],\r\n path: fullPath,\r\n label: route.data['title'] || route.path || route.data['id'],\r\n parentIds: route.data['breadcrumbs'] || [],\r\n metadata: route.data,\r\n });\r\n }\r\n\r\n if (route.children) {\r\n this.buildRouteMap(route.children, currentPath);\r\n }\r\n if ((route as any)._loadedRoutes) {\r\n this.buildRouteMap((route as any)._loadedRoutes, currentPath);\r\n }\r\n }\r\n }\r\n\r\n /** @internal Builds the full breadcrumb chain for a route by its ID. */\r\n private buildBreadcrumbChain(routeId: string, params: Record<string, string>): UiBreadcrumbItem[] {\r\n const config = this.breadcrumbMap.get(routeId);\r\n if (!config) return [];\r\n\r\n this.saveFullPath(routeId, this.router.url);\r\n\r\n const parentChain = this.getParentChain(config.parentIds, params);\r\n const breadcrumbs: UiBreadcrumbItem[] = [...parentChain];\r\n\r\n breadcrumbs.push({\r\n label: this.resolveLabel(config.label, params),\r\n url: this.stripQueryParams(this.router.url),\r\n isLast: true,\r\n });\r\n\r\n return breadcrumbs;\r\n }\r\n\r\n /** @internal Resolves parent breadcrumbs from ordered parent IDs. */\r\n private getParentChain(parentIds: string[], params: Record<string, string>): UiBreadcrumbItem[] {\r\n if (!parentIds?.length) return [];\r\n\r\n return parentIds\r\n .map((id) => {\r\n const config = this.breadcrumbMap.get(id);\r\n if (!config) return null;\r\n\r\n return {\r\n label: this.resolveLabel(config.label, params),\r\n url: this.resolveUrl(config.path, params),\r\n isLast: false,\r\n };\r\n })\r\n .filter(Boolean) as UiBreadcrumbItem[];\r\n }\r\n\r\n /**\r\n * @internal Resolves `:param` placeholders in a label using\r\n * the injected label resolver function.\r\n */\r\n private resolveLabel(label: string, params: Record<string, string>): string {\r\n if (!label.includes(':')) return label;\r\n\r\n let resolved = label;\r\n for (const [key, value] of Object.entries(params)) {\r\n const readableValue = this.labelResolver(key, value);\r\n resolved = resolved.replace(`:${key}`, readableValue);\r\n }\r\n return resolved;\r\n }\r\n\r\n /** @internal Resolves `:param` placeholders in a path and creates a URL. */\r\n private resolveUrl(path: string, params: Record<string, string>): string {\r\n let processedPath = path;\r\n\r\n if (path.includes(':')) {\r\n const segments = path.split('/');\r\n const processedSegments = segments.map((segment) => {\r\n if (segment.startsWith(':')) {\r\n const paramName = segment.substring(1);\r\n return params[paramName] || segment;\r\n }\r\n return segment;\r\n });\r\n processedPath = processedSegments.join('/');\r\n }\r\n\r\n try {\r\n return this.router.createUrlTree([processedPath]).toString();\r\n } catch {\r\n return processedPath;\r\n }\r\n }\r\n\r\n /** @internal Normalizes path by collapsing double slashes and trimming trailing slash. */\r\n private normalizePath(path: string): string {\r\n return path.replace(/\\/+/g, '/').replace(/\\/$/, '');\r\n }\r\n\r\n /** @internal Removes query parameters from a URL. */\r\n private stripQueryParams(url: string): string {\r\n return url.split('?')[0];\r\n }\r\n\r\n /** @internal Caches the fully resolved URL for a route ID. */\r\n private saveFullPath(routeId: string, fullPath: string): void {\r\n const config = this.breadcrumbMap.get(routeId);\r\n if (config) {\r\n config.fullPath = this.stripQueryParams(fullPath);\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n inject,\r\n Input,\r\n OnInit,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ActivatedRoute, NavigationEnd, Router, RouterLink } from '@angular/router';\r\nimport { Title } from '@angular/platform-browser';\r\nimport { filter } from 'rxjs/operators';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiBreadcrumbService } from './breadcrumb.service';\r\nimport { UiBreadcrumbItem } from './page-header.types';\r\n\r\n/**\r\n * Page header component that renders a breadcrumb navigation trail\r\n * and a page title. Integrates with `UiBreadcrumbService` to\r\n * automatically derive breadcrumbs from Angular route configuration.\r\n *\r\n * The breadcrumb trail is generated from route `data` properties:\r\n * - `data.id` — unique route identifier\r\n * - `data.title` — display label\r\n * - `data.breadcrumbs` — ordered array of parent route IDs\r\n *\r\n * @selector ui-page-header\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Auto breadcrumbs from route data -->\r\n * <ui-page-header />\r\n *\r\n * <!-- With explicit title override -->\r\n * <ui-page-header title=\"Custom Title\" />\r\n *\r\n * <!-- With document title update -->\r\n * <ui-page-header [updateDocumentTitle]=\"true\" titleSuffix=\" | My App\" />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-page-header',\r\n standalone: true,\r\n imports: [RouterLink, LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'ui-page-header-host',\r\n },\r\n template: `\r\n <header class=\"ui-page-header\">\r\n <nav aria-label=\"Breadcrumb\" class=\"ui-page-header__nav\">\r\n <ol\r\n class=\"ui-page-header__breadcrumb\"\r\n itemscope\r\n itemtype=\"https://schema.org/BreadcrumbList\"\r\n >\r\n @if (showHome) {\r\n <li\r\n class=\"ui-page-header__item\"\r\n itemprop=\"itemListElement\"\r\n itemscope\r\n itemtype=\"https://schema.org/ListItem\"\r\n >\r\n <a\r\n itemprop=\"item\"\r\n [routerLink]=\"homeRoute\"\r\n class=\"ui-page-header__link\"\r\n aria-label=\"Home\"\r\n >\r\n <lucide-icon name=\"home\" [size]=\"14\" aria-hidden=\"true\" />\r\n <span itemprop=\"name\" class=\"ui-page-header__text\">Home</span>\r\n </a>\r\n <meta itemprop=\"position\" content=\"1\" />\r\n <span class=\"ui-page-header__separator\" aria-hidden=\"true\">\r\n <lucide-icon name=\"chevron-right\" [size]=\"14\" />\r\n </span>\r\n </li>\r\n }\r\n @for (crumb of breadcrumbs; track crumb.url; let i = $index) {\r\n <li\r\n class=\"ui-page-header__item\"\r\n [class.ui-page-header__item--current]=\"crumb.isLast\"\r\n itemprop=\"itemListElement\"\r\n itemscope\r\n itemtype=\"https://schema.org/ListItem\"\r\n >\r\n @if (!crumb.isLast) {\r\n <a\r\n itemprop=\"item\"\r\n [routerLink]=\"crumb.url\"\r\n class=\"ui-page-header__link\"\r\n >\r\n <span itemprop=\"name\" class=\"ui-page-header__text\">{{ crumb.label }}</span>\r\n </a>\r\n <span class=\"ui-page-header__separator\" aria-hidden=\"true\">\r\n <lucide-icon name=\"chevron-right\" [size]=\"14\" />\r\n </span>\r\n } @else {\r\n <span\r\n itemprop=\"name\"\r\n class=\"ui-page-header__text ui-page-header__text--current\"\r\n aria-current=\"page\"\r\n >\r\n {{ crumb.label }}\r\n </span>\r\n }\r\n <meta itemprop=\"position\" [attr.content]=\"showHome ? i + 2 : i + 1\" />\r\n </li>\r\n }\r\n </ol>\r\n </nav>\r\n\r\n <h1 class=\"ui-page-header__title\" id=\"page-title\">\r\n {{ displayTitle }}\r\n </h1>\r\n </header>\r\n `,\r\n styleUrl: './page-header.component.scss',\r\n})\r\nexport class UiPageHeaderComponent implements OnInit {\r\n /** Override the auto-detected page title. When empty, title is derived from the last breadcrumb. */\r\n @Input() title = '';\r\n\r\n /** Route path for the Home breadcrumb link. */\r\n @Input() homeRoute = '/';\r\n\r\n /** Whether to display the Home link at the start of the trail. */\r\n @Input() showHome = true;\r\n\r\n /** When `true`, updates `document.title` on each navigation. */\r\n @Input() updateDocumentTitle = false;\r\n\r\n /** Suffix appended to `document.title` (e.g. `' | My App'`). Only used when `updateDocumentTitle` is `true`. */\r\n @Input() titleSuffix = '';\r\n\r\n /** @internal */\r\n breadcrumbs: UiBreadcrumbItem[] = [];\r\n\r\n private readonly router = inject(Router);\r\n private readonly activatedRoute = inject(ActivatedRoute);\r\n private readonly titleService = inject(Title);\r\n private readonly breadcrumbService = inject(UiBreadcrumbService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n /** Resolved page title: explicit `title` input wins, otherwise last breadcrumb label. */\r\n get displayTitle(): string {\r\n if (this.title) return this.title;\r\n if (this.breadcrumbs.length > 0) {\r\n return this.breadcrumbs[this.breadcrumbs.length - 1].label;\r\n }\r\n return '';\r\n }\r\n\r\n ngOnInit(): void {\r\n this.refresh();\r\n\r\n this.router.events\r\n .pipe(\r\n filter((event) => event instanceof NavigationEnd),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => this.refresh());\r\n }\r\n\r\n /**\r\n * Navigates to the previous breadcrumb (parent route).\r\n * @param fallbackUrl - URL to navigate to when no parent exists (default: homeRoute).\r\n */\r\n navigateBack(fallbackUrl?: string): void {\r\n this.breadcrumbService.navigateBack(fallbackUrl ?? this.homeRoute);\r\n }\r\n\r\n /** @internal */\r\n private refresh(): void {\r\n this.breadcrumbs = this.breadcrumbService.getBreadcrumbsForRoute(this.activatedRoute);\r\n if (this.updateDocumentTitle) {\r\n const title = this.displayTitle;\r\n if (title) {\r\n this.titleService.setTitle(`${title}${this.titleSuffix}`);\r\n }\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","/**\r\n * ng-ui-system — Page Header entry point.\r\n *\r\n * @example\r\n * ```typescript\r\n * import {\r\n * UiPageHeaderComponent,\r\n * UiBreadcrumbService,\r\n * UiBreadcrumbItem,\r\n * UI_BREADCRUMB_LABEL_RESOLVER,\r\n * } from 'ng-ui-system';\r\n * ```\r\n */\r\n\r\n// Components\r\nexport { UiPageHeaderComponent } from './page-header.component';\r\n\r\n// Services\r\nexport { UiBreadcrumbService } from './breadcrumb.service';\r\n\r\n// Types & Tokens\r\nexport {\r\n UiBreadcrumbItem,\r\n UiBreadcrumbConfig,\r\n UiLabelResolverFn,\r\n UI_BREADCRUMB_LABEL_RESOLVER,\r\n} from './page-header.types';\r\n","import {\r\n Component,\r\n DestroyRef,\r\n inject,\r\n Input,\r\n OnInit,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { Location } from '@angular/common';\r\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\r\nimport { filter, debounceTime } from 'rxjs/operators';\r\nimport { UiPageHeaderComponent } from '../page-header/page-header.component';\r\nimport { UiBreadcrumbService } from '../page-header/breadcrumb.service';\r\nimport { UiBreadcrumbItem } from '../page-header/page-header.types';\r\nimport { UiButtonAreaComponent } from '../button/button-area.component';\r\nimport { UiButtonDescriptor, UiButtonAreaAlign } from '../button/button.types';\r\nimport { UiBackButtonConfig } from './base-layout.types';\r\n\r\n/**\r\n * Full-page layout component that combines a page header (breadcrumbs + title),\r\n * a main content area via `<ng-content>`, and a sticky footer action bar\r\n * powered by `UiButtonAreaComponent`.\r\n *\r\n * Optionally renders an automatic \"back\" button in the footer, derived from\r\n * the breadcrumb trail (navigates to the parent breadcrumb).\r\n *\r\n * @selector ui-base-layout\r\n *\r\n * @example\r\n * ```html\r\n * <ui-base-layout [actions]=\"pageActions\" footerAlign=\"end\">\r\n * <p>Your page content here</p>\r\n * </ui-base-layout>\r\n * ```\r\n *\r\n * @example\r\n * ```html\r\n * <!-- With back button and custom title -->\r\n * <ui-base-layout\r\n * title=\"Dettaglio utente\"\r\n * [showBackButton]=\"true\"\r\n * [actions]=\"[\r\n * { id: 'save', label: 'Salva', variant: 'primary', icon: 'save', action: save },\r\n * ]\"\r\n * >\r\n * <app-user-detail />\r\n * </ui-base-layout>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-base-layout',\r\n standalone: true,\r\n imports: [UiPageHeaderComponent, UiButtonAreaComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'ui-base-layout-host',\r\n },\r\n template: `\r\n <div class=\"ui-base-layout\">\r\n @if (showHeader) {\r\n <ui-page-header\r\n [title]=\"title\"\r\n [homeRoute]=\"homeRoute\"\r\n [showHome]=\"showHome\"\r\n [updateDocumentTitle]=\"updateDocumentTitle\"\r\n [titleSuffix]=\"titleSuffix\"\r\n />\r\n }\r\n\r\n <main class=\"ui-base-layout__content\">\r\n <ng-content />\r\n </main>\r\n\r\n @if (hasVisibleActions) {\r\n <aside\r\n class=\"ui-base-layout__footer\"\r\n aria-label=\"Page actions\"\r\n >\r\n <ui-button-area\r\n [buttons]=\"mergedActions\"\r\n [align]=\"footerAlign\"\r\n [gap]=\"footerGap\"\r\n [stackOnMobile]=\"true\"\r\n ariaLabel=\"Page actions\"\r\n />\r\n </aside>\r\n }\r\n </div>\r\n `,\r\n styleUrl: './base-layout.component.scss',\r\n})\r\nexport class UiBaseLayoutComponent implements OnInit {\r\n /** Whether to display the page header (breadcrumbs + title). */\r\n @Input() showHeader = true;\r\n\r\n /** Override the auto-detected page title. Passed through to `ui-page-header`. */\r\n @Input() title = '';\r\n\r\n /** Route path for the Home breadcrumb link. */\r\n @Input() homeRoute = '/';\r\n\r\n /** Whether to display the Home link in the breadcrumb trail. */\r\n @Input() showHome = true;\r\n\r\n /** When `true`, updates `document.title` on navigation. */\r\n @Input() updateDocumentTitle = false;\r\n\r\n /** Suffix appended to `document.title`. */\r\n @Input() titleSuffix = '';\r\n\r\n /** Whether to show an automatic \"back\" button based on breadcrumbs. */\r\n @Input() showBackButton = true;\r\n\r\n /** Configuration overrides for the automatic back button. */\r\n @Input() backButtonConfig: UiBackButtonConfig = {};\r\n\r\n /** Array of button descriptors for the footer action area. */\r\n @Input() actions: UiButtonDescriptor[] = [];\r\n\r\n /** Horizontal alignment of the footer button area. */\r\n @Input() footerAlign: UiButtonAreaAlign = 'start';\r\n\r\n /** Gap size between footer buttons. */\r\n @Input() footerGap: 'xs' | 'sm' | 'md' | 'lg' | 'xl' = 'sm';\r\n\r\n private readonly router = inject(Router);\r\n private readonly location = inject(Location);\r\n private readonly activatedRoute = inject(ActivatedRoute);\r\n private readonly breadcrumbService = inject(UiBreadcrumbService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n /** @internal Current breadcrumbs, updated on each navigation. */\r\n private breadcrumbs: UiBreadcrumbItem[] = [];\r\n\r\n /**\r\n * Merged action list (back button + consumer actions).\r\n * Computed on every change-detection check so it stays in sync\r\n * with both navigation state (breadcrumbs) and input changes.\r\n */\r\n get mergedActions(): UiButtonDescriptor[] {\r\n const result: UiButtonDescriptor[] = [];\r\n\r\n if (this.showBackButton) {\r\n const backTarget = this.getBackTarget();\r\n result.push({\r\n id: '__ui-back',\r\n label: this.backButtonConfig.label ?? 'Indietro',\r\n icon: (this.backButtonConfig.icon as any) ?? 'arrow-left',\r\n iconPosition: 'leading',\r\n variant: (this.backButtonConfig.variant as any) ?? 'outline',\r\n hidden: !backTarget,\r\n action: () => this.navigateBack(),\r\n });\r\n }\r\n\r\n result.push(...this.actions);\r\n return result;\r\n }\r\n\r\n /** Whether the footer should render (at least one non-hidden action exists). */\r\n get hasVisibleActions(): boolean {\r\n return this.mergedActions.some((a) => !a.hidden);\r\n }\r\n\r\n ngOnInit(): void {\r\n this.refreshBreadcrumbs();\r\n\r\n this.router.events\r\n .pipe(\r\n filter((event) => event instanceof NavigationEnd),\r\n debounceTime(50),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => this.refreshBreadcrumbs());\r\n }\r\n\r\n /** @internal Refreshes breadcrumb state from the current route. */\r\n private refreshBreadcrumbs(): void {\r\n this.breadcrumbs = this.breadcrumbService.getBreadcrumbsForRoute(this.activatedRoute);\r\n }\r\n\r\n /** @internal Determines the back navigation target from breadcrumbs. */\r\n private getBackTarget(): UiBreadcrumbItem | null {\r\n if (this.breadcrumbs.length < 2) return null;\r\n return this.breadcrumbs[this.breadcrumbs.length - 2];\r\n }\r\n\r\n /** @internal Navigates to the parent breadcrumb or falls back to browser history. */\r\n private navigateBack(): void {\r\n const target = this.getBackTarget();\r\n if (target?.url) {\r\n this.router.navigateByUrl(target.url);\r\n } else {\r\n this.location.back();\r\n }\r\n }\r\n}\r\n","/**\r\n * ng-ui-system — Base Layout entry point.\r\n *\r\n * @example\r\n * ```typescript\r\n * import {\r\n * UiBaseLayoutComponent,\r\n * UiBackButtonConfig,\r\n * } from 'ng-ui-system';\r\n * ```\r\n */\r\n\r\n// Components\r\nexport { UiBaseLayoutComponent } from './base-layout.component';\r\n\r\n// Types\r\nexport { UiBackButtonConfig } from './base-layout.types';\r\n","/**\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, 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-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 { 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","/**\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","// ── 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 * Central service for programmatic control of the `ui-layout-builder` shell.\r\n *\r\n * Provides reactive state management for:\r\n * - Overlay loader (with body scroll locking)\r\n * - Sidebar open / collapsed state\r\n * - Context-sensitive FAB actions\r\n * - Navigation badge and visibility overrides\r\n * - Layout mode switching (sidebar / topbar)\r\n * - Content type (fluid / boxed / fullscreen)\r\n * - Topbar bar visibility (notification bars show/hide)\r\n *\r\n * @example\r\n * ```typescript\r\n * export class MyPageComponent {\r\n * private layout = inject(UiLayoutService);\r\n *\r\n * async loadData() {\r\n * this.layout.showLoader();\r\n * try {\r\n * await this.api.fetchAll();\r\n * } finally {\r\n * this.layout.hideLoader();\r\n * }\r\n * }\r\n * }\r\n * ```\r\n */\r\nimport { Injectable, inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport {\r\n UiFabAction,\r\n UiLayoutFabConfig,\r\n UiLayoutMode,\r\n UiContentType,\r\n} from './layout-builder.types';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiLayoutService {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n\r\n // ── Loader ───────────────────────────────────────────────────────\r\n\r\n private readonly _loading$ = new BehaviorSubject<boolean>(false);\r\n /** Whether the overlay loader is currently visible. */\r\n readonly loading$: Observable<boolean> = this._loading$.asObservable();\r\n\r\n /** Show the full-screen overlay loader and block body scroll. */\r\n showLoader(): void {\r\n this._loading$.next(true);\r\n this.setBodyOverflow(true);\r\n }\r\n\r\n /** Hide the overlay loader and restore body scroll. */\r\n hideLoader(): void {\r\n this._loading$.next(false);\r\n this.setBodyOverflow(false);\r\n }\r\n\r\n /** Toggle the overlay loader. */\r\n toggleLoader(): void {\r\n if (this._loading$.value) {\r\n this.hideLoader();\r\n } else {\r\n this.showLoader();\r\n }\r\n }\r\n\r\n /** Synchronous snapshot of the loading state. */\r\n isLoading(): boolean {\r\n return this._loading$.value;\r\n }\r\n\r\n // ── Layout Mode ─────────────────────────────────────────────────\r\n\r\n private readonly _layoutMode$ = new BehaviorSubject<UiLayoutMode>('sidebar');\r\n /** Current layout mode (sidebar or topbar). */\r\n readonly layoutMode$: Observable<UiLayoutMode> = this._layoutMode$.asObservable();\r\n\r\n /**\r\n * Switch layout mode with loader masking the transition.\r\n * Shows the loader, applies the mode change, then hides the loader\r\n * after a short delay to prevent visible layout shift.\r\n */\r\n setLayoutMode(mode: UiLayoutMode, transitionMs = 300): void {\r\n if (this._layoutMode$.value === mode) return;\r\n this.showLoader();\r\n this._layoutMode$.next(mode);\r\n setTimeout(() => this.hideLoader(), transitionMs);\r\n }\r\n\r\n /** Synchronous snapshot of the current layout mode. */\r\n getLayoutMode(): UiLayoutMode {\r\n return this._layoutMode$.value;\r\n }\r\n\r\n /**\r\n * @internal Called by the layout-builder component to set the initial mode\r\n * from the schema without triggering the loader transition.\r\n */\r\n _setInitialLayoutMode(mode: UiLayoutMode): void {\r\n this._layoutMode$.next(mode);\r\n }\r\n\r\n // ── Content Type ────────────────────────────────────────────────\r\n\r\n private readonly _contentType$ = new BehaviorSubject<UiContentType>('fluid');\r\n /** Current content type (fluid, boxed, fullscreen). */\r\n readonly contentType$: Observable<UiContentType> = this._contentType$.asObservable();\r\n\r\n /** Set the content type per-route or globally. */\r\n setContentType(type: UiContentType): void {\r\n this._contentType$.next(type);\r\n }\r\n\r\n /** Synchronous snapshot of the current content type. */\r\n getContentType(): UiContentType {\r\n return this._contentType$.value;\r\n }\r\n\r\n /** @internal */\r\n _setInitialContentType(type: UiContentType): void {\r\n this._contentType$.next(type);\r\n }\r\n\r\n // ── Sidebar ──────────────────────────────────────────────────────\r\n\r\n private readonly _sidebarOpen$ = new BehaviorSubject<boolean>(false);\r\n /** Whether the mobile sidebar drawer is open. */\r\n readonly sidebarOpen$: Observable<boolean> = this._sidebarOpen$.asObservable();\r\n\r\n private readonly _sidebarCollapsed$ = new BehaviorSubject<boolean>(false);\r\n /** Whether the desktop sidebar is in collapsed (icon-only) mode. */\r\n readonly sidebarCollapsed$: Observable<boolean> = this._sidebarCollapsed$.asObservable();\r\n\r\n /** Toggle the desktop sidebar between expanded and collapsed. */\r\n toggleSidebar(): void {\r\n this._sidebarCollapsed$.next(!this._sidebarCollapsed$.value);\r\n }\r\n\r\n /** Set the desktop sidebar collapsed state explicitly. */\r\n collapseSidebar(collapsed = true): void {\r\n this._sidebarCollapsed$.next(collapsed);\r\n }\r\n\r\n /** Open the mobile sidebar drawer. */\r\n openMobileSidebar(): void {\r\n this._sidebarOpen$.next(true);\r\n }\r\n\r\n /** Close the mobile sidebar drawer. */\r\n closeMobileSidebar(): void {\r\n this._sidebarOpen$.next(false);\r\n }\r\n\r\n /** Synchronous snapshot: is the mobile sidebar open? */\r\n isSidebarOpen(): boolean {\r\n return this._sidebarOpen$.value;\r\n }\r\n\r\n /** Synchronous snapshot: is the desktop sidebar collapsed? */\r\n isSidebarCollapsed(): boolean {\r\n return this._sidebarCollapsed$.value;\r\n }\r\n\r\n // ── FAB (context-sensitive) ──────────────────────────────────────\r\n\r\n private _defaultFabConfig: UiLayoutFabConfig | null = null;\r\n private readonly _fabConfig$ = new BehaviorSubject<UiLayoutFabConfig | null>(null);\r\n /** Current FAB configuration (schema default merged with page overrides). */\r\n readonly fabConfig$: Observable<UiLayoutFabConfig | null> = this._fabConfig$.asObservable();\r\n\r\n /**\r\n * Called internally by the layout-builder component to register the\r\n * schema-level default FAB config.\r\n * @internal\r\n */\r\n _setDefaultFabConfig(config: UiLayoutFabConfig | null): void {\r\n this._defaultFabConfig = config;\r\n this._fabConfig$.next(config);\r\n }\r\n\r\n /** Override the FAB main action for the current page context. */\r\n setMainFabAction(action: UiFabAction): void {\r\n const current = this._fabConfig$.value;\r\n this._fabConfig$.next({\r\n mainAction: action,\r\n secondaryActions: current?.secondaryActions ?? [],\r\n position: current?.position ?? 'bottom-right',\r\n });\r\n }\r\n\r\n /** Override all FAB actions for the current page context. */\r\n setFabActions(main: UiFabAction, secondary?: UiFabAction[]): void {\r\n const current = this._fabConfig$.value;\r\n this._fabConfig$.next({\r\n mainAction: main,\r\n secondaryActions: secondary ?? [],\r\n position: current?.position ?? 'bottom-right',\r\n });\r\n }\r\n\r\n /** Reset FAB to the schema-level default configuration. */\r\n clearFabActions(): void {\r\n this._fabConfig$.next(this._defaultFabConfig);\r\n }\r\n\r\n // ── Navigation helpers ───────────────────────────────────────────\r\n\r\n private readonly _navBadges$ = new BehaviorSubject<Map<string, string | number | null>>(new Map());\r\n /** Observable map of nav-item badges keyed by item ID. */\r\n readonly navBadges$: Observable<Map<string, string | number | null>> = this._navBadges$.asObservable();\r\n\r\n private readonly _navVisibility$ = new BehaviorSubject<Map<string, boolean>>(new Map());\r\n /** Observable map of nav-item visibility overrides keyed by item ID. */\r\n readonly navVisibility$: Observable<Map<string, boolean>> = this._navVisibility$.asObservable();\r\n\r\n /** Set or clear a badge on a navigation item. Pass `null` to remove. */\r\n setNavBadge(itemId: string, badge: string | number | null): void {\r\n const map = new Map(this._navBadges$.value);\r\n if (badge === null) {\r\n map.delete(itemId);\r\n } else {\r\n map.set(itemId, badge);\r\n }\r\n this._navBadges$.next(map);\r\n }\r\n\r\n /** Override visibility of a navigation item. */\r\n setNavItemVisibility(itemId: string, visible: boolean): void {\r\n const map = new Map(this._navVisibility$.value);\r\n map.set(itemId, visible);\r\n this._navVisibility$.next(map);\r\n }\r\n\r\n // ── Bar visibility (topbar notification bars) ───────────────────\r\n\r\n private readonly _barVisibility$ = new BehaviorSubject<Map<string, boolean>>(new Map());\r\n /** Observable map of topbar bar visibility keyed by bar ID. */\r\n readonly barVisibility$: Observable<Map<string, boolean>> = this._barVisibility$.asObservable();\r\n\r\n /** Show a topbar bar by ID. */\r\n showBar(barId: string): void {\r\n const map = new Map(this._barVisibility$.value);\r\n map.set(barId, true);\r\n this._barVisibility$.next(map);\r\n }\r\n\r\n /** Hide a topbar bar by ID. */\r\n hideBar(barId: string): void {\r\n const map = new Map(this._barVisibility$.value);\r\n map.set(barId, false);\r\n this._barVisibility$.next(map);\r\n }\r\n\r\n /** Toggle visibility of a topbar bar by ID. */\r\n toggleBar(barId: string): void {\r\n const map = new Map(this._barVisibility$.value);\r\n const current = map.get(barId);\r\n map.set(barId, current === undefined ? false : !current);\r\n this._barVisibility$.next(map);\r\n }\r\n\r\n /** Synchronous check of bar visibility (schema `visible` fallback). */\r\n isBarVisible(barId: string, schemaVisible = true): boolean {\r\n const override = this._barVisibility$.value.get(barId);\r\n return override !== undefined ? override : schemaVisible;\r\n }\r\n\r\n // ── Private helpers ──────────────────────────────────────────────\r\n\r\n private setBodyOverflow(locked: boolean): void {\r\n if (isPlatformBrowser(this.platformId)) {\r\n document.body.style.overflow = locked ? 'hidden' : '';\r\n }\r\n }\r\n}\r\n","/**\r\n * Schema-driven application shell that materializes a full responsive layout\r\n * from a single `UiLayoutSchema` descriptor.\r\n *\r\n * Features:\r\n * - Two layout modes: sidebar (collapsible) and topbar (multi-bar stack)\r\n * - Programmatic mode switching with loader masking\r\n * - Content type: fluid, boxed, fullscreen\r\n * - Speed-dial FAB with context-sensitive actions\r\n * - Overlay loader with body-scroll locking\r\n * - Auto-derived breadcrumbs from navigation schema\r\n * - Skip-to-content link and full keyboard navigation\r\n *\r\n * @selector ui-layout-builder\r\n *\r\n * @example\r\n * ```html\r\n * <ui-layout-builder [schema]=\"layoutSchema\" />\r\n * ```\r\n */\r\nimport {\r\n Component,\r\n Input,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n ViewEncapsulation,\r\n inject,\r\n HostListener,\r\n} from '@angular/core';\r\nimport { Router, RouterOutlet, RouterLink, RouterLinkActive, NavigationEnd } from '@angular/router';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { Subscription, filter } from 'rxjs';\r\n\r\nimport { UiLayoutService } from './layout.service';\r\nimport {\r\n UiLayoutSchema,\r\n UiLayoutMode,\r\n UiContentType,\r\n UiLayoutBreadcrumb,\r\n UiNavItem,\r\n UiNavSection,\r\n UiLayoutFabConfig,\r\n UiFabAction,\r\n UiBarConfig,\r\n} from './layout-builder.types';\r\n\r\n@Component({\r\n selector: 'ui-layout-builder',\r\n standalone: true,\r\n imports: [\r\n RouterOutlet,\r\n RouterLink,\r\n RouterLinkActive,\r\n NgTemplateOutlet,\r\n LucideAngularModule,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: { class: 'ui-layout-builder-host' },\r\n template: `\r\n <!-- Skip to content (a11y) -->\r\n <a class=\"ui-layout__skip-link\" href=\"#ui-layout-main\">\r\n Vai al contenuto principale\r\n </a>\r\n\r\n <div\r\n class=\"ui-layout\"\r\n [class.ui-layout--sidebar-collapsed]=\"layoutMode === 'sidebar' && sidebarCollapsed\"\r\n [class.ui-layout--topbar]=\"layoutMode === 'topbar'\"\r\n >\r\n <!-- ─── Overlay Loader ─────────────────────────────────────── -->\r\n @if (loading) {\r\n <div\r\n class=\"ui-layout__loader-overlay\"\r\n role=\"alert\"\r\n aria-live=\"assertive\"\r\n aria-label=\"Caricamento in corso\"\r\n >\r\n <div class=\"ui-layout__loader-spinner\" aria-hidden=\"true\">\r\n <svg viewBox=\"0 0 50 50\" class=\"ui-layout__loader-svg\">\r\n <circle cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\" />\r\n </svg>\r\n </div>\r\n </div>\r\n }\r\n\r\n @switch (layoutMode) {\r\n <!-- ════════════════════════════════════════════════════════ -->\r\n <!-- ═══ SIDEBAR MODE ═════════════════════════════════════ -->\r\n <!-- ════════════════════════════════════════════════════════ -->\r\n @case ('sidebar') {\r\n <!-- Mobile Top Bar -->\r\n <header class=\"ui-layout__topbar\">\r\n <button\r\n class=\"ui-layout__hamburger\"\r\n (click)=\"layoutService.openMobileSidebar()\"\r\n aria-label=\"Apri navigazione\"\r\n >\r\n <span class=\"ui-layout__hamburger-line\"></span>\r\n <span class=\"ui-layout__hamburger-line\"></span>\r\n <span class=\"ui-layout__hamburger-line\"></span>\r\n </button>\r\n @if (schema.header.logo) {\r\n @if (schema.header.logo.src) {\r\n <img\r\n class=\"ui-layout__topbar-logo-img\"\r\n [src]=\"schema.header.logo.src\"\r\n [alt]=\"schema.header.logo.alt || schema.header.title\"\r\n />\r\n } @else if (schema.header.logo.text) {\r\n <span class=\"ui-layout__topbar-logo\">{{ schema.header.logo.text }}</span>\r\n }\r\n }\r\n <span class=\"ui-layout__topbar-title\">{{ schema.header.title }}</span>\r\n </header>\r\n\r\n <!-- Mobile Backdrop -->\r\n @if (sidebarOpen) {\r\n <div\r\n class=\"ui-layout__backdrop\"\r\n (click)=\"layoutService.closeMobileSidebar()\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n }\r\n\r\n <!-- Body (sidebar + content) -->\r\n <div class=\"ui-layout__body\">\r\n <aside\r\n class=\"ui-layout__sidebar\"\r\n [class.ui-layout__sidebar--collapsed]=\"sidebarCollapsed\"\r\n [class.ui-layout__sidebar--open]=\"sidebarOpen\"\r\n role=\"navigation\"\r\n aria-label=\"Navigazione principale\"\r\n >\r\n <div class=\"ui-layout__sidebar-header\">\r\n <div class=\"ui-layout__sidebar-brand\">\r\n @if (schema.header.logo) {\r\n @if (schema.header.logo.src) {\r\n <img\r\n class=\"ui-layout__sidebar-logo-img\"\r\n [src]=\"schema.header.logo.src\"\r\n [alt]=\"schema.header.logo.alt || schema.header.title\"\r\n />\r\n } @else if (schema.header.logo.text) {\r\n <span class=\"ui-layout__sidebar-logo\">{{ schema.header.logo.text }}</span>\r\n }\r\n }\r\n @if (!sidebarCollapsed || sidebarOpen) {\r\n <span class=\"ui-layout__sidebar-title\">{{ schema.header.title }}</span>\r\n }\r\n </div>\r\n\r\n @if (schema.navigation.collapsible !== false) {\r\n <button\r\n class=\"ui-layout__collapse-btn ui-layout__desktop-only\"\r\n (click)=\"layoutService.toggleSidebar()\"\r\n [attr.aria-label]=\"sidebarCollapsed ? 'Espandi sidebar' : 'Comprimi sidebar'\"\r\n >\r\n <lucide-icon\r\n name=\"chevrons-left\"\r\n [size]=\"16\"\r\n class=\"ui-layout__collapse-icon\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n }\r\n\r\n <button\r\n class=\"ui-layout__close-btn ui-layout__mobile-only\"\r\n (click)=\"layoutService.closeMobileSidebar()\"\r\n aria-label=\"Chiudi navigazione\"\r\n >\r\n <lucide-icon name=\"x\" [size]=\"16\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n\r\n @if (!sidebarCollapsed || sidebarOpen) {\r\n <nav class=\"ui-layout__sidebar-nav\">\r\n @if (schema.navigation.sections?.length) {\r\n @for (section of schema.navigation.sections; track section.id) {\r\n <div class=\"ui-layout__nav-section\">\r\n <span class=\"ui-layout__nav-section-title\">{{ section.label }}</span>\r\n @for (item of getItemsForSection(section); track item.id) {\r\n @if (!isItemHidden(item)) {\r\n <ng-container\r\n *ngTemplateOutlet=\"navItemTpl; context: { $implicit: item }\"\r\n />\r\n }\r\n }\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"ui-layout__nav-section\">\r\n @for (item of schema.navigation.items; track item.id) {\r\n @if (!isItemHidden(item)) {\r\n <ng-container\r\n *ngTemplateOutlet=\"navItemTpl; context: { $implicit: item }\"\r\n />\r\n }\r\n }\r\n </div>\r\n }\r\n </nav>\r\n }\r\n </aside>\r\n\r\n <!-- Main content area -->\r\n <main\r\n class=\"ui-layout__content\"\r\n [class.ui-layout__content--boxed]=\"contentType === 'boxed'\"\r\n [class.ui-layout__content--fullscreen]=\"contentType === 'fullscreen'\"\r\n [class.ui-layout__content--transitioning]=\"contentTransitioning\"\r\n (animationend)=\"contentTransitioning = false\"\r\n id=\"ui-layout-main\"\r\n tabindex=\"-1\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"pageHeaderTpl\" />\r\n <router-outlet />\r\n </main>\r\n </div>\r\n }\r\n\r\n <!-- ════════════════════════════════════════════════════════ -->\r\n <!-- ═══ TOPBAR MODE ══════════════════════════════════════ -->\r\n <!-- ════════════════════════════════════════════════════════ -->\r\n @case ('topbar') {\r\n <!-- Bar stack -->\r\n <div class=\"ui-layout__bar-stack\">\r\n @for (bar of visibleBars; track bar.id) {\r\n @switch (bar.type) {\r\n @case ('notification') {\r\n @if (bar.notification) {\r\n <div\r\n class=\"ui-layout__bar ui-layout__bar--notification\"\r\n [class]=\"'ui-layout__bar--notification-' + (bar.notification.variant || 'primary')\"\r\n role=\"alert\"\r\n >\r\n @if (bar.notification.icon) {\r\n <lucide-icon [name]=\"bar.notification.icon\" [size]=\"16\" aria-hidden=\"true\" />\r\n }\r\n <span class=\"ui-layout__bar-text\">{{ bar.notification.text }}</span>\r\n @if (bar.notification.dismissible !== false) {\r\n <button\r\n class=\"ui-layout__bar-dismiss\"\r\n (click)=\"dismissBar(bar.id)\"\r\n aria-label=\"Chiudi notifica\"\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 }\r\n\r\n @case ('brand') {\r\n @if (bar.brand; as brand) {\r\n <div class=\"ui-layout__bar ui-layout__bar--brand\">\r\n <div class=\"ui-layout__bar-brand-left\">\r\n <button\r\n class=\"ui-layout__hamburger ui-layout__topbar-hamburger\"\r\n (click)=\"layoutService.openMobileSidebar()\"\r\n aria-label=\"Apri navigazione\"\r\n >\r\n <span class=\"ui-layout__hamburger-line\"></span>\r\n <span class=\"ui-layout__hamburger-line\"></span>\r\n <span class=\"ui-layout__hamburger-line\"></span>\r\n </button>\r\n @if (brand.logo; as logo) {\r\n @if (logo.src) {\r\n <img\r\n class=\"ui-layout__bar-logo-img\"\r\n [src]=\"logo.src\"\r\n [alt]=\"logo.alt || brand.title || ''\"\r\n />\r\n } @else if (logo.text) {\r\n <span class=\"ui-layout__bar-logo\">{{ logo.text }}</span>\r\n }\r\n }\r\n @if (brand.title; as brandTitle) {\r\n <span class=\"ui-layout__bar-title\">{{ brandTitle }}</span>\r\n }\r\n </div>\r\n @if (brand.userDropdown; as dropdown) {\r\n <div class=\"ui-layout__user-dropdown\">\r\n <button\r\n class=\"ui-layout__user-dropdown-trigger\"\r\n (click)=\"userDropdownOpen = !userDropdownOpen\"\r\n [attr.aria-expanded]=\"userDropdownOpen\"\r\n aria-haspopup=\"true\"\r\n >\r\n @if (dropdown.avatar?.src) {\r\n <img\r\n class=\"ui-layout__user-avatar\"\r\n [src]=\"dropdown.avatar!.src\"\r\n [alt]=\"dropdown.avatar!.alt || dropdown.label\"\r\n />\r\n } @else {\r\n <lucide-icon\r\n [name]=\"dropdown.icon || 'user'\"\r\n [size]=\"18\"\r\n aria-hidden=\"true\"\r\n />\r\n }\r\n <span class=\"ui-layout__user-label\">{{ dropdown.label }}</span>\r\n <lucide-icon name=\"chevron-down\" [size]=\"14\" aria-hidden=\"true\" class=\"ui-layout__user-chevron\" />\r\n </button>\r\n @if (userDropdownOpen) {\r\n <div class=\"ui-layout__user-dropdown-menu\" role=\"menu\">\r\n @for (dItem of dropdown.items; track dItem.id) {\r\n @if (dItem.divider) {\r\n <hr class=\"ui-layout__user-dropdown-divider\" />\r\n }\r\n @if (dItem.route) {\r\n <a\r\n class=\"ui-layout__user-dropdown-item\"\r\n [routerLink]=\"dItem.route\"\r\n role=\"menuitem\"\r\n (click)=\"userDropdownOpen = false\"\r\n >\r\n @if (dItem.icon) {\r\n <lucide-icon [name]=\"dItem.icon\" [size]=\"16\" aria-hidden=\"true\" />\r\n }\r\n {{ dItem.label }}\r\n </a>\r\n } @else {\r\n <button\r\n class=\"ui-layout__user-dropdown-item\"\r\n role=\"menuitem\"\r\n (click)=\"onDropdownAction(dItem)\"\r\n >\r\n @if (dItem.icon) {\r\n <lucide-icon [name]=\"dItem.icon\" [size]=\"16\" aria-hidden=\"true\" />\r\n }\r\n {{ dItem.label }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n @case ('navigation') {\r\n <nav class=\"ui-layout__bar ui-layout__bar--navigation\" role=\"navigation\" aria-label=\"Navigazione principale\">\r\n @for (item of getTopbarNavItems(bar); track item.id) {\r\n @if (!isItemHidden(item)) {\r\n @if (item.children?.length) {\r\n <div class=\"ui-layout__hnav-dropdown\" [class.ui-layout__hnav-dropdown--open]=\"hnavDropdownId === item.id\">\r\n <button\r\n class=\"ui-layout__hnav-link ui-layout__hnav-link--parent\"\r\n [class.ui-layout__hnav-link--active]=\"isParentActive(item)\"\r\n (click)=\"toggleHnavDropdown(item.id)\"\r\n [attr.aria-expanded]=\"hnavDropdownId === item.id\"\r\n >\r\n @if (item.icon) {\r\n <lucide-icon [name]=\"item.icon\" [size]=\"16\" aria-hidden=\"true\" />\r\n }\r\n <span>{{ item.label }}</span>\r\n <lucide-icon name=\"chevron-down\" [size]=\"14\" aria-hidden=\"true\" class=\"ui-layout__hnav-chevron\" />\r\n </button>\r\n @if (hnavDropdownId === item.id) {\r\n <div class=\"ui-layout__hnav-dropdown-menu\">\r\n @for (group of item.children; track group.label) {\r\n <span class=\"ui-layout__hnav-dropdown-label\">{{ group.label }}</span>\r\n @for (child of group.items; track child.id) {\r\n @if (!isItemHidden(child)) {\r\n <a\r\n class=\"ui-layout__hnav-dropdown-item\"\r\n [routerLink]=\"child.route\"\r\n routerLinkActive=\"ui-layout__hnav-dropdown-item--active\"\r\n (click)=\"hnavDropdownId = null; onNavClick()\"\r\n >\r\n {{ child.label }}\r\n </a>\r\n }\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n } @else if (item.type === 'external') {\r\n <a\r\n class=\"ui-layout__hnav-link\"\r\n [href]=\"item.href\"\r\n [target]=\"item.target || '_blank'\"\r\n [attr.rel]=\"item.target === '_blank' ? 'noopener noreferrer' : null\"\r\n >\r\n @if (item.icon) {\r\n <lucide-icon [name]=\"item.icon\" [size]=\"16\" aria-hidden=\"true\" />\r\n }\r\n <span>{{ item.label }}</span>\r\n <lucide-icon name=\"external-link\" [size]=\"12\" aria-hidden=\"true\" />\r\n </a>\r\n } @else if (item.type !== 'divider') {\r\n <a\r\n class=\"ui-layout__hnav-link\"\r\n [routerLink]=\"item.route\"\r\n routerLinkActive=\"ui-layout__hnav-link--active\"\r\n [routerLinkActiveOptions]=\"{ exact: item.routeActiveExact || false }\"\r\n >\r\n @if (item.icon) {\r\n <lucide-icon [name]=\"item.icon\" [size]=\"16\" aria-hidden=\"true\" />\r\n }\r\n <span>{{ item.label }}</span>\r\n @if (getItemBadge(item)) {\r\n <span class=\"ui-layout__badge\">{{ getItemBadge(item) }}</span>\r\n }\r\n </a>\r\n }\r\n }\r\n }\r\n </nav>\r\n }\r\n\r\n @case ('links') {\r\n @if (bar.links) {\r\n <div\r\n class=\"ui-layout__bar ui-layout__bar--links\"\r\n [style.justify-content]=\"bar.links.align === 'start' ? 'flex-start' : bar.links.align === 'center' ? 'center' : bar.links.align === 'space-between' ? 'space-between' : 'flex-end'\"\r\n >\r\n @for (lnk of bar.links.items; track lnk.label || lnk.ariaLabel || $index) {\r\n @if (lnk.route) {\r\n <a class=\"ui-layout__bar-link\" [routerLink]=\"lnk.route\" [attr.aria-label]=\"lnk.ariaLabel || null\">\r\n @if (lnk.icon) {\r\n <lucide-icon [name]=\"lnk.icon\" [size]=\"14\" aria-hidden=\"true\" />\r\n }\r\n @if (lnk.label) {\r\n <span>{{ lnk.label }}</span>\r\n }\r\n </a>\r\n } @else if (lnk.href) {\r\n <a\r\n class=\"ui-layout__bar-link\"\r\n [href]=\"lnk.href\"\r\n [target]=\"lnk.target || '_self'\"\r\n [attr.rel]=\"lnk.target === '_blank' ? 'noopener noreferrer' : null\"\r\n [attr.aria-label]=\"lnk.ariaLabel || null\"\r\n >\r\n @if (lnk.icon) {\r\n <lucide-icon [name]=\"lnk.icon\" [size]=\"14\" aria-hidden=\"true\" />\r\n }\r\n @if (lnk.label) {\r\n <span>{{ lnk.label }}</span>\r\n }\r\n </a>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n }\r\n </div>\r\n\r\n <!-- Mobile Backdrop (topbar mode) -->\r\n @if (sidebarOpen) {\r\n <div\r\n class=\"ui-layout__backdrop ui-layout__backdrop--topbar\"\r\n (click)=\"layoutService.closeMobileSidebar()\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n }\r\n\r\n <!-- Mobile drawer (topbar mode) -->\r\n <aside\r\n class=\"ui-layout__sidebar ui-layout__sidebar--topbar-drawer\"\r\n [class.ui-layout__sidebar--open]=\"sidebarOpen\"\r\n role=\"navigation\"\r\n aria-label=\"Navigazione principale\"\r\n >\r\n <div class=\"ui-layout__sidebar-header\">\r\n <div class=\"ui-layout__sidebar-brand\">\r\n @if (schema.header.logo) {\r\n @if (schema.header.logo.src) {\r\n <img class=\"ui-layout__sidebar-logo-img\" [src]=\"schema.header.logo.src\" [alt]=\"schema.header.logo.alt || schema.header.title\" />\r\n } @else if (schema.header.logo.text) {\r\n <span class=\"ui-layout__sidebar-logo\">{{ schema.header.logo.text }}</span>\r\n }\r\n }\r\n <span class=\"ui-layout__sidebar-title\">{{ schema.header.title }}</span>\r\n </div>\r\n <button class=\"ui-layout__close-btn\" (click)=\"layoutService.closeMobileSidebar()\" aria-label=\"Chiudi navigazione\">\r\n <lucide-icon name=\"x\" [size]=\"16\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n <nav class=\"ui-layout__sidebar-nav\">\r\n @if (schema.navigation.sections?.length) {\r\n @for (section of schema.navigation.sections; track section.id) {\r\n <div class=\"ui-layout__nav-section\">\r\n <span class=\"ui-layout__nav-section-title\">{{ section.label }}</span>\r\n @for (item of getItemsForSection(section); track item.id) {\r\n @if (!isItemHidden(item)) {\r\n <ng-container *ngTemplateOutlet=\"navItemTpl; context: { $implicit: item }\" />\r\n }\r\n }\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"ui-layout__nav-section\">\r\n @for (item of schema.navigation.items; track item.id) {\r\n @if (!isItemHidden(item)) {\r\n <ng-container *ngTemplateOutlet=\"navItemTpl; context: { $implicit: item }\" />\r\n }\r\n }\r\n </div>\r\n }\r\n </nav>\r\n </aside>\r\n\r\n <!-- Main content area (topbar mode) -->\r\n <main\r\n class=\"ui-layout__content ui-layout__content--topbar\"\r\n [class.ui-layout__content--boxed]=\"contentType === 'boxed'\"\r\n [class.ui-layout__content--fullscreen]=\"contentType === 'fullscreen'\"\r\n [class.ui-layout__content--transitioning]=\"contentTransitioning\"\r\n (animationend)=\"contentTransitioning = false\"\r\n id=\"ui-layout-main\"\r\n tabindex=\"-1\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"pageHeaderTpl\" />\r\n <router-outlet />\r\n </main>\r\n }\r\n }\r\n\r\n <!-- ─── Footer ─────────────────────────────────────────────── -->\r\n @if (schema.footer) {\r\n <footer class=\"ui-layout__footer\">\r\n @if (schema.footer.links?.length) {\r\n <nav class=\"ui-layout__footer-links\" aria-label=\"Link footer\">\r\n @for (link of schema.footer.links; track link.label) {\r\n @if (link.route) {\r\n <a class=\"ui-layout__footer-link\" [routerLink]=\"link.route\">\r\n @if (link.icon) {\r\n <lucide-icon [name]=\"link.icon\" [size]=\"14\" aria-hidden=\"true\" />\r\n }\r\n {{ link.label }}\r\n </a>\r\n } @else if (link.href) {\r\n <a\r\n class=\"ui-layout__footer-link\"\r\n [href]=\"link.href\"\r\n [target]=\"link.target || '_self'\"\r\n [attr.rel]=\"link.target === '_blank' ? 'noopener noreferrer' : null\"\r\n >\r\n @if (link.icon) {\r\n <lucide-icon [name]=\"link.icon\" [size]=\"14\" aria-hidden=\"true\" />\r\n }\r\n {{ link.label }}\r\n </a>\r\n }\r\n }\r\n </nav>\r\n }\r\n @if (schema.footer.text) {\r\n <span class=\"ui-layout__footer-text\">{{ schema.footer.text }}</span>\r\n }\r\n </footer>\r\n }\r\n\r\n <!-- ─── Speed Dial FAB ─────────────────────────────────────── -->\r\n @if (currentFabConfig) {\r\n <div\r\n class=\"ui-layout__fab\"\r\n [class.ui-layout__fab--open]=\"fabOpen\"\r\n [class.ui-layout__fab--bottom-left]=\"currentFabConfig.position === 'bottom-left'\"\r\n role=\"complementary\"\r\n aria-label=\"Azioni rapide\"\r\n >\r\n @if (fabOpen && currentFabConfig.secondaryActions?.length) {\r\n <div class=\"ui-layout__fab-actions\">\r\n @for (action of currentFabConfig.secondaryActions; track action.id; let i = $index) {\r\n <button\r\n class=\"ui-layout__fab-action\"\r\n [class]=\"'ui-layout__fab-action--' + (action.variant || 'neutral')\"\r\n [attr.aria-label]=\"action.ariaLabel || action.label\"\r\n [title]=\"action.label\"\r\n [style.animation-delay]=\"(i * 50) + 'ms'\"\r\n (click)=\"onFabAction(action)\"\r\n >\r\n <lucide-icon [name]=\"action.icon\" [size]=\"18\" aria-hidden=\"true\" />\r\n <span class=\"ui-layout__fab-action-label\">{{ action.label }}</span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n <button\r\n class=\"ui-layout__fab-main\"\r\n [class]=\"'ui-layout__fab-main--' + (currentFabConfig.mainAction.variant || 'primary')\"\r\n [attr.aria-label]=\"currentFabConfig.mainAction.ariaLabel || currentFabConfig.mainAction.label\"\r\n [attr.aria-expanded]=\"currentFabConfig.secondaryActions?.length ? fabOpen : null\"\r\n (click)=\"onFabMainClick()\"\r\n >\r\n <lucide-icon\r\n [name]=\"currentFabConfig.mainAction.icon\"\r\n [size]=\"24\"\r\n aria-hidden=\"true\"\r\n class=\"ui-layout__fab-main-icon\"\r\n />\r\n </button>\r\n </div>\r\n }\r\n\r\n <!-- ─── Bottom Navigation (mobile, sidebar mode) ────────────── -->\r\n @if (layoutMode === 'sidebar' && bottomNavItems.length > 0 && mobileMode !== 'drawer') {\r\n <nav\r\n class=\"ui-layout__bottom-nav\"\r\n role=\"navigation\"\r\n aria-label=\"Navigazione rapida\"\r\n >\r\n @for (item of bottomNavItems; track item.id) {\r\n <a\r\n class=\"ui-layout__bottom-nav-item\"\r\n [routerLink]=\"item.route\"\r\n routerLinkActive=\"ui-layout__bottom-nav-item--active\"\r\n [routerLinkActiveOptions]=\"{ exact: item.routeActiveExact || false }\"\r\n [attr.aria-current]=\"isRouteActive(item) ? 'page' : null\"\r\n >\r\n @if (item.icon) {\r\n <lucide-icon [name]=\"item.icon\" [size]=\"20\" aria-hidden=\"true\" />\r\n }\r\n <span class=\"ui-layout__bottom-nav-label\">{{ item.label }}</span>\r\n @if (getItemBadge(item)) {\r\n <span class=\"ui-layout__badge\" aria-label=\"Notifica\">{{ getItemBadge(item) }}</span>\r\n }\r\n </a>\r\n }\r\n </nav>\r\n }\r\n </div>\r\n\r\n <!-- ═══ SHARED TEMPLATES ═══════════════════════════════════════ -->\r\n\r\n <!-- Page header with auto-derived breadcrumbs -->\r\n <ng-template #pageHeaderTpl>\r\n @if (schema.pageHeader?.show !== false && breadcrumbs.length > 0) {\r\n <header class=\"ui-layout__page-header\">\r\n <nav aria-label=\"Breadcrumb\" class=\"ui-layout__breadcrumb-nav\">\r\n <ol class=\"ui-layout__breadcrumb\" itemscope itemtype=\"https://schema.org/BreadcrumbList\">\r\n @if (schema.pageHeader?.showHome !== false) {\r\n <li class=\"ui-layout__breadcrumb-item\" itemprop=\"itemListElement\" itemscope itemtype=\"https://schema.org/ListItem\">\r\n <a itemprop=\"item\" [routerLink]=\"schema.pageHeader?.homeRoute || '/'\" class=\"ui-layout__breadcrumb-link\" aria-label=\"Home\">\r\n <lucide-icon name=\"home\" [size]=\"14\" aria-hidden=\"true\" />\r\n <span itemprop=\"name\" class=\"ui-layout__breadcrumb-text\">Home</span>\r\n </a>\r\n <meta itemprop=\"position\" content=\"1\" />\r\n <span class=\"ui-layout__breadcrumb-sep\" aria-hidden=\"true\">\r\n <lucide-icon name=\"chevron-right\" [size]=\"14\" />\r\n </span>\r\n </li>\r\n }\r\n @for (crumb of breadcrumbs; track crumb.label; let i = $index) {\r\n <li\r\n class=\"ui-layout__breadcrumb-item\"\r\n [class.ui-layout__breadcrumb-item--current]=\"crumb.isLast\"\r\n itemprop=\"itemListElement\"\r\n itemscope\r\n itemtype=\"https://schema.org/ListItem\"\r\n >\r\n @if (!crumb.isLast && crumb.url) {\r\n <a itemprop=\"item\" [routerLink]=\"crumb.url\" class=\"ui-layout__breadcrumb-link\">\r\n <span itemprop=\"name\" class=\"ui-layout__breadcrumb-text\">{{ crumb.label }}</span>\r\n </a>\r\n <span class=\"ui-layout__breadcrumb-sep\" aria-hidden=\"true\">\r\n <lucide-icon name=\"chevron-right\" [size]=\"14\" />\r\n </span>\r\n } @else {\r\n <span itemprop=\"name\" class=\"ui-layout__breadcrumb-text ui-layout__breadcrumb-text--current\" aria-current=\"page\">\r\n {{ crumb.label }}\r\n </span>\r\n }\r\n <meta itemprop=\"position\" [attr.content]=\"(schema.pageHeader?.showHome !== false) ? i + 2 : i + 1\" />\r\n </li>\r\n }\r\n </ol>\r\n </nav>\r\n <h1 class=\"ui-layout__page-title\">{{ pageTitle }}</h1>\r\n </header>\r\n }\r\n </ng-template>\r\n\r\n <!-- Nav item template (sidebar, recursive-friendly) -->\r\n <ng-template #navItemTpl let-item>\r\n @if (item.type === 'divider') {\r\n <hr class=\"ui-layout__nav-divider\" />\r\n } @else if (item.type === 'external') {\r\n <a\r\n class=\"ui-layout__nav-link\"\r\n [href]=\"item.href\"\r\n [target]=\"item.target || '_blank'\"\r\n [attr.rel]=\"item.target === '_blank' ? 'noopener noreferrer' : null\"\r\n (click)=\"onNavClick()\"\r\n >\r\n @if (item.icon) {\r\n <lucide-icon [name]=\"item.icon\" [size]=\"16\" aria-hidden=\"true\" class=\"ui-layout__nav-icon\" />\r\n }\r\n <span class=\"ui-layout__nav-label\">{{ item.label }}</span>\r\n <lucide-icon name=\"external-link\" [size]=\"12\" aria-hidden=\"true\" class=\"ui-layout__nav-external\" />\r\n @if (getItemBadge(item)) {\r\n <span class=\"ui-layout__badge\">{{ getItemBadge(item) }}</span>\r\n }\r\n </a>\r\n } @else if (item.children?.length) {\r\n <button\r\n class=\"ui-layout__nav-link ui-layout__nav-link--parent\"\r\n [class.ui-layout__nav-link--active]=\"isParentActive(item)\"\r\n [class.ui-layout__nav-link--expanded]=\"expandedIds.has(item.id)\"\r\n [attr.aria-expanded]=\"expandedIds.has(item.id)\"\r\n (click)=\"toggleExpand(item)\"\r\n >\r\n @if (item.icon) {\r\n <lucide-icon [name]=\"item.icon\" [size]=\"16\" aria-hidden=\"true\" class=\"ui-layout__nav-icon\" />\r\n }\r\n <span class=\"ui-layout__nav-label\">{{ item.label }}</span>\r\n @if (getItemBadge(item)) {\r\n <span class=\"ui-layout__badge\">{{ getItemBadge(item) }}</span>\r\n }\r\n <span class=\"ui-layout__nav-chevron\" aria-hidden=\"true\">\r\n <lucide-icon name=\"chevron-right\" [size]=\"14\" />\r\n </span>\r\n </button>\r\n @if (expandedIds.has(item.id)) {\r\n <div class=\"ui-layout__nav-children\">\r\n @for (group of item.children; track group.label) {\r\n <span class=\"ui-layout__nav-group-label\">{{ group.label }}</span>\r\n @for (child of group.items; track child.id) {\r\n @if (!isItemHidden(child)) {\r\n <a\r\n class=\"ui-layout__nav-link ui-layout__nav-link--child\"\r\n [routerLink]=\"child.route\"\r\n routerLinkActive=\"ui-layout__nav-link--active\"\r\n (click)=\"onNavClick()\"\r\n >\r\n <span class=\"ui-layout__nav-label\">{{ child.label }}</span>\r\n @if (getItemBadge(child)) {\r\n <span class=\"ui-layout__badge\">{{ getItemBadge(child) }}</span>\r\n }\r\n </a>\r\n }\r\n }\r\n }\r\n </div>\r\n }\r\n } @else {\r\n <a\r\n class=\"ui-layout__nav-link\"\r\n [routerLink]=\"item.route\"\r\n routerLinkActive=\"ui-layout__nav-link--active\"\r\n [routerLinkActiveOptions]=\"{ exact: item.routeActiveExact || false }\"\r\n [attr.aria-current]=\"isRouteActive(item) ? 'page' : null\"\r\n (click)=\"onNavClick()\"\r\n >\r\n @if (item.icon) {\r\n <lucide-icon [name]=\"item.icon\" [size]=\"16\" aria-hidden=\"true\" class=\"ui-layout__nav-icon\" />\r\n }\r\n <span class=\"ui-layout__nav-label\">{{ item.label }}</span>\r\n @if (getItemBadge(item)) {\r\n <span class=\"ui-layout__badge\">{{ getItemBadge(item) }}</span>\r\n }\r\n </a>\r\n }\r\n </ng-template>\r\n `,\r\n styleUrl: './layout-builder.component.scss',\r\n})\r\nexport class UiLayoutBuilderComponent implements OnInit, OnDestroy {\r\n /** Full layout descriptor. */\r\n @Input({ required: true }) schema!: UiLayoutSchema;\r\n\r\n readonly layoutService = inject(UiLayoutService);\r\n private readonly router = inject(Router);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private subs: Subscription[] = [];\r\n\r\n currentUrl = '';\r\n expandedIds = new Set<string>();\r\n fabOpen = false;\r\n currentFabConfig: UiLayoutFabConfig | null = null;\r\n\r\n loading = false;\r\n sidebarOpen = false;\r\n sidebarCollapsed = false;\r\n layoutMode: UiLayoutMode = 'sidebar';\r\n contentType: UiContentType = 'fluid';\r\n contentTransitioning = false;\r\n breadcrumbs: UiLayoutBreadcrumb[] = [];\r\n userDropdownOpen = false;\r\n hnavDropdownId: string | null = null;\r\n\r\n private navBadges = new Map<string, string | number | null>();\r\n private navVisibility = new Map<string, boolean>();\r\n private barVisibility = new Map<string, boolean>();\r\n\r\n /** Resolved page title from the last breadcrumb. */\r\n get pageTitle(): string {\r\n if (!this.breadcrumbs.length) return '';\r\n return this.breadcrumbs[this.breadcrumbs.length - 1].label;\r\n }\r\n\r\n /** Items flagged for the mobile bottom navigation bar (max 5). */\r\n get bottomNavItems(): UiNavItem[] {\r\n return this.schema.navigation.items\r\n .filter((i) => i.bottomNav && !this.isItemHidden(i) && i.route)\r\n .sort((a, b) => (a.bottomNavOrder ?? 99) - (b.bottomNavOrder ?? 99))\r\n .slice(0, 5);\r\n }\r\n\r\n get mobileMode(): string {\r\n return this.schema.navigation.mobileMode || 'both';\r\n }\r\n\r\n /** Topbar bars filtered by visibility (schema default + service overrides). */\r\n get visibleBars(): UiBarConfig[] {\r\n if (!this.schema.topbar?.bars) return [];\r\n return this.schema.topbar.bars.filter((bar) =>\r\n this.layoutService.isBarVisible(bar.id, bar.visible !== false),\r\n );\r\n }\r\n\r\n ngOnInit(): void {\r\n this.currentUrl = this.router.url;\r\n this.autoExpandFromUrl(this.currentUrl);\r\n\r\n if (this.schema.mode) {\r\n this.layoutService._setInitialLayoutMode(this.schema.mode);\r\n }\r\n if (this.schema.contentType) {\r\n this.layoutService._setInitialContentType(this.schema.contentType);\r\n }\r\n if (this.schema.fab) {\r\n this.layoutService._setDefaultFabConfig(this.schema.fab);\r\n }\r\n if (this.schema.loader?.showOnInit) {\r\n this.layoutService.showLoader();\r\n }\r\n\r\n this.breadcrumbs = this.computeBreadcrumbs(this.currentUrl);\r\n\r\n this.subs.push(\r\n this.layoutService.loading$.subscribe((v) => {\r\n this.loading = v;\r\n this.cdr.markForCheck();\r\n }),\r\n this.layoutService.sidebarOpen$.subscribe((v) => {\r\n this.sidebarOpen = v;\r\n this.cdr.markForCheck();\r\n }),\r\n this.layoutService.sidebarCollapsed$.subscribe((v) => {\r\n this.sidebarCollapsed = v;\r\n this.cdr.markForCheck();\r\n }),\r\n this.layoutService.fabConfig$.subscribe((config) => {\r\n this.currentFabConfig = config;\r\n this.cdr.markForCheck();\r\n }),\r\n this.layoutService.navBadges$.subscribe((m) => {\r\n this.navBadges = m;\r\n this.cdr.markForCheck();\r\n }),\r\n this.layoutService.navVisibility$.subscribe((m) => {\r\n this.navVisibility = m;\r\n this.cdr.markForCheck();\r\n }),\r\n this.layoutService.layoutMode$.subscribe((mode) => {\r\n this.layoutMode = mode;\r\n this.cdr.markForCheck();\r\n }),\r\n this.layoutService.contentType$.subscribe((type) => {\r\n this.contentType = type;\r\n this.cdr.markForCheck();\r\n }),\r\n this.layoutService.barVisibility$.subscribe((m) => {\r\n this.barVisibility = m;\r\n this.cdr.markForCheck();\r\n }),\r\n this.router.events\r\n .pipe(filter((e): e is NavigationEnd => e instanceof NavigationEnd))\r\n .subscribe((e) => {\r\n this.currentUrl = e.urlAfterRedirects;\r\n this.autoExpandFromUrl(this.currentUrl);\r\n this.layoutService.closeMobileSidebar();\r\n this.breadcrumbs = this.computeBreadcrumbs(this.currentUrl);\r\n this.contentTransitioning = true;\r\n this.userDropdownOpen = false;\r\n this.hnavDropdownId = null;\r\n\r\n if (this.schema.loader?.showOnInit && this.layoutService.isLoading()) {\r\n const hide = () => this.layoutService.hideLoader();\r\n const minDuration = this.schema.loader.minDuration ?? 0;\r\n if (minDuration > 0) {\r\n setTimeout(hide, minDuration);\r\n } else {\r\n hide();\r\n }\r\n }\r\n\r\n this.cdr.markForCheck();\r\n }),\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subs.forEach((s) => s.unsubscribe());\r\n }\r\n\r\n @HostListener('document:keydown.escape')\r\n onEscape(): void {\r\n if (this.fabOpen) {\r\n this.fabOpen = false;\r\n }\r\n if (this.userDropdownOpen) {\r\n this.userDropdownOpen = false;\r\n }\r\n if (this.hnavDropdownId) {\r\n this.hnavDropdownId = null;\r\n }\r\n if (this.sidebarOpen) {\r\n this.layoutService.closeMobileSidebar();\r\n }\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n const target = event.target as HTMLElement;\r\n if (this.userDropdownOpen && !target.closest('.ui-layout__user-dropdown')) {\r\n this.userDropdownOpen = false;\r\n this.cdr.markForCheck();\r\n }\r\n if (this.hnavDropdownId && !target.closest('.ui-layout__hnav-dropdown')) {\r\n this.hnavDropdownId = null;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n // ── Navigation helpers ──────────────────────────────────────────\r\n\r\n getItemsForSection(section: UiNavSection): UiNavItem[] {\r\n const idSet = new Set(section.itemIds);\r\n return this.schema.navigation.items.filter((i) => idSet.has(i.id));\r\n }\r\n\r\n isItemHidden(item: UiNavItem): boolean {\r\n const override = this.navVisibility.get(item.id);\r\n if (override !== undefined) return !override;\r\n return item.hidden ?? false;\r\n }\r\n\r\n getItemBadge(item: UiNavItem): string | number | null {\r\n return this.navBadges.get(item.id) ?? item.badge ?? null;\r\n }\r\n\r\n isParentActive(item: UiNavItem): boolean {\r\n if (!item.route) return false;\r\n return this.currentUrl === item.route || this.currentUrl.startsWith(item.route + '/');\r\n }\r\n\r\n isRouteActive(item: UiNavItem): boolean {\r\n if (!item.route) return false;\r\n if (item.routeActiveExact) return this.currentUrl === item.route;\r\n return this.currentUrl === item.route || this.currentUrl.startsWith(item.route + '/');\r\n }\r\n\r\n toggleExpand(item: UiNavItem): void {\r\n if (this.expandedIds.has(item.id)) {\r\n this.expandedIds.delete(item.id);\r\n } else {\r\n this.expandedIds.add(item.id);\r\n if (!this.isParentActive(item) && item.children?.length) {\r\n const firstChild = item.children[0]?.items[0];\r\n if (firstChild?.route) {\r\n this.router.navigateByUrl(firstChild.route);\r\n }\r\n }\r\n }\r\n }\r\n\r\n onNavClick(): void {\r\n this.layoutService.closeMobileSidebar();\r\n }\r\n\r\n // ── FAB ─────────────────────────────────────────────────────────\r\n\r\n onFabMainClick(): void {\r\n if (this.currentFabConfig?.secondaryActions?.length) {\r\n this.fabOpen = !this.fabOpen;\r\n } else {\r\n this.currentFabConfig?.mainAction.action?.();\r\n }\r\n }\r\n\r\n onFabAction(action: UiFabAction): void {\r\n this.fabOpen = false;\r\n action.action?.();\r\n }\r\n\r\n // ── Topbar helpers ──────────────────────────────────────────────\r\n\r\n getTopbarNavItems(bar: UiBarConfig): UiNavItem[] {\r\n return bar.navigation?.items ?? this.schema.navigation.items;\r\n }\r\n\r\n toggleHnavDropdown(itemId: string): void {\r\n this.hnavDropdownId = this.hnavDropdownId === itemId ? null : itemId;\r\n }\r\n\r\n dismissBar(barId: string): void {\r\n this.layoutService.hideBar(barId);\r\n }\r\n\r\n onDropdownAction(item: { action?: () => void }): void {\r\n this.userDropdownOpen = false;\r\n item.action?.();\r\n }\r\n\r\n // ── Breadcrumb derivation from nav schema ───────────────────────\r\n\r\n /**\r\n * Derives breadcrumbs by matching the current URL against the\r\n * navigation schema. Walks top-level items, sections, and children\r\n * to build a trail from root to current page.\r\n */\r\n private computeBreadcrumbs(url: string): UiLayoutBreadcrumb[] {\r\n const items = this.schema.navigation.items;\r\n const sections = this.schema.navigation.sections;\r\n\r\n for (const item of items) {\r\n if (item.type === 'divider' || item.type === 'external') continue;\r\n\r\n if (item.children?.length) {\r\n for (const group of item.children) {\r\n for (const child of group.items) {\r\n if (child.route && this.urlMatches(url, child.route, child.routeActiveExact)) {\r\n const trail: UiLayoutBreadcrumb[] = [];\r\n const sectionLabel = this.findSectionLabel(item.id, sections);\r\n if (sectionLabel) {\r\n trail.push({ label: sectionLabel, isLast: false });\r\n }\r\n trail.push({ label: item.label, url: item.route, isLast: false });\r\n trail.push({ label: child.label, isLast: true });\r\n return trail;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (item.route && this.urlMatches(url, item.route, item.routeActiveExact)) {\r\n const trail: UiLayoutBreadcrumb[] = [];\r\n const sectionLabel = this.findSectionLabel(item.id, sections);\r\n if (sectionLabel) {\r\n trail.push({ label: sectionLabel, isLast: false });\r\n }\r\n trail.push({ label: item.label, isLast: true });\r\n return trail;\r\n }\r\n }\r\n\r\n return [];\r\n }\r\n\r\n private urlMatches(current: string, route: string, exact?: boolean): boolean {\r\n if (exact) return current === route;\r\n return current === route || current.startsWith(route + '/');\r\n }\r\n\r\n private findSectionLabel(itemId: string, sections?: UiNavSection[]): string | null {\r\n if (!sections?.length) return null;\r\n const section = sections.find((s) => s.itemIds.includes(itemId));\r\n return section?.label ?? null;\r\n }\r\n\r\n private autoExpandFromUrl(url: string): void {\r\n for (const item of this.schema.navigation.items) {\r\n if (item.children && item.route && (url === item.route || url.startsWith(item.route + '/'))) {\r\n this.expandedIds.add(item.id);\r\n }\r\n }\r\n }\r\n}\r\n","/**\r\n * ng-ui-system — Layout Builder entry point.\r\n *\r\n * @example\r\n * ```typescript\r\n * import {\r\n * UiLayoutBuilderComponent,\r\n * UiLayoutService,\r\n * UiLayoutSchema,\r\n * UiNavItem,\r\n * } from 'ng-ui-system';\r\n * ```\r\n */\r\n\r\n// Components\r\nexport { UiLayoutBuilderComponent } from './layout-builder.component';\r\n\r\n// Services\r\nexport { UiLayoutService } from './layout.service';\r\n\r\n// Types\r\nexport {\r\n UiLayoutMode,\r\n UiContentType,\r\n UiLayoutBreadcrumb,\r\n UiLayoutSchema,\r\n UiNavItem,\r\n UiNavItemType,\r\n UiNavGroup,\r\n UiNavSection,\r\n UiNavAutoDiscoveryConfig,\r\n UiLayoutNavigationConfig,\r\n UiLayoutLogo,\r\n UiLayoutHeaderConfig,\r\n UiFooterLink,\r\n UiLayoutFooterConfig,\r\n UiFabAction,\r\n UiLayoutFabConfig,\r\n UiLayoutPageHeaderConfig,\r\n UiLayoutLoaderConfig,\r\n UiBarType,\r\n UiBarConfig,\r\n UiTopbarConfig,\r\n UiNotificationBarConfig,\r\n UiBrandBarConfig,\r\n UiUserDropdownConfig,\r\n UiDropdownItem,\r\n UiNavigationBarConfig,\r\n UiLinksBarConfig,\r\n UiBarLinkItem,\r\n} from './layout-builder.types';\r\n","/**\r\n * ng-ui-system - Public API Surface\r\n *\r\n * Main entry point that re-exports all secondary entry points.\r\n * For optimal tree-shaking, prefer importing from specific entry points:\r\n * import { UiButtonComponent } from 'ng-ui-system/button';\r\n *\r\n * For convenience, you can also import from the main entry point:\r\n * import { UiButtonComponent } from 'ng-ui-system';\r\n */\r\n\r\n// Core (design tokens types, shared utilities)\r\nexport * from './lib/core/types/index';\r\nexport * from './lib/core/utils/index';\r\n\r\n// Components — Button\r\nexport * from './lib/components/button/index';\r\n\r\n// Components — Accordion\r\nexport * from './lib/components/accordion/index';\r\n\r\n// Components — Modal\r\nexport * from './lib/components/modal/index';\r\n\r\n// Components — Table\r\nexport * from './lib/components/table/index';\r\n\r\n// Components — CRUD Table\r\nexport * from './lib/components/crud-table/index';\r\n\r\n// Components — Form Builder / Form Wizard\r\nexport * from './lib/components/form-builder/index';\r\n\r\n// Components — Page Header / Breadcrumb\r\nexport * from './lib/components/page-header/index';\r\n\r\n// Components — Base Layout\r\nexport * from './lib/components/base-layout/index';\r\n\r\n// Components — Form Builder Editor (editor visuale)\r\nexport * from './lib/components/form-builder-editor/index';\r\n\r\n// Components — Layout Builder\r\nexport * from './lib/components/layout-builder/index';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1","i3","isDateValid","i1.UiFormConditionService","i2.UiLocationService","i6","i1.UiLocationService","i4","takeUntil","i5","i14","i7","filter"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|