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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (721) hide show
  1. package/accordion/entry-accordion.d.ts +4 -0
  2. package/accordion/index.d.ts +5 -0
  3. package/accordion/lib/components/accordion/accordion.component.d.ts +125 -0
  4. package/accordion/lib/components/accordion/accordion.types.d.ts +64 -0
  5. package/accordion/lib/components/accordion/index.d.ts +2 -0
  6. package/accordion/lib/core/types/index.d.ts +133 -0
  7. package/base-layout/entry-base-layout.d.ts +4 -0
  8. package/base-layout/index.d.ts +5 -0
  9. package/base-layout/lib/components/base-layout/base-layout.component.d.ts +108 -0
  10. package/base-layout/lib/components/base-layout/base-layout.types.d.ts +40 -0
  11. package/base-layout/lib/components/base-layout/index.d.ts +13 -0
  12. package/base-layout/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  13. package/base-layout/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  14. package/base-layout/lib/components/blackbox/blackbox.service.d.ts +144 -0
  15. package/base-layout/lib/components/blackbox/blackbox.types.d.ts +238 -0
  16. package/base-layout/lib/components/button/button-area.component.d.ts +93 -0
  17. package/base-layout/lib/components/button/button.component.d.ts +61 -0
  18. package/base-layout/lib/components/button/button.types.d.ts +75 -0
  19. package/base-layout/lib/components/page-header/breadcrumb.service.d.ts +96 -0
  20. package/base-layout/lib/components/page-header/page-header.component.d.ts +59 -0
  21. package/base-layout/lib/components/page-header/page-header.types.d.ts +96 -0
  22. package/base-layout/lib/core/types/index.d.ts +133 -0
  23. package/blackbox/entry-blackbox.d.ts +4 -0
  24. package/blackbox/index.d.ts +5 -0
  25. package/blackbox/lib/components/blackbox/blackbox-debugger.component.d.ts +80 -0
  26. package/blackbox/lib/components/blackbox/blackbox-debugger.service.d.ts +34 -0
  27. package/blackbox/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  28. package/blackbox/lib/components/blackbox/blackbox-json-viewer.component.d.ts +18 -0
  29. package/blackbox/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  30. package/blackbox/lib/components/blackbox/blackbox.interceptor.d.ts +38 -0
  31. package/blackbox/lib/components/blackbox/blackbox.service.d.ts +144 -0
  32. package/blackbox/lib/components/blackbox/blackbox.types.d.ts +238 -0
  33. package/blackbox/lib/components/blackbox/index.d.ts +23 -0
  34. package/blackbox/lib/components/blackbox/ui-track.directive.d.ts +20 -0
  35. package/blackbox/lib/components/button/button-area.component.d.ts +93 -0
  36. package/blackbox/lib/components/button/button.component.d.ts +61 -0
  37. package/blackbox/lib/components/button/button.types.d.ts +75 -0
  38. package/blackbox/lib/components/button/index.d.ts +15 -0
  39. package/blackbox/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  40. package/blackbox/lib/components/modal/index.d.ts +4 -0
  41. package/blackbox/lib/components/modal/modal.component.d.ts +44 -0
  42. package/blackbox/lib/components/modal/modal.service.d.ts +93 -0
  43. package/blackbox/lib/components/modal/modal.types.d.ts +110 -0
  44. package/blackbox/lib/core/types/index.d.ts +133 -0
  45. package/button/entry-button.d.ts +4 -0
  46. package/button/index.d.ts +5 -0
  47. package/button/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  48. package/button/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  49. package/button/lib/components/blackbox/blackbox.service.d.ts +144 -0
  50. package/button/lib/components/blackbox/blackbox.types.d.ts +238 -0
  51. package/button/lib/components/button/button-area.component.d.ts +93 -0
  52. package/button/lib/components/button/button.component.d.ts +61 -0
  53. package/button/lib/components/button/button.types.d.ts +75 -0
  54. package/button/lib/components/button/index.d.ts +15 -0
  55. package/button/lib/core/types/index.d.ts +133 -0
  56. package/core/entry-core.d.ts +5 -0
  57. package/core/index.d.ts +5 -0
  58. package/core/lib/core/types/index.d.ts +133 -0
  59. package/core/lib/core/utils/index.d.ts +60 -0
  60. package/crud-table/entry-crud-table.d.ts +4 -0
  61. package/crud-table/index.d.ts +5 -0
  62. package/crud-table/lib/components/accordion/accordion.component.d.ts +125 -0
  63. package/crud-table/lib/components/accordion/accordion.types.d.ts +64 -0
  64. package/crud-table/lib/components/accordion/index.d.ts +2 -0
  65. package/crud-table/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  66. package/crud-table/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  67. package/crud-table/lib/components/blackbox/blackbox.service.d.ts +144 -0
  68. package/crud-table/lib/components/blackbox/blackbox.types.d.ts +238 -0
  69. package/crud-table/lib/components/button/button-area.component.d.ts +93 -0
  70. package/crud-table/lib/components/button/button.component.d.ts +61 -0
  71. package/crud-table/lib/components/button/button.types.d.ts +75 -0
  72. package/crud-table/lib/components/button/index.d.ts +15 -0
  73. package/crud-table/lib/components/crud-table/crud-table.component.d.ts +143 -0
  74. package/crud-table/lib/components/crud-table/crud-table.types.d.ts +207 -0
  75. package/crud-table/lib/components/crud-table/index.d.ts +15 -0
  76. package/crud-table/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
  77. package/crud-table/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
  78. package/crud-table/lib/components/form-builder/form-builder.component.d.ts +279 -0
  79. package/crud-table/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
  80. package/crud-table/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
  81. package/crud-table/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
  82. package/crud-table/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
  83. package/crud-table/lib/components/form-builder/services/location.service.d.ts +83 -0
  84. package/crud-table/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
  85. package/crud-table/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +31 -0
  86. package/crud-table/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
  87. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
  88. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
  89. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
  90. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
  91. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
  92. package/crud-table/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
  93. package/crud-table/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
  94. package/crud-table/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
  95. package/crud-table/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
  96. package/crud-table/lib/components/form-builder/types/condition.types.d.ts +51 -0
  97. package/crud-table/lib/components/form-builder/types/field.types.d.ts +330 -0
  98. package/crud-table/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
  99. package/crud-table/lib/components/form-builder/types/schema.types.d.ts +304 -0
  100. package/crud-table/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
  101. package/crud-table/lib/components/form-builder/types/validation.types.d.ts +179 -0
  102. package/crud-table/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  103. package/crud-table/lib/components/modal/modal.service.d.ts +93 -0
  104. package/crud-table/lib/components/modal/modal.types.d.ts +110 -0
  105. package/crud-table/lib/core/logging/logger.config.d.ts +18 -0
  106. package/crud-table/lib/core/logging/logger.service.d.ts +75 -0
  107. package/crud-table/lib/core/logging/logger.types.d.ts +70 -0
  108. package/crud-table/lib/core/types/index.d.ts +133 -0
  109. package/esm2022/accordion/entry-accordion.mjs +5 -0
  110. package/esm2022/accordion/gnggln-ng-ui-system-accordion.mjs +5 -0
  111. package/esm2022/accordion/lib/components/accordion/accordion.component.mjs +398 -0
  112. package/esm2022/accordion/lib/components/accordion/accordion.types.mjs +6 -0
  113. package/esm2022/accordion/lib/components/accordion/index.mjs +2 -0
  114. package/esm2022/accordion/lib/core/types/index.mjs +6 -0
  115. package/esm2022/base-layout/entry-base-layout.mjs +5 -0
  116. package/esm2022/base-layout/gnggln-ng-ui-system-base-layout.mjs +5 -0
  117. package/esm2022/base-layout/lib/components/base-layout/base-layout.component.mjs +272 -0
  118. package/esm2022/base-layout/lib/components/base-layout/base-layout.types.mjs +6 -0
  119. package/esm2022/base-layout/lib/components/base-layout/index.mjs +14 -0
  120. package/esm2022/base-layout/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  121. package/esm2022/base-layout/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  122. package/esm2022/base-layout/lib/components/blackbox/blackbox.service.mjs +323 -0
  123. package/esm2022/base-layout/lib/components/blackbox/blackbox.types.mjs +25 -0
  124. package/esm2022/base-layout/lib/components/button/button-area.component.mjs +210 -0
  125. package/esm2022/base-layout/lib/components/button/button.component.mjs +180 -0
  126. package/esm2022/base-layout/lib/components/button/button.types.mjs +6 -0
  127. package/esm2022/base-layout/lib/components/page-header/breadcrumb.service.mjs +243 -0
  128. package/esm2022/base-layout/lib/components/page-header/page-header.component.mjs +243 -0
  129. package/esm2022/base-layout/lib/components/page-header/page-header.types.mjs +21 -0
  130. package/esm2022/base-layout/lib/core/types/index.mjs +6 -0
  131. package/esm2022/blackbox/entry-blackbox.mjs +5 -0
  132. package/esm2022/blackbox/gnggln-ng-ui-system-blackbox.mjs +5 -0
  133. package/esm2022/blackbox/lib/components/blackbox/blackbox-debugger.component.mjs +904 -0
  134. package/esm2022/blackbox/lib/components/blackbox/blackbox-debugger.service.mjs +51 -0
  135. package/esm2022/blackbox/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  136. package/esm2022/blackbox/lib/components/blackbox/blackbox-json-viewer.component.mjs +66 -0
  137. package/esm2022/blackbox/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  138. package/esm2022/blackbox/lib/components/blackbox/blackbox.interceptor.mjs +135 -0
  139. package/esm2022/blackbox/lib/components/blackbox/blackbox.service.mjs +323 -0
  140. package/esm2022/blackbox/lib/components/blackbox/blackbox.types.mjs +25 -0
  141. package/esm2022/blackbox/lib/components/blackbox/index.mjs +27 -0
  142. package/esm2022/blackbox/lib/components/blackbox/ui-track.directive.mjs +69 -0
  143. package/esm2022/blackbox/lib/components/button/button-area.component.mjs +210 -0
  144. package/esm2022/blackbox/lib/components/button/button.component.mjs +180 -0
  145. package/esm2022/blackbox/lib/components/button/button.types.mjs +6 -0
  146. package/esm2022/blackbox/lib/components/button/index.mjs +16 -0
  147. package/esm2022/blackbox/lib/components/modal/confirm-dialog.component.mjs +151 -0
  148. package/esm2022/blackbox/lib/components/modal/index.mjs +4 -0
  149. package/esm2022/blackbox/lib/components/modal/modal.component.mjs +139 -0
  150. package/esm2022/blackbox/lib/components/modal/modal.service.mjs +197 -0
  151. package/esm2022/blackbox/lib/components/modal/modal.types.mjs +6 -0
  152. package/esm2022/blackbox/lib/core/types/index.mjs +6 -0
  153. package/esm2022/button/entry-button.mjs +5 -0
  154. package/esm2022/button/gnggln-ng-ui-system-button.mjs +5 -0
  155. package/esm2022/button/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  156. package/esm2022/button/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  157. package/esm2022/button/lib/components/blackbox/blackbox.service.mjs +323 -0
  158. package/esm2022/button/lib/components/blackbox/blackbox.types.mjs +25 -0
  159. package/esm2022/button/lib/components/button/button-area.component.mjs +210 -0
  160. package/esm2022/button/lib/components/button/button.component.mjs +180 -0
  161. package/esm2022/button/lib/components/button/button.types.mjs +6 -0
  162. package/esm2022/button/lib/components/button/index.mjs +16 -0
  163. package/esm2022/button/lib/core/types/index.mjs +6 -0
  164. package/esm2022/core/entry-core.mjs +6 -0
  165. package/esm2022/core/gnggln-ng-ui-system-core.mjs +5 -0
  166. package/esm2022/core/lib/core/types/index.mjs +6 -0
  167. package/esm2022/core/lib/core/utils/index.mjs +102 -0
  168. package/esm2022/crud-table/entry-crud-table.mjs +5 -0
  169. package/esm2022/crud-table/gnggln-ng-ui-system-crud-table.mjs +5 -0
  170. package/esm2022/crud-table/lib/components/accordion/accordion.component.mjs +398 -0
  171. package/esm2022/crud-table/lib/components/accordion/accordion.types.mjs +6 -0
  172. package/esm2022/crud-table/lib/components/accordion/index.mjs +2 -0
  173. package/esm2022/crud-table/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  174. package/esm2022/crud-table/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  175. package/esm2022/crud-table/lib/components/blackbox/blackbox.service.mjs +323 -0
  176. package/esm2022/crud-table/lib/components/blackbox/blackbox.types.mjs +25 -0
  177. package/esm2022/crud-table/lib/components/button/button-area.component.mjs +210 -0
  178. package/esm2022/crud-table/lib/components/button/button.component.mjs +180 -0
  179. package/esm2022/crud-table/lib/components/button/button.types.mjs +6 -0
  180. package/esm2022/crud-table/lib/components/button/index.mjs +16 -0
  181. package/esm2022/crud-table/lib/components/crud-table/crud-table.component.mjs +789 -0
  182. package/esm2022/crud-table/lib/components/crud-table/crud-table.types.mjs +6 -0
  183. package/esm2022/crud-table/lib/components/crud-table/index.mjs +16 -0
  184. package/esm2022/crud-table/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
  185. package/esm2022/crud-table/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
  186. package/esm2022/crud-table/lib/components/form-builder/form-builder.component.mjs +1351 -0
  187. package/esm2022/crud-table/lib/components/form-builder/services/form-condition.service.mjs +132 -0
  188. package/esm2022/crud-table/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
  189. package/esm2022/crud-table/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
  190. package/esm2022/crud-table/lib/components/form-builder/services/form-validation.service.mjs +381 -0
  191. package/esm2022/crud-table/lib/components/form-builder/services/location.service.mjs +141 -0
  192. package/esm2022/crud-table/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
  193. package/esm2022/crud-table/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +190 -0
  194. package/esm2022/crud-table/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
  195. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
  196. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
  197. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
  198. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
  199. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
  200. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
  201. package/esm2022/crud-table/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
  202. package/esm2022/crud-table/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
  203. package/esm2022/crud-table/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
  204. package/esm2022/crud-table/lib/components/form-builder/types/condition.types.mjs +6 -0
  205. package/esm2022/crud-table/lib/components/form-builder/types/field.types.mjs +6 -0
  206. package/esm2022/crud-table/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
  207. package/esm2022/crud-table/lib/components/form-builder/types/schema.types.mjs +6 -0
  208. package/esm2022/crud-table/lib/components/form-builder/types/territoriale.types.mjs +6 -0
  209. package/esm2022/crud-table/lib/components/form-builder/types/validation.types.mjs +10 -0
  210. package/esm2022/crud-table/lib/components/modal/confirm-dialog.component.mjs +151 -0
  211. package/esm2022/crud-table/lib/components/modal/modal.service.mjs +197 -0
  212. package/esm2022/crud-table/lib/components/modal/modal.types.mjs +6 -0
  213. package/esm2022/crud-table/lib/core/logging/logger.config.mjs +18 -0
  214. package/esm2022/crud-table/lib/core/logging/logger.service.mjs +295 -0
  215. package/esm2022/crud-table/lib/core/logging/logger.types.mjs +7 -0
  216. package/esm2022/crud-table/lib/core/types/index.mjs +6 -0
  217. package/esm2022/crud-table/lib/sources/location-data.opt.json +8942 -0
  218. package/esm2022/crud-table/lib/sources/nazioni.opt.json +215 -0
  219. package/esm2022/form-builder/entry-form-builder.mjs +5 -0
  220. package/esm2022/form-builder/gnggln-ng-ui-system-form-builder.mjs +5 -0
  221. package/esm2022/form-builder/lib/components/accordion/accordion.component.mjs +398 -0
  222. package/esm2022/form-builder/lib/components/accordion/accordion.types.mjs +6 -0
  223. package/esm2022/form-builder/lib/components/accordion/index.mjs +2 -0
  224. package/esm2022/form-builder/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  225. package/esm2022/form-builder/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  226. package/esm2022/form-builder/lib/components/blackbox/blackbox.service.mjs +323 -0
  227. package/esm2022/form-builder/lib/components/blackbox/blackbox.types.mjs +25 -0
  228. package/esm2022/form-builder/lib/components/button/button-area.component.mjs +210 -0
  229. package/esm2022/form-builder/lib/components/button/button.component.mjs +180 -0
  230. package/esm2022/form-builder/lib/components/button/button.types.mjs +6 -0
  231. package/esm2022/form-builder/lib/components/button/index.mjs +16 -0
  232. package/esm2022/form-builder/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
  233. package/esm2022/form-builder/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
  234. package/esm2022/form-builder/lib/components/form-builder/form-builder.component.mjs +1351 -0
  235. package/esm2022/form-builder/lib/components/form-builder/form-wizard.component.mjs +1064 -0
  236. package/esm2022/form-builder/lib/components/form-builder/index.mjs +24 -0
  237. package/esm2022/form-builder/lib/components/form-builder/services/form-condition.service.mjs +132 -0
  238. package/esm2022/form-builder/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
  239. package/esm2022/form-builder/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
  240. package/esm2022/form-builder/lib/components/form-builder/services/form-validation.service.mjs +381 -0
  241. package/esm2022/form-builder/lib/components/form-builder/services/location.service.mjs +141 -0
  242. package/esm2022/form-builder/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
  243. package/esm2022/form-builder/lib/components/form-builder/services/wizard-sync.service.mjs +84 -0
  244. package/esm2022/form-builder/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +190 -0
  245. package/esm2022/form-builder/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
  246. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
  247. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
  248. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
  249. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
  250. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
  251. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
  252. package/esm2022/form-builder/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
  253. package/esm2022/form-builder/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
  254. package/esm2022/form-builder/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
  255. package/esm2022/form-builder/lib/components/form-builder/types/condition.types.mjs +6 -0
  256. package/esm2022/form-builder/lib/components/form-builder/types/field.types.mjs +6 -0
  257. package/esm2022/form-builder/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
  258. package/esm2022/form-builder/lib/components/form-builder/types/index.mjs +3 -0
  259. package/esm2022/form-builder/lib/components/form-builder/types/schema.types.mjs +6 -0
  260. package/esm2022/form-builder/lib/components/form-builder/types/territoriale.types.mjs +6 -0
  261. package/esm2022/form-builder/lib/components/form-builder/types/validation.types.mjs +10 -0
  262. package/esm2022/form-builder/lib/core/logging/logger.config.mjs +18 -0
  263. package/esm2022/form-builder/lib/core/logging/logger.service.mjs +295 -0
  264. package/esm2022/form-builder/lib/core/logging/logger.types.mjs +7 -0
  265. package/esm2022/form-builder/lib/core/types/index.mjs +6 -0
  266. package/esm2022/form-builder/lib/sources/location-data.opt.json +8942 -0
  267. package/esm2022/form-builder/lib/sources/nazioni.opt.json +215 -0
  268. package/esm2022/form-builder-editor/entry-form-builder-editor.mjs +5 -0
  269. package/esm2022/form-builder-editor/gnggln-ng-ui-system-form-builder-editor.mjs +5 -0
  270. package/esm2022/form-builder-editor/lib/components/accordion/accordion.component.mjs +398 -0
  271. package/esm2022/form-builder-editor/lib/components/accordion/accordion.types.mjs +6 -0
  272. package/esm2022/form-builder-editor/lib/components/accordion/index.mjs +2 -0
  273. package/esm2022/form-builder-editor/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  274. package/esm2022/form-builder-editor/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  275. package/esm2022/form-builder-editor/lib/components/blackbox/blackbox.service.mjs +323 -0
  276. package/esm2022/form-builder-editor/lib/components/blackbox/blackbox.types.mjs +25 -0
  277. package/esm2022/form-builder-editor/lib/components/button/button-area.component.mjs +210 -0
  278. package/esm2022/form-builder-editor/lib/components/button/button.component.mjs +180 -0
  279. package/esm2022/form-builder-editor/lib/components/button/button.types.mjs +6 -0
  280. package/esm2022/form-builder-editor/lib/components/button/index.mjs +16 -0
  281. package/esm2022/form-builder-editor/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
  282. package/esm2022/form-builder-editor/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
  283. package/esm2022/form-builder-editor/lib/components/form-builder/form-builder.component.mjs +1351 -0
  284. package/esm2022/form-builder-editor/lib/components/form-builder/services/form-condition.service.mjs +132 -0
  285. package/esm2022/form-builder-editor/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
  286. package/esm2022/form-builder-editor/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
  287. package/esm2022/form-builder-editor/lib/components/form-builder/services/form-validation.service.mjs +381 -0
  288. package/esm2022/form-builder-editor/lib/components/form-builder/services/location.service.mjs +141 -0
  289. package/esm2022/form-builder-editor/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
  290. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +190 -0
  291. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
  292. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
  293. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
  294. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
  295. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
  296. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
  297. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
  298. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
  299. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
  300. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
  301. package/esm2022/form-builder-editor/lib/components/form-builder/types/condition.types.mjs +6 -0
  302. package/esm2022/form-builder-editor/lib/components/form-builder/types/field.types.mjs +6 -0
  303. package/esm2022/form-builder-editor/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
  304. package/esm2022/form-builder-editor/lib/components/form-builder/types/index.mjs +3 -0
  305. package/esm2022/form-builder-editor/lib/components/form-builder/types/schema.types.mjs +6 -0
  306. package/esm2022/form-builder-editor/lib/components/form-builder/types/territoriale.types.mjs +6 -0
  307. package/esm2022/form-builder-editor/lib/components/form-builder/types/validation.types.mjs +10 -0
  308. package/esm2022/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.component.mjs +730 -0
  309. package/esm2022/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.service.mjs +56 -0
  310. package/esm2022/form-builder-editor/lib/components/form-builder-editor/index.mjs +23 -0
  311. package/esm2022/form-builder-editor/lib/components/form-builder-editor/presets/editor-presets.mjs +395 -0
  312. package/esm2022/form-builder-editor/lib/components/form-builder-editor/services/editor-persistence.service.mjs +190 -0
  313. package/esm2022/form-builder-editor/lib/components/form-builder-editor/services/editor-state.service.mjs +324 -0
  314. package/esm2022/form-builder-editor/lib/components/form-builder-editor/services/field-factory.service.mjs +188 -0
  315. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.mjs +667 -0
  316. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.mjs +317 -0
  317. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.mjs +611 -0
  318. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.mjs +267 -0
  319. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.mjs +276 -0
  320. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.mjs +323 -0
  321. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +238 -0
  322. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +473 -0
  323. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.mjs +473 -0
  324. package/esm2022/form-builder-editor/lib/components/form-builder-editor/types/editor.types.mjs +6 -0
  325. package/esm2022/form-builder-editor/lib/components/modal/confirm-dialog.component.mjs +151 -0
  326. package/esm2022/form-builder-editor/lib/components/modal/index.mjs +4 -0
  327. package/esm2022/form-builder-editor/lib/components/modal/modal.component.mjs +139 -0
  328. package/esm2022/form-builder-editor/lib/components/modal/modal.service.mjs +197 -0
  329. package/esm2022/form-builder-editor/lib/components/modal/modal.types.mjs +6 -0
  330. package/esm2022/form-builder-editor/lib/core/logging/logger.config.mjs +18 -0
  331. package/esm2022/form-builder-editor/lib/core/logging/logger.service.mjs +295 -0
  332. package/esm2022/form-builder-editor/lib/core/logging/logger.types.mjs +7 -0
  333. package/esm2022/form-builder-editor/lib/core/types/index.mjs +6 -0
  334. package/esm2022/form-builder-editor/lib/sources/location-data.opt.json +8942 -0
  335. package/esm2022/form-builder-editor/lib/sources/nazioni.opt.json +215 -0
  336. package/esm2022/http/entry-http.mjs +5 -0
  337. package/esm2022/http/gnggln-ng-ui-system-http.mjs +5 -0
  338. package/esm2022/http/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  339. package/esm2022/http/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  340. package/esm2022/http/lib/components/blackbox/blackbox.service.mjs +323 -0
  341. package/esm2022/http/lib/components/blackbox/blackbox.types.mjs +25 -0
  342. package/esm2022/http/lib/components/http/http-message.handler.mjs +143 -0
  343. package/esm2022/http/lib/components/http/http.service.mjs +228 -0
  344. package/esm2022/http/lib/components/http/http.tokens.mjs +29 -0
  345. package/esm2022/http/lib/components/http/http.types.mjs +6 -0
  346. package/esm2022/http/lib/components/http/index.mjs +19 -0
  347. package/esm2022/http/lib/components/layout-builder/layout-builder.types.mjs +9 -0
  348. package/esm2022/http/lib/components/layout-builder/layout.service.mjs +239 -0
  349. package/esm2022/http/lib/components/toast/toast-container.component.mjs +80 -0
  350. package/esm2022/http/lib/components/toast/toast.component.mjs +151 -0
  351. package/esm2022/http/lib/components/toast/toast.service.mjs +156 -0
  352. package/esm2022/http/lib/components/toast/toast.types.mjs +12 -0
  353. package/esm2022/http/lib/core/types/index.mjs +6 -0
  354. package/esm2022/http/lib/core/utils/index.mjs +102 -0
  355. package/esm2022/layout-builder/entry-layout-builder.mjs +5 -0
  356. package/esm2022/layout-builder/gnggln-ng-ui-system-layout-builder.mjs +5 -0
  357. package/esm2022/layout-builder/lib/components/layout-builder/index.mjs +18 -0
  358. package/esm2022/layout-builder/lib/components/layout-builder/layout-builder.component.mjs +1804 -0
  359. package/esm2022/layout-builder/lib/components/layout-builder/layout-builder.types.mjs +9 -0
  360. package/esm2022/layout-builder/lib/components/layout-builder/layout.service.mjs +239 -0
  361. package/esm2022/layout-builder/lib/core/types/index.mjs +6 -0
  362. package/esm2022/lib/components/accordion/accordion.component.mjs +106 -61
  363. package/esm2022/lib/components/accordion/accordion.types.mjs +1 -1
  364. package/esm2022/lib/components/base-layout/base-layout.component.mjs +88 -34
  365. package/esm2022/lib/components/base-layout/base-layout.types.mjs +1 -1
  366. package/esm2022/lib/components/base-layout/index.mjs +1 -1
  367. package/esm2022/lib/components/blackbox/blackbox-debugger.component.mjs +904 -0
  368. package/esm2022/lib/components/blackbox/blackbox-debugger.service.mjs +51 -0
  369. package/esm2022/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  370. package/esm2022/lib/components/blackbox/blackbox-json-viewer.component.mjs +66 -0
  371. package/esm2022/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  372. package/esm2022/lib/components/blackbox/blackbox.interceptor.mjs +135 -0
  373. package/esm2022/lib/components/blackbox/blackbox.service.mjs +323 -0
  374. package/esm2022/lib/components/blackbox/blackbox.types.mjs +25 -0
  375. package/esm2022/lib/components/blackbox/index.mjs +27 -0
  376. package/esm2022/lib/components/blackbox/ui-track.directive.mjs +69 -0
  377. package/esm2022/lib/components/button/button-area.component.mjs +16 -2
  378. package/esm2022/lib/components/button/button.component.mjs +23 -7
  379. package/esm2022/lib/components/button/button.types.mjs +1 -1
  380. package/esm2022/lib/components/crud-table/crud-table.component.mjs +14 -14
  381. package/esm2022/lib/components/form-builder/form-builder.component.mjs +710 -183
  382. package/esm2022/lib/components/form-builder/form-wizard.component.mjs +789 -235
  383. package/esm2022/lib/components/form-builder/index.mjs +7 -2
  384. package/esm2022/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
  385. package/esm2022/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
  386. package/esm2022/lib/components/form-builder/services/location.service.mjs +4 -3
  387. package/esm2022/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
  388. package/esm2022/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +142 -113
  389. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
  390. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
  391. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
  392. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
  393. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
  394. package/esm2022/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
  395. package/esm2022/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
  396. package/esm2022/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +3 -3
  397. package/esm2022/lib/components/form-builder/types/field.types.mjs +1 -1
  398. package/esm2022/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
  399. package/esm2022/lib/components/form-builder/types/index.mjs +3 -2
  400. package/esm2022/lib/components/form-builder/types/schema.types.mjs +1 -1
  401. package/esm2022/lib/components/form-builder/types/validation.types.mjs +6 -2
  402. package/esm2022/lib/components/form-builder-editor/form-builder-editor.component.mjs +3 -3
  403. package/esm2022/lib/components/form-builder-editor/index.mjs +3 -1
  404. package/esm2022/lib/components/form-builder-editor/presets/editor-presets.mjs +395 -0
  405. package/esm2022/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +2 -2
  406. package/esm2022/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +2 -1
  407. package/esm2022/lib/components/http/http-message.handler.mjs +143 -0
  408. package/esm2022/lib/components/http/http.service.mjs +228 -0
  409. package/esm2022/lib/components/http/http.tokens.mjs +29 -0
  410. package/esm2022/lib/components/http/http.types.mjs +6 -0
  411. package/esm2022/lib/components/http/index.mjs +19 -0
  412. package/esm2022/lib/components/layout-builder/layout-builder.component.mjs +27 -15
  413. package/esm2022/lib/components/modal/confirm-dialog.component.mjs +3 -3
  414. package/esm2022/lib/components/modal/modal.service.mjs +5 -2
  415. package/esm2022/lib/components/page-header/breadcrumb.service.mjs +5 -4
  416. package/esm2022/lib/components/table/paginated-table.component.mjs +17 -3
  417. package/esm2022/lib/components/table/table.types.mjs +1 -1
  418. package/esm2022/lib/components/toast/index.mjs +18 -0
  419. package/esm2022/lib/components/toast/toast-container.component.mjs +80 -0
  420. package/esm2022/lib/components/toast/toast.component.mjs +151 -0
  421. package/esm2022/lib/components/toast/toast.service.mjs +156 -0
  422. package/esm2022/lib/components/toast/toast.types.mjs +12 -0
  423. package/esm2022/lib/core/logging/index.mjs +10 -0
  424. package/esm2022/lib/core/logging/logger.config.mjs +18 -0
  425. package/esm2022/lib/core/logging/logger.service.mjs +295 -0
  426. package/esm2022/lib/core/logging/logger.types.mjs +7 -0
  427. package/esm2022/lib/core/types/index.mjs +1 -1
  428. package/esm2022/lib/core/utils/index.mjs +50 -1
  429. package/esm2022/lib/version/ng-ui-system-version.mjs +12 -0
  430. package/esm2022/modal/entry-modal.mjs +5 -0
  431. package/esm2022/modal/gnggln-ng-ui-system-modal.mjs +5 -0
  432. package/esm2022/modal/lib/components/button/button.component.mjs +180 -0
  433. package/esm2022/modal/lib/components/button/button.types.mjs +6 -0
  434. package/esm2022/modal/lib/components/modal/confirm-dialog.component.mjs +151 -0
  435. package/esm2022/modal/lib/components/modal/index.mjs +4 -0
  436. package/esm2022/modal/lib/components/modal/modal.component.mjs +139 -0
  437. package/esm2022/modal/lib/components/modal/modal.service.mjs +197 -0
  438. package/esm2022/modal/lib/components/modal/modal.types.mjs +6 -0
  439. package/esm2022/modal/lib/core/types/index.mjs +6 -0
  440. package/esm2022/page-header/entry-page-header.mjs +5 -0
  441. package/esm2022/page-header/gnggln-ng-ui-system-page-header.mjs +5 -0
  442. package/esm2022/page-header/lib/components/page-header/breadcrumb.service.mjs +243 -0
  443. package/esm2022/page-header/lib/components/page-header/index.mjs +20 -0
  444. package/esm2022/page-header/lib/components/page-header/page-header.component.mjs +243 -0
  445. package/esm2022/page-header/lib/components/page-header/page-header.types.mjs +21 -0
  446. package/esm2022/public-api.mjs +17 -8
  447. package/esm2022/table/entry-table.mjs +5 -0
  448. package/esm2022/table/gnggln-ng-ui-system-table.mjs +5 -0
  449. package/esm2022/table/lib/components/table/index.mjs +2 -0
  450. package/esm2022/table/lib/components/table/paginated-table.component.mjs +421 -0
  451. package/esm2022/table/lib/components/table/table.types.mjs +6 -0
  452. package/esm2022/table/lib/core/utils/index.mjs +102 -0
  453. package/esm2022/toast/entry-toast.mjs +5 -0
  454. package/esm2022/toast/gnggln-ng-ui-system-toast.mjs +5 -0
  455. package/esm2022/toast/lib/components/toast/index.mjs +18 -0
  456. package/esm2022/toast/lib/components/toast/toast-container.component.mjs +80 -0
  457. package/esm2022/toast/lib/components/toast/toast.component.mjs +151 -0
  458. package/esm2022/toast/lib/components/toast/toast.service.mjs +156 -0
  459. package/esm2022/toast/lib/components/toast/toast.types.mjs +12 -0
  460. package/esm2022/toast/lib/core/types/index.mjs +6 -0
  461. package/esm2022/toast/lib/core/utils/index.mjs +102 -0
  462. package/fesm2022/gnggln-ng-ui-system-accordion.mjs +409 -0
  463. package/fesm2022/gnggln-ng-ui-system-accordion.mjs.map +1 -0
  464. package/fesm2022/gnggln-ng-ui-system-base-layout.mjs +1905 -0
  465. package/fesm2022/gnggln-ng-ui-system-base-layout.mjs.map +1 -0
  466. package/fesm2022/gnggln-ng-ui-system-blackbox.mjs +2829 -0
  467. package/fesm2022/gnggln-ng-ui-system-blackbox.mjs.map +1 -0
  468. package/fesm2022/gnggln-ng-ui-system-button.mjs +1148 -0
  469. package/fesm2022/gnggln-ng-ui-system-button.mjs.map +1 -0
  470. package/fesm2022/gnggln-ng-ui-system-core.mjs +117 -0
  471. package/fesm2022/gnggln-ng-ui-system-core.mjs.map +1 -0
  472. package/fesm2022/gnggln-ng-ui-system-crud-table.mjs +49600 -0
  473. package/fesm2022/gnggln-ng-ui-system-crud-table.mjs.map +1 -0
  474. package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs +54332 -0
  475. package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs.map +1 -0
  476. package/fesm2022/gnggln-ng-ui-system-form-builder.mjs +49609 -0
  477. package/fesm2022/gnggln-ng-ui-system-form-builder.mjs.map +1 -0
  478. package/fesm2022/gnggln-ng-ui-system-http.mjs +1878 -0
  479. package/fesm2022/gnggln-ng-ui-system-http.mjs.map +1 -0
  480. package/fesm2022/gnggln-ng-ui-system-layout-builder.mjs +2064 -0
  481. package/fesm2022/gnggln-ng-ui-system-layout-builder.mjs.map +1 -0
  482. package/fesm2022/gnggln-ng-ui-system-modal.mjs +664 -0
  483. package/fesm2022/gnggln-ng-ui-system-modal.mjs.map +1 -0
  484. package/fesm2022/gnggln-ng-ui-system-page-header.mjs +526 -0
  485. package/fesm2022/gnggln-ng-ui-system-page-header.mjs.map +1 -0
  486. package/fesm2022/gnggln-ng-ui-system-table.mjs +533 -0
  487. package/fesm2022/gnggln-ng-ui-system-table.mjs.map +1 -0
  488. package/fesm2022/gnggln-ng-ui-system-toast.mjs +516 -0
  489. package/fesm2022/gnggln-ng-ui-system-toast.mjs.map +1 -0
  490. package/fesm2022/gnggln-ng-ui-system.mjs +10068 -4234
  491. package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -1
  492. package/form-builder/entry-form-builder.d.ts +4 -0
  493. package/form-builder/index.d.ts +5 -0
  494. package/form-builder/lib/components/accordion/accordion.component.d.ts +125 -0
  495. package/form-builder/lib/components/accordion/accordion.types.d.ts +64 -0
  496. package/form-builder/lib/components/accordion/index.d.ts +2 -0
  497. package/form-builder/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  498. package/form-builder/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  499. package/form-builder/lib/components/blackbox/blackbox.service.d.ts +144 -0
  500. package/form-builder/lib/components/blackbox/blackbox.types.d.ts +238 -0
  501. package/form-builder/lib/components/button/button-area.component.d.ts +93 -0
  502. package/form-builder/lib/components/button/button.component.d.ts +61 -0
  503. package/form-builder/lib/components/button/button.types.d.ts +75 -0
  504. package/form-builder/lib/components/button/index.d.ts +15 -0
  505. package/form-builder/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
  506. package/form-builder/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
  507. package/form-builder/lib/components/form-builder/form-builder.component.d.ts +279 -0
  508. package/form-builder/lib/components/form-builder/form-wizard.component.d.ts +172 -0
  509. package/form-builder/lib/components/form-builder/index.d.ts +19 -0
  510. package/form-builder/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
  511. package/form-builder/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
  512. package/form-builder/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
  513. package/form-builder/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
  514. package/form-builder/lib/components/form-builder/services/location.service.d.ts +83 -0
  515. package/form-builder/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
  516. package/form-builder/lib/components/form-builder/services/wizard-sync.service.d.ts +63 -0
  517. package/form-builder/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +31 -0
  518. package/form-builder/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
  519. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
  520. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
  521. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
  522. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
  523. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
  524. package/form-builder/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
  525. package/form-builder/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
  526. package/form-builder/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
  527. package/form-builder/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
  528. package/form-builder/lib/components/form-builder/types/condition.types.d.ts +51 -0
  529. package/form-builder/lib/components/form-builder/types/field.types.d.ts +330 -0
  530. package/form-builder/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
  531. package/form-builder/lib/components/form-builder/types/index.d.ts +6 -0
  532. package/form-builder/lib/components/form-builder/types/schema.types.d.ts +304 -0
  533. package/form-builder/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
  534. package/form-builder/lib/components/form-builder/types/validation.types.d.ts +179 -0
  535. package/form-builder/lib/core/logging/logger.config.d.ts +18 -0
  536. package/form-builder/lib/core/logging/logger.service.d.ts +75 -0
  537. package/form-builder/lib/core/logging/logger.types.d.ts +70 -0
  538. package/form-builder/lib/core/types/index.d.ts +133 -0
  539. package/form-builder-editor/entry-form-builder-editor.d.ts +4 -0
  540. package/form-builder-editor/index.d.ts +5 -0
  541. package/form-builder-editor/lib/components/accordion/accordion.component.d.ts +125 -0
  542. package/form-builder-editor/lib/components/accordion/accordion.types.d.ts +64 -0
  543. package/form-builder-editor/lib/components/accordion/index.d.ts +2 -0
  544. package/form-builder-editor/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  545. package/form-builder-editor/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  546. package/form-builder-editor/lib/components/blackbox/blackbox.service.d.ts +144 -0
  547. package/form-builder-editor/lib/components/blackbox/blackbox.types.d.ts +238 -0
  548. package/form-builder-editor/lib/components/button/button-area.component.d.ts +93 -0
  549. package/form-builder-editor/lib/components/button/button.component.d.ts +61 -0
  550. package/form-builder-editor/lib/components/button/button.types.d.ts +75 -0
  551. package/form-builder-editor/lib/components/button/index.d.ts +15 -0
  552. package/form-builder-editor/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
  553. package/form-builder-editor/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
  554. package/form-builder-editor/lib/components/form-builder/form-builder.component.d.ts +279 -0
  555. package/form-builder-editor/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
  556. package/form-builder-editor/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
  557. package/form-builder-editor/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
  558. package/form-builder-editor/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
  559. package/form-builder-editor/lib/components/form-builder/services/location.service.d.ts +83 -0
  560. package/form-builder-editor/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
  561. package/form-builder-editor/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +31 -0
  562. package/form-builder-editor/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
  563. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
  564. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
  565. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
  566. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
  567. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
  568. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
  569. package/form-builder-editor/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
  570. package/form-builder-editor/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
  571. package/form-builder-editor/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
  572. package/form-builder-editor/lib/components/form-builder/types/condition.types.d.ts +51 -0
  573. package/form-builder-editor/lib/components/form-builder/types/field.types.d.ts +330 -0
  574. package/form-builder-editor/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
  575. package/form-builder-editor/lib/components/form-builder/types/index.d.ts +6 -0
  576. package/form-builder-editor/lib/components/form-builder/types/schema.types.d.ts +304 -0
  577. package/form-builder-editor/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
  578. package/form-builder-editor/lib/components/form-builder/types/validation.types.d.ts +179 -0
  579. package/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.component.d.ts +117 -0
  580. package/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.service.d.ts +38 -0
  581. package/form-builder-editor/lib/components/form-builder-editor/index.d.ts +17 -0
  582. package/form-builder-editor/lib/components/form-builder-editor/presets/editor-presets.d.ts +25 -0
  583. package/form-builder-editor/lib/components/form-builder-editor/services/editor-persistence.service.d.ts +42 -0
  584. package/form-builder-editor/lib/components/form-builder-editor/services/editor-state.service.d.ts +66 -0
  585. package/form-builder-editor/lib/components/form-builder-editor/services/field-factory.service.d.ts +28 -0
  586. package/form-builder-editor/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.d.ts +139 -0
  587. package/form-builder-editor/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.d.ts +43 -0
  588. package/form-builder-editor/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.d.ts +83 -0
  589. package/form-builder-editor/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.d.ts +40 -0
  590. package/form-builder-editor/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.d.ts +51 -0
  591. package/form-builder-editor/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.d.ts +63 -0
  592. package/form-builder-editor/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.d.ts +68 -0
  593. package/form-builder-editor/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.d.ts +82 -0
  594. package/form-builder-editor/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.d.ts +112 -0
  595. package/form-builder-editor/lib/components/form-builder-editor/types/editor.types.d.ts +124 -0
  596. package/form-builder-editor/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  597. package/form-builder-editor/lib/components/modal/index.d.ts +4 -0
  598. package/form-builder-editor/lib/components/modal/modal.component.d.ts +44 -0
  599. package/form-builder-editor/lib/components/modal/modal.service.d.ts +93 -0
  600. package/form-builder-editor/lib/components/modal/modal.types.d.ts +110 -0
  601. package/form-builder-editor/lib/core/logging/logger.config.d.ts +18 -0
  602. package/form-builder-editor/lib/core/logging/logger.service.d.ts +75 -0
  603. package/form-builder-editor/lib/core/logging/logger.types.d.ts +70 -0
  604. package/form-builder-editor/lib/core/types/index.d.ts +133 -0
  605. package/http/entry-http.d.ts +4 -0
  606. package/http/index.d.ts +5 -0
  607. package/http/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  608. package/http/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  609. package/http/lib/components/blackbox/blackbox.service.d.ts +144 -0
  610. package/http/lib/components/blackbox/blackbox.types.d.ts +238 -0
  611. package/http/lib/components/http/http-message.handler.d.ts +59 -0
  612. package/http/lib/components/http/http.service.d.ts +98 -0
  613. package/http/lib/components/http/http.tokens.d.ts +29 -0
  614. package/http/lib/components/http/http.types.d.ts +50 -0
  615. package/http/lib/components/http/index.d.ts +17 -0
  616. package/http/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
  617. package/http/lib/components/layout-builder/layout.service.d.ts +100 -0
  618. package/http/lib/components/toast/toast-container.component.d.ts +27 -0
  619. package/http/lib/components/toast/toast.component.d.ts +37 -0
  620. package/http/lib/components/toast/toast.service.d.ts +39 -0
  621. package/http/lib/components/toast/toast.types.d.ts +52 -0
  622. package/http/lib/core/types/index.d.ts +133 -0
  623. package/http/lib/core/utils/index.d.ts +60 -0
  624. package/layout-builder/entry-layout-builder.d.ts +4 -0
  625. package/layout-builder/index.d.ts +5 -0
  626. package/layout-builder/lib/components/layout-builder/index.d.ts +16 -0
  627. package/layout-builder/lib/components/layout-builder/layout-builder.component.d.ts +85 -0
  628. package/layout-builder/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
  629. package/layout-builder/lib/components/layout-builder/layout.service.d.ts +100 -0
  630. package/layout-builder/lib/core/types/index.d.ts +133 -0
  631. package/lib/components/accordion/accordion.component.d.ts +10 -3
  632. package/lib/components/accordion/accordion.types.d.ts +2 -0
  633. package/lib/components/base-layout/base-layout.component.d.ts +36 -11
  634. package/lib/components/base-layout/base-layout.types.d.ts +14 -0
  635. package/lib/components/base-layout/index.d.ts +1 -1
  636. package/lib/components/blackbox/blackbox-debugger.component.d.ts +80 -0
  637. package/lib/components/blackbox/blackbox-debugger.service.d.ts +34 -0
  638. package/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  639. package/lib/components/blackbox/blackbox-json-viewer.component.d.ts +18 -0
  640. package/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  641. package/lib/components/blackbox/blackbox.interceptor.d.ts +38 -0
  642. package/lib/components/blackbox/blackbox.service.d.ts +144 -0
  643. package/lib/components/blackbox/blackbox.types.d.ts +238 -0
  644. package/lib/components/blackbox/index.d.ts +23 -0
  645. package/lib/components/blackbox/ui-track.directive.d.ts +20 -0
  646. package/lib/components/button/button-area.component.d.ts +6 -1
  647. package/lib/components/button/button.component.d.ts +8 -2
  648. package/lib/components/button/button.types.d.ts +5 -0
  649. package/lib/components/form-builder/form-builder.component.d.ts +125 -29
  650. package/lib/components/form-builder/form-wizard.component.d.ts +89 -4
  651. package/lib/components/form-builder/index.d.ts +7 -1
  652. package/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
  653. package/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
  654. package/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
  655. package/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +9 -6
  656. package/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
  657. package/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
  658. package/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
  659. package/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
  660. package/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
  661. package/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
  662. package/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
  663. package/lib/components/form-builder/types/field.types.d.ts +48 -6
  664. package/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
  665. package/lib/components/form-builder/types/index.d.ts +4 -3
  666. package/lib/components/form-builder/types/schema.types.d.ts +83 -6
  667. package/lib/components/form-builder/types/validation.types.d.ts +5 -0
  668. package/lib/components/form-builder-editor/index.d.ts +2 -0
  669. package/lib/components/form-builder-editor/presets/editor-presets.d.ts +25 -0
  670. package/lib/components/http/http-message.handler.d.ts +59 -0
  671. package/lib/components/http/http.service.d.ts +98 -0
  672. package/lib/components/http/http.tokens.d.ts +29 -0
  673. package/lib/components/http/http.types.d.ts +50 -0
  674. package/lib/components/http/index.d.ts +17 -0
  675. package/lib/components/page-header/breadcrumb.service.d.ts +2 -2
  676. package/lib/components/table/table.types.d.ts +5 -0
  677. package/lib/components/toast/index.d.ts +17 -0
  678. package/lib/components/toast/toast-container.component.d.ts +27 -0
  679. package/lib/components/toast/toast.component.d.ts +37 -0
  680. package/lib/components/toast/toast.service.d.ts +39 -0
  681. package/lib/components/toast/toast.types.d.ts +52 -0
  682. package/lib/core/logging/index.d.ts +8 -0
  683. package/lib/core/logging/logger.config.d.ts +18 -0
  684. package/lib/core/logging/logger.service.d.ts +75 -0
  685. package/lib/core/logging/logger.types.d.ts +70 -0
  686. package/lib/core/types/index.d.ts +76 -0
  687. package/lib/core/utils/index.d.ts +31 -0
  688. package/lib/version/ng-ui-system-version.d.ts +9 -0
  689. package/modal/entry-modal.d.ts +4 -0
  690. package/modal/index.d.ts +5 -0
  691. package/modal/lib/components/button/button.component.d.ts +61 -0
  692. package/modal/lib/components/button/button.types.d.ts +75 -0
  693. package/modal/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  694. package/modal/lib/components/modal/index.d.ts +4 -0
  695. package/modal/lib/components/modal/modal.component.d.ts +44 -0
  696. package/modal/lib/components/modal/modal.service.d.ts +93 -0
  697. package/modal/lib/components/modal/modal.types.d.ts +110 -0
  698. package/modal/lib/core/types/index.d.ts +133 -0
  699. package/package.json +93 -8
  700. package/page-header/entry-page-header.d.ts +4 -0
  701. package/page-header/index.d.ts +5 -0
  702. package/page-header/lib/components/page-header/breadcrumb.service.d.ts +96 -0
  703. package/page-header/lib/components/page-header/index.d.ts +16 -0
  704. package/page-header/lib/components/page-header/page-header.component.d.ts +59 -0
  705. package/page-header/lib/components/page-header/page-header.types.d.ts +96 -0
  706. package/public-api.d.ts +11 -6
  707. package/table/entry-table.d.ts +4 -0
  708. package/table/index.d.ts +5 -0
  709. package/table/lib/components/table/index.d.ts +2 -0
  710. package/table/lib/components/table/paginated-table.component.d.ts +85 -0
  711. package/table/lib/components/table/table.types.d.ts +86 -0
  712. package/table/lib/core/utils/index.d.ts +60 -0
  713. package/toast/entry-toast.d.ts +4 -0
  714. package/toast/index.d.ts +5 -0
  715. package/toast/lib/components/toast/index.d.ts +17 -0
  716. package/toast/lib/components/toast/toast-container.component.d.ts +27 -0
  717. package/toast/lib/components/toast/toast.component.d.ts +37 -0
  718. package/toast/lib/components/toast/toast.service.d.ts +39 -0
  719. package/toast/lib/components/toast/toast.types.d.ts +52 -0
  720. package/toast/lib/core/types/index.d.ts +133 -0
  721. package/toast/lib/core/utils/index.d.ts +60 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gnggln-ng-ui-system-form-builder.mjs","sources":["../../../packages/ng-ui-system/src/lib/components/accordion/accordion.component.ts","../../../packages/ng-ui-system/src/lib/components/button/button.component.ts","../../../packages/ng-ui-system/src/lib/components/blackbox/blackbox.types.ts","../../../packages/ng-ui-system/src/lib/components/blackbox/blackbox-fingerprint.service.ts","../../../packages/ng-ui-system/src/lib/components/blackbox/blackbox-storage.service.ts","../../../packages/ng-ui-system/src/lib/components/blackbox/blackbox.service.ts","../../../packages/ng-ui-system/src/lib/components/button/button-area.component.ts","../../../packages/ng-ui-system/src/lib/components/button/index.ts","../../../packages/ng-ui-system/src/lib/core/logging/logger.config.ts","../../../packages/ng-ui-system/src/lib/core/logging/logger.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/types/validation.types.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/services/form-condition.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/services/form-validation.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/services/form-field-error.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/file-input/file-input.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/services/location.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/services/nominatim-geocoding.service.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/services/form-error-state.matcher.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-text-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-text-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/directives/currency-input.directive.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-number-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-number-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-select-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-select-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/adapters/it-date-adapter.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/form-builder.component.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/form-builder.component.html","../../../packages/ng-ui-system/src/lib/components/form-builder/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/types/index.ts","../../../packages/ng-ui-system/src/lib/components/form-builder/index.ts","../../../packages/ng-ui-system/src/entry-form-builder.ts","../../../packages/ng-ui-system/src/gnggln-ng-ui-system-form-builder.ts"],"sourcesContent":["import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n ViewEncapsulation,\r\n DoCheck,\r\n TemplateRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiAccordionDescriptor, UiAccordionToggleEvent, UiAccordionMode } from './accordion.types';\r\n\r\n/**\r\n * Accordion configurabile, data-driven, con supporto multi/single expand,\r\n * animazioni CSS, icone Lucide e template personalizzabili.\r\n *\r\n * Il contenuto dei pannelli viene fornito tramite un `itemTemplate`\r\n * che riceve il descriptor del pannello come contesto.\r\n *\r\n * @selector ui-accordion\r\n *\r\n * @example\r\n * ```html\r\n * <ui-accordion\r\n * [items]=\"sections\"\r\n * [itemTemplate]=\"panelTpl\"\r\n * mode=\"single\"\r\n * >\r\n * <ng-template #panelTpl let-item>\r\n * @switch (item.id) {\r\n * @case ('info') { <app-info-panel /> }\r\n * @case ('address') { <app-address-form /> }\r\n * }\r\n * </ng-template>\r\n * </ui-accordion>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * sections: UiAccordionDescriptor[] = [\r\n * { id: 'info', title: 'Informazioni', icon: 'info', expanded: true },\r\n * { id: 'address', title: 'Indirizzo', icon: 'map-pin' },\r\n * ];\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-accordion',\r\n standalone: true,\r\n imports: [NgTemplateOutlet, LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: { class: 'ui-accordion-host' },\r\n template: `\r\n @for (item of visibleItems; track item.id) {\r\n <div\r\n [class]=\"getPanelClasses(item)\"\r\n [id]=\"'ui-accordion-' + item.id\"\r\n >\r\n <!-- Header: div wrapper per ospitare trigger + azioni + chevron -->\r\n <div\r\n class=\"ui-accordion__header\"\r\n [class.ui-accordion__header--expanded]=\"item.expanded\"\r\n [class.ui-accordion__header--disabled]=\"item.disabled\"\r\n (click)=\"!item.disabled && toggle(item)\"\r\n >\r\n <button\r\n class=\"ui-accordion__trigger\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-expanded]=\"item.expanded\"\r\n [attr.aria-controls]=\"'ui-accordion-body-' + item.id\"\r\n [attr.id]=\"'ui-accordion-header-' + item.id\"\r\n type=\"button\"\r\n (keydown.home)=\"focusFirst($event)\"\r\n (keydown.end)=\"focusLast($event)\"\r\n >\r\n <div class=\"ui-accordion__header-content\">\r\n @if (item.icon) {\r\n <lucide-icon\r\n class=\"ui-accordion__icon\"\r\n [name]=\"item.icon\"\r\n [size]=\"18\"\r\n aria-hidden=\"true\"\r\n />\r\n }\r\n <span class=\"ui-accordion__title\">{{ item.title }}</span>\r\n @if (item.subtitle) {\r\n <span class=\"ui-accordion__subtitle\">{{ item.subtitle }}</span>\r\n }\r\n </div>\r\n\r\n @if (headerTemplate) {\r\n <div class=\"ui-accordion__header-extra\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"headerTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\r\n />\r\n </div>\r\n }\r\n </button>\r\n\r\n @if (actionsTemplate) {\r\n <div\r\n class=\"ui-accordion__actions\"\r\n role=\"group\"\r\n aria-label=\"Azioni pannello\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"actionsTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\r\n />\r\n </div>\r\n }\r\n\r\n <lucide-icon\r\n class=\"ui-accordion__chevron\"\r\n [class.ui-accordion__chevron--rotated]=\"item.expanded\"\r\n name=\"chevron-down\"\r\n [size]=\"16\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n\r\n <!-- Body (animazione CSS grid) -->\r\n <div\r\n class=\"ui-accordion__body-wrapper\"\r\n [class.ui-accordion__body-wrapper--open]=\"item.expanded\"\r\n role=\"region\"\r\n [attr.id]=\"'ui-accordion-body-' + item.id\"\r\n [attr.aria-labelledby]=\"'ui-accordion-header-' + item.id\"\r\n >\r\n <div class=\"ui-accordion__body\">\r\n @if (item.expanded && itemTemplate) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"itemTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n `,\r\n styleUrl: './accordion.component.scss',\r\n})\r\nexport class UiAccordionComponent implements DoCheck {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n /**\r\n * Fingerprint dell'ultimo stato dei descriptor.\r\n * Usato da DoCheck per rilevare mutazioni in-place sulle proprieta\r\n * degli item senza richiedere un nuovo riferimento dell'array.\r\n */\r\n private _lastFingerprint = '';\r\n\r\n /**\r\n * Array di descriptor dei pannelli.\r\n * Pannelli con `hidden: true` vengono filtrati automaticamente.\r\n *\r\n * Supporta sia aggiornamenti immutabili (nuovo array) sia\r\n * mutazioni in-place delle proprieta dei descriptor.\r\n */\r\n @Input() items: UiAccordionDescriptor[] = [];\r\n\r\n /**\r\n * Template per il contenuto di ogni pannello.\r\n * Il contesto fornisce il descriptor come `$implicit`.\r\n *\r\n * @example\r\n * ```html\r\n * <ng-template #tpl let-item>\r\n * <p>Contenuto per: {{ item.title }}</p>\r\n * </ng-template>\r\n * ```\r\n */\r\n @Input() itemTemplate: TemplateRef<unknown> | null = null;\r\n\r\n /**\r\n * Template opzionale per contenuto aggiuntivo nell'header.\r\n * Il contesto fornisce il descriptor come `$implicit`.\r\n * Viene renderizzato all'interno del trigger, tra il titolo e il chevron.\r\n */\r\n @Input() headerTemplate: TemplateRef<unknown> | null = null;\r\n\r\n /**\r\n * Template opzionale per azioni nell'header del pannello.\r\n * Posizionato tra il trigger e il chevron, al di fuori del button\r\n * per consentire elementi interattivi (es. pulsanti duplica/elimina).\r\n * Il contesto fornisce il descriptor come `$implicit`.\r\n */\r\n @Input() actionsTemplate: TemplateRef<unknown> | null = null;\r\n\r\n /**\r\n * Modalita di espansione.\r\n * - `multi`: piu pannelli aperti contemporaneamente\r\n * - `single`: un solo pannello aperto alla volta\r\n */\r\n @Input() mode: UiAccordionMode = 'multi';\r\n\r\n /** Label accessibile per il gruppo accordion. */\r\n @Input() ariaLabel = 'Accordion';\r\n\r\n /** Emesso quando un pannello viene aperto o chiuso. */\r\n @Output() itemToggled = new EventEmitter<UiAccordionToggleEvent>();\r\n\r\n /**\r\n * Rileva mutazioni in-place sulle proprieta dei descriptor.\r\n * Confronta un fingerprint leggero dello stato corrente con quello\r\n * precedente e, se diverso, forza un ciclo di change detection.\r\n *\r\n * Questo permette al consumatore di fare sia:\r\n * - `items[2].hidden = true` (mutazione in-place)\r\n * - `items = [...newItems]` (nuovo riferimento)\r\n */\r\n ngDoCheck(): void {\r\n const fp = this.computeFingerprint();\r\n if (fp !== this._lastFingerprint) {\r\n this._lastFingerprint = fp;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n /** Pannelli visibili (non hidden). */\r\n get visibleItems(): UiAccordionDescriptor[] {\r\n return this.items.filter((i) => !i.hidden);\r\n }\r\n\r\n /** Alterna l'espansione di un pannello. */\r\n toggle(item: UiAccordionDescriptor): void {\r\n if (item.disabled) return;\r\n\r\n const willExpand = !item.expanded;\r\n\r\n // In modalita single, chiudi tutti gli altri\r\n if (willExpand && this.mode === 'single') {\r\n this.items.forEach((i) => {\r\n if (i !== item && i.expanded) {\r\n i.expanded = false;\r\n this.itemToggled.emit({ item: i, expanded: false });\r\n }\r\n });\r\n }\r\n\r\n item.expanded = willExpand;\r\n this.itemToggled.emit({ item, expanded: willExpand });\r\n }\r\n\r\n /** Apre un pannello specifico per id. */\r\n open(id: string): void {\r\n const item = this.items.find((i) => i.id === id);\r\n if (item && !item.expanded && !item.disabled) {\r\n this.toggle(item);\r\n }\r\n }\r\n\r\n /** Chiude un pannello specifico per id. */\r\n close(id: string): void {\r\n const item = this.items.find((i) => i.id === id);\r\n if (item && item.expanded) {\r\n item.expanded = false;\r\n this.itemToggled.emit({ item, expanded: false });\r\n }\r\n }\r\n\r\n /** Apre tutti i pannelli (solo in modalita multi). */\r\n openAll(): void {\r\n if (this.mode === 'single') return;\r\n this.items.forEach((item) => {\r\n if (!item.expanded && !item.disabled && !item.hidden) {\r\n item.expanded = true;\r\n this.itemToggled.emit({ item, expanded: true });\r\n }\r\n });\r\n }\r\n\r\n /** Chiude tutti i pannelli. */\r\n closeAll(): void {\r\n this.items.forEach((item) => {\r\n if (item.expanded) {\r\n item.expanded = false;\r\n this.itemToggled.emit({ item, expanded: false });\r\n }\r\n });\r\n }\r\n\r\n /** @internal Classi CSS per il pannello. */\r\n getPanelClasses(item: UiAccordionDescriptor): string {\r\n return [\r\n 'ui-accordion__panel',\r\n item.expanded ? 'ui-accordion__panel--expanded' : '',\r\n item.disabled ? 'ui-accordion__panel--disabled' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n /** @internal Sposta il focus al primo header. */\r\n focusFirst(event: Event): void {\r\n event.preventDefault();\r\n const headers = this.getHeaders();\r\n headers[0]?.focus();\r\n }\r\n\r\n /** @internal Sposta il focus all'ultimo header. */\r\n focusLast(event: Event): void {\r\n event.preventDefault();\r\n const headers = this.getHeaders();\r\n headers[headers.length - 1]?.focus();\r\n }\r\n\r\n /** @internal Recupera tutti i trigger button del DOM. */\r\n private getHeaders(): HTMLButtonElement[] {\r\n return Array.from(document.querySelectorAll<HTMLButtonElement>('.ui-accordion__trigger:not(:disabled)'));\r\n }\r\n\r\n /**\r\n * @internal Calcola un fingerprint leggero basato sulle proprieta\r\n * reattive dei descriptor (quelle che influenzano il rendering).\r\n */\r\n private computeFingerprint(): string {\r\n return this.items.map((i) => `${i.id}:${i.hidden ?? 0}:${i.disabled ?? 0}:${i.expanded ?? 0}:${i.title}`).join('|');\r\n }\r\n}\r\n","import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiVariant, UiSize, UiIconName } from '../../core/types';\r\nimport { UiIconPosition } from './button.types';\r\n\r\n/** @internal Size-to-icon-pixel mapping for consistent icon sizing. */\r\nconst ICON_SIZE_MAP: Record<UiSize, number> = {\r\n xs: 14,\r\n sm: 16,\r\n md: 18,\r\n lg: 20,\r\n xl: 22,\r\n};\r\n\r\n/**\r\n * Standalone button component with design-token-driven theming,\r\n * variant/size system, Lucide icon support, loading states, and WCAG 2.1 AA accessibility.\r\n *\r\n * Uses native `<button>` click events — listen with `(click)` on the host element.\r\n *\r\n * @selector ui-button\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Basic -->\r\n * <ui-button label=\"Save\" variant=\"primary\" icon=\"save\" (click)=\"save()\" />\r\n *\r\n * <!-- Loading -->\r\n * <ui-button label=\"Submitting...\" variant=\"primary\" [loading]=\"true\" />\r\n *\r\n * <!-- Icon-only: tooltip o ariaLabel forniscono il nome accessibile -->\r\n * <ui-button icon=\"trash-2\" variant=\"warn\" tooltip=\"Elimina\" (click)=\"delete()\" />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-button',\r\n standalone: true,\r\n imports: [MatTooltipModule, LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'ui-button-host',\r\n '[class.ui-button-host--full-width]': 'fullWidth',\r\n },\r\n template: `\r\n <button\r\n [type]=\"type\"\r\n [class]=\"buttonClasses\"\r\n [disabled]=\"disabled || loading\"\r\n [attr.aria-label]=\"effectiveAriaLabel || null\"\r\n [attr.aria-busy]=\"loading || null\"\r\n [matTooltip]=\"tooltip\"\r\n >\r\n <span class=\"ui-button__content\" [class.ui-button__content--hidden]=\"loading\">\r\n @if (icon && iconPosition === 'leading') {\r\n <lucide-icon [name]=\"icon!\" [size]=\"iconSize\" aria-hidden=\"true\" />\r\n }\r\n @if (label) {\r\n <span class=\"ui-button__label\">{{ label }}</span>\r\n }\r\n <ng-content />\r\n @if (icon && iconPosition === 'trailing') {\r\n <lucide-icon [name]=\"icon!\" [size]=\"iconSize\" aria-hidden=\"true\" />\r\n }\r\n </span>\r\n @if (loading) {\r\n <span class=\"ui-button__spinner-overlay\">\r\n <span class=\"ui-button__spinner\" aria-hidden=\"true\"></span>\r\n <span class=\"ui-button__sr-only\">Loading</span>\r\n </span>\r\n }\r\n </button>\r\n `,\r\n styleUrl: './button.component.scss',\r\n})\r\nexport class UiButtonComponent {\r\n /** Button label text. */\r\n @Input() label = '';\r\n\r\n /** Tooltip text shown on hover (uses Angular Material tooltip). */\r\n @Input() tooltip = '';\r\n\r\n /** Visual style variant. */\r\n @Input() variant: UiVariant = 'primary';\r\n\r\n /** Size variant. */\r\n @Input() size: UiSize = 'md';\r\n\r\n /** Lucide icon name. @see https://lucide.dev/icons */\r\n @Input() icon?: UiIconName;\r\n\r\n /** Icon position relative to the label. */\r\n @Input() iconPosition: UiIconPosition = 'trailing';\r\n\r\n /** Whether the button is in a loading state. Disables interaction and shows spinner. */\r\n @Input() loading = false;\r\n\r\n /** Whether the button is disabled. */\r\n @Input() disabled = false;\r\n\r\n /** Expand button to full container width. */\r\n @Input() fullWidth = false;\r\n\r\n /** HTML button type attribute. */\r\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\r\n\r\n /** Accessible label override (required for icon-only buttons). */\r\n @Input() ariaLabel?: string;\r\n\r\n /** Additional CSS class for edge cases. */\r\n @Input() customClass?: string;\r\n\r\n /**\r\n * Nome accessibile risolto per il pulsante nativo.\r\n * Usa `ariaLabel` se impostato; per pulsanti solo icona senza testo visibile\r\n * ricade sul `tooltip` (il tooltip Material non sostituisce il nome accessibile).\r\n */\r\n get effectiveAriaLabel(): string | undefined {\r\n const explicit = this.ariaLabel?.trim();\r\n if (explicit) return explicit;\r\n\r\n if (this.label?.trim()) return undefined;\r\n\r\n const tip = this.tooltip?.trim();\r\n if (this.icon && tip) return tip;\r\n\r\n return undefined;\r\n }\r\n\r\n /** Computed icon pixel size based on button size. */\r\n get iconSize(): number {\r\n return ICON_SIZE_MAP[this.size] ?? 18;\r\n }\r\n\r\n /** Assembled CSS class string for the native button element. */\r\n get buttonClasses(): string {\r\n return [\r\n 'ui-button',\r\n `ui-button--${this.variant}`,\r\n `ui-button--${this.size}`,\r\n this.loading ? 'ui-button--loading' : '',\r\n this.fullWidth ? 'ui-button--full-width' : '',\r\n !this.label && this.icon ? 'ui-button--icon-only' : '',\r\n this.customClass ?? '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/blackbox\r\n * Types and interfaces for the BlackBox observability service.\r\n *\r\n * The BlackBox service acts as a \"black box recorder\" for user sessions,\r\n * capturing navigation, UI interactions, form events and HTTP calls\r\n * in a compressed, opaque format stored in IndexedDB.\r\n */\r\n\r\n// ─── Configuration ───────────────────────────────────────────────────\r\n\r\n/**\r\n * Form tracking granularity flags.\r\n *\r\n * Controls which form events are captured by the BlackBox service.\r\n * All flags default to `true` except `trackValues` which defaults to `false`\r\n * for privacy reasons.\r\n */\r\nexport interface UiBlackboxFormTrackingConfig {\r\n /**\r\n * When `true`, the actual field values are stored in form events.\r\n * When `false`, only the fact that a change occurred is recorded.\r\n * @default false\r\n */\r\n trackValues: boolean;\r\n\r\n /** Track focus events on form fields. @default true */\r\n trackFocus: boolean;\r\n\r\n /** Track blur events on form fields. @default true */\r\n trackBlur: boolean;\r\n\r\n /** Track value change events on form fields. @default true */\r\n trackValueChanges: boolean;\r\n\r\n /** Track validation error events on form fields. @default true */\r\n trackValidation: boolean;\r\n\r\n /**\r\n * Debounce interval (ms) for `valueChanges` subscriptions.\r\n * Higher values reduce noise but increase latency.\r\n * @default 500\r\n */\r\n debounceMs: number;\r\n}\r\n\r\n/**\r\n * Root configuration for the BlackBox service.\r\n *\r\n * All properties are optional — sensible defaults are applied when omitted.\r\n *\r\n * @example\r\n * ```typescript\r\n * blackboxService.configure({\r\n * maxStorageMb: 30,\r\n * formTracking: { trackValues: true, debounceMs: 1000 },\r\n * });\r\n * ```\r\n */\r\nexport interface UiBlackboxConfig {\r\n /**\r\n * Maximum IndexedDB storage quota in megabytes.\r\n * Oldest sessions are pruned when the quota is exceeded.\r\n * @default 50\r\n */\r\n maxStorageMb: number;\r\n\r\n /**\r\n * Interval (ms) at which the in-memory buffer is flushed to IndexedDB.\r\n * @default 5000\r\n */\r\n flushIntervalMs: number;\r\n\r\n /**\r\n * Number of buffered events that trigger an immediate flush.\r\n * @default 20\r\n */\r\n flushThreshold: number;\r\n\r\n /**\r\n * Centralised debounce (ms) applied to the event buffer.\r\n * @default 500\r\n */\r\n bufferDebounceMs: number;\r\n\r\n /** Per-field form tracking configuration. */\r\n formTracking: UiBlackboxFormTrackingConfig;\r\n}\r\n\r\n// ─── Fingerprint ─────────────────────────────────────────────────────\r\n\r\n/**\r\n * Stable device/browser fingerprint generated by FingerprintJS (open-source).\r\n * Persists across sessions and incognito mode.\r\n */\r\nexport type UiBlackboxFingerprint = string;\r\n\r\n// ─── Session ─────────────────────────────────────────────────────────\r\n\r\n/**\r\n * A single recording session, corresponding to one browser tab lifecycle.\r\n *\r\n * Sessions are associated to a stable `fingerprint` so that multiple\r\n * sessions from the same device can be grouped together.\r\n */\r\nexport interface UiBlackboxSession {\r\n /** Unique session identifier (UUID v4). */\r\n sessionId: string;\r\n\r\n /** Stable device/browser fingerprint. */\r\n fingerprint: UiBlackboxFingerprint;\r\n\r\n /** Timestamp (ms since epoch) when the session started. */\r\n startedAt: number;\r\n\r\n /** Timestamp (ms since epoch) when the session ended (tab closed). */\r\n endedAt?: number;\r\n\r\n /** Raw `navigator.userAgent` string captured at session start. */\r\n userAgent: string;\r\n\r\n /**\r\n * Ordered list of navigation steps (route changes).\r\n * Each step contains the actions performed on that page.\r\n */\r\n steps: UiBlackboxStep[];\r\n\r\n /**\r\n * Parallel stream of form interaction events.\r\n * Ordered by timestamp, correlated to routes via `route` field.\r\n */\r\n formEvents: UiBlackboxFormEvent[];\r\n\r\n /**\r\n * Intercepted HTTP calls, ordered by timestamp.\r\n * Only requests explicitly marked with the `X-Ui-Blackbox` header.\r\n */\r\n calls: UiBlackboxHttpCall[];\r\n}\r\n\r\n// ─── Step (Route Change) ─────────────────────────────────────────────\r\n\r\n/**\r\n * A single navigation step created on every `NavigationEnd` event.\r\n * Contains all UI actions performed during this route.\r\n */\r\nexport interface UiBlackboxStep {\r\n /** Timestamp (ms) of the navigation event. */\r\n timestamp: number;\r\n\r\n /** The route URL navigated to. */\r\n route: string;\r\n\r\n /** The previous route URL (undefined for the first step). */\r\n previousRoute?: string;\r\n\r\n /**\r\n * Ordered list of UI actions (clicks) performed on this page.\r\n */\r\n actions: UiBlackboxAction[];\r\n}\r\n\r\n// ─── Action (UI Click) ──────────────────────────────────────────────\r\n\r\n/**\r\n * A single tracked UI action, typically a click.\r\n */\r\nexport interface UiBlackboxAction {\r\n /** Timestamp (ms) of the action. */\r\n timestamp: number;\r\n\r\n /** Type discriminator. Currently only `click` is supported. */\r\n type: 'click';\r\n\r\n /** Information about the clicked element. */\r\n target: UiBlackboxActionTarget;\r\n}\r\n\r\n/**\r\n * Minimal information about the element that was interacted with.\r\n */\r\nexport interface UiBlackboxActionTarget {\r\n /** HTML tag name (lowercase). */\r\n tag: string;\r\n\r\n /** Element `id` attribute, if present. */\r\n id?: string;\r\n\r\n /**\r\n * Custom tracking identifier, set via `data-track-id` attribute\r\n * or the `[uiTrack]` directive value.\r\n */\r\n trackId?: string;\r\n\r\n /** First 50 characters of `innerText` (trimmed). */\r\n text?: string;\r\n}\r\n\r\n// ─── Form Event ──────────────────────────────────────────────────────\r\n\r\n/** Discriminator for form event types. */\r\nexport type UiBlackboxFormEventType =\r\n | 'focus'\r\n | 'blur'\r\n | 'valueChange'\r\n | 'validationError';\r\n\r\n/**\r\n * A single form interaction event from the parallel form stream.\r\n *\r\n * Each event is timestamped and tagged with the current route, allowing\r\n * correlation with navigation steps on a shared timeline.\r\n */\r\nexport interface UiBlackboxFormEvent {\r\n /** Timestamp (ms) of the event. */\r\n timestamp: number;\r\n\r\n /** Route URL where the event occurred. */\r\n route: string;\r\n\r\n /** Schema `id` of the `UiFormBuilderComponent` that owns the field. */\r\n formId: string;\r\n\r\n /** `key` of the field descriptor from the form schema. */\r\n fieldKey: string;\r\n\r\n /** Type of form interaction. */\r\n eventType: UiBlackboxFormEventType;\r\n\r\n /** Optional metadata depending on event type and config. */\r\n metadata?: UiBlackboxFormEventMetadata;\r\n}\r\n\r\n/**\r\n * Optional metadata attached to a `UiBlackboxFormEvent`.\r\n */\r\nexport interface UiBlackboxFormEventMetadata {\r\n /** Field value (only captured when `config.formTracking.trackValues` is `true`). */\r\n value?: any;\r\n\r\n /** Whether the field is currently valid. */\r\n valid?: boolean;\r\n\r\n /** List of active validation error keys. */\r\n errors?: string[];\r\n\r\n /**\r\n * Full form values snapshot at the moment of the event.\r\n * Only captured when `config.formTracking.trackValues` is `true`.\r\n */\r\n formValues?: Record<string, any>;\r\n}\r\n\r\n// ─── HTTP Call ────────────────────────────────────────────────────────\r\n\r\n/**\r\n * A single intercepted HTTP call.\r\n *\r\n * Only requests bearing the `X-Ui-Blackbox` header are captured.\r\n */\r\nexport interface UiBlackboxHttpCall {\r\n /** Timestamp (ms) when the request was initiated. */\r\n timestamp: number;\r\n\r\n /** HTTP method (GET, POST, PUT, DELETE, …). */\r\n method: string;\r\n\r\n /** Request URL. */\r\n url: string;\r\n\r\n /** HTTP status code of the response (undefined if the request failed). */\r\n status?: number;\r\n\r\n /** Round-trip duration in milliseconds. */\r\n durationMs?: number;\r\n\r\n /** Request body payload (serialisable). */\r\n requestPayload?: any;\r\n\r\n /** Response headers filtered by the `X-Ui-Blackbox-Headers` regex. */\r\n responseHeaders?: Record<string, string>;\r\n\r\n /** The regex pattern used to filter response headers. */\r\n headerFilter?: string;\r\n}\r\n\r\n// ─── Internal Buffer Event ───────────────────────────────────────────\r\n\r\n/**\r\n * Union type for all events flowing through the centralised buffer.\r\n * @internal\r\n */\r\nexport type UiBlackboxBufferEvent =\r\n | { kind: 'action'; payload: UiBlackboxAction & { route: string } }\r\n | { kind: 'formEvent'; payload: UiBlackboxFormEvent }\r\n | { kind: 'httpCall'; payload: UiBlackboxHttpCall }\r\n | { kind: 'step'; payload: UiBlackboxStep };\r\n\r\n// ─── Defaults ────────────────────────────────────────────────────────\r\n\r\n/** Default configuration values. */\r\nexport const UI_BLACKBOX_DEFAULTS: UiBlackboxConfig = {\r\n maxStorageMb: 50,\r\n flushIntervalMs: 5000,\r\n flushThreshold: 20,\r\n bufferDebounceMs: 500,\r\n formTracking: {\r\n trackValues: false,\r\n trackFocus: true,\r\n trackBlur: true,\r\n trackValueChanges: true,\r\n trackValidation: true,\r\n debounceMs: 500,\r\n },\r\n};\r\n","/**\r\n * @module ng-ui-system/blackbox\r\n * Fingerprint service — generates a stable device/browser hash\r\n * using the open-source FingerprintJS library (MIT, no API key required).\r\n *\r\n * The fingerprint is computed once and cached in `localStorage` under\r\n * the key `__ui_bb_fp` to avoid redundant recalculations.\r\n */\r\n\r\nimport { Injectable, inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport type { UiBlackboxFingerprint } from './blackbox.types';\r\n\r\n/** localStorage key for the cached fingerprint. */\r\nconst FP_CACHE_KEY = '__ui_bb_fp';\r\n\r\n/**\r\n * Generates and caches a stable browser/device fingerprint.\r\n *\r\n * Uses `@fingerprintjs/fingerprintjs` (open-source, MIT) which analyses\r\n * canvas rendering, WebGL, audio context, screen properties, timezone,\r\n * user-agent, and other browser signals to produce a stable hash.\r\n *\r\n * @usageNotes\r\n * ```typescript\r\n * const fp = inject(UiBlackboxFingerprintService);\r\n * const hash = await fp.getFingerprint();\r\n * // => \"a1b2c3d4e5f6...\" (stable across sessions)\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiBlackboxFingerprintService {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private cached: UiBlackboxFingerprint | null = null;\r\n\r\n /**\r\n * Returns the stable fingerprint for this device/browser.\r\n *\r\n * On first call, loads FingerprintJS dynamically, computes the hash,\r\n * and caches it in both memory and `localStorage`.\r\n * Subsequent calls return the cached value immediately.\r\n */\r\n async getFingerprint(): Promise<UiBlackboxFingerprint> {\r\n // Return cached value if available\r\n if (this.cached) {\r\n return this.cached;\r\n }\r\n\r\n // SSR guard\r\n if (!isPlatformBrowser(this.platformId)) {\r\n return 'ssr-placeholder';\r\n }\r\n\r\n // Try localStorage cache first\r\n try {\r\n const stored = localStorage.getItem(FP_CACHE_KEY);\r\n if (stored) {\r\n this.cached = stored;\r\n return stored;\r\n }\r\n } catch {\r\n // localStorage may be unavailable (privacy mode, quota exceeded)\r\n }\r\n\r\n // Compute fingerprint via FingerprintJS\r\n try {\r\n const FingerprintJS = await import('@fingerprintjs/fingerprintjs');\r\n const agent = await FingerprintJS.load();\r\n const result = await agent.get();\r\n this.cached = result.visitorId;\r\n\r\n // Persist to localStorage\r\n try {\r\n localStorage.setItem(FP_CACHE_KEY, this.cached);\r\n } catch {\r\n // Silently ignore storage errors\r\n }\r\n\r\n return this.cached;\r\n } catch {\r\n // Fallback: generate a pseudo-fingerprint from available signals\r\n const fallback = this.generateFallbackFingerprint();\r\n this.cached = fallback;\r\n\r\n try {\r\n localStorage.setItem(FP_CACHE_KEY, fallback);\r\n } catch {\r\n // Silently ignore\r\n }\r\n\r\n return fallback;\r\n }\r\n }\r\n\r\n /**\r\n * Fallback fingerprint when FingerprintJS is unavailable.\r\n * Combines basic browser signals into a hash.\r\n * @internal\r\n */\r\n private generateFallbackFingerprint(): string {\r\n const signals = [\r\n navigator.userAgent,\r\n navigator.language,\r\n screen.width + 'x' + screen.height,\r\n screen.colorDepth?.toString() ?? '',\r\n Intl.DateTimeFormat().resolvedOptions().timeZone,\r\n navigator.hardwareConcurrency?.toString() ?? '',\r\n ].join('|');\r\n\r\n // Simple string hash (djb2)\r\n let hash = 5381;\r\n for (let i = 0; i < signals.length; i++) {\r\n hash = ((hash << 5) + hash + signals.charCodeAt(i)) >>> 0;\r\n }\r\n return hash.toString(36).padStart(12, '0');\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/blackbox\r\n * IndexedDB storage adapter for BlackBox sessions.\r\n *\r\n * Handles persistence, compression (via native CompressionStream gzip),\r\n * quota enforcement, and JSONL export.\r\n *\r\n * Design notes:\r\n * - DB name: `ui-blackbox`, object store: `sessions`\r\n * - Each session is gzip-compressed before storage for both size\r\n * reduction and inherent obfuscation\r\n * - Quota enforced by total stored size; oldest sessions are pruned first\r\n */\r\n\r\nimport { Injectable, inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport type { UiBlackboxSession, UiBlackboxConfig } from './blackbox.types';\r\nimport { UI_BLACKBOX_DEFAULTS } from './blackbox.types';\r\n\r\nconst DB_NAME = 'ui-blackbox';\r\nconst DB_VERSION = 1;\r\nconst STORE_NAME = 'sessions';\r\n\r\n/**\r\n * Low-level IndexedDB adapter for reading/writing compressed BlackBox sessions.\r\n *\r\n * @usageNotes\r\n * This service is used internally by `UiBlackboxService`.\r\n * Consumers should interact with the higher-level `UiBlackboxService` API.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiBlackboxStorageService {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private db: IDBDatabase | null = null;\r\n private maxStorageMb = UI_BLACKBOX_DEFAULTS.maxStorageMb;\r\n\r\n // ─── Configuration ─────────────────────────────────────────────────\r\n\r\n /** Update the storage quota from the parent service config. */\r\n setMaxStorageMb(mb: number): void {\r\n this.maxStorageMb = mb;\r\n }\r\n\r\n // ─── Database lifecycle ────────────────────────────────────────────\r\n\r\n /** Open (or create) the IndexedDB database. */\r\n private async openDb(): Promise<IDBDatabase> {\r\n if (this.db) return this.db;\r\n if (!isPlatformBrowser(this.platformId)) {\r\n throw new Error('IndexedDB is not available in SSR');\r\n }\r\n\r\n return new Promise<IDBDatabase>((resolve, reject) => {\r\n const request = indexedDB.open(DB_NAME, DB_VERSION);\r\n\r\n request.onupgradeneeded = () => {\r\n const db = request.result;\r\n if (!db.objectStoreNames.contains(STORE_NAME)) {\r\n const store = db.createObjectStore(STORE_NAME, { keyPath: 'sessionId' });\r\n store.createIndex('fingerprint', 'fingerprint', { unique: false });\r\n store.createIndex('startedAt', 'startedAt', { unique: false });\r\n }\r\n };\r\n\r\n request.onsuccess = () => {\r\n this.db = request.result;\r\n resolve(this.db);\r\n };\r\n\r\n request.onerror = () => reject(request.error);\r\n });\r\n }\r\n\r\n // ─── Compression helpers ───────────────────────────────────────────\r\n\r\n /** Compress a string to a gzip Uint8Array using native CompressionStream. */\r\n private async compress(data: string): Promise<Uint8Array> {\r\n const encoder = new TextEncoder();\r\n const stream = new Blob([encoder.encode(data) as BlobPart])\r\n .stream()\r\n .pipeThrough(new CompressionStream('gzip'));\r\n\r\n const reader = stream.getReader();\r\n const chunks: Uint8Array[] = [];\r\n let done = false;\r\n\r\n while (!done) {\r\n const result = await reader.read();\r\n done = result.done;\r\n if (result.value) {\r\n chunks.push(result.value);\r\n }\r\n }\r\n\r\n // Merge chunks into a single ArrayBuffer-backed Uint8Array\r\n const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);\r\n const buffer = new ArrayBuffer(totalLength);\r\n const merged = new Uint8Array(buffer);\r\n let offset = 0;\r\n for (const chunk of chunks) {\r\n merged.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n return merged;\r\n }\r\n\r\n /** Decompress a gzip Uint8Array back to a string. */\r\n private async decompress(data: Uint8Array): Promise<string> {\r\n const stream = new Blob([data as BlobPart])\r\n .stream()\r\n .pipeThrough(new DecompressionStream('gzip'));\r\n\r\n const reader = stream.getReader();\r\n const decoder = new TextDecoder();\r\n let result = '';\r\n let done = false;\r\n\r\n while (!done) {\r\n const chunk = await reader.read();\r\n done = chunk.done;\r\n if (chunk.value) {\r\n result += decoder.decode(chunk.value, { stream: !done });\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n // ─── CRUD ──────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Persist a session to IndexedDB (gzip-compressed).\r\n * Enforces quota after saving.\r\n */\r\n async saveSession(session: UiBlackboxSession): Promise<void> {\r\n const db = await this.openDb();\r\n const json = JSON.stringify(session);\r\n const compressed = await this.compress(json);\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const store = tx.objectStore(STORE_NAME);\r\n\r\n // Store as { sessionId, fingerprint, startedAt, data: Uint8Array }\r\n store.put({\r\n sessionId: session.sessionId,\r\n fingerprint: session.fingerprint,\r\n startedAt: session.startedAt,\r\n sizeBytes: compressed.byteLength,\r\n data: compressed,\r\n });\r\n\r\n tx.oncomplete = () => {\r\n this.enforceQuota().then(resolve).catch(resolve);\r\n };\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n\r\n /**\r\n * Read and decompress a single session by ID.\r\n */\r\n async getSession(sessionId: string): Promise<UiBlackboxSession | null> {\r\n const db = await this.openDb();\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readonly');\r\n const store = tx.objectStore(STORE_NAME);\r\n const req = store.get(sessionId);\r\n\r\n req.onsuccess = async () => {\r\n if (!req.result) {\r\n resolve(null);\r\n return;\r\n }\r\n try {\r\n const json = await this.decompress(req.result.data);\r\n resolve(JSON.parse(json));\r\n } catch (e) {\r\n reject(e);\r\n }\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n /**\r\n * Get all stored sessions (decompressed).\r\n */\r\n async getAllSessions(): Promise<UiBlackboxSession[]> {\r\n const db = await this.openDb();\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readonly');\r\n const store = tx.objectStore(STORE_NAME);\r\n const req = store.getAll();\r\n\r\n req.onsuccess = async () => {\r\n try {\r\n const sessions: UiBlackboxSession[] = [];\r\n for (const record of req.result) {\r\n const json = await this.decompress(record.data);\r\n sessions.push(JSON.parse(json));\r\n }\r\n resolve(sessions);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n /**\r\n * Get all sessions for a given fingerprint.\r\n */\r\n async getSessionsByFingerprint(fingerprint: string): Promise<UiBlackboxSession[]> {\r\n const db = await this.openDb();\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readonly');\r\n const store = tx.objectStore(STORE_NAME);\r\n const index = store.index('fingerprint');\r\n const req = index.getAll(fingerprint);\r\n\r\n req.onsuccess = async () => {\r\n try {\r\n const sessions: UiBlackboxSession[] = [];\r\n for (const record of req.result) {\r\n const json = await this.decompress(record.data);\r\n sessions.push(JSON.parse(json));\r\n }\r\n resolve(sessions);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n /**\r\n * Generate a downloadable JSONL Blob of all sessions.\r\n * Each line is one JSON-serialised session (decompressed).\r\n */\r\n async exportDump(): Promise<Blob> {\r\n const sessions = await this.getAllSessions();\r\n const lines = sessions.map((s) => JSON.stringify(s)).join('\\n');\r\n return new Blob([lines], { type: 'application/x-ndjson' });\r\n }\r\n\r\n /**\r\n * Delete all stored sessions.\r\n */\r\n async clearAll(): Promise<void> {\r\n const db = await this.openDb();\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const store = tx.objectStore(STORE_NAME);\r\n store.clear();\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n\r\n // ─── Quota enforcement ─────────────────────────────────────────────\r\n\r\n /**\r\n * Prune oldest sessions until total stored size is under `maxStorageMb`.\r\n * @internal\r\n */\r\n async enforceQuota(): Promise<void> {\r\n const db = await this.openDb();\r\n const maxBytes = this.maxStorageMb * 1024 * 1024;\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const store = tx.objectStore(STORE_NAME);\r\n const index = store.index('startedAt');\r\n\r\n // Collect all records sorted by startedAt (ascending = oldest first)\r\n const cursorReq = index.openCursor();\r\n const records: { key: IDBValidKey; size: number }[] = [];\r\n let totalSize = 0;\r\n\r\n cursorReq.onsuccess = () => {\r\n const cursor = cursorReq.result;\r\n if (cursor) {\r\n const size: number = cursor.value.sizeBytes || 0;\r\n totalSize += size;\r\n records.push({ key: cursor.primaryKey, size });\r\n cursor.continue();\r\n } else {\r\n // Cursor exhausted — prune if over quota\r\n if (totalSize <= maxBytes) {\r\n resolve();\r\n return;\r\n }\r\n\r\n let freed = 0;\r\n const target = totalSize - maxBytes;\r\n for (const record of records) {\r\n if (freed >= target) break;\r\n store.delete(record.key);\r\n freed += record.size;\r\n }\r\n resolve();\r\n }\r\n };\r\n\r\n cursorReq.onerror = () => reject(cursorReq.error);\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n}\r\n","/**\r\n * @module ng-ui-system/blackbox\r\n * Core BlackBox observability service — the main entry point for session\r\n * recording, event buffering, and export.\r\n *\r\n * Architecture:\r\n * - Root singleton (`providedIn: 'root'`)\r\n * - On first inject: generates fingerprint, creates session, subscribes to Router events\r\n * - Centralised in-memory buffer with periodic/threshold-based flush to IndexedDB\r\n * - `window:beforeunload` triggers a final best-effort async flush\r\n */\r\n\r\nimport {\r\n Injectable,\r\n inject,\r\n PLATFORM_ID,\r\n OnDestroy,\r\n NgZone,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Router, NavigationEnd } from '@angular/router';\r\nimport { Subject } from 'rxjs';\r\nimport { filter, takeUntil } from 'rxjs/operators';\r\n\r\nimport {\r\n UiBlackboxConfig,\r\n UiBlackboxFormTrackingConfig,\r\n UiBlackboxSession,\r\n UiBlackboxStep,\r\n UiBlackboxAction,\r\n UiBlackboxFormEvent,\r\n UiBlackboxHttpCall,\r\n UiBlackboxBufferEvent,\r\n UI_BLACKBOX_DEFAULTS,\r\n} from './blackbox.types';\r\nimport { UiBlackboxFingerprintService } from './blackbox-fingerprint.service';\r\nimport { UiBlackboxStorageService } from './blackbox-storage.service';\r\n\r\n/**\r\n * Central BlackBox observability service.\r\n *\r\n * Records navigation, UI interactions, form events, and HTTP calls\r\n * into compressed sessions stored in IndexedDB.\r\n *\r\n * @usageNotes\r\n * The service activates automatically when injected. Provide it at root level\r\n * and it will start recording immediately.\r\n *\r\n * ```typescript\r\n * // app.config.ts — just importing the service is enough\r\n * import { UiBlackboxService } from '@gnggln/ng-ui-system';\r\n *\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * // The service is providedIn: 'root', so it's auto-provided.\r\n * // To force eager initialisation:\r\n * { provide: APP_INITIALIZER, useFactory: () => () => inject(UiBlackboxService), multi: true },\r\n * ],\r\n * };\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiBlackboxService implements OnDestroy {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private readonly router = inject(Router);\r\n private readonly zone = inject(NgZone);\r\n private readonly fingerprint = inject(UiBlackboxFingerprintService);\r\n private readonly storage = inject(UiBlackboxStorageService);\r\n\r\n private readonly destroy$ = new Subject<void>();\r\n private config: UiBlackboxConfig = { ...UI_BLACKBOX_DEFAULTS };\r\n\r\n // ─── Session state ─────────────────────────────────────────────────\r\n private session!: UiBlackboxSession;\r\n private currentStep: UiBlackboxStep | null = null;\r\n private initialised = false;\r\n\r\n // ─── Centralised event buffer ──────────────────────────────────────\r\n private buffer: UiBlackboxBufferEvent[] = [];\r\n private flushTimerId: ReturnType<typeof setInterval> | null = null;\r\n private beforeUnloadHandler: (() => void) | null = null;\r\n\r\n constructor() {\r\n if (isPlatformBrowser(this.platformId)) {\r\n this.init();\r\n }\r\n }\r\n\r\n // ─── Initialisation ────────────────────────────────────────────────\r\n\r\n private async init(): Promise<void> {\r\n // Generate session ID\r\n const sessionId = this.generateUuid();\r\n const fp = await this.fingerprint.getFingerprint();\r\n\r\n this.session = {\r\n sessionId,\r\n fingerprint: fp,\r\n startedAt: Date.now(),\r\n userAgent: navigator.userAgent,\r\n steps: [],\r\n formEvents: [],\r\n calls: [],\r\n };\r\n\r\n // Create initial step from current URL\r\n this.currentStep = {\r\n timestamp: Date.now(),\r\n route: this.router.url,\r\n actions: [],\r\n };\r\n this.session.steps.push(this.currentStep);\r\n\r\n // Subscribe to router navigation\r\n this.router.events\r\n .pipe(\r\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe((event) => {\r\n const previousRoute = this.currentStep?.route;\r\n this.currentStep = {\r\n timestamp: Date.now(),\r\n route: event.urlAfterRedirects,\r\n previousRoute,\r\n actions: [],\r\n };\r\n this.pushBufferEvent({ kind: 'step', payload: this.currentStep });\r\n });\r\n\r\n // Setup periodic flush (outside Angular zone to avoid triggering CD)\r\n this.zone.runOutsideAngular(() => {\r\n this.flushTimerId = setInterval(\r\n () => this.flush(),\r\n this.config.flushIntervalMs,\r\n );\r\n\r\n // Best-effort flush on tab close (IndexedDB is async, no sync fallback)\r\n this.beforeUnloadHandler = () => {\r\n this.session.endedAt = Date.now();\r\n void this.flush();\r\n };\r\n window.addEventListener('beforeunload', this.beforeUnloadHandler);\r\n });\r\n\r\n this.initialised = true;\r\n }\r\n\r\n // ─── Public API: Configuration ─────────────────────────────────────\r\n\r\n /**\r\n * Update the BlackBox configuration.\r\n * Can be called at any time; changes take effect immediately.\r\n */\r\n configure(config: Partial<Omit<UiBlackboxConfig, 'formTracking'>> & { formTracking?: Partial<UiBlackboxFormTrackingConfig> }): void {\r\n this.config = {\r\n ...this.config,\r\n ...config,\r\n formTracking: {\r\n ...this.config.formTracking,\r\n ...(config.formTracking ?? {}),\r\n },\r\n };\r\n this.storage.setMaxStorageMb(this.config.maxStorageMb);\r\n\r\n // Restart flush timer with new interval\r\n if (this.flushTimerId !== null) {\r\n clearInterval(this.flushTimerId);\r\n this.zone.runOutsideAngular(() => {\r\n this.flushTimerId = setInterval(\r\n () => this.flush(),\r\n this.config.flushIntervalMs,\r\n );\r\n });\r\n }\r\n }\r\n\r\n /** Returns the current configuration (readonly snapshot). */\r\n getConfig(): Readonly<UiBlackboxConfig> {\r\n return { ...this.config };\r\n }\r\n\r\n // ─── Public API: Tracking ──────────────────────────────────────────\r\n\r\n /**\r\n * Manually track a UI action (click).\r\n *\r\n * Called automatically by `UiButtonAreaComponent` and the `[uiTrack]` directive.\r\n * Can also be called programmatically for custom interactions.\r\n *\r\n * @param trackId - Identifier for the action (e.g. button id, link name).\r\n * @param meta - Optional metadata: `tag`, `text`, `id` of the element.\r\n */\r\n trackAction(\r\n trackId: string,\r\n meta?: { tag?: string; text?: string; id?: string },\r\n ): void {\r\n if (!this.initialised) return;\r\n\r\n const action: UiBlackboxAction = {\r\n timestamp: Date.now(),\r\n type: 'click',\r\n target: {\r\n tag: meta?.tag ?? 'unknown',\r\n id: meta?.id,\r\n trackId,\r\n text: meta?.text?.substring(0, 50),\r\n },\r\n };\r\n\r\n // Add to current step immediately (for in-memory session access)\r\n this.currentStep?.actions.push(action);\r\n\r\n // Also push to buffer for persistence\r\n this.pushBufferEvent({\r\n kind: 'action',\r\n payload: { ...action, route: this.currentStep?.route ?? this.router.url },\r\n });\r\n }\r\n\r\n /**\r\n * Track a form interaction event.\r\n *\r\n * Called automatically by `UiFormBuilderComponent` when the BlackBox\r\n * service is available.\r\n */\r\n trackFormEvent(event: UiBlackboxFormEvent): void {\r\n if (!this.initialised) return;\r\n\r\n this.session.formEvents.push(event);\r\n this.pushBufferEvent({ kind: 'formEvent', payload: event });\r\n }\r\n\r\n /**\r\n * Track an intercepted HTTP call.\r\n * Called by `UiBlackboxInterceptor`.\r\n * @internal\r\n */\r\n trackHttpCall(call: UiBlackboxHttpCall): void {\r\n if (!this.initialised) return;\r\n\r\n this.session.calls.push(call);\r\n this.pushBufferEvent({ kind: 'httpCall', payload: call });\r\n }\r\n\r\n // ─── Public API: Session access ────────────────────────────────────\r\n\r\n /**\r\n * Returns the current in-memory session (live, not yet flushed).\r\n * Useful for debugging or real-time inspection.\r\n */\r\n getCurrentSession(): UiBlackboxSession {\r\n return this.session;\r\n }\r\n\r\n /**\r\n * Retrieve all sessions stored in IndexedDB (decompressed).\r\n */\r\n async getSessionHistory(): Promise<UiBlackboxSession[]> {\r\n return this.storage.getAllSessions();\r\n }\r\n\r\n /**\r\n * Retrieve sessions for the current device fingerprint.\r\n */\r\n async getSessionsForDevice(): Promise<UiBlackboxSession[]> {\r\n const fp = await this.fingerprint.getFingerprint();\r\n return this.storage.getSessionsByFingerprint(fp);\r\n }\r\n\r\n // ─── Public API: Export ────────────────────────────────────────────\r\n\r\n /**\r\n * Export all sessions as a downloadable JSONL Blob.\r\n *\r\n * @returns A Blob containing JSONL data (one session per line).\r\n *\r\n * @example\r\n * ```typescript\r\n * const blob = await blackbox.exportSessions();\r\n * const url = URL.createObjectURL(blob);\r\n * const a = document.createElement('a');\r\n * a.href = url;\r\n * a.download = 'blackbox-sessions.jsonl';\r\n * a.click();\r\n * ```\r\n */\r\n async exportSessions(): Promise<Blob> {\r\n // Flush current session first\r\n await this.flush();\r\n return this.storage.exportDump();\r\n }\r\n\r\n // ─── Public API: Lifecycle ─────────────────────────────────────────\r\n\r\n /**\r\n * Explicitly end the current session.\r\n * Flushes all buffered events and marks the session as ended.\r\n */\r\n async endSession(): Promise<void> {\r\n if (!this.initialised) return;\r\n this.session.endedAt = Date.now();\r\n await this.flush();\r\n }\r\n\r\n /**\r\n * Clear all stored sessions from IndexedDB.\r\n */\r\n async clearHistory(): Promise<void> {\r\n return this.storage.clearAll();\r\n }\r\n\r\n // ─── Buffer management ─────────────────────────────────────────────\r\n\r\n /**\r\n * Push an event into the centralised buffer.\r\n * Triggers an immediate flush if the buffer exceeds the threshold.\r\n * @internal\r\n */\r\n private pushBufferEvent(event: UiBlackboxBufferEvent): void {\r\n this.buffer.push(event);\r\n if (this.buffer.length >= this.config.flushThreshold) {\r\n this.flush();\r\n }\r\n }\r\n\r\n /**\r\n * Flush buffered events to IndexedDB asynchronously.\r\n * @internal\r\n */\r\n private async flush(): Promise<void> {\r\n if (!this.initialised || this.buffer.length === 0) return;\r\n\r\n // Drain buffer\r\n const events = this.buffer.splice(0);\r\n\r\n // Apply step events to the session\r\n for (const event of events) {\r\n if (event.kind === 'step') {\r\n // Steps are already pushed in real-time; ensure they're in the session\r\n if (!this.session.steps.includes(event.payload)) {\r\n this.session.steps.push(event.payload);\r\n }\r\n }\r\n // Actions, formEvents, httpCalls are already pushed in real-time\r\n // to the in-memory session by trackAction/trackFormEvent/trackHttpCall\r\n }\r\n\r\n // Save the full session snapshot\r\n try {\r\n await this.storage.saveSession(this.session);\r\n } catch (e) {\r\n // storage error — re-enqueue events for next flush\r\n console.warn('[UiBlackbox] Storage flush failed:', e);\r\n }\r\n }\r\n\r\n // ─── Utilities ─────────────────────────────────────────────────────\r\n\r\n /** Generate a UUID v4. */\r\n private generateUuid(): string {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n // Fallback for older browsers\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n }\r\n\r\n // ─── Cleanup ───────────────────────────────────────────────────────\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n if (this.flushTimerId !== null) {\r\n clearInterval(this.flushTimerId);\r\n }\r\n\r\n if (this.beforeUnloadHandler) {\r\n window.removeEventListener('beforeunload', this.beforeUnloadHandler);\r\n }\r\n\r\n // Final flush\r\n void this.flush();\r\n }\r\n}\r\n","import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation, inject } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { UiSize } from '../../core/types';\r\nimport { UiButtonComponent } from './button.component';\r\nimport { UiButtonDescriptor, UiButtonAreaAlign } from './button.types';\r\nimport { UiBlackboxService } from '../blackbox/blackbox.service';\r\n\r\n/**\r\n * Standalone button-group component driven by a `UiButtonDescriptor[]` configuration.\r\n *\r\n * Renders a group of `UiButton` instances from declarative descriptors.\r\n * Supports per-button loading/disabled states, dynamic visibility,\r\n * alignment control, and optional navigation via Angular Router.\r\n *\r\n * When the `UiBlackboxService` is provided, button clicks are\r\n * automatically tracked in the active session.\r\n *\r\n * @selector ui-button-area\r\n *\r\n * @example\r\n * ```html\r\n * <ui-button-area\r\n * [buttons]=\"actions\"\r\n * align=\"end\"\r\n * gap=\"sm\"\r\n * [loadingIds]=\"currentlyLoading\"\r\n * />\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // Dynamic configuration\r\n * actions: UiButtonDescriptor[] = [\r\n * { id: 'export', label: 'Export Excel', icon: 'file-spreadsheet', variant: 'primary',\r\n * action: () => this.exportExcel() },\r\n * { id: 'delete', label: 'Delete', icon: 'trash-2', variant: 'warn',\r\n * action: () => this.deleteSelected(), hidden: !this.hasSelection },\r\n * ];\r\n *\r\n * // Set loading state from outside:\r\n * currentlyLoading: string | string[] | null = 'export';\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-button-area',\r\n standalone: true,\r\n imports: [UiButtonComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'ui-button-area-host',\r\n },\r\n template: `\r\n <div\r\n [class]=\"areaClasses\"\r\n role=\"group\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n >\r\n @for (button of visibleButtons; track trackButton($index, button)) {\r\n <ui-button\r\n [attr.data-button-id]=\"button.id || null\"\r\n [label]=\"button.label\"\r\n [tooltip]=\"button.tooltip ?? ''\"\r\n [ariaLabel]=\"button.ariaLabel\"\r\n [icon]=\"button.icon\"\r\n [iconPosition]=\"button.iconPosition ?? 'trailing'\"\r\n [variant]=\"button.variant ?? 'primary'\"\r\n [size]=\"button.size ?? 'md'\"\r\n [loading]=\"isButtonLoading(button)\"\r\n [disabled]=\"isButtonDisabled(button)\"\r\n [customClass]=\"button.customClass\"\r\n (click)=\"handleButtonClick(button, $event)\"\r\n />\r\n }\r\n </div>\r\n `,\r\n styleUrl: './button-area.component.scss',\r\n})\r\nexport class UiButtonAreaComponent {\r\n /**\r\n * Array of button descriptors to render.\r\n * Buttons with `hidden: true` are filtered out.\r\n */\r\n @Input() buttons: UiButtonDescriptor[] = [];\r\n\r\n /** Horizontal alignment of the button group. */\r\n @Input() align: UiButtonAreaAlign = 'end';\r\n\r\n /** Accessible group label for screen readers. */\r\n @Input() ariaLabel = 'Actions';\r\n\r\n /** Gap between buttons (maps to design token spacing). */\r\n @Input() gap: UiSize = 'sm';\r\n\r\n /** Stack buttons vertically on mobile viewports (<600px). */\r\n @Input() stackOnMobile = true;\r\n\r\n /**\r\n * When `true`, all buttons are disabled while any button is in a loading state.\r\n * Useful to prevent double-actions during async operations.\r\n */\r\n @Input() disableWhileLoading = false;\r\n\r\n /**\r\n * Set one or more buttons to a loading state by their `id`.\r\n * Accepts a single string, an array of strings, or `null` to clear.\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Single -->\r\n * <ui-button-area [loadingIds]=\"'save'\" />\r\n *\r\n * <!-- Multiple -->\r\n * <ui-button-area [loadingIds]=\"['save', 'export']\" />\r\n * ```\r\n */\r\n @Input()\r\n set loadingIds(value: string | string[] | null | undefined) {\r\n if (value === null || value === undefined) {\r\n this._loadingIds = new Set();\r\n } else if (Array.isArray(value)) {\r\n this._loadingIds = new Set(value);\r\n } else {\r\n this._loadingIds = new Set([value]);\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _loadingIds = new Set<string>();\r\n\r\n /** @internal Optional router for href navigation. */\r\n private router = inject(Router, { optional: true });\r\n\r\n /** @internal Optional BlackBox service — auto-tracks button clicks when available. */\r\n private blackbox = inject(UiBlackboxService, { optional: true });\r\n\r\n /** Buttons filtered to visible (non-hidden) entries. */\r\n get visibleButtons(): UiButtonDescriptor[] {\r\n return this.buttons.filter((b) => !b.hidden);\r\n }\r\n\r\n /** Assembled CSS class string for the button area container. */\r\n get areaClasses(): string {\r\n return [\r\n 'ui-button-area',\r\n `ui-button-area--align-${this.align}`,\r\n `ui-button-area--gap-${this.gap}`,\r\n this.stackOnMobile ? 'ui-button-area--stack-mobile' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n /** @internal Track function for @for loop. */\r\n trackButton(index: number, button: UiButtonDescriptor): string {\r\n return button.id ?? `idx-${index}`;\r\n }\r\n\r\n /** Whether a specific button is in a loading state. */\r\n isButtonLoading(button: UiButtonDescriptor): boolean {\r\n return !!button.loading || (!!button.id && this._loadingIds.has(button.id));\r\n }\r\n\r\n /** Whether a specific button is disabled (includes loading logic). */\r\n isButtonDisabled(button: UiButtonDescriptor): boolean {\r\n if (button.disabled) return true;\r\n if (this.isButtonLoading(button)) return true;\r\n if (this.disableWhileLoading && this._loadingIds.size > 0) return true;\r\n return false;\r\n }\r\n\r\n /** @internal Handles button click: tracks action, calls callback and/or navigates. */\r\n handleButtonClick(button: UiButtonDescriptor, event: MouseEvent): void {\r\n // BlackBox auto-tracking (no-op if service is not provided)\r\n this.blackbox?.trackAction(button.id ?? button.label, {\r\n tag: 'ui-button',\r\n id: button.id,\r\n text: button.label,\r\n });\r\n\r\n if (button.action) {\r\n button.action(event);\r\n }\r\n if (button.href && this.router) {\r\n this.router.navigateByUrl(button.href);\r\n }\r\n }\r\n}\r\n\r\n","/**\r\n * ng-ui-system — Button entry point.\r\n *\r\n * @example\r\n * ```typescript\r\n * import {\r\n * UiButtonComponent,\r\n * UiButtonAreaComponent,\r\n * UiButtonDescriptor,\r\n * } from 'ng-ui-system';\r\n * ```\r\n */\r\n\r\n// Components\r\nexport { UiButtonComponent } from './button.component';\r\nexport { UiButtonAreaComponent } from './button-area.component';\r\n\r\n// Types\r\nexport {\r\n UiButtonDescriptor,\r\n UiButtonAreaAlign,\r\n UiIconPosition,\r\n} from './button.types';\r\n","/**\r\n * @module ng-ui-system/core/logging\r\n * Configurazione IndexedDB per UiLoggerService.\r\n * Pattern omologato a action-logger.config.ts del progetto Siform-PAL.\r\n */\r\n\r\nimport type { UiLogLevel } from './logger.types';\r\n\r\n/** Durata default retention log (7 giorni). */\r\nexport const UI_LOGGER_DEFAULT_TTL_MS = 7 * 24 * 60 * 60 * 1000;\r\n\r\n/** Nome database IndexedDB. */\r\nexport const UI_LOGGER_IDB_NAME = 'ng-ui-system-logs';\r\n\r\n/** Versione database (incrementare su schema change). */\r\nexport const UI_LOGGER_IDB_VERSION = 1;\r\n\r\n/** Nome object store. */\r\nexport const UI_LOGGER_IDB_STORE = 'entries';\r\n\r\n/** Max entry totali per cleanup automatico. */\r\nexport const UI_LOGGER_MAX_ENTRIES = 10000;\r\n\r\n/** Livelli di log ordinati per severità crescente. */\r\nexport const UI_LOGGER_LEVELS: readonly UiLogLevel[] = ['debug', 'info', 'warn', 'error'];\r\n","/**\r\n * @module ng-ui-system/core/logging\r\n * Logger centralizzato con persistenza IndexedDB.\r\n * Pattern omologato a ActionLoggerService del progetto Siform-PAL.\r\n *\r\n * @example\r\n * const logger = inject(UiLoggerService);\r\n * logger.logFormAction('form_submit', { schemaId: 'user-form', values: data });\r\n * logger.logWizardAction('step_change', { from: 0, to: 1 });\r\n */\r\n\r\nimport { inject, Injectable, signal, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\nimport type { UiLogCategory, UiLogEntry, UiLogFilter, UiLogLevel, UiLogSummary, UiLoggerConfig } from './logger.types';\r\nimport {\r\n UI_LOGGER_DEFAULT_TTL_MS,\r\n UI_LOGGER_IDB_NAME,\r\n UI_LOGGER_IDB_STORE,\r\n UI_LOGGER_IDB_VERSION,\r\n UI_LOGGER_MAX_ENTRIES,\r\n UI_LOGGER_LEVELS,\r\n} from './logger.config';\r\n\r\n/**\r\n * Logger centralizzato per componenti ng-ui-system.\r\n * Persiste su IndexedDB con cleanup automatico.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiLoggerService {\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private dbPromise: Promise<IDBDatabase> | null = null;\r\n\r\n /** Stato toggle runtime. */\r\n readonly enabled = signal(this.detectEnabled());\r\n\r\n /** Configurazione runtime. */\r\n private config: UiLoggerConfig = {\r\n enabled: this.detectEnabled(),\r\n minLevel: 'debug',\r\n ttlMs: UI_LOGGER_DEFAULT_TTL_MS,\r\n maxEntries: UI_LOGGER_MAX_ENTRIES,\r\n };\r\n\r\n /** True se IndexedDB disponibile e siamo in browser. */\r\n private idbSupported(): boolean {\r\n return isPlatformBrowser(this.platformId) && typeof indexedDB !== 'undefined';\r\n }\r\n\r\n /** Rileva se logging attivo (default: true in dev se non production). */\r\n private detectEnabled(): boolean {\r\n if (!isPlatformBrowser(this.platformId)) return false;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const ng = (window as any).ng;\r\n const isDev = ng && typeof ng.probe === 'function';\r\n return isDev;\r\n }\r\n\r\n /** Abilita/disabilita logging runtime. */\r\n setEnabled(value: boolean): void {\r\n this.enabled.set(value);\r\n this.config.enabled = value;\r\n }\r\n\r\n /** Configura il logger. */\r\n configure(config: Partial<UiLoggerConfig>): void {\r\n this.config = { ...this.config, ...config };\r\n this.enabled.set(this.config.enabled);\r\n }\r\n\r\n // Public API: generic log\r\n\r\n /**\r\n * Log generico con controllo enabled e livello.\r\n */\r\n log(\r\n category: UiLogCategory,\r\n level: UiLogLevel,\r\n action: string,\r\n payload?: Record<string, unknown>,\r\n duration?: number\r\n ): void {\r\n if (!this.enabled()) return;\r\n if (!this.shouldLogLevel(level)) return;\r\n void this.persist(category, level, action, payload, duration);\r\n }\r\n\r\n /**\r\n * Log azione form (submit, reset, valueChange, etc).\r\n */\r\n logFormAction(\r\n action: 'init' | 'submit' | 'reset' | 'valueChange' | 'validationChange' | 'customEvent' | 'destroy',\r\n payload: { schemaId: string;[key: string]: unknown }\r\n ): void {\r\n this.log('form', 'info', action, payload);\r\n }\r\n\r\n /**\r\n * Log azione wizard (stepChange, complete, validationFailed, etc).\r\n */\r\n logWizardAction(\r\n action: 'init' | 'stepChange' | 'stepComplete' | 'stepValidationFailed' | 'complete' | 'navigation' | 'save' | 'valueChange' | 'keyboardNavigation' | 'destroy',\r\n payload: { wizardId?: string; step?: number;[key: string]: unknown }\r\n ): void {\r\n this.log('wizard', 'info', action, payload);\r\n }\r\n\r\n /**\r\n * Log errore.\r\n */\r\n logError(error: Error | unknown, context?: Record<string, unknown>): void {\r\n const payload: Record<string, unknown> = { ...context };\r\n if (error instanceof Error) {\r\n payload['message'] = error.message;\r\n payload['stack'] = error.stack;\r\n } else {\r\n payload['error'] = error;\r\n }\r\n this.log('error', 'error', 'exception', payload);\r\n }\r\n\r\n /**\r\n * Log debug (solo se enabled e minLevel <= debug).\r\n */\r\n debug(category: UiLogCategory, action: string, payload?: Record<string, unknown>): void {\r\n this.log(category, 'debug', action, payload);\r\n }\r\n\r\n // IndexedDB persistence\r\n\r\n private async persist(\r\n category: UiLogCategory,\r\n level: UiLogLevel,\r\n action: string,\r\n payload?: Record<string, unknown>,\r\n duration?: number\r\n ): Promise<void> {\r\n if (!this.idbSupported()) return;\r\n\r\n const entry: UiLogEntry = {\r\n id: `${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,\r\n category,\r\n level,\r\n action,\r\n payload,\r\n timestamp: Date.now(),\r\n duration,\r\n url: typeof window !== 'undefined' ? window.location.href : '',\r\n userId: this.getUserId(),\r\n };\r\n\r\n try {\r\n const db = await this.openDb();\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readwrite');\r\n tx.objectStore(UI_LOGGER_IDB_STORE).put(entry, entry.id);\r\n\r\n // Debug visibile in dev mode\r\n // eslint-disable-next-line no-console\r\n if (this.enabled()) {\r\n // eslint-disable-next-line no-console\r\n console.log(`[UiLogger] ${entry.category}:${entry.action}`, entry.payload ?? '');\r\n }\r\n\r\n // Cleanup asincrono senza bloccare\r\n void this.cleanupIfNeeded(db);\r\n } catch (e) {\r\n // Silent fail: logging non deve rompere l'app\r\n // eslint-disable-next-line no-console\r\n console.warn('[UiLogger] Persist failed:', e);\r\n }\r\n }\r\n\r\n /** Recupera userId da localStorage se disponibile. */\r\n private getUserId(): string | undefined {\r\n if (typeof localStorage === 'undefined') return undefined;\r\n return localStorage.getItem('exLogin') ?? undefined;\r\n }\r\n\r\n /** Verifica se il livello deve essere loggato in base a minLevel. */\r\n private shouldLogLevel(level: UiLogLevel): boolean {\r\n const minIndex = UI_LOGGER_LEVELS.indexOf(this.config.minLevel);\r\n const levelIndex = UI_LOGGER_LEVELS.indexOf(level);\r\n return levelIndex >= minIndex;\r\n }\r\n\r\n // Query API\r\n\r\n /**\r\n * Recupera log con filtri.\r\n */\r\n async query(filter: UiLogFilter = {}): Promise<UiLogEntry[]> {\r\n if (!this.idbSupported()) return [];\r\n\r\n const db = await this.openDb();\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readonly');\r\n const store = tx.objectStore(UI_LOGGER_IDB_STORE);\r\n\r\n const all: UiLogEntry[] = await new Promise((resolve, reject) => {\r\n const request = store.getAll();\r\n request.onsuccess = () => resolve(request.result as UiLogEntry[]);\r\n request.onerror = () => reject(request.error);\r\n });\r\n\r\n return this.applyFilter(all, filter);\r\n }\r\n\r\n /**\r\n * Riepilogo log per dashboard.\r\n */\r\n async summary(): Promise<UiLogSummary> {\r\n const all = await this.query();\r\n\r\n const byCategory = { form: 0, wizard: 0, navigation: 0, system: 0, error: 0 } as Record<UiLogCategory, number>;\r\n const byLevel = { debug: 0, info: 0, warn: 0, error: 0 } as Record<UiLogLevel, number>;\r\n\r\n let oldest = Infinity;\r\n let newest = 0;\r\n\r\n for (const entry of all) {\r\n byCategory[entry.category]++;\r\n byLevel[entry.level]++;\r\n if (entry.timestamp < oldest) oldest = entry.timestamp;\r\n if (entry.timestamp > newest) newest = entry.timestamp;\r\n }\r\n\r\n return {\r\n total: all.length,\r\n byCategory,\r\n byLevel,\r\n oldest: oldest === Infinity ? 0 : oldest,\r\n newest,\r\n };\r\n }\r\n\r\n /**\r\n * Cancella log più vecchi di TTL.\r\n */\r\n async purgeOld(): Promise<number> {\r\n if (!this.idbSupported()) return 0;\r\n\r\n const cutoff = Date.now() - this.config.ttlMs;\r\n const toDelete: string[] = [];\r\n\r\n const db = await this.openDb();\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readonly');\r\n const store = tx.objectStore(UI_LOGGER_IDB_STORE);\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const cursor = store.openCursor();\r\n cursor.onsuccess = (e) => {\r\n const result = (e.target as IDBRequest).result as IDBCursorWithValue | null;\r\n if (!result) {\r\n resolve();\r\n return;\r\n }\r\n const entry = result.value as UiLogEntry;\r\n if (entry.timestamp < cutoff) {\r\n toDelete.push(entry.id);\r\n }\r\n result.continue();\r\n };\r\n cursor.onerror = () => reject(cursor.error);\r\n });\r\n\r\n if (toDelete.length > 0) {\r\n const delTx = db.transaction(UI_LOGGER_IDB_STORE, 'readwrite');\r\n for (const id of toDelete) {\r\n delTx.objectStore(UI_LOGGER_IDB_STORE).delete(id);\r\n }\r\n }\r\n\r\n return toDelete.length;\r\n }\r\n\r\n /**\r\n * Cancella tutti i log.\r\n */\r\n async clear(): Promise<void> {\r\n if (!this.idbSupported()) return;\r\n\r\n const db = await this.openDb();\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readwrite');\r\n await new Promise<void>((resolve, reject) => {\r\n const request = tx.objectStore(UI_LOGGER_IDB_STORE).clear();\r\n request.onsuccess = () => resolve();\r\n request.onerror = () => reject(request.error);\r\n });\r\n }\r\n\r\n // Internals\r\n\r\n private openDb(): Promise<IDBDatabase> {\r\n if (this.dbPromise) return this.dbPromise;\r\n\r\n this.dbPromise = new Promise((resolve, reject) => {\r\n const req = indexedDB.open(UI_LOGGER_IDB_NAME, UI_LOGGER_IDB_VERSION);\r\n req.onerror = () => reject(req.error);\r\n req.onsuccess = () => resolve(req.result);\r\n req.onupgradeneeded = (ev) => {\r\n const db = (ev.target as IDBOpenDBRequest).result;\r\n if (!db.objectStoreNames.contains(UI_LOGGER_IDB_STORE)) {\r\n db.createObjectStore(UI_LOGGER_IDB_STORE);\r\n }\r\n };\r\n });\r\n\r\n return this.dbPromise;\r\n }\r\n\r\n private async cleanupIfNeeded(db: IDBDatabase): Promise<void> {\r\n const tx = db.transaction(UI_LOGGER_IDB_STORE, 'readonly');\r\n const count = await new Promise<number>((resolve, reject) => {\r\n const req = tx.objectStore(UI_LOGGER_IDB_STORE).count();\r\n req.onsuccess = () => resolve(req.result);\r\n req.onerror = () => reject(req.error);\r\n });\r\n\r\n if (count > this.config.maxEntries) {\r\n void this.purgeOld();\r\n }\r\n }\r\n\r\n private applyFilter(entries: UiLogEntry[], filter: UiLogFilter): UiLogEntry[] {\r\n let result = entries;\r\n\r\n if (filter.category) {\r\n result = result.filter((e) => e.category === filter.category);\r\n }\r\n if (filter.level) {\r\n result = result.filter((e) => e.level === filter.level);\r\n }\r\n if (filter.action) {\r\n result = result.filter((e) => e.action.includes(filter.action!));\r\n }\r\n if (filter.from) {\r\n result = result.filter((e) => e.timestamp >= filter.from!);\r\n }\r\n if (filter.to) {\r\n result = result.filter((e) => e.timestamp <= filter.to!);\r\n }\r\n\r\n // Ordina newest first\r\n result = result.sort((a, b) => b.timestamp - a.timestamp);\r\n\r\n if (filter.limit && filter.limit > 0) {\r\n result = result.slice(0, filter.limit);\r\n }\r\n\r\n return result;\r\n }\r\n}","/**\r\n * @module ng-ui-system/form-builder\r\n * Tipi relativi alla validazione dei campi.\r\n */\r\n\r\nimport { ValidatorFn } from '@angular/forms';\r\nimport { UiFieldCondition } from './condition.types';\r\n\r\n// ─── Operatori cross-field ────────────────────────────────────────\r\n\r\n/**\r\n * Operatori di confronto per validazioni cross-field.\r\n */\r\nexport type UiCrossFieldOperator = 'greater_than' | 'greater_equal' | 'less_than' | 'less_equal' | 'not_equal';\r\n\r\n/**\r\n * Configurazione per validazione cross-field.\r\n * Confronta il valore del campo corrente con quello di un altro campo.\r\n *\r\n * @example\r\n * ```typescript\r\n * // La data di fine deve essere successiva alla data di inizio\r\n * crossField: {\r\n * targetField: 'data-inizio',\r\n * operator: 'greater_than',\r\n * dataType: 'date',\r\n * }\r\n * ```\r\n */\r\nexport interface UiCrossFieldConfig {\r\n /** Chiave del campo di confronto. */\r\n targetField: string;\r\n /** Operatore di confronto. */\r\n operator: UiCrossFieldOperator;\r\n /** Tipo di dato per il confronto. */\r\n dataType: 'date' | 'number';\r\n /** Per le date, specifica se il formato e MM/YYYY. */\r\n isMonthYear?: boolean;\r\n}\r\n\r\n// ─── Validazione date ─────────────────────────────────────────────\r\n\r\n/**\r\n * Keyword predefinite per date di riferimento.\r\n */\r\nexport type UiDateKeyword = 'today' | 'tomorrow' | 'yesterday';\r\n\r\n/**\r\n * Configurazione per validazione date-min / date-max.\r\n * Permette di validare che una data sia precedente o successiva\r\n * a un valore di riferimento, con supporto per offset temporali.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Data deve essere >= oggi\r\n * { type: 'date-min', value: 'today', message: 'La data deve essere futura' }\r\n *\r\n * // Data deve essere <= oggi + 1 anno\r\n * { type: 'date-max', value: 'today', offset: '1y', message: 'Max 1 anno da oggi' }\r\n *\r\n * // Data deve essere >= una data specifica\r\n * { type: 'date-min', value: '01/01/2024', message: 'Almeno dal 2024' }\r\n * ```\r\n */\r\nexport interface UiDateValidationConfig {\r\n /**\r\n * Data di riferimento.\r\n * Puo essere una keyword (`'today'`, `'tomorrow'`, `'yesterday'`)\r\n * o una data nel formato `DD/MM/YYYY`.\r\n */\r\n value: string | UiDateKeyword;\r\n /**\r\n * Offset da applicare alla data di riferimento.\r\n *\r\n * Formato: `numero + unita`\r\n * - `'y'` o `'a'` per anni (es. `'1y'`, `'2a'`)\r\n * - `'m'` per mesi (es. `'6m'`, `'12m'`)\r\n * - `'g'` o `'d'` per giorni (es. `'30g'`, `'7d'`)\r\n * - `'w'` per settimane (es. `'2w'`)\r\n */\r\n offset?: string;\r\n}\r\n\r\n// ─── Tipi di validazione ──────────────────────────────────────────\r\n\r\n/**\r\n * Tipi di validazione supportati dal form builder.\r\n *\r\n * | Tipo | Valore atteso | Descrizione |\r\n * |-------------|--------------------|-----------------------------------------|\r\n * | `required` | — | Campo obbligatorio |\r\n * | `email` | — | Formato email valido |\r\n * | `min` | `number` | Valore numerico minimo |\r\n * | `max` | `number` | Valore numerico massimo |\r\n * | `minLength` | `number` | Lunghezza minima stringa |\r\n * | `maxLength` | `number` | Lunghezza massima stringa |\r\n * | `pattern` | `string` (regex) | Pattern regex da rispettare |\r\n * | `custom` | `ValidatorFn` | Validatore Angular custom |\r\n * | `crossField`| `CrossFieldConfig` | Confronto con un altro campo |\r\n * | `date-min` | `string` | Data minima (keyword o DD/MM/YYYY) |\r\n * | `date-max` | `string` | Data massima (keyword o DD/MM/YYYY) |\r\n * | `fileSize` | `number` (bytes) | Dimensione massima file |\r\n * | `fileType` | `string[]` (MIME) | Tipi file accettati |\r\n * | `fileCount` | `number` | Numero massimo file |\r\n */\r\nexport type UiValidationType =\r\n | 'required'\r\n | 'email'\r\n | 'min'\r\n | 'max'\r\n | 'minLength'\r\n | 'maxLength'\r\n | 'pattern'\r\n | 'custom'\r\n | 'crossField'\r\n | 'date-min'\r\n | 'date-max'\r\n | 'fileSize'\r\n | 'fileType'\r\n | 'fileCount';\r\n\r\n// ─── Regola di validazione ────────────────────────────────────────\r\n\r\n/**\r\n * Regola di validazione per un campo del form.\r\n *\r\n * Supporta validazioni standard, cross-field, date con offset,\r\n * file e validatori custom Angular. Ogni regola puo avere\r\n * condizioni che ne controllano l'applicazione.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Validazione required condizionale\r\n * {\r\n * type: 'required',\r\n * message: 'Campo obbligatorio se attivo',\r\n * conditions: [{ field: 'is-active', operator: 'equals', value: true }],\r\n * }\r\n *\r\n * // Validazione cross-field\r\n * {\r\n * type: 'crossField',\r\n * crossField: {\r\n * targetField: 'eta-minima',\r\n * operator: 'greater_than',\r\n * dataType: 'number',\r\n * },\r\n * message: \"L'eta massima deve essere maggiore dell'eta minima\",\r\n * }\r\n * ```\r\n */\r\nexport interface UiValidationRule {\r\n /** Tipo di validazione. */\r\n type: UiValidationType;\r\n /**\r\n * Valore per la validazione.\r\n * - Per `min`/`max`: valore numerico\r\n * - Per `minLength`/`maxLength`: lunghezza\r\n * - Per `pattern`: stringa regex\r\n * - Per `date-min`/`date-max`: keyword o data `DD/MM/YYYY`\r\n * - Per `fileSize`: dimensione in bytes\r\n * - Per `fileType`: array di MIME types\r\n * - Per `fileCount`: numero massimo file\r\n */\r\n value?: any;\r\n /**\r\n * Offset temporale per `date-min`/`date-max`.\r\n * @see UiDateValidationConfig.offset\r\n */\r\n offset?: string;\r\n /** Configurazione per validazione cross-field. */\r\n crossField?: UiCrossFieldConfig;\r\n /** Messaggio di errore personalizzato. */\r\n message?: string;\r\n /** Funzione validatore Angular custom (per `type: 'custom'`). */\r\n validator?: ValidatorFn;\r\n /** Condizioni per applicare questa regola (validazione condizionale). */\r\n conditions?: UiFieldCondition[];\r\n}\r\n\r\n// ─── Stato di validazione ─────────────────────────────────────────\r\n\r\n/**\r\n * Stato di validazione complessivo del form.\r\n */\r\nexport interface UiFormValidationState {\r\n /** Se il form e valido. */\r\n valid: boolean;\r\n /** Mappa errori per chiave campo. */\r\n errors: Record<string, string[]>;\r\n /** Chiavi dei campi modificati. */\r\n dirty: string[];\r\n /** Chiavi dei campi toccati. */\r\n touched: string[];\r\n}\r\n\r\n/**\r\n * Chiave `ValidationErrors` usata dai CVA custom per esporre errori granulari\r\n * sui campi interni (atomici) verso l'error-summary del form-builder.\r\n */\r\nexport const UI_FORM_NESTED_FIELD_ERRORS_KEY = 'uiNestedFieldErrors';\r\n\r\n/**\r\n * Dettaglio di un errore per l'error summary.\r\n */\r\nexport interface UiFormErrorDetail {\r\n /** Chiave del campo in errore. */\r\n fieldKey: string;\r\n /** Label del campo per visualizzazione. */\r\n fieldLabel: string;\r\n /** Lista messaggi di errore. */\r\n errors: string[];\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { UiFieldCondition } from '../types/condition.types';\r\n\r\n/**\r\n * Servizio per la valutazione delle condizioni di visibilita,\r\n * required e disable dei campi del form.\r\n *\r\n * Supporta 12 operatori di confronto, logica AND/OR\r\n * e accesso a valori annidati tramite dot notation.\r\n *\r\n * @providedIn 'root'\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiFormConditionService {\r\n /**\r\n * Valuta una singola condizione rispetto ai dati del form.\r\n *\r\n * @param condition - Condizione da valutare.\r\n * @param formData - Stato corrente dei dati del form.\r\n * @returns `true` se la condizione e soddisfatta.\r\n */\r\n evaluateCondition(condition: UiFieldCondition, formData: Record<string, any>): boolean {\r\n const fieldValue = this.getNestedValue(formData, condition.field);\r\n\r\n switch (condition.operator) {\r\n case 'equals':\r\n return fieldValue === condition.value;\r\n case 'not_equals':\r\n return fieldValue !== condition.value;\r\n case 'contains':\r\n return this.stringContains(fieldValue, condition.value);\r\n case 'not_contains':\r\n return !this.stringContains(fieldValue, condition.value);\r\n case 'greater_than':\r\n return this.numericCompare(fieldValue, condition.value, '>');\r\n case 'less_than':\r\n return this.numericCompare(fieldValue, condition.value, '<');\r\n case 'greater_equal':\r\n return this.numericCompare(fieldValue, condition.value, '>=');\r\n case 'less_equal':\r\n return this.numericCompare(fieldValue, condition.value, '<=');\r\n case 'is_empty':\r\n return this.isEmpty(fieldValue);\r\n case 'is_not_empty':\r\n return !this.isEmpty(fieldValue);\r\n case 'in_array':\r\n return Array.isArray(condition.value) && condition.value.includes(fieldValue);\r\n case 'not_in_array':\r\n return Array.isArray(condition.value) && !condition.value.includes(fieldValue);\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Valuta un array di condizioni con logica AND/OR.\r\n *\r\n * La prima condizione stabilisce il valore iniziale.\r\n * Le condizioni successive usano la proprieta `logic` per\r\n * combinare il risultato (`AND` per default).\r\n *\r\n * @param conditions - Array di condizioni.\r\n * @param formData - Stato corrente dei dati del form.\r\n * @returns `true` se le condizioni combinate sono soddisfatte.\r\n */\r\n evaluateConditions(conditions: UiFieldCondition[], formData: Record<string, any>): boolean {\r\n if (!conditions || conditions.length === 0) {\r\n return true;\r\n }\r\n\r\n let result = this.evaluateCondition(conditions[0], formData);\r\n\r\n for (let i = 1; i < conditions.length; i++) {\r\n const condition = conditions[i];\r\n const conditionResult = this.evaluateCondition(condition, formData);\r\n\r\n if (condition.logic === 'OR') {\r\n result = result || conditionResult;\r\n } else {\r\n result = result && conditionResult;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /** Accesso a valori annidati tramite dot notation (es. `'address.city'`). */\r\n private getNestedValue(obj: any, path: string): any {\r\n return path\r\n .split('.')\r\n .reduce((current, key) => (current != null && current[key] !== undefined ? current[key] : undefined), obj);\r\n }\r\n\r\n /** Confronto stringa case-insensitive. */\r\n private stringContains(haystack: any, needle: any): boolean {\r\n if (haystack == null || needle == null) return false;\r\n return String(haystack).toLowerCase().includes(String(needle).toLowerCase());\r\n }\r\n\r\n /** Confronto numerico generico. */\r\n private numericCompare(a: any, b: any, op: string): boolean {\r\n const n1 = Number(a);\r\n const n2 = Number(b);\r\n if (isNaN(n1) || isNaN(n2)) return false;\r\n switch (op) {\r\n case '>':\r\n return n1 > n2;\r\n case '<':\r\n return n1 < n2;\r\n case '>=':\r\n return n1 >= n2;\r\n case '<=':\r\n return n1 <= n2;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Verifica se un valore e vuoto in modo robusto.\r\n * Gestisce null, undefined, false, stringhe vuote, array vuoti e oggetti vuoti.\r\n */\r\n private isEmpty(value: any): boolean {\r\n if (value === null || value === undefined || value === false) return true;\r\n if (typeof value === 'string' && value.trim().length === 0) return true;\r\n if (Array.isArray(value) && value.length === 0) return true;\r\n if (typeof value === 'object' && Object.keys(value).length === 0) return true;\r\n return false;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl, ValidatorFn, Validators } from '@angular/forms';\r\nimport {\r\n parse,\r\n format,\r\n startOfDay,\r\n startOfMonth,\r\n addDays,\r\n addMonths,\r\n addYears,\r\n addWeeks,\r\n isAfter,\r\n isBefore,\r\n isEqual,\r\n isValid as isDateValid,\r\n} from 'date-fns';\r\nimport { UiValidationRule } from '../types/validation.types';\r\nimport { UiCrossFieldConfig, UiCrossFieldOperator } from '../types/validation.types';\r\nimport { UiFileData } from '../types/field.types';\r\nimport { UiFormConditionService } from './form-condition.service';\r\n\r\n/**\r\n * Servizio per la creazione e gestione dei validatori Angular\r\n * basati sulle regole dichiarative dello schema del form.\r\n *\r\n * Supporta validazioni standard, cross-field, date con offset,\r\n * file e validatori condizionali.\r\n *\r\n * @providedIn 'root'\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiFormValidationService {\r\n constructor(private conditionService: UiFormConditionService) {}\r\n\r\n // ─── Creazione validatori ──────────────────────────────────────\r\n\r\n /** Crea un array di validatori Angular dalle regole di validazione. */\r\n createValidators(rules: UiValidationRule[]): ValidatorFn[] {\r\n if (!rules?.length) return [];\r\n return rules.map((r) => this.createValidator(r)).filter((v): v is ValidatorFn => v !== null);\r\n }\r\n\r\n /**\r\n * Crea validatori con supporto condizionale.\r\n * Le regole con `conditions` vengono applicate solo se le condizioni sono soddisfatte.\r\n */\r\n createConditionalValidators(rules: UiValidationRule[], formData: Record<string, any>): ValidatorFn[] {\r\n if (!rules?.length) return [];\r\n const validators: ValidatorFn[] = [];\r\n\r\n for (const rule of rules) {\r\n if (rule.conditions?.length) {\r\n const shouldApply = this.conditionService.evaluateConditions(rule.conditions, formData);\r\n if (!shouldApply) continue;\r\n }\r\n const v = this.createValidator(rule);\r\n if (v) validators.push(v);\r\n }\r\n\r\n return validators;\r\n }\r\n\r\n /**\r\n * Aggiorna i validatori di un campo in base allo stato corrente del form.\r\n * Usato per ricalcolare validazioni condizionali quando i dati cambiano.\r\n */\r\n updateFieldValidators(\r\n control: AbstractControl,\r\n rules: UiValidationRule[] | undefined,\r\n formData: Record<string, any>,\r\n ): void {\r\n if (!rules?.length) {\r\n control.clearValidators();\r\n } else {\r\n const validators = this.createConditionalValidators(rules, formData);\r\n control.setValidators(validators);\r\n }\r\n control.updateValueAndValidity({ emitEvent: false });\r\n }\r\n\r\n // ─── Utility pubbliche ─────────────────────────────────────────\r\n\r\n /** Verifica se un campo dovrebbe mostrare gli errori. */\r\n shouldShowFieldErrors(control: AbstractControl): boolean {\r\n return control.invalid && (control.dirty || control.touched);\r\n }\r\n\r\n /** Restituisce i campi correlati da cross-field validation. */\r\n getCrossFieldRelatedFields(fieldKey: string, allRules: Record<string, UiValidationRule[]>): string[] {\r\n const related: string[] = [];\r\n for (const [key, rules] of Object.entries(allRules)) {\r\n if (key === fieldKey) continue;\r\n for (const rule of rules) {\r\n if (rule.type === 'crossField' && rule.crossField?.targetField === fieldKey) {\r\n related.push(key);\r\n }\r\n }\r\n }\r\n return related;\r\n }\r\n\r\n /** Verifica se un campo ha validazioni cross-field che lo referenziano. */\r\n hasCrossFieldValidations(fieldKey: string, allRules: Record<string, UiValidationRule[]>): boolean {\r\n return this.getCrossFieldRelatedFields(fieldKey, allRules).length > 0;\r\n }\r\n\r\n /** Formatta la dimensione del file in una stringa leggibile. */\r\n formatFileSize(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\r\n }\r\n\r\n // ─── Factory validatori ────────────────────────────────────────\r\n\r\n private createValidator(rule: UiValidationRule): ValidatorFn | null {\r\n switch (rule.type) {\r\n case 'required':\r\n return Validators.required;\r\n case 'email':\r\n return Validators.email;\r\n case 'min':\r\n return Validators.min(rule.value);\r\n case 'max':\r\n return Validators.max(rule.value);\r\n case 'minLength':\r\n return Validators.minLength(rule.value);\r\n case 'maxLength':\r\n return Validators.maxLength(rule.value);\r\n case 'pattern':\r\n return Validators.pattern(rule.value);\r\n case 'custom':\r\n return rule.validator || null;\r\n case 'crossField':\r\n return rule.crossField ? this.createCrossFieldValidator(rule.crossField) : null;\r\n case 'date-min':\r\n return this.createDateMinValidator(rule.value, rule.offset);\r\n case 'date-max':\r\n return this.createDateMaxValidator(rule.value, rule.offset);\r\n case 'fileSize':\r\n return this.createFileSizeValidator(rule.value);\r\n case 'fileType':\r\n return this.createFileTypeValidator(rule.value);\r\n case 'fileCount':\r\n return this.createFileCountValidator(rule.value);\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n // ─── Cross-field ───────────────────────────────────────────────\r\n\r\n private createCrossFieldValidator(config: UiCrossFieldConfig): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n if (!control.parent || !config.targetField) return null;\r\n\r\n const targetControl = control.parent.get(config.targetField);\r\n if (!targetControl) return null;\r\n\r\n const sourceValue = control.value;\r\n const targetValue = targetControl.value;\r\n\r\n if (sourceValue == null || targetValue == null || sourceValue === '' || targetValue === '') {\r\n return null;\r\n }\r\n\r\n let isValid = false;\r\n if (config.dataType === 'date') {\r\n isValid = this.validateDateComparison(sourceValue, targetValue, config.operator, config.isMonthYear);\r\n } else {\r\n isValid = this.validateNumberComparison(sourceValue, targetValue, config.operator);\r\n }\r\n\r\n return isValid\r\n ? null\r\n : {\r\n crossField: {\r\n actualValue: sourceValue,\r\n requiredComparison: config.operator,\r\n comparedValue: targetValue,\r\n targetField: config.targetField,\r\n },\r\n };\r\n };\r\n }\r\n\r\n /** Confronto date con date-fns. */\r\n private validateDateComparison(\r\n sourceValue: any,\r\n targetValue: any,\r\n operator: UiCrossFieldOperator,\r\n isMonthYear?: boolean,\r\n ): boolean {\r\n const normalize = isMonthYear ? startOfMonth : startOfDay;\r\n const sourceDate = normalize(new Date(sourceValue));\r\n const targetDate = normalize(new Date(targetValue));\r\n\r\n if (!isDateValid(sourceDate) || !isDateValid(targetDate)) return false;\r\n\r\n switch (operator) {\r\n case 'greater_than':\r\n return isAfter(sourceDate, targetDate);\r\n case 'greater_equal':\r\n return isAfter(sourceDate, targetDate) || isEqual(sourceDate, targetDate);\r\n case 'less_than':\r\n return isBefore(sourceDate, targetDate);\r\n case 'less_equal':\r\n return isBefore(sourceDate, targetDate) || isEqual(sourceDate, targetDate);\r\n case 'not_equal':\r\n return !isEqual(sourceDate, targetDate);\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /** Confronto numerico. */\r\n private validateNumberComparison(sourceValue: any, targetValue: any, operator: UiCrossFieldOperator): boolean {\r\n const src = Number(sourceValue);\r\n const tgt = Number(targetValue);\r\n if (isNaN(src) || isNaN(tgt)) return false;\r\n\r\n switch (operator) {\r\n case 'greater_than':\r\n return src > tgt;\r\n case 'greater_equal':\r\n return src >= tgt;\r\n case 'less_than':\r\n return src < tgt;\r\n case 'less_equal':\r\n return src <= tgt;\r\n case 'not_equal':\r\n return src !== tgt;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n // ─── Date min/max (con keyword e offset) ───────────────────────\r\n\r\n private createDateMinValidator(value: string, offset?: string): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n if (!control.value) return null;\r\n\r\n const refDate = this.parseReferenceDate(value, offset);\r\n if (!refDate) return null;\r\n\r\n const inputDate = startOfDay(new Date(control.value));\r\n if (!isDateValid(inputDate)) {\r\n return { 'date-min': { message: 'Data non valida', referenceDate: this.formatRefDate(refDate) } };\r\n }\r\n\r\n if (isBefore(inputDate, refDate)) {\r\n return {\r\n 'date-min': {\r\n message: `La data deve essere successiva o uguale a ${this.formatRefDate(refDate)}`,\r\n referenceDate: this.formatRefDate(refDate),\r\n inputDate: format(inputDate, 'dd/MM/yyyy'),\r\n },\r\n };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n private createDateMaxValidator(value: string, offset?: string): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n if (!control.value) return null;\r\n\r\n const refDate = this.parseReferenceDate(value, offset);\r\n if (!refDate) return null;\r\n\r\n const inputDate = startOfDay(new Date(control.value));\r\n if (!isDateValid(inputDate)) {\r\n return { 'date-max': { message: 'Data non valida', referenceDate: this.formatRefDate(refDate) } };\r\n }\r\n\r\n if (isAfter(inputDate, refDate)) {\r\n return {\r\n 'date-max': {\r\n message: `La data deve essere precedente o uguale a ${this.formatRefDate(refDate)}`,\r\n referenceDate: this.formatRefDate(refDate),\r\n inputDate: format(inputDate, 'dd/MM/yyyy'),\r\n },\r\n };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n /**\r\n * Parsa una data di riferimento da keyword o stringa DD/MM/YYYY\r\n * e applica un eventuale offset temporale.\r\n */\r\n private parseReferenceDate(value: string, offset?: string): Date | null {\r\n const today = startOfDay(new Date());\r\n let date: Date;\r\n\r\n switch (value?.toLowerCase().trim()) {\r\n case 'today':\r\n case 'oggi':\r\n date = today;\r\n break;\r\n case 'tomorrow':\r\n case 'domani':\r\n date = addDays(today, 1);\r\n break;\r\n case 'yesterday':\r\n case 'ieri':\r\n date = addDays(today, -1);\r\n break;\r\n default: {\r\n // Prova DD/MM/YYYY\r\n const parsed = parse(value, 'dd/MM/yyyy', new Date());\r\n if (isDateValid(parsed)) {\r\n date = startOfDay(parsed);\r\n } else {\r\n // Prova YYYY-MM-DD (ISO)\r\n const isoDate = new Date(value);\r\n if (isDateValid(isoDate)) {\r\n date = startOfDay(isoDate);\r\n } else {\r\n return null;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return offset ? this.applyDateOffset(date, offset) : date;\r\n }\r\n\r\n /**\r\n * Applica un offset temporale a una data.\r\n *\r\n * Formato: `numero + unita`\r\n * - `y`/`a` = anni, `m` = mesi, `g`/`d` = giorni, `s`/`w` = settimane\r\n */\r\n private applyDateOffset(date: Date, offset: string): Date {\r\n const match = offset.match(/^(-?\\d+)([yYaAmMgGdDsSwW])$/);\r\n if (!match) return date;\r\n\r\n const amount = parseInt(match[1], 10);\r\n switch (match[2].toLowerCase()) {\r\n case 'y':\r\n case 'a':\r\n return addYears(date, amount);\r\n case 'm':\r\n return addMonths(date, amount);\r\n case 'g':\r\n case 'd':\r\n return addDays(date, amount);\r\n case 's':\r\n case 'w':\r\n return addWeeks(date, amount);\r\n default:\r\n return date;\r\n }\r\n }\r\n\r\n private formatRefDate(date: Date): string {\r\n return format(date, 'dd/MM/yyyy');\r\n }\r\n\r\n // ─── File validators ───────────────────────────────────────────\r\n\r\n private createFileSizeValidator(maxSize: number): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n const files: UiFileData[] = control.value;\r\n if (!Array.isArray(files) || files.length === 0) return null;\r\n\r\n const oversized = files.filter((f) => f.size > maxSize);\r\n if (oversized.length > 0) {\r\n return {\r\n fileSize: {\r\n maxSize,\r\n maxSizeFormatted: this.formatFileSize(maxSize),\r\n files: oversized.map((f) => f.filename),\r\n },\r\n };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n private createFileTypeValidator(allowedTypes: string[]): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n const files: UiFileData[] = control.value;\r\n if (!Array.isArray(files) || files.length === 0) return null;\r\n\r\n const invalid = files.filter((f) => {\r\n return !allowedTypes.some((type) => {\r\n if (type.endsWith('/*')) {\r\n const category = type.split('/')[0];\r\n return f.mimeType.startsWith(category + '/');\r\n }\r\n return f.mimeType === type;\r\n });\r\n });\r\n\r\n if (invalid.length > 0) {\r\n return {\r\n fileType: {\r\n allowedTypes,\r\n files: invalid.map((f) => f.filename),\r\n },\r\n };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n private createFileCountValidator(maxCount: number): ValidatorFn {\r\n return (control: AbstractControl) => {\r\n const files: UiFileData[] = control.value;\r\n if (!Array.isArray(files)) return null;\r\n\r\n if (files.length > maxCount) {\r\n return { fileCount: { maxCount, actualCount: files.length } };\r\n }\r\n return null;\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { UiValidationRule } from '../types/validation.types';\r\n\r\n/** Opzioni per la visibilità degli errori di un campo. */\r\nexport interface UiFieldErrorDisplayOptions {\r\n /** Tratta il campo come prevalorizzato (mostra errori anche senza touched). */\r\n treatAsPrevalorized?: boolean;\r\n}\r\n\r\n/**\r\n * Servizio condiviso per messaggi di errore, visibilità errori e conteggio caratteri\r\n * dei campi form-builder e dei componenti atomici standalone.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiFormFieldErrorService {\r\n /**\r\n * Restituisce i messaggi di errore user-facing per un controllo.\r\n *\r\n * @param control Controllo Angular del campo\r\n * @param rules Regole di validazione dichiarative (messaggi custom dallo schema)\r\n */\r\n getFieldErrors(control: AbstractControl | null, rules: UiValidationRule[] = []): string[] {\r\n if (!control?.errors) return [];\r\n\r\n const messages: string[] = [];\r\n for (const [errorKey, errorValue] of Object.entries(control.errors)) {\r\n const rule = rules.find(\r\n (r) =>\r\n this.normalizeValidationKey(r.type) === errorKey ||\r\n (r.type === 'crossField' && errorKey === 'crossField'),\r\n );\r\n if (rule?.message) {\r\n messages.push(rule.message);\r\n } else {\r\n messages.push(this.getDefaultErrorMessage(errorKey, errorValue));\r\n }\r\n }\r\n return messages;\r\n }\r\n\r\n /**\r\n * Indica se mostrare gli errori per un controllo (invalid + touched/dirty/prevalorizzato).\r\n */\r\n shouldShowFieldErrors(\r\n control: AbstractControl | null,\r\n options: UiFieldErrorDisplayOptions = {},\r\n ): boolean {\r\n if (!control) return false;\r\n return (\r\n control.invalid &&\r\n (control.dirty || control.touched || options.treatAsPrevalorized === true)\r\n );\r\n }\r\n\r\n /**\r\n * Conteggio caratteri corrente/massimo per campi text/textarea con maxLength.\r\n */\r\n getCharCount(\r\n control: AbstractControl | null,\r\n maxLength?: number,\r\n ): { current: number; max: number } | null {\r\n if (maxLength == null || maxLength <= 0) return null;\r\n const current = String(control?.value ?? '').length;\r\n return { current, max: maxLength };\r\n }\r\n\r\n /** Estrae maxLength dalle regole schema. */\r\n resolveMaxLength(rules: UiValidationRule[] = []): number | undefined {\r\n const rule = rules.find((r) => r.type === 'maxLength');\r\n return rule?.value != null ? Number(rule.value) : undefined;\r\n }\r\n\r\n private normalizeValidationKey(schemaType: string): string {\r\n const keyMap: Record<string, string> = {\r\n minLength: 'minlength',\r\n maxLength: 'maxlength',\r\n };\r\n return keyMap[schemaType] || schemaType;\r\n }\r\n\r\n private getDefaultErrorMessage(errorKey: string, errorValue: unknown): string {\r\n if (typeof errorValue === 'string') {\r\n return errorValue;\r\n }\r\n\r\n const ev = errorValue as Record<string, unknown> | null | undefined;\r\n\r\n switch (errorKey) {\r\n case 'required':\r\n return 'Campo obbligatorio';\r\n case 'email':\r\n return 'Formato email non valido';\r\n case 'min':\r\n return `Valore minimo: ${ev?.['min']}`;\r\n case 'max':\r\n return `Valore massimo: ${ev?.['max']}`;\r\n case 'minlength':\r\n return `Lunghezza minima: ${ev?.['requiredLength']} caratteri`;\r\n case 'maxlength':\r\n return `Lunghezza massima: ${ev?.['requiredLength']} caratteri`;\r\n case 'pattern':\r\n return 'Formato non valido';\r\n case 'crossField':\r\n return 'Valore non coerente con il campo correlato';\r\n case 'date-min':\r\n return (ev?.['message'] as string) || 'Data troppo remota';\r\n case 'date-max':\r\n return (ev?.['message'] as string) || 'Data troppo avanzata';\r\n case 'fileSize':\r\n return `Dimensione massima: ${ev?.['maxSizeFormatted']}`;\r\n case 'fileType':\r\n return 'Formato file non accettato';\r\n case 'fileCount':\r\n return `Massimo ${ev?.['maxCount']} file`;\r\n default:\r\n return 'Valore non valido';\r\n }\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiFormErrorDetail } from '../../types/validation.types';\r\n\r\n/**\r\n * Riepilogo stato validazione del form.\r\n *\r\n * Con errori: indicatore + dropdown hover/click per il dettaglio e navigazione ai campi.\r\n * Senza errori: messaggio di stato positivo fisso (no dropdown), UI prevedibile.\r\n *\r\n * @selector ui-form-error-summary\r\n */\r\n@Component({\r\n selector: 'ui-form-error-summary',\r\n standalone: true,\r\n imports: [LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n template: `\r\n <div\r\n class=\"ui-form-error-summary\"\r\n [class.ui-form-error-summary--invalid]=\"hasErrors\"\r\n [class.ui-form-error-summary--valid]=\"!hasErrors\"\r\n >\r\n @if (hasErrors) {\r\n <div\r\n class=\"ui-form-error-summary__panel ui-form-error-summary__panel--invalid\"\r\n (mouseenter)=\"showDropdown = true\"\r\n (mouseleave)=\"showDropdown = false\"\r\n >\r\n <div\r\n class=\"ui-form-error-summary__heading\"\r\n (click)=\"showDropdown = !showDropdown\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-expanded]=\"showDropdown\"\r\n [attr.aria-label]=\"displayCount + ' errori nel form'\"\r\n (keydown.enter)=\"showDropdown = !showDropdown\"\r\n (keydown.space)=\"showDropdown = !showDropdown; $event.preventDefault()\"\r\n >\r\n <lucide-icon name=\"alert-circle\" [size]=\"20\" class=\"ui-form-error-summary__icon\" aria-hidden=\"true\" />\r\n <p class=\"ui-form-error-summary__text\">\r\n Sono presenti <strong>{{ displayCount }}</strong>\r\n {{ displayCount === 1 ? 'errore' : 'errori' }} nel form.\r\n </p>\r\n </div>\r\n\r\n <div\r\n class=\"ui-form-error-summary__dropdown\"\r\n [class.ui-form-error-summary__dropdown--visible]=\"showDropdown\"\r\n role=\"list\"\r\n aria-label=\"Elenco errori del form\"\r\n >\r\n <div class=\"ui-form-error-summary__dropdown-content\">\r\n <h4 class=\"ui-form-error-summary__dropdown-title\">Dettagli errori:</h4>\r\n <ul class=\"ui-form-error-summary__list\">\r\n @for (detail of errors; track detail.fieldKey) {\r\n <li\r\n class=\"ui-form-error-summary__item\"\r\n role=\"listitem\"\r\n (click)=\"onFieldClick(detail.fieldKey)\"\r\n tabindex=\"0\"\r\n (keydown.enter)=\"onFieldClick(detail.fieldKey)\"\r\n >\r\n <div class=\"ui-form-error-summary__field-name\">\r\n <lucide-icon name=\"arrow-right\" [size]=\"14\" class=\"ui-form-error-summary__arrow\" aria-hidden=\"true\" />\r\n {{ detail.fieldLabel }}\r\n </div>\r\n <div class=\"ui-form-error-summary__messages\">\r\n @for (err of detail.errors; track $index; let last = $last) {\r\n <span>{{ err }}@if (!last) {, }</span>\r\n }\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"ui-form-error-summary__panel ui-form-error-summary__panel--valid\" role=\"status\" aria-live=\"polite\">\r\n <lucide-icon name=\"check-circle\" [size]=\"20\" class=\"ui-form-error-summary__icon-valid\" aria-hidden=\"true\" />\r\n <p class=\"ui-form-error-summary__text-valid\">{{ validMessage }}</p>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styleUrl: './form-error-summary.component.scss',\r\n})\r\nexport class UiFormErrorSummaryComponent {\r\n /** Lista di errori dettagliati per campo. */\r\n @Input() errors: UiFormErrorDetail[] = [];\r\n\r\n /** Conteggio totale degli errori (somma di tutti i messaggi). */\r\n @Input() totalErrorCount = 0;\r\n\r\n /** Testo mostrato quando non ci sono errori. */\r\n @Input() validMessage = 'Il form è compilato correttamente';\r\n\r\n /** Emesso quando l'utente clicca su un errore per navigare al campo. */\r\n @Output() fieldClick = new EventEmitter<string>();\r\n\r\n /** @internal Stato del dropdown (solo con errori). */\r\n showDropdown = false;\r\n\r\n /** True se il form ha almeno un errore da mostrare nel summary. */\r\n get hasErrors(): boolean {\r\n return this.displayCount > 0;\r\n }\r\n\r\n /** Conteggio da visualizzare: usa totalErrorCount se fornito, altrimenti conta dai dettagli. */\r\n get displayCount(): number {\r\n return this.totalErrorCount > 0 ? this.totalErrorCount : this.errors.reduce((sum, d) => sum + d.errors.length, 0);\r\n }\r\n\r\n /** @internal Gestione click su errore. */\r\n onFieldClick(fieldKey: string): void {\r\n this.showDropdown = false;\r\n this.fieldClick.emit(fieldKey);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n forwardRef,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n signal,\r\n computed,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiFileData, UiFileInputConfig } from '../../types/field.types';\r\n\r\n/**\r\n * Componente file input standalone con drag & drop,\r\n * anteprima, validazione e supporto multiplo.\r\n *\r\n * Implementa `ControlValueAccessor` per integrazione\r\n * diretta con Angular Reactive Forms.\r\n *\r\n * @selector ui-file-input\r\n */\r\n@Component({\r\n selector: 'ui-file-input',\r\n standalone: true,\r\n imports: [LucideAngularModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiFileInputComponent),\r\n multi: true,\r\n },\r\n ],\r\n template: `\r\n <div class=\"ui-file-input\" [class.ui-file-input--disabled]=\"disabled()\" [class.ui-file-input--drag-over]=\"isDragOver()\">\r\n <!-- Area drag & drop -->\r\n @if (config?.enableDragDrop !== false) {\r\n <div\r\n class=\"ui-file-input__drop-zone\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave()\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"fileInput.click()\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"config?.dragDropText || 'Trascina i file qui o clicca per selezionare'\"\r\n (keydown.enter)=\"fileInput.click()\"\r\n (keydown.space)=\"fileInput.click()\"\r\n >\r\n <lucide-icon name=\"upload\" [size]=\"24\" aria-hidden=\"true\" />\r\n <span class=\"ui-file-input__drop-text\">\r\n {{ config?.dragDropText || 'Trascina i file qui o clicca per selezionare' }}\r\n </span>\r\n @if (config?.acceptedTypes?.length) {\r\n <span class=\"ui-file-input__hint\">\r\n Formati: {{ config!.acceptedTypes!.join(', ') }}\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <button\r\n class=\"ui-file-input__select-btn\"\r\n type=\"button\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"fileInput.click()\"\r\n >\r\n <lucide-icon name=\"paperclip\" [size]=\"16\" aria-hidden=\"true\" />\r\n {{ config?.placeholder || 'Seleziona file' }}\r\n </button>\r\n }\r\n\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n class=\"ui-file-input__native\"\r\n [accept]=\"acceptString\"\r\n [multiple]=\"config?.multiple ?? false\"\r\n [disabled]=\"disabled()\"\r\n (change)=\"onFileSelected($event)\"\r\n />\r\n\r\n <!-- Lista file selezionati -->\r\n @if (files().length > 0) {\r\n <div class=\"ui-file-input__file-list\" role=\"list\">\r\n @for (file of files(); track file.id || $index) {\r\n <div class=\"ui-file-input__file-item\" role=\"listitem\">\r\n <div class=\"ui-file-input__file-info\">\r\n <lucide-icon name=\"file\" [size]=\"16\" aria-hidden=\"true\" />\r\n <span class=\"ui-file-input__file-name\">{{ file.filename }}</span>\r\n <span class=\"ui-file-input__file-size\">{{ formatSize(file.size) }}</span>\r\n </div>\r\n @if (!disabled()) {\r\n <button\r\n class=\"ui-file-input__remove-btn\"\r\n type=\"button\"\r\n [attr.aria-label]=\"'Rimuovi ' + file.filename\"\r\n (click)=\"removeFile($index)\"\r\n >\r\n <lucide-icon name=\"x\" [size]=\"14\" aria-hidden=\"true\" />\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styleUrl: './file-input.component.scss',\r\n})\r\nexport class UiFileInputComponent implements ControlValueAccessor {\r\n /** Configurazione del file input. */\r\n @Input() config: UiFileInputConfig | undefined;\r\n\r\n /** File rimosso dalla lista. */\r\n @Output() fileRemoved = new EventEmitter<UiFileData>();\r\n\r\n /** Errore di validazione file. */\r\n @Output() validationError = new EventEmitter<string>();\r\n\r\n // ── Stato interno (signals) ──\r\n readonly files = signal<UiFileData[]>([]);\r\n readonly disabled = signal(false);\r\n readonly isDragOver = signal(false);\r\n\r\n private onChange: (value: UiFileData[]) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n /** Stringa accept per l'input nativo. */\r\n get acceptString(): string {\r\n return this.config?.acceptedTypes?.join(',') || '';\r\n }\r\n\r\n // ── ControlValueAccessor ──\r\n writeValue(value: UiFileData[]): void {\r\n this.files.set(Array.isArray(value) ? value : []);\r\n }\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled.set(isDisabled);\r\n }\r\n\r\n // ── Drag & drop ──\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver.set(true);\r\n }\r\n\r\n onDragLeave(): void {\r\n this.isDragOver.set(false);\r\n }\r\n\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver.set(false);\r\n if (this.disabled()) return;\r\n\r\n const droppedFiles = event.dataTransfer?.files;\r\n if (droppedFiles?.length) {\r\n this.processFiles(droppedFiles);\r\n }\r\n }\r\n\r\n onFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files?.length) {\r\n this.processFiles(input.files);\r\n input.value = ''; // Reset per permettere la ri-selezione dello stesso file\r\n }\r\n }\r\n\r\n removeFile(index: number): void {\r\n const current = [...this.files()];\r\n const removed = current.splice(index, 1);\r\n this.files.set(current);\r\n this.onChange(current);\r\n if (removed[0]) this.fileRemoved.emit(removed[0]);\r\n }\r\n\r\n formatSize(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\r\n }\r\n\r\n // ── Processing ──\r\n private async processFiles(fileList: FileList): Promise<void> {\r\n this.onTouched();\r\n const maxFiles = this.config?.maxFiles || Infinity;\r\n const current = this.config?.multiple ? [...this.files()] : [];\r\n const remaining = maxFiles - current.length;\r\n\r\n if (remaining <= 0) {\r\n this.validationError.emit(`Numero massimo di file raggiunto (${maxFiles})`);\r\n return;\r\n }\r\n\r\n const filesToProcess = Array.from(fileList).slice(0, remaining);\r\n\r\n for (const file of filesToProcess) {\r\n // Validazione dimensione\r\n if (this.config?.maxFileSize && file.size > this.config.maxFileSize) {\r\n this.validationError.emit(`Il file \"${file.name}\" supera la dimensione massima consentita`);\r\n continue;\r\n }\r\n\r\n // Validazione tipo\r\n if (this.config?.acceptedTypes?.length) {\r\n const isAccepted = this.config.acceptedTypes.some((type) => {\r\n if (type.endsWith('/*')) {\r\n return file.type.startsWith(type.split('/')[0] + '/');\r\n }\r\n return file.type === type;\r\n });\r\n if (!isAccepted) {\r\n this.validationError.emit(`Il formato del file \"${file.name}\" non e accettato`);\r\n continue;\r\n }\r\n }\r\n\r\n const content = new Uint8Array(await file.arrayBuffer());\r\n const ext = file.name.split('.').pop() || '';\r\n\r\n const fileData: UiFileData = {\r\n filename: file.name,\r\n content,\r\n mimeType: file.type,\r\n extension: ext,\r\n size: file.size,\r\n needsUpload: true,\r\n id: `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`, // NOSONAR - Used for non-cryptographic file ID generation in UI\r\n timestamp: new Date(),\r\n };\r\n\r\n // Genera preview per immagini\r\n if (this.config?.showPreview && file.type.startsWith('image/')) {\r\n fileData.previewUrl = URL.createObjectURL(file);\r\n }\r\n\r\n current.push(fileData);\r\n }\r\n\r\n this.files.set(current);\r\n this.onChange(current);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport * as locationData from '../../../sources/location-data.opt.json';\r\nimport * as nazioniData from '../../../sources/nazioni.opt.json';\r\n\r\n// ─── Interfacce JSON ottimizzate ──────────────────────────────────\r\n\r\n/** Voce nazione nel JSON ottimizzato. */\r\nexport interface MinifiedNazioneOption {\r\n /** Codice nazione (es. `'ITA'`). */\r\n x: string;\r\n /** Descrizione (es. `'Italia'`). */\r\n d: string;\r\n}\r\n\r\n/** Voce provincia/comune nel JSON ottimizzato. */\r\nexport interface MinifiedSelectOption {\r\n /** Codice (provincia o comune). */\r\n x: string;\r\n /** Descrizione. */\r\n d: string;\r\n /** CAP singolo o multipli. */\r\n c?: string | string[];\r\n}\r\n\r\ninterface MinifiedLocationMap {\r\n province: MinifiedSelectOption[];\r\n comuniPerProvincia: Record<string, MinifiedSelectOption[]>;\r\n}\r\n\r\ninterface MinifiedNazioniMap {\r\n nazioni: MinifiedNazioneOption[];\r\n}\r\n\r\n// ─── Interfacce pubbliche (formato legacy compatibile) ───────────\r\n\r\n/** Nazione. */\r\nexport interface UiNazione {\r\n codStatoPk: string;\r\n codiceCatastale: string;\r\n descrizione: string;\r\n}\r\n\r\n/** Provincia. */\r\nexport interface UiProvincia {\r\n codiceProvinciaPk: string;\r\n nomeProvincia: string;\r\n siglaProvincia: string;\r\n visibile: boolean;\r\n}\r\n\r\n/** Comune. */\r\nexport interface UiComune {\r\n codiceCatastale: string;\r\n codiceComunePk: string;\r\n comuneSoppresso: boolean;\r\n nomeComune: string;\r\n prov: UiProvincia;\r\n visibile: boolean;\r\n}\r\n\r\n/**\r\n * Servizio per la gestione dei dati geografici italiani\r\n * da file JSON statici ottimizzati.\r\n *\r\n * Elimina la necessita di chiamate backend per nazioni,\r\n * province, comuni e CAP. I dati vengono caricati in memoria\r\n * al primo accesso e poi serviti dalla cache.\r\n *\r\n * @providedIn 'root'\r\n *\r\n * @example\r\n * ```typescript\r\n * const nazioni = await this.locationService.getNazioni();\r\n * const province = await this.locationService.getProvince();\r\n * const comuni = await this.locationService.getComuniByProvincia('015');\r\n * const caps = await this.locationService.getCapList('015146');\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiLocationService {\r\n private readonly nazioniMap: MinifiedNazioniMap;\r\n private readonly locationMap: MinifiedLocationMap;\r\n private readonly nazioniCache = new Map<string, UiNazione>();\r\n private readonly provinceCache = new Map<string, UiProvincia>();\r\n private readonly comuniCache = new Map<string, UiComune>();\r\n\r\n constructor() {\r\n this.nazioniMap = nazioniData as MinifiedNazioniMap;\r\n this.locationMap = locationData as any;\r\n this.initializeCaches();\r\n }\r\n\r\n // ─── API pubblica ──────────────────────────────────────────────\r\n\r\n /** Elenco completo delle nazioni (Italia prima). */\r\n async getNazioni(): Promise<{ data: UiNazione[] }> {\r\n const nazioni = Array.from(this.nazioniCache.values());\r\n return { data: this.sortNazioniItaliaFirst(nazioni) };\r\n }\r\n\r\n /** Elenco completo delle province, ordinate alfabeticamente. */\r\n async getProvince(): Promise<{ content: UiProvincia[] }> {\r\n const province = Array.from(this.provinceCache.values()).sort((a, b) =>\r\n a.nomeProvincia.localeCompare(b.nomeProvincia, 'it'),\r\n );\r\n return { content: province };\r\n }\r\n\r\n /** Elenco dei comuni per una specifica provincia. */\r\n async getComuniByProvincia(provinciaId: string): Promise<UiComune[]> {\r\n const comuniMin = this.locationMap.comuniPerProvincia[provinciaId] || [];\r\n const provincia = this.provinceCache.get(provinciaId);\r\n if (!provincia) return [];\r\n\r\n return comuniMin\r\n .map((c) => ({\r\n codiceCatastale: c.x,\r\n codiceComunePk: c.x,\r\n comuneSoppresso: false,\r\n nomeComune: c.d,\r\n prov: provincia,\r\n visibile: true,\r\n }))\r\n .sort((a, b) => a.nomeComune.localeCompare(b.nomeComune, 'it'));\r\n }\r\n\r\n /** Elenco dei CAP per un comune. */\r\n async getCapList(comuneId: string): Promise<string[]> {\r\n for (const comuni of Object.values(this.locationMap.comuniPerProvincia)) {\r\n const comune = comuni.find((c) => c.x === comuneId);\r\n if (comune?.c) {\r\n return Array.isArray(comune.c) ? comune.c : [comune.c];\r\n }\r\n }\r\n return [];\r\n }\r\n\r\n /** Dati completi di una location (nazione, provincia o comune). */\r\n async getLocationFullData(\r\n type: 'nazione' | 'provincia' | 'comune',\r\n id: string,\r\n provinciaId?: string,\r\n ): Promise<UiNazione | UiProvincia | UiComune | null> {\r\n switch (type) {\r\n case 'nazione':\r\n return this.nazioniCache.get(id) ?? null;\r\n case 'provincia':\r\n return this.provinceCache.get(id) ?? null;\r\n case 'comune': {\r\n if (!provinciaId) return this.comuniCache.get(id) ?? null;\r\n const comuni = await this.getComuniByProvincia(provinciaId);\r\n return comuni.find((c) => c.codiceComunePk === id) ?? null;\r\n }\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n // ─── Inizializzazione cache ────────────────────────────────────\r\n\r\n private initializeCaches(): void {\r\n // Nazioni\r\n for (const n of this.nazioniMap.nazioni) {\r\n this.nazioniCache.set(n.x, {\r\n codStatoPk: n.x,\r\n codiceCatastale: n.x,\r\n descrizione: n.d,\r\n });\r\n }\r\n\r\n // Province\r\n for (const p of this.locationMap.province) {\r\n this.provinceCache.set(p.x, {\r\n codiceProvinciaPk: p.x,\r\n nomeProvincia: p.d,\r\n siglaProvincia: p.x,\r\n visibile: true,\r\n });\r\n }\r\n\r\n // Comuni (con riferimento alla provincia)\r\n for (const [provinciaId, comuni] of Object.entries(this.locationMap.comuniPerProvincia)) {\r\n const provincia = this.provinceCache.get(provinciaId);\r\n if (!provincia) continue;\r\n for (const c of comuni) {\r\n this.comuniCache.set(c.x, {\r\n codiceCatastale: c.x,\r\n codiceComunePk: c.x,\r\n comuneSoppresso: false,\r\n nomeComune: c.d,\r\n prov: provincia,\r\n visibile: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n private sortNazioniItaliaFirst(nazioni: UiNazione[]): UiNazione[] {\r\n return nazioni.sort((a, b) => {\r\n const aItalia = a.descrizione?.toLowerCase().includes('italia') || a.codStatoPk === 'ITA';\r\n const bItalia = b.descrizione?.toLowerCase().includes('italia') || b.codStatoPk === 'ITA';\r\n if (aItalia && !bItalia) return -1;\r\n if (!aItalia && bItalia) return 1;\r\n return (a.descrizione || '').localeCompare(b.descrizione || '', 'it', { sensitivity: 'base' });\r\n });\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n forwardRef,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectorRef,\r\n Injector,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormBuilder,\r\n FormGroup,\r\n NG_VALUE_ACCESSOR,\r\n NG_VALIDATORS,\r\n FormControl,\r\n AbstractControl,\r\n ValidationErrors,\r\n Validators,\r\n Validator,\r\n NgControl,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { Subject, combineLatest, takeUntil, distinctUntilChanged, startWith, map } from 'rxjs';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { UiLocationService, UiNazione, UiProvincia, UiComune } from '../../services/location.service';\r\nimport { UiLocationConfig, UiLocationValue } from '../../types/territoriale.types';\r\n\r\n/**\r\n * Interfaccia interna per i CAP nel componente.\r\n */\r\ninterface UiCapOption {\r\n /** ID del CAP. */\r\n id: string;\r\n /** Codice CAP visualizzato. */\r\n codice: string;\r\n /** ID del comune associato. */\r\n comuneId: string;\r\n}\r\n\r\n/**\r\n * Componente standalone per la selezione di dati geografici italiani o esteri.\r\n *\r\n * Supporta due modalita:\r\n * - **Italia**: selezione a cascata nazione -> provincia -> comune -> CAP\r\n * - **Estero**: selezione nazione + campo testo libero per il comune\r\n *\r\n * Campi opzionali configurabili: indirizzo, mail, PEC, telefono.\r\n *\r\n * Implementa `ControlValueAccessor` e `Validator` per l'integrazione\r\n * diretta con Angular Reactive Forms.\r\n *\r\n * Utilizza dati da JSON statici tramite `UiLocationService`\r\n * (nessuna dipendenza al backend).\r\n *\r\n * @selector ui-specifica-territoriale\r\n *\r\n * @example\r\n * ```html\r\n * <ui-specifica-territoriale\r\n * [formControl]=\"myControl\"\r\n * [config]=\"{ italyByDefault: true, cap: { show: true } }\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-specifica-territoriale',\r\n standalone: true,\r\n imports: [ReactiveFormsModule, MatFormFieldModule, MatSelectModule, MatInputModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiSpecificaTerritorialeComponent),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => UiSpecificaTerritorialeComponent),\r\n multi: true,\r\n },\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: './specifica-territoriale.component.html',\r\n styleUrl: './specifica-territoriale.component.scss',\r\n})\r\nexport class UiSpecificaTerritorialeComponent implements ControlValueAccessor, Validator, OnInit, OnDestroy {\r\n /** Configurazione del componente. */\r\n @Input() config: UiLocationConfig = {};\r\n\r\n /** Stato disabilitato globale. */\r\n @Input() disabled = false;\r\n\r\n // ─── Pattern di validazione ──────────────────────────────────────\r\n private readonly EMAIL_PATTERN = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n private readonly PEC_PATTERN = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n private readonly PHONE_PATTERN = /^[+]?[0-9\\s\\-()]{6,16}$/;\r\n\r\n // ─── Stato interno ──────────────────────────────────────────────\r\n form!: FormGroup;\r\n isItalian = false;\r\n isForeign = false;\r\n ngControl!: NgControl;\r\n\r\n /** Elenco nazioni disponibili. */\r\n nazioni: UiNazione[] = [];\r\n /** Elenco province disponibili. */\r\n province: UiProvincia[] = [];\r\n /** Comuni filtrati per la provincia selezionata. */\r\n filteredComuni: UiComune[] = [];\r\n /** CAP filtrati per il comune selezionato. */\r\n filteredCaps: UiCapOption[] = [];\r\n\r\n /** Promise di inizializzazione (utile per test e table-territoriale). */\r\n initializationPromise: Promise<void> | null = null;\r\n\r\n private readonly destroy$ = new Subject<void>();\r\n private onChange = (_value: UiLocationValue) => {};\r\n private onTouched = () => {};\r\n private onValidatorChange = () => {};\r\n private subscriptionsInitialized = false;\r\n private pendingWriteValue: UiLocationValue | null = null;\r\n private isInitializing = false;\r\n private tipologicheLoaded = false;\r\n\r\n constructor(\r\n private readonly fb: FormBuilder,\r\n private readonly injector: Injector,\r\n private readonly cdr: ChangeDetectorRef,\r\n private readonly locationService: UiLocationService,\r\n ) {\r\n this.initializeForm();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.setupNgControl();\r\n this.initializationPromise = this.initializeComponent();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n // ─── ControlValueAccessor ───────────────────────────────────────\r\n\r\n writeValue(value: UiLocationValue | null): void {\r\n if (!this.tipologicheLoaded) {\r\n this.pendingWriteValue = value;\r\n return;\r\n }\r\n this.processWriteValue(value);\r\n }\r\n\r\n registerOnChange(fn: (value: UiLocationValue) => void): void {\r\n this.onChange = (value) => {\r\n if (!this.isInitializing) fn(value);\r\n };\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n registerOnValidatorChange(fn: () => void): void {\r\n this.onValidatorChange = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n if (isDisabled) {\r\n this.form.disable();\r\n } else {\r\n this.form.enable();\r\n this.applyFieldsDisabledState();\r\n }\r\n }\r\n\r\n // ─── Validator ──────────────────────────────────────────────────\r\n\r\n validate(_control: AbstractControl): ValidationErrors | null {\r\n if (!this.form) return null;\r\n\r\n const errors: ValidationErrors = {};\r\n const isNazioneRequired = this.config.nazione?.required !== false;\r\n const isProvinciaRequired = this.config.provincia?.required !== false;\r\n const isComuneRequired = this.config.comune?.required !== false;\r\n const isComuneEsteroRequired = this.config.comuneEstero?.required !== false;\r\n\r\n // Validazione nazione\r\n if (isNazioneRequired && !this.form.get('nazioneId')?.value) {\r\n errors['nazioneRequired'] = 'Seleziona una nazione';\r\n }\r\n\r\n // Validazioni Italia\r\n if (this.isItalian) {\r\n if (isProvinciaRequired && !this.form.get('provinciaId')?.value) {\r\n errors['provinciaRequired'] = 'Seleziona una provincia';\r\n }\r\n if (isComuneRequired && !this.form.get('comuneId')?.value) {\r\n errors['comuneRequired'] = 'Seleziona un comune';\r\n }\r\n if (this.config.cap?.required && this.showCAP && !this.form.get('cap')?.value) {\r\n errors['capRequired'] = 'Inserisci il CAP';\r\n }\r\n if (this.config.indirizzo?.required && this.showIndirizzo) {\r\n const v = this.form.get('indirizzo')?.value;\r\n if (!v || v.trim() === '') errors['indirizzoRequired'] = \"Inserisci l'indirizzo\";\r\n }\r\n this.validateContactFields(errors);\r\n }\r\n\r\n // Validazioni estero\r\n if (this.isForeign) {\r\n const comuneEstero = this.form.get('comuneEstero')?.value;\r\n if (isComuneEsteroRequired && (!comuneEstero || comuneEstero.trim() === '')) {\r\n errors['comuneEsteroRequired'] = 'Inserisci il comune estero';\r\n }\r\n }\r\n\r\n return Object.keys(errors).length > 0 ? errors : null;\r\n }\r\n\r\n // ─── API pubblica ───────────────────────────────────────────────\r\n\r\n /** Marca tutti i controlli interni come touched. */\r\n markAsTouched(): void {\r\n Object.values(this.form.controls).forEach((c) => c.markAsTouched());\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Verifica se mostrare gli errori per un campo interno. */\r\n shouldShowFieldErrors(fieldKey: string): boolean {\r\n const control = this.form.get(fieldKey);\r\n return !!(control?.invalid && (control.touched || control.dirty));\r\n }\r\n\r\n /** Errori di un campo interno come array di messaggi. */\r\n getFieldErrors(fieldKey: string): string[] {\r\n const control = this.form.get(fieldKey);\r\n if (!control?.errors) return [];\r\n const messages: string[] = [];\r\n const errs = control.errors;\r\n if (errs['required']) messages.push('Campo obbligatorio');\r\n if (errs['pattern']) messages.push('Formato non valido');\r\n if (errs['email']) messages.push('Email non valida');\r\n return messages;\r\n }\r\n\r\n /** Handler blur per propagare il touched. */\r\n onBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n /** Resetta lo stato del componente. */\r\n resetComponentState(): void {\r\n this.isItalian = false;\r\n this.isForeign = false;\r\n this.filteredComuni = [];\r\n this.filteredCaps = [];\r\n this.form.get('comuneId')?.disable({ emitEvent: false });\r\n this.form.get('cap')?.disable({ emitEvent: false });\r\n this.updateValidators();\r\n }\r\n\r\n // ─── Getter calcolati ───────────────────────────────────────────\r\n\r\n /** Labels personalizzabili con valori di default. */\r\n get labels() {\r\n return {\r\n nazione: this.config.labels?.nazione || 'Nazione',\r\n provincia: this.config.labels?.provincia || 'Provincia',\r\n comune: this.config.labels?.comune || 'Comune',\r\n cap: this.config.labels?.cap || 'CAP',\r\n indirizzo: this.config.labels?.indirizzo || 'Indirizzo',\r\n comuneEstero: this.config.labels?.comuneEstero || 'Comune Estero',\r\n mail: this.config.labels?.mail || 'Email',\r\n pec: this.config.labels?.pec || 'PEC',\r\n telefono: this.config.labels?.telefono || 'Telefono',\r\n };\r\n }\r\n\r\n get hasValidationErrors(): boolean {\r\n const externalInvalid = !!(\r\n this.ngControl?.control?.invalid &&\r\n (this.ngControl.control.touched || this.ngControl.control.dirty)\r\n );\r\n if (externalInvalid) return true;\r\n\r\n const isInteracted =\r\n this.form?.touched || this.form?.dirty || this.ngControl?.control?.touched || this.ngControl?.control?.dirty;\r\n if (isInteracted) {\r\n return !!this.validate(null as any);\r\n }\r\n return false;\r\n }\r\n\r\n get validationErrors(): string[] {\r\n // Errori esterni dal FormBuilder\r\n if (this.ngControl?.control?.errors) {\r\n const errors: string[] = [];\r\n if (this.ngControl.control.errors['required']) {\r\n errors.push('Inizia selezionando la nazione');\r\n }\r\n if (errors.length > 0) return errors;\r\n }\r\n\r\n // Errori interni\r\n const internalErrors = this.validate(null as any);\r\n if (!internalErrors) return [];\r\n return Object.values(internalErrors) as string[];\r\n }\r\n\r\n get showCAP(): boolean {\r\n return this.config.cap?.show !== false;\r\n }\r\n get showIndirizzo(): boolean {\r\n return this.config.indirizzo?.show !== false;\r\n }\r\n get showMail(): boolean {\r\n return this.config.mail?.show === true;\r\n }\r\n get showPEC(): boolean {\r\n return this.config.pec?.show === true;\r\n }\r\n get showTelefono(): boolean {\r\n return this.config.telefono?.show === true;\r\n }\r\n\r\n get capColumns(): number {\r\n return this.config.cap?.columns || 6;\r\n }\r\n get indirizzoColumns(): number {\r\n return this.config.indirizzo?.columns || 12;\r\n }\r\n get mailColumns(): number {\r\n return this.config.mail?.columns || 6;\r\n }\r\n get pecColumns(): number {\r\n return this.config.pec?.columns || 6;\r\n }\r\n get telefonoColumns(): number {\r\n return this.config.telefono?.columns || 6;\r\n }\r\n\r\n get isItalyByDefault(): boolean {\r\n return this.config.italyByDefault === true;\r\n }\r\n\r\n get isCapDisabled(): boolean {\r\n const comuneId = this.form.get('comuneId')?.value;\r\n return !comuneId || this.filteredCaps.length === 0 || this.filteredCaps.length === 1;\r\n }\r\n\r\n get isNazioneDisabled(): boolean {\r\n return this.disabled || this.config.italyByDefault === true;\r\n }\r\n\r\n get isRequired(): boolean {\r\n if (this.config.nazione?.required !== false) return true;\r\n if (!this.ngControl?.control) return false;\r\n const validator = this.ngControl.control.validator;\r\n if (validator) {\r\n const errors = validator({} as AbstractControl);\r\n return !!errors?.['required'];\r\n }\r\n return false;\r\n }\r\n\r\n // ─── Inizializzazione ──────────────────────────────────────────\r\n\r\n private async initializeComponent(): Promise<void> {\r\n try {\r\n await this.loadLocationData();\r\n this.tipologicheLoaded = true;\r\n\r\n if (this.pendingWriteValue !== null) {\r\n this.processWriteValue(this.pendingWriteValue);\r\n this.pendingWriteValue = null;\r\n } else {\r\n this.applyInitialConfiguration();\r\n }\r\n\r\n if (!this.subscriptionsInitialized) {\r\n this.setupFormSubscriptions();\r\n this.subscriptionsInitialized = true;\r\n }\r\n } catch (error) {\r\n console.error('[UiSpecificaTerritoriale] Errore inizializzazione:', error);\r\n this.tipologicheLoaded = false;\r\n }\r\n }\r\n\r\n private initializeForm(): void {\r\n this.form = this.fb.group({\r\n nazioneId: [null, Validators.required],\r\n provinciaId: [null],\r\n comuneId: [{ value: null, disabled: true }],\r\n cap: [{ value: null, disabled: true }],\r\n comuneEstero: [null],\r\n indirizzo: [null],\r\n mail: [null],\r\n pec: [null],\r\n telefono: [null],\r\n });\r\n }\r\n\r\n private setupNgControl(): void {\r\n const ngControl = this.injector.get(NgControl, null, { self: true, optional: true });\r\n if (ngControl) {\r\n this.ngControl = ngControl;\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n private async loadLocationData(): Promise<void> {\r\n const [nazioniResult, provinceResult] = await Promise.all([\r\n this.locationService.getNazioni(),\r\n this.locationService.getProvince(),\r\n ]);\r\n this.nazioni = nazioniResult.data;\r\n this.province = provinceResult.content;\r\n }\r\n\r\n // ─── Gestione writeValue ────────────────────────────────────────\r\n\r\n private processWriteValue(value: UiLocationValue | null): void {\r\n this.isInitializing = true;\r\n\r\n if (value) {\r\n const processedValue = this.handleItalyByDefaultValue(value);\r\n this.form.patchValue(processedValue, { emitEvent: false });\r\n\r\n this.updateComponentState(processedValue).then(() => {\r\n this.applyInitialConfiguration();\r\n this.isInitializing = false;\r\n this.form.patchValue(processedValue, { emitEvent: true });\r\n this.handleTerritorialChanges(\r\n processedValue.nazioneId || '',\r\n processedValue.provinciaId || '',\r\n processedValue.comuneId || '',\r\n );\r\n this.updateValidators();\r\n Object.values(this.form.controls).forEach((ctrl) => ctrl.updateValueAndValidity({ emitEvent: false }));\r\n this.form.updateValueAndValidity();\r\n });\r\n } else {\r\n this.form.reset(undefined, { emitEvent: false });\r\n this.resetComponentState();\r\n this.applyInitialConfiguration();\r\n this.isInitializing = false;\r\n }\r\n }\r\n\r\n private handleItalyByDefaultValue(value: UiLocationValue): UiLocationValue {\r\n if (!this.config.italyByDefault) return value;\r\n if (value.nazioneId && value.nazioneId !== 'ITA') {\r\n return { ...value, nazioneId: 'ITA', comuneEstero: undefined };\r\n }\r\n return value;\r\n }\r\n\r\n // ─── Subscriptions ──────────────────────────────────────────────\r\n\r\n private setupFormSubscriptions(): void {\r\n // Subscription per i cambiamenti territoriali (nazione/provincia/comune)\r\n combineLatest([\r\n this.form\r\n .get('nazioneId')!\r\n .valueChanges.pipe(startWith(this.form.get('nazioneId')!.value), distinctUntilChanged()),\r\n this.form\r\n .get('provinciaId')!\r\n .valueChanges.pipe(startWith(this.form.get('provinciaId')!.value), distinctUntilChanged()),\r\n this.form.get('comuneId')!.valueChanges.pipe(startWith(this.form.get('comuneId')!.value), distinctUntilChanged()),\r\n ])\r\n .pipe(\r\n takeUntil(this.destroy$),\r\n map(([nazioneId, provinciaId, comuneId]) => ({ nazioneId, provinciaId, comuneId })),\r\n )\r\n .subscribe(({ nazioneId, provinciaId, comuneId }) => {\r\n if (!this.isInitializing && this.tipologicheLoaded) {\r\n this.handleTerritorialChanges(nazioneId, provinciaId, comuneId);\r\n }\r\n });\r\n\r\n // Subscription per tutti i cambiamenti del form\r\n this.form.valueChanges\r\n .pipe(\r\n takeUntil(this.destroy$),\r\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)),\r\n )\r\n .subscribe((formValue) => {\r\n if (!this.isInitializing && this.tipologicheLoaded) {\r\n this.onChange(formValue);\r\n this.notifyValidationChange();\r\n }\r\n });\r\n\r\n this.cdr.detectChanges();\r\n }\r\n\r\n // ─── Logica territoriale ────────────────────────────────────────\r\n\r\n private async handleTerritorialChanges(nazioneId: string, provinciaId: string, comuneId: string): Promise<void> {\r\n this.updateNationalityState(nazioneId);\r\n await this.updateTerritorialData(provinciaId, comuneId);\r\n this.updateValidators();\r\n }\r\n\r\n private updateNationalityState(nazioneId: string): void {\r\n const nazione = this.nazioni.find((n) => n.codStatoPk === nazioneId);\r\n this.isItalian = nazione?.codStatoPk === 'ITA';\r\n this.isForeign = !!(nazione && nazione.codStatoPk !== 'ITA');\r\n }\r\n\r\n private async updateTerritorialData(provinciaId: string, comuneId: string): Promise<void> {\r\n if (this.isItalian && provinciaId) {\r\n await this.updateFilteredComuni(provinciaId);\r\n } else {\r\n this.filteredComuni = [];\r\n }\r\n\r\n if (this.isItalian && comuneId) {\r\n await this.updateFilteredCaps(comuneId);\r\n } else {\r\n this.filteredCaps = [];\r\n }\r\n\r\n this.applyFieldsDisabledState();\r\n }\r\n\r\n private async updateFilteredComuni(provinciaId: string): Promise<void> {\r\n if (!provinciaId) {\r\n this.filteredComuni = [];\r\n return;\r\n }\r\n try {\r\n this.filteredComuni = await this.locationService.getComuniByProvincia(provinciaId);\r\n const currentComuneId = this.form.get('comuneId')?.value;\r\n if (currentComuneId && !this.filteredComuni.find((c) => c.codiceComunePk === currentComuneId)) {\r\n this.form.patchValue({ comuneId: null }, { emitEvent: false });\r\n }\r\n } catch {\r\n this.filteredComuni = [];\r\n }\r\n }\r\n\r\n private async updateFilteredCaps(comuneId: string): Promise<void> {\r\n if (!comuneId) {\r\n this.filteredCaps = [];\r\n this.form.patchValue({ cap: null }, { emitEvent: true });\r\n return;\r\n }\r\n\r\n const caps = await this.locationService.getCapList(comuneId);\r\n this.filteredCaps = caps.map((capCode) => ({ id: capCode, codice: capCode, comuneId }));\r\n\r\n const currentCap = this.form.get('cap')?.value;\r\n if (this.filteredCaps.length === 1) {\r\n this.form.patchValue({ cap: this.filteredCaps[0].id }, { emitEvent: true });\r\n } else if (this.filteredCaps.length > 1) {\r\n if (!currentCap || !this.filteredCaps.some((c) => c.id === currentCap)) {\r\n this.form.patchValue({ cap: null }, { emitEvent: true });\r\n }\r\n } else {\r\n this.form.patchValue({ cap: null }, { emitEvent: true });\r\n }\r\n }\r\n\r\n private async updateComponentState(value: UiLocationValue): Promise<void> {\r\n this.updateNationalityState(value.nazioneId || '');\r\n await this.updateFilteredComuni(value.provinciaId || '');\r\n await this.updateFilteredCaps(value.comuneId || '');\r\n this.applyFieldsDisabledState();\r\n this.updateValidators();\r\n }\r\n\r\n // ─── Stato campi ───────────────────────────────────────────────\r\n\r\n private applyFieldsDisabledState(): void {\r\n if (this.disabled) {\r\n this.form.disable({ emitEvent: false });\r\n return;\r\n }\r\n\r\n const comuneControl = this.form.get('comuneId');\r\n const capControl = this.form.get('cap');\r\n const nazioneControl = this.form.get('nazioneId');\r\n\r\n // Comune abilitato solo se Italia + provincia selezionata\r\n if (this.isItalian && this.form.get('provinciaId')?.value) {\r\n comuneControl?.enable({ emitEvent: false });\r\n } else {\r\n comuneControl?.disable({ emitEvent: false });\r\n }\r\n\r\n // CAP segue logica specifica\r\n if (this.isCapDisabled) {\r\n capControl?.disable({ emitEvent: false });\r\n } else {\r\n capControl?.enable({ emitEvent: false });\r\n }\r\n\r\n // Nazione disabilitata se italyByDefault\r\n if (this.isItalyByDefault) {\r\n nazioneControl?.disable({ emitEvent: false });\r\n } else {\r\n nazioneControl?.enable({ emitEvent: false });\r\n }\r\n }\r\n\r\n // ─── Validazione dinamica ──────────────────────────────────────\r\n\r\n private updateValidators(): void {\r\n const controls: Record<string, AbstractControl | null> = {\r\n nazione: this.form.get('nazioneId'),\r\n provincia: this.form.get('provinciaId'),\r\n comune: this.form.get('comuneId'),\r\n comuneEstero: this.form.get('comuneEstero'),\r\n cap: this.form.get('cap'),\r\n indirizzo: this.form.get('indirizzo'),\r\n mail: this.form.get('mail'),\r\n pec: this.form.get('pec'),\r\n telefono: this.form.get('telefono'),\r\n };\r\n\r\n // Pulisci tutti i validatori\r\n Object.values(controls).forEach((c) => c?.clearValidators());\r\n\r\n // Nazione\r\n if (this.config.nazione?.required !== false) {\r\n controls['nazione']?.setValidators(Validators.required);\r\n }\r\n\r\n if (this.isItalian) {\r\n if (this.config.provincia?.required !== false) {\r\n controls['provincia']?.setValidators(Validators.required);\r\n }\r\n if (this.config.comune?.required !== false) {\r\n controls['comune']?.setValidators(Validators.required);\r\n }\r\n if (this.config.cap?.required && this.showCAP) {\r\n controls['cap']?.setValidators(Validators.required);\r\n }\r\n if (this.config.indirizzo?.required && this.showIndirizzo) {\r\n controls['indirizzo']?.setValidators(Validators.required);\r\n }\r\n this.applyContactValidators(controls);\r\n } else if (this.isForeign) {\r\n if (this.config.comuneEstero?.required !== false) {\r\n controls['comuneEstero']?.setValidators(Validators.required);\r\n }\r\n }\r\n\r\n // Aggiorna senza emettere eventi\r\n Object.values(controls).forEach((c) => c?.updateValueAndValidity({ emitEvent: false }));\r\n this.notifyValidationChange();\r\n }\r\n\r\n private applyContactValidators(controls: Record<string, AbstractControl | null>): void {\r\n if (this.config.mail?.required && this.showMail) {\r\n controls['mail']?.setValidators([Validators.required, Validators.pattern(this.EMAIL_PATTERN)]);\r\n } else if (this.showMail) {\r\n controls['mail']?.setValidators([Validators.pattern(this.EMAIL_PATTERN)]);\r\n }\r\n\r\n if (this.config.pec?.required && this.showPEC) {\r\n controls['pec']?.setValidators([Validators.required, Validators.pattern(this.PEC_PATTERN)]);\r\n } else if (this.showPEC) {\r\n controls['pec']?.setValidators([Validators.pattern(this.PEC_PATTERN)]);\r\n }\r\n\r\n if (this.config.telefono?.required && this.showTelefono) {\r\n controls['telefono']?.setValidators([Validators.required, Validators.pattern(this.PHONE_PATTERN)]);\r\n } else if (this.showTelefono) {\r\n controls['telefono']?.setValidators([Validators.pattern(this.PHONE_PATTERN)]);\r\n }\r\n }\r\n\r\n private validateContactFields(errors: ValidationErrors): void {\r\n if (this.config.mail?.required && this.showMail) {\r\n const v = this.form.get('mail')?.value;\r\n if (!v || v.trim() === '') {\r\n errors['mailRequired'] = \"Inserisci l'email\";\r\n } else if (!this.EMAIL_PATTERN.test(v)) {\r\n errors['mailInvalid'] = \"Inserisci un'email valida\";\r\n }\r\n }\r\n if (this.config.pec?.required && this.showPEC) {\r\n const v = this.form.get('pec')?.value;\r\n if (!v || v.trim() === '') {\r\n errors['pecRequired'] = 'Inserisci la PEC';\r\n } else if (!this.PEC_PATTERN.test(v)) {\r\n errors['pecInvalid'] = 'Inserisci una PEC valida';\r\n }\r\n }\r\n if (this.config.telefono?.required && this.showTelefono) {\r\n const v = this.form.get('telefono')?.value;\r\n if (!v || v.trim() === '') {\r\n errors['telefonoRequired'] = 'Inserisci il telefono';\r\n } else if (!this.PHONE_PATTERN.test(v)) {\r\n errors['telefonoInvalid'] = 'Inserisci un numero di telefono valido';\r\n }\r\n }\r\n }\r\n\r\n // ─── Configurazione iniziale ───────────────────────────────────\r\n\r\n private applyInitialConfiguration(): void {\r\n const nazioneControl = this.form.get('nazioneId');\r\n const currentNazioneId = nazioneControl?.value;\r\n\r\n if (this.config.italyByDefault) {\r\n const italia = this.nazioni.find((n) => n.codStatoPk === 'ITA');\r\n if (italia && (!currentNazioneId || currentNazioneId !== 'ITA')) {\r\n this.form.patchValue({ nazioneId: italia.codStatoPk }, { emitEvent: false });\r\n }\r\n this.updateNationalityState('ITA');\r\n nazioneControl?.disable({ emitEvent: false });\r\n } else {\r\n if (currentNazioneId) this.updateNationalityState(currentNazioneId);\r\n if (!this.disabled) nazioneControl?.enable({ emitEvent: false });\r\n }\r\n\r\n this.updateValidators();\r\n }\r\n\r\n private notifyValidationChange(): void {\r\n if (this.onValidatorChange) {\r\n setTimeout(() => this.onValidatorChange(), 0);\r\n }\r\n }\r\n}\r\n","<!--\r\n Componente per la selezione di dati geografici (Italia/Estero).\r\n Utilizza il flow control moderno di Angular (@if, @for).\r\n-->\r\n<div\r\n class=\"ui-location\"\r\n [formGroup]=\"form\"\r\n [class.ui-location--foreign]=\"isForeign\"\r\n [class.ui-location--italian]=\"isItalian\"\r\n>\r\n <!-- ==================== NAZIONE ==================== -->\r\n <div class=\"ui-location__field-row\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n class=\"ui-location__full-width\"\r\n [class.ui-location__italy-default]=\"config.italyByDefault\"\r\n >\r\n <mat-label>{{ labels.nazione }}</mat-label>\r\n <mat-select\r\n formControlName=\"nazioneId\"\r\n [disabled]=\"disabled || isNazioneDisabled\"\r\n (blur)=\"onBlur()\"\r\n aria-label=\"Seleziona nazione\"\r\n >\r\n <mat-option [value]=\"null\">Seleziona nazione</mat-option>\r\n @for (nazione of nazioni; track nazione.codStatoPk) {\r\n <mat-option [value]=\"nazione.codStatoPk\">\r\n {{ nazione.descrizione }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (shouldShowFieldErrors('nazioneId')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('nazioneId'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- ==================== CAMPI ITALIA ==================== -->\r\n @if (isItalian) {\r\n <div class=\"ui-location__provincia-comune\">\r\n <!-- Provincia -->\r\n <div class=\"ui-location__field-row\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.provincia }}</mat-label>\r\n <mat-select\r\n formControlName=\"provinciaId\"\r\n [disabled]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n aria-label=\"Seleziona provincia\"\r\n >\r\n <mat-option [value]=\"null\">Seleziona provincia</mat-option>\r\n @for (prov of province; track prov.codiceProvinciaPk) {\r\n <mat-option [value]=\"prov.codiceProvinciaPk\">\r\n {{ prov.nomeProvincia }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (shouldShowFieldErrors('provinciaId')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('provinciaId'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- Comune -->\r\n <div class=\"ui-location__field-row\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.comune }}</mat-label>\r\n <mat-select\r\n formControlName=\"comuneId\"\r\n [disabled]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n aria-label=\"Seleziona comune\"\r\n >\r\n <mat-option [value]=\"null\">Seleziona comune</mat-option>\r\n @for (comune of filteredComuni; track comune.codiceComunePk) {\r\n <mat-option [value]=\"comune.codiceComunePk\">\r\n {{ comune.nomeComune }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (shouldShowFieldErrors('comuneId')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('comuneId'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== GRIGLIA CAMPI DINAMICI ==================== -->\r\n <div class=\"ui-location__dynamic-grid\">\r\n <!-- CAP -->\r\n @if (showCAP && isItalian) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + capColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.cap }}</mat-label>\r\n <mat-select\r\n formControlName=\"cap\"\r\n [disabled]=\"disabled || isCapDisabled\"\r\n (blur)=\"onBlur()\"\r\n aria-label=\"Seleziona CAP\"\r\n >\r\n <mat-option [value]=\"null\">Seleziona CAP</mat-option>\r\n @for (cap of filteredCaps; track cap.id) {\r\n <mat-option [value]=\"cap.id\">{{ cap.codice }}</mat-option>\r\n }\r\n </mat-select>\r\n @if (shouldShowFieldErrors('cap')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('cap'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <!-- Indirizzo -->\r\n @if (showIndirizzo) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + indirizzoColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.indirizzo }}</mat-label>\r\n <input\r\n matInput\r\n formControlName=\"indirizzo\"\r\n placeholder=\"Via, numero civico\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('indirizzo')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('indirizzo'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <!-- Mail -->\r\n @if (showMail) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + mailColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.mail }}</mat-label>\r\n <input\r\n matInput\r\n type=\"email\"\r\n formControlName=\"mail\"\r\n placeholder=\"esempio@email.com\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('mail')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('mail'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <!-- PEC -->\r\n @if (showPEC) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + pecColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.pec }}</mat-label>\r\n <input\r\n matInput\r\n type=\"email\"\r\n formControlName=\"pec\"\r\n placeholder=\"esempio@pec.it\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('pec')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('pec'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <!-- Telefono -->\r\n @if (showTelefono) {\r\n <div class=\"ui-location__grid-cell\" [style.grid-column]=\"'span ' + telefonoColumns\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.telefono }}</mat-label>\r\n <input\r\n matInput\r\n type=\"tel\"\r\n formControlName=\"telefono\"\r\n placeholder=\"+39 123 456 7890\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('telefono')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('telefono'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- ==================== CAMPO ESTERO ==================== -->\r\n @if (isForeign) {\r\n <div class=\"ui-location__field-row\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-location__full-width\">\r\n <mat-label>{{ labels.comuneEstero }}</mat-label>\r\n <input\r\n matInput\r\n formControlName=\"comuneEstero\"\r\n placeholder=\"Inserisci citta/comune\"\r\n [readonly]=\"disabled\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (shouldShowFieldErrors('comuneEstero')) {\r\n <mat-error>\r\n @for (error of getFieldErrors('comuneEstero'); track $index) {\r\n <div>{{ error }}</div>\r\n }\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n forwardRef,\r\n OnInit,\r\n OnDestroy,\r\n OnChanges,\r\n SimpleChanges,\r\n ChangeDetectorRef,\r\n ViewChild,\r\n Injector,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n NG_VALIDATORS,\r\n Validator,\r\n AbstractControl,\r\n ValidationErrors,\r\n FormControl,\r\n NgControl,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { MatTableModule, MatTableDataSource } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiSpecificaTerritorialeComponent } from '../specifica-territoriale/specifica-territoriale.component';\r\nimport { UiLocationService } from '../../services/location.service';\r\nimport { UiButtonAreaComponent, UiButtonDescriptor } from '../../../button/index';\r\nimport {\r\n UiLocationTableConfig,\r\n UiLocationRow,\r\n UiLocationConfig,\r\n UiLocationValue,\r\n} from '../../types/territoriale.types';\r\n\r\n/**\r\n * Componente standalone per la gestione tabellare di location multiple.\r\n *\r\n * Permette l'inserimento, la modifica e l'eliminazione di righe\r\n * territoriali (italiane o estere) tramite una tabella Material\r\n * con form inline basato su `UiSpecificaTerritorialeComponent`.\r\n *\r\n * Implementa `ControlValueAccessor` e `Validator` per l'integrazione\r\n * con Angular Reactive Forms. Il valore e un array di `UiLocationRow`.\r\n *\r\n * @selector ui-table-territoriale\r\n *\r\n * @example\r\n * ```html\r\n * <ui-table-territoriale\r\n * [formControl]=\"sedeControl\"\r\n * [config]=\"{\r\n * tableLabel: 'Sedi operative',\r\n * subFieldConfig: { italyByDefault: true, cap: { show: true } }\r\n * }\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-table-territoriale',\r\n standalone: true,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatTableModule,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n UiSpecificaTerritorialeComponent,\r\n UiButtonAreaComponent,\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiTableTerritorialeComponent),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => UiTableTerritorialeComponent),\r\n multi: true,\r\n },\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: './table-territoriale.component.html',\r\n styleUrl: './table-territoriale.component.scss',\r\n})\r\nexport class UiTableTerritorialeComponent implements ControlValueAccessor, Validator, OnInit, OnDestroy, OnChanges {\r\n /** Configurazione della tabella. */\r\n @Input() config: UiLocationTableConfig = {};\r\n\r\n /** Stato disabilitato globale. */\r\n @Input() disabled = false;\r\n\r\n // ─── Stato interno ──────────────────────────────────────────────\r\n\r\n /** Righe della tabella. */\r\n rows: UiLocationRow[] = [];\r\n /** DataSource Material per la tabella. */\r\n dataSource = new MatTableDataSource<UiLocationRow>([]);\r\n\r\n /** Modalita editing attiva. */\r\n editMode = false;\r\n /** Modalita inserimento attiva. */\r\n insertMode = false;\r\n /** Riga in modifica. */\r\n editingRow: UiLocationRow | null = null;\r\n /** Indice della riga in modifica. */\r\n editingIndex: number | null = null;\r\n\r\n /** Colonne visualizzate nella tabella. */\r\n displayedColumns: string[] = [];\r\n /** Configurazione delle colonne. */\r\n columnConfig: Record<string, { label: string; show: boolean }> = {};\r\n\r\n /** Pulsanti per il form di inserimento/modifica. */\r\n formButtons: UiButtonDescriptor[] = [];\r\n /** Pulsante per aggiungere una nuova riga. */\r\n addButton: UiButtonDescriptor[] = [];\r\n\r\n /** NgControl per accedere alla validazione del form parent. */\r\n ngControl: NgControl | null = null;\r\n\r\n @ViewChild(UiSpecificaTerritorialeComponent)\r\n specificaForm!: UiSpecificaTerritorialeComponent;\r\n\r\n private readonly destroy$ = new Subject<void>();\r\n private onChange = (_value: UiLocationRow[]) => {};\r\n private onTouched = () => {};\r\n private onValidatorChange = () => {};\r\n\r\n constructor(\r\n private readonly cdr: ChangeDetectorRef,\r\n private readonly injector: Injector,\r\n private readonly locationService: UiLocationService,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.ngControl = this.injector.get(NgControl, null, { optional: true, self: true });\r\n this.initializeColumns();\r\n this.calculateActions();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config'] && !changes['config'].firstChange) {\r\n this.initializeColumns();\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n // ─── ControlValueAccessor ───────────────────────────────────────\r\n\r\n writeValue(value: UiLocationRow[] | null): void {\r\n this.rows = value ? [...value] : [];\r\n this.dataSource.data = this.rows;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n registerOnChange(fn: (value: UiLocationRow[]) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n // ─── Validator ──────────────────────────────────────────────────\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n if (control?.validator) {\r\n const errors = control.validator({} as AbstractControl);\r\n if (errors?.['required'] && (!this.rows || this.rows.length === 0)) {\r\n return { required: true };\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // ─── Getter calcolati ───────────────────────────────────────────\r\n\r\n get isRequired(): boolean {\r\n if (!this.ngControl?.control) return false;\r\n const validator = this.ngControl.control.validator;\r\n if (validator) {\r\n const errors = validator({} as AbstractControl);\r\n return !!errors?.['required'];\r\n }\r\n return false;\r\n }\r\n\r\n get hasValidationErrors(): boolean {\r\n return !!(this.ngControl?.control?.invalid && (this.ngControl.control.touched || this.ngControl.control.dirty));\r\n }\r\n\r\n get validationErrors(): string[] {\r\n if (!this.hasValidationErrors || !this.ngControl?.control?.errors) return [];\r\n const errors: string[] = [];\r\n if (this.ngControl.control.errors['required']) {\r\n errors.push(this.config.requiredMessage || 'Aggiungere almeno un elemento');\r\n }\r\n return errors;\r\n }\r\n\r\n // ─── Colonne dinamiche ─────────────────────────────────────────\r\n\r\n private initializeColumns(): void {\r\n const subConfig = this.config.subFieldConfig || {};\r\n\r\n // Colonne base - nasconde 'stato' quando italyByDefault e true\r\n this.columnConfig = {\r\n stato: { label: 'Stato', show: !subConfig.italyByDefault },\r\n provincia: { label: 'Provincia', show: true },\r\n comune: { label: 'Comune', show: true },\r\n };\r\n\r\n // Colonne dinamiche dalla configurazione\r\n if (subConfig.cap?.show) {\r\n this.columnConfig['cap'] = { label: subConfig.labels?.cap || 'CAP', show: true };\r\n }\r\n if (subConfig.indirizzo?.show) {\r\n this.columnConfig['indirizzo'] = { label: subConfig.labels?.indirizzo || 'Indirizzo', show: true };\r\n }\r\n if (subConfig.mail?.show) {\r\n this.columnConfig['mail'] = { label: subConfig.labels?.mail || 'Email', show: true };\r\n }\r\n if (subConfig.pec?.show) {\r\n this.columnConfig['pec'] = { label: subConfig.labels?.pec || 'PEC', show: true };\r\n }\r\n if (subConfig.telefono?.show) {\r\n this.columnConfig['telefono'] = { label: subConfig.labels?.telefono || 'Telefono', show: true };\r\n }\r\n\r\n // Colonna azioni sempre alla fine\r\n this.columnConfig['azioni'] = { label: 'Azioni', show: true };\r\n\r\n this.displayedColumns = Object.keys(this.columnConfig).filter((key) => this.columnConfig[key].show);\r\n }\r\n\r\n // ─── Azioni CRUD ───────────────────────────────────────────────\r\n\r\n /** Attiva la modalita inserimento. */\r\n activateInsertMode(): void {\r\n this.insertMode = true;\r\n this.editMode = false;\r\n this.editingRow = null;\r\n this.editingIndex = null;\r\n this.calculateActions();\r\n this.cdr.detectChanges();\r\n\r\n // Attende l'inizializzazione completa del componente figlio prima\r\n // di resettare il form. writeValue(null) gestisce internamente sia\r\n // il reset sia la riapplicazione della configurazione iniziale\r\n // (es. italyByDefault), quindi non serve chiamare resetComponentState()\r\n // separatamente (altrimenti annullerebbe lo stato impostato).\r\n setTimeout(async () => {\r\n if (this.specificaForm) {\r\n if (this.specificaForm.initializationPromise) {\r\n await this.specificaForm.initializationPromise;\r\n }\r\n this.specificaForm.writeValue(null);\r\n this.cdr.detectChanges();\r\n }\r\n }, 0);\r\n }\r\n\r\n /** Attiva la modalita modifica per una riga. */\r\n editRow(row: UiLocationRow, index: number): void {\r\n this.editMode = true;\r\n this.insertMode = false;\r\n this.editingRow = { ...row };\r\n this.editingIndex = index;\r\n this.calculateActions();\r\n this.cdr.detectChanges();\r\n\r\n // Attende l'inizializzazione completa del componente figlio\r\n // prima di scrivere il valore per la modifica.\r\n setTimeout(async () => {\r\n if (this.specificaForm) {\r\n if (this.specificaForm.initializationPromise) {\r\n await this.specificaForm.initializationPromise;\r\n }\r\n this.specificaForm.writeValue(this.mapRowToFormValue(row));\r\n this.cdr.detectChanges();\r\n }\r\n }, 0);\r\n }\r\n\r\n /** Annulla l'operazione in corso (inserimento o modifica). */\r\n cancelEdit(): void {\r\n this.editMode = false;\r\n this.insertMode = false;\r\n this.editingRow = null;\r\n this.editingIndex = null;\r\n this.calculateActions();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Rimuove una riga dalla tabella. */\r\n removeRow(index: number): void {\r\n this.rows.splice(index, 1);\r\n this.dataSource.data = this.rows;\r\n this.propagateChange();\r\n this.markAsTouched();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Salva la riga corrente (nuova o in modifica). */\r\n async saveRow(): Promise<void> {\r\n if (!this.specificaForm?.form.valid) {\r\n this.specificaForm?.markAsTouched();\r\n return;\r\n }\r\n\r\n const rawValue: UiLocationValue = this.specificaForm.form.getRawValue();\r\n const finalValue = rawValue.nazioneId || rawValue.cap ? rawValue : this.specificaForm.form.value;\r\n\r\n const row = await this.mapFormValueToRow(finalValue);\r\n\r\n if (this.editMode && this.editingIndex !== null) {\r\n row.refId = this.rows[this.editingIndex].refId;\r\n this.rows[this.editingIndex] = row;\r\n } else {\r\n row.refId = this.generateUUID();\r\n this.rows.push(row);\r\n }\r\n\r\n this.dataSource.data = this.rows;\r\n this.cancelEdit();\r\n this.propagateChange();\r\n this.markAsTouched();\r\n this.calculateActions();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Marca il componente come touched. */\r\n markAsTouched(): void {\r\n this.onTouched();\r\n this.ngControl?.control?.markAsTouched();\r\n }\r\n\r\n /** Resetta lo stato del componente. */\r\n resetComponentState(): void {\r\n this.rows = [];\r\n this.dataSource.data = this.rows;\r\n this.insertMode = false;\r\n this.editMode = false;\r\n this.editingRow = null;\r\n this.editingIndex = null;\r\n this.specificaForm?.resetComponentState();\r\n this.onChange(this.rows);\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /** Funzione track by per la tabella. */\r\n trackByFn(_index: number, item: UiLocationRow): string {\r\n return item.refId || String(_index);\r\n }\r\n\r\n // ─── Mappatura dati ────────────────────────────────────────────\r\n\r\n private mapRowToFormValue(row: UiLocationRow): UiLocationValue {\r\n if (row.stato?.codStatoPk === 'ITA') {\r\n return {\r\n nazioneId: 'ITA',\r\n provinciaId: row.provincia?.codiceProvinciaPk,\r\n comuneId: row.comuni?.codiceComunePk,\r\n cap: row.cap,\r\n indirizzo: row.indirizzo,\r\n mail: row.mail,\r\n pec: row.pec,\r\n telefono: row.telefono,\r\n };\r\n }\r\n return {\r\n nazioneId: row.stato?.codStatoPk,\r\n comuneEstero: row.comuniEsteri?.[0],\r\n indirizzo: row.indirizzo,\r\n mail: row.mail,\r\n pec: row.pec,\r\n telefono: row.telefono,\r\n };\r\n }\r\n\r\n private async mapFormValueToRow(value: UiLocationValue): Promise<UiLocationRow> {\r\n // Se italyByDefault e nazioneId mancante, forza ITA\r\n if (!value.nazioneId && this.config.subFieldConfig?.italyByDefault) {\r\n value.nazioneId = 'ITA';\r\n }\r\n\r\n try {\r\n const stato = await this.locationService.getLocationFullData('nazione', value.nazioneId!);\r\n\r\n if (value.nazioneId === 'ITA') {\r\n let provincia = null;\r\n let comune = null;\r\n\r\n if (value.provinciaId) {\r\n provincia = await this.locationService.getLocationFullData('provincia', value.provinciaId);\r\n }\r\n if (value.comuneId && value.provinciaId) {\r\n comune = await this.locationService.getLocationFullData('comune', value.comuneId, value.provinciaId);\r\n }\r\n\r\n return {\r\n stato,\r\n provincia,\r\n comuni: comune,\r\n comuniEsteri: [],\r\n cap: value.cap,\r\n indirizzo: value.indirizzo,\r\n mail: value.mail,\r\n pec: value.pec,\r\n telefono: value.telefono,\r\n };\r\n }\r\n\r\n return {\r\n stato,\r\n provincia: undefined,\r\n comuni: undefined,\r\n comuniEsteri: value.comuneEstero ? [value.comuneEstero] : [],\r\n indirizzo: value.indirizzo,\r\n mail: value.mail,\r\n pec: value.pec,\r\n telefono: value.telefono,\r\n };\r\n } catch (error) {\r\n console.error('[UiTableTerritoriale] Errore caricamento dati location:', error);\r\n return {\r\n stato: value.nazioneId ? { codStatoPk: value.nazioneId, descrizione: value.nazioneId } : undefined,\r\n provincia: value.provinciaId ? { codiceProvinciaPk: value.provinciaId } : undefined,\r\n comuni: value.comuneId ? { codiceComunePk: value.comuneId } : undefined,\r\n comuniEsteri: value.comuneEstero ? [value.comuneEstero] : [],\r\n cap: value.cap,\r\n indirizzo: value.indirizzo,\r\n mail: value.mail,\r\n pec: value.pec,\r\n telefono: value.telefono,\r\n };\r\n }\r\n }\r\n\r\n // ─── Utilita ───────────────────────────────────────────────────\r\n\r\n private propagateChange(): void {\r\n this.onChange([...this.rows]);\r\n this.onValidatorChange();\r\n }\r\n\r\n private generateUUID(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0; // NOSONAR - Used for non-cryptographic UUID generation in UI table rows\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n }\r\n\r\n private calculateActions(): void {\r\n this.calculateFormButtons();\r\n this.calculateAddButton();\r\n }\r\n\r\n private calculateFormButtons(): void {\r\n if (!this.editMode && !this.insertMode) {\r\n this.formButtons = [];\r\n return;\r\n }\r\n this.formButtons = [\r\n { label: 'Annulla', variant: 'outline', action: () => this.cancelEdit() },\r\n { label: 'Salva', variant: 'primary', action: () => this.saveRow() },\r\n ];\r\n }\r\n\r\n private calculateAddButton(): void {\r\n if (this.editMode || this.insertMode) {\r\n this.addButton = [];\r\n return;\r\n }\r\n this.addButton = [\r\n {\r\n label: this.config.emptyCtaLabel || 'Aggiungi un luogo',\r\n variant: 'outline',\r\n action: () => this.activateInsertMode(),\r\n },\r\n ];\r\n }\r\n}\r\n","<!--\r\n Tabella CRUD per location multiple.\r\n Utilizza UiSpecificaTerritorialeComponent per il form inline di aggiunta/modifica.\r\n-->\r\n<div\r\n class=\"ui-location-table\"\r\n [class.ui-location-table--has-errors]=\"hasValidationErrors\"\r\n>\r\n <!-- ==================== LABEL ==================== -->\r\n <p\r\n class=\"ui-location-table__label\"\r\n [class.ui-location-table__label--invalid]=\"hasValidationErrors\"\r\n >\r\n {{ config.tableLabel || 'Tabella territoriale' }}\r\n @if (isRequired) {\r\n <span class=\"ui-location-table__required\">*</span>\r\n }\r\n </p>\r\n\r\n <!-- ==================== STATO VUOTO ==================== -->\r\n @if (rows.length === 0 && !insertMode && !editMode) {\r\n <div class=\"ui-location-table__empty\">\r\n <span class=\"ui-location-table__empty-text\">\r\n {{ config.emptyPrompt || 'Nessun luogo aggiunto' }}\r\n </span>\r\n <div class=\"ui-location-table__empty-actions\">\r\n @if (hasValidationErrors) {\r\n <div class=\"ui-location-table__validation-errors\">\r\n @for (error of validationErrors; track $index) {\r\n <div class=\"ui-location-table__error-msg\">\r\n <lucide-icon name=\"alert-circle\" [size]=\"14\" />\r\n {{ error }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n <ui-button-area [buttons]=\"addButton\" align=\"end\" />\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- ==================== TABELLA ==================== -->\r\n @if (rows.length > 0 && !insertMode && !editMode) {\r\n <div class=\"ui-location-table__container\">\r\n <table mat-table [dataSource]=\"dataSource\" class=\"ui-location-table__table\" [trackBy]=\"trackByFn\">\r\n @for (column of displayedColumns; track column) {\r\n <ng-container [matColumnDef]=\"column\">\r\n <th\r\n mat-header-cell *matHeaderCellDef\r\n [style.text-align]=\"column === 'azioni' ? 'right' : 'left'\"\r\n >\r\n {{ columnConfig[column].label }}\r\n </th>\r\n <td\r\n mat-cell *matCellDef=\"let row; let i = index\"\r\n [style.text-align]=\"column === 'azioni' ? 'right' : 'left'\"\r\n >\r\n <!-- Stato -->\r\n @if (column === 'stato') {\r\n @if (row.stato?.codStatoPk === 'ITA') {\r\n Italia\r\n } @else if (row.stato?.codStatoPk) {\r\n {{ row.stato.descrizione }} ({{ row.stato.codStatoPk }})\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Provincia -->\r\n @if (column === 'provincia') {\r\n @if (row.stato?.codStatoPk === 'ITA') {\r\n @if (row.provincia?.nomeProvincia) {\r\n {{ row.provincia.nomeProvincia }}\r\n @if (row.provincia.siglaProvincia) {\r\n ({{ row.provincia.siglaProvincia }})\r\n }\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">Non specificata</span>\r\n }\r\n } @else if (row.stato?.codStatoPk) {\r\n <span class=\"ui-location-table__foreign-tag\">ESTERO</span>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Comune -->\r\n @if (column === 'comune') {\r\n @if (row.stato?.codStatoPk === 'ITA') {\r\n @if (row.comuni?.nomeComune) {\r\n {{ row.comuni.nomeComune }}\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n } @else if (row.comuniEsteri && row.comuniEsteri.length > 0) {\r\n {{ row.comuniEsteri.join(', ') }}\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- CAP -->\r\n @if (column === 'cap') {\r\n @if (row.cap) {\r\n <span class=\"ui-location-table__cap\">{{ row.cap }}</span>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Indirizzo -->\r\n @if (column === 'indirizzo') {\r\n @if (row.indirizzo) {\r\n <span class=\"ui-location-table__address\" [title]=\"row.indirizzo\">\r\n {{ row.indirizzo.length > 30 ? row.indirizzo.substring(0, 30) + '...' : row.indirizzo }}\r\n </span>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Mail -->\r\n @if (column === 'mail') {\r\n @if (row.mail) {\r\n <a [href]=\"'mailto:' + row.mail\" class=\"ui-location-table__link ui-location-table__link--email\"\r\n [title]=\"row.mail\" (click)=\"$event.stopPropagation()\">\r\n <lucide-icon name=\"mail\" [size]=\"14\" />\r\n {{ row.mail.length > 25 ? row.mail.substring(0, 25) + '...' : row.mail }}\r\n </a>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- PEC -->\r\n @if (column === 'pec') {\r\n @if (row.pec) {\r\n <a [href]=\"'mailto:' + row.pec\" class=\"ui-location-table__link ui-location-table__link--pec\"\r\n [title]=\"row.pec\" (click)=\"$event.stopPropagation()\">\r\n <lucide-icon name=\"shield-check\" [size]=\"14\" />\r\n {{ row.pec.length > 25 ? row.pec.substring(0, 25) + '...' : row.pec }}\r\n </a>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Telefono -->\r\n @if (column === 'telefono') {\r\n @if (row.telefono) {\r\n <a [href]=\"'tel:' + row.telefono\" class=\"ui-location-table__link ui-location-table__link--phone\"\r\n [title]=\"row.telefono\" (click)=\"$event.stopPropagation()\">\r\n <lucide-icon name=\"phone\" [size]=\"14\" />\r\n {{ row.telefono }}\r\n </a>\r\n } @else {\r\n <span class=\"ui-location-table__empty-value\">--</span>\r\n }\r\n }\r\n\r\n <!-- Azioni -->\r\n @if (column === 'azioni') {\r\n <div class=\"ui-location-table__actions\">\r\n <button\r\n class=\"ui-location-table__action-btn ui-location-table__action-btn--edit\"\r\n (click)=\"editRow(row, i)\"\r\n [disabled]=\"disabled\"\r\n [matTooltip]=\"'Modifica'\"\r\n type=\"button\"\r\n aria-label=\"Modifica riga\"\r\n >\r\n <lucide-icon name=\"pencil\" [size]=\"16\" />\r\n </button>\r\n <button\r\n class=\"ui-location-table__action-btn ui-location-table__action-btn--delete\"\r\n (click)=\"removeRow(i)\"\r\n [disabled]=\"disabled\"\r\n [matTooltip]=\"'Elimina'\"\r\n type=\"button\"\r\n aria-label=\"Elimina riga\"\r\n >\r\n <lucide-icon name=\"trash-2\" [size]=\"16\" />\r\n </button>\r\n </div>\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\r\n </table>\r\n </div>\r\n\r\n <!-- Pulsante aggiungi sotto la tabella -->\r\n <div class=\"ui-location-table__add-area\">\r\n <ui-button-area [buttons]=\"addButton\" align=\"end\" />\r\n </div>\r\n }\r\n\r\n <!-- ==================== FORM AGGIUNGI/MODIFICA ==================== -->\r\n @if (insertMode || editMode) {\r\n <div class=\"ui-location-table__form\">\r\n <ui-specifica-territoriale\r\n [config]=\"config.subFieldConfig || {}\"\r\n [disabled]=\"disabled\"\r\n #specificaForm\r\n />\r\n <div class=\"ui-location-table__form-actions\">\r\n <ui-button-area [buttons]=\"formButtons\" align=\"end\" />\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Observable, map } from 'rxjs';\r\nimport type {\r\n UiGeocodedForeignDetails,\r\n UiGeocodedItalianDetails,\r\n UiGeocodedLocationType,\r\n UiLocationGeocodedFieldConfig,\r\n} from '../types/geocoded-location.types';\r\n\r\n/** Risposta elementare dell'API search di Nominatim (format=json). */\r\ninterface NominatimSearchItem {\r\n place_id: number;\r\n lat: string;\r\n lon: string;\r\n display_name: string;\r\n importance?: number;\r\n boundingbox?: [string, string, string, string];\r\n address?: Record<string, string>;\r\n}\r\n\r\nconst DEFAULT_BASE = 'https://nominatim.openstreetmap.org';\r\n\r\n/**\r\n * Integrazione con l'API pubblica Nominatim (OpenStreetMap) per la ricerca indirizzi.\r\n * Mappa i risultati sul tipo {@link UiGeocodedLocationType}.\r\n *\r\n * In browser è consigliato usare un proxy same-origin per CORS e User-Agent;\r\n * vedi {@link UiLocationGeocodedFieldConfig.nominatimBaseUrl}.\r\n *\r\n * @providedIn root\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UiNominatimGeocodingService {\r\n private readonly http = inject(HttpClient);\r\n\r\n /**\r\n * Cerca indirizzi in base alla query testuale.\r\n *\r\n * @param query - Testo libero inserito dall'utente\r\n * @param config - Opzioni di ricerca e base URL\r\n */\r\n search(query: string, config: UiLocationGeocodedFieldConfig = {}): Observable<UiGeocodedLocationType[]> {\r\n const trimmed = query.trim();\r\n const base = (config.nominatimBaseUrl ?? DEFAULT_BASE).replace(/\\/$/, '');\r\n const limit = config.limit ?? 5;\r\n\r\n let params = new HttpParams()\r\n .set('q', trimmed)\r\n .set('format', 'json')\r\n .set('addressdetails', '1')\r\n .set('limit', String(limit));\r\n\r\n if (config.biasCountry) {\r\n params = params.set('countrycodes', config.biasCountry.toLowerCase());\r\n }\r\n\r\n if (config.biasProximity) {\r\n const { lat, lng } = config.biasProximity;\r\n const pad = 0.05;\r\n const left = lng - pad;\r\n const right = lng + pad;\r\n const top = lat + pad;\r\n const bottom = lat - pad;\r\n params = params.set('viewbox', `${left},${top},${right},${bottom}`).set('bounded', '1');\r\n }\r\n\r\n const url = `${base}/search`;\r\n\r\n return this.http.get<NominatimSearchItem[]>(url, { params }).pipe(map((items) => items.map((item) => this.mapItem(item))));\r\n }\r\n\r\n /** Converte un risultato Nominatim in {@link UiGeocodedLocationType}. */\r\n mapItem(item: NominatimSearchItem): UiGeocodedLocationType {\r\n const addr = item.address ?? {};\r\n const lat = parseFloat(item.lat);\r\n const lon = parseFloat(item.lon);\r\n const bb = item.boundingbox;\r\n\r\n let boundingBox: UiGeocodedLocationType['boundingBox'];\r\n if (bb && bb.length >= 4) {\r\n const south = parseFloat(bb[0]);\r\n const north = parseFloat(bb[1]);\r\n const west = parseFloat(bb[2]);\r\n const east = parseFloat(bb[3]);\r\n if (!Number.isNaN(south + north + west + east)) {\r\n boundingBox = { south, north, west, east };\r\n }\r\n }\r\n\r\n const city =\r\n addr['city'] ||\r\n addr['town'] ||\r\n addr['village'] ||\r\n addr['municipality'] ||\r\n addr['hamlet'] ||\r\n addr['suburb'];\r\n\r\n const confidence =\r\n typeof item.importance === 'number' ? Math.min(1, Math.max(0, item.importance / 0.75)) : undefined;\r\n\r\n const ccRaw = addr['country_code'];\r\n const countryCode = typeof ccRaw === 'string' ? ccRaw.toUpperCase() : undefined;\r\n const isItalian = countryCode === 'IT';\r\n\r\n const italian: UiGeocodedItalianDetails | undefined = isItalian\r\n ? {\r\n comune: city,\r\n provincia: addr['county'] || addr['state_district'] || addr['province'],\r\n regione: addr['state'],\r\n }\r\n : undefined;\r\n\r\n const foreign: UiGeocodedForeignDetails | undefined = !isItalian\r\n ? {\r\n locality: city,\r\n adminArea: addr['state'] || addr['state_district'] || addr['county'],\r\n countryCode,\r\n }\r\n : undefined;\r\n\r\n return {\r\n label: item.display_name,\r\n latitude: lat,\r\n longitude: lon,\r\n formattedAddress: item.display_name,\r\n territory: isItalian ? 'italian' : 'foreign',\r\n italian,\r\n foreign,\r\n street: addr['road'] || addr['pedestrian'] || addr['path'],\r\n streetNumber: addr['house_number'],\r\n postalCode: addr['postcode'],\r\n city,\r\n municipality: addr['municipality'],\r\n province: addr['state_district'] || addr['county'],\r\n region: addr['state'],\r\n country: addr['country'],\r\n countryCode,\r\n placeId: String(item.place_id),\r\n confidence,\r\n boundingBox,\r\n source: 'nominatim',\r\n raw: item,\r\n };\r\n }\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n Input,\r\n OnInit,\r\n ViewChild,\r\n ViewEncapsulation,\r\n forwardRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n ControlValueAccessor,\r\n FormControl,\r\n NG_VALUE_ACCESSOR,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport {\r\n MatAutocompleteModule,\r\n MatAutocompleteSelectedEvent,\r\n MatAutocompleteTrigger,\r\n} from '@angular/material/autocomplete';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { NgForOf } from '@angular/common';\r\nimport { EMPTY, debounceTime, distinctUntilChanged, switchMap, tap, catchError, map, of } from 'rxjs';\r\nimport { UiNominatimGeocodingService } from '../../services/nominatim-geocoding.service';\r\nimport type {\r\n UiGeocodedLocationInput,\r\n UiGeocodedLocationType,\r\n UiLocationGeocodedFieldConfig,\r\n} from '../../types/geocoded-location.types';\r\n\r\n/** Stati UI per hint e messaggi accessibili. */\r\ntype UiGeocodedPanelState = 'idle' | 'loading' | 'results' | 'empty' | 'error';\r\n\r\n/**\r\n * Campo indirizzo con ricerca geocodificata (Nominatim) e selezione atomica da autocomplete.\r\n * Implementa `ControlValueAccessor`; il valore è {@link UiGeocodedLocationType} o `null`.\r\n *\r\n * L'applicazione host deve fornire `provideHttpClient()` (o `HttpClient` equivalente).\r\n */\r\n@Component({\r\n selector: 'ui-location-geocoded',\r\n standalone: true,\r\n imports: [\r\n NgForOf,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatAutocompleteModule,\r\n MatProgressSpinnerModule,\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiLocationGeocodedComponent),\r\n multi: true,\r\n },\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './location-geocoded.component.html',\r\n styleUrl: './location-geocoded.component.scss',\r\n})\r\nexport class UiLocationGeocodedComponent implements ControlValueAccessor, OnInit {\r\n private readonly nominatim = inject(UiNominatimGeocodingService);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly document = inject(DOCUMENT);\r\n\r\n /** Configurazione ricerca (URL base, debounce, limiti). */\r\n @Input() config: UiLocationGeocodedFieldConfig = {};\r\n\r\n /** Placeholder dell'input. */\r\n @Input() placeholder = '';\r\n\r\n /** Etichetta accessibile dell'input (se la label visibile è esterna al componente). */\r\n @Input() inputAriaLabel = 'Cerca indirizzo';\r\n\r\n /** `id` HTML dell'input (per associare la label esterna con `for`). */\r\n @Input() inputId = '';\r\n\r\n /** Disabilita il campo. */\r\n @Input() set disabled(v: boolean) {\r\n this._disabled = v;\r\n this.syncDisabled();\r\n }\r\n get disabled(): boolean {\r\n return this._disabled;\r\n }\r\n\r\n /** Input in sola lettura (testo non modificabile). */\r\n @Input() readonly = false;\r\n\r\n /** Trigger Material: serve a non trattare il blur verso il pannello come uscita senza selezione. */\r\n @ViewChild('autoTrigger') private autoTrigger?: MatAutocompleteTrigger;\r\n\r\n /** Testo digitabile e label selezionata (sempre stringa, compatibile con MatAutocomplete). */\r\n readonly searchControl = new FormControl<string>('', { nonNullable: true });\r\n\r\n /** Suggerimenti correnti per il pannello autocomplete. */\r\n suggestions: UiGeocodedLocationType[] = [];\r\n\r\n /** Ultima query usata per evidenziare i match nel pannello. */\r\n lastQueryForHighlight = '';\r\n\r\n panelState: UiGeocodedPanelState = 'idle';\r\n\r\n private _disabled = false;\r\n private selected: UiGeocodedLocationType | null = null;\r\n /** Evita che la selezione da autocomplete venga trattata come cancellazione del valore. */\r\n private selecting = false;\r\n /** `pointerdown` sul pannello overlay (fase capture): il blur dell'input avviene prima del click; senza questo si azzera il valore. */\r\n private pointerDownOnOverlay = false;\r\n private readonly resultCache = new Map<string, UiGeocodedLocationType[]>();\r\n private readonly maxCacheEntries = 40;\r\n\r\n private onChange: (v: UiGeocodedLocationType | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n ngOnInit(): void {\r\n const minChars = this.config.minChars ?? 3;\r\n const debounceMs = this.config.debounceMs ?? 200;\r\n\r\n this.document.addEventListener('pointerdown', this.onDocumentPointerDown, true);\r\n this.destroyRef.onDestroy(() => {\r\n this.document.removeEventListener('pointerdown', this.onDocumentPointerDown, true);\r\n });\r\n\r\n this.searchControl.valueChanges\r\n .pipe(\r\n tap((text) => {\r\n if (this.selecting) {\r\n return;\r\n }\r\n if (this.selected && text !== this.selected.label) {\r\n this.selected = null;\r\n this.onChange(null);\r\n }\r\n }),\r\n debounceTime(debounceMs),\r\n distinctUntilChanged(),\r\n switchMap((text) => {\r\n const t = text.trim();\r\n if (t.length < minChars) {\r\n this.suggestions = [];\r\n this.panelState = 'idle';\r\n this.lastQueryForHighlight = '';\r\n this.cdr.markForCheck();\r\n return EMPTY;\r\n }\r\n const cacheKey = t.toLowerCase();\r\n const cached = this.resultCache.get(cacheKey);\r\n if (cached) {\r\n return of({ q: t, items: cached });\r\n }\r\n this.panelState = 'loading';\r\n this.cdr.markForCheck();\r\n return this.nominatim.search(t, this.config).pipe(\r\n tap((items) => this.pushCache(cacheKey, items)),\r\n map((items) => ({ q: t, items })),\r\n catchError(() => {\r\n this.panelState = 'error';\r\n this.suggestions = [];\r\n this.cdr.markForCheck();\r\n return EMPTY;\r\n }),\r\n );\r\n }),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe((payload) => {\r\n this.lastQueryForHighlight = payload.q;\r\n this.suggestions = payload.items;\r\n this.panelState = payload.items.length ? 'results' : 'empty';\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n private pushCache(key: string, items: UiGeocodedLocationType[]): void {\r\n if (this.resultCache.size >= this.maxCacheEntries) {\r\n const first = this.resultCache.keys().next().value as string | undefined;\r\n if (first !== undefined) {\r\n this.resultCache.delete(first);\r\n }\r\n }\r\n this.resultCache.set(key, items);\r\n }\r\n\r\n onOptionSelected(event: MatAutocompleteSelectedEvent): void {\r\n this.pointerDownOnOverlay = false;\r\n const opts = event.source.options?.toArray() ?? [];\r\n const idx = opts.indexOf(event.option);\r\n let opt = idx >= 0 ? this.suggestions[idx] : undefined;\r\n if (!opt && typeof event.option.value === 'string') {\r\n opt = this.suggestions.find((o) => o.label === event.option.value);\r\n }\r\n if (!opt) {\r\n return;\r\n }\r\n this.selecting = true;\r\n this.selected = opt;\r\n this.searchControl.setValue(opt.label, { emitEvent: false });\r\n this.onChange(opt);\r\n this.onTouched();\r\n setTimeout(() => {\r\n this.selecting = false;\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Chiusura focus sull'input: differita così `optionSelected` può aggiornare il modello prima di eventuale reset.\r\n * `pointerDownOnOverlay` copre il caso blur → click sulla lista (relatedTarget spesso null).\r\n */\r\n onBlur(event: FocusEvent): void {\r\n const next = event.relatedTarget as HTMLElement | null;\r\n if (next?.closest?.('.cdk-overlay-container')) {\r\n return;\r\n }\r\n const hadPointerOnPanel = this.pointerDownOnOverlay;\r\n setTimeout(() => {\r\n this.pointerDownOnOverlay = false;\r\n if (this.selecting || this.autoTrigger?.panelOpen || hadPointerOnPanel) {\r\n return;\r\n }\r\n const text = this.searchControl.value?.trim() ?? '';\r\n if (!this.selected) {\r\n if (text.length > 0) {\r\n this.searchControl.setValue('', { emitEvent: false });\r\n }\r\n this.onChange(null);\r\n }\r\n this.onTouched();\r\n }, 0);\r\n }\r\n\r\n /** Imposta il flag prima del blur quando l'utente preme sul pannello (stesso gesto del click su `mat-option`). */\r\n private onDocumentPointerDown = (e: PointerEvent): void => {\r\n if (!this.autoTrigger?.panelOpen) {\r\n return;\r\n }\r\n const t = e.target;\r\n if (!(t instanceof Node)) {\r\n return;\r\n }\r\n if (this.document.querySelector('.cdk-overlay-container')?.contains(t)) {\r\n this.pointerDownOnOverlay = true;\r\n }\r\n };\r\n\r\n /**\r\n * Identità stabile per `@for` sui suggerimenti (evita `??` nel template e problemi di codegen).\r\n */\r\n trackSuggestion(opt: UiGeocodedLocationType): string {\r\n return String(opt.placeId ?? opt.label);\r\n }\r\n\r\n /** Segmenta la label per evidenziazione accessibile (match letterale case-insensitive). */\r\n highlightParts(label: string): { text: string; highlight: boolean }[] {\r\n const q = this.lastQueryForHighlight.trim();\r\n if (!q) {\r\n return [{ text: label, highlight: false }];\r\n }\r\n const lower = label.toLowerCase();\r\n const qi = lower.indexOf(q.toLowerCase());\r\n if (qi < 0) {\r\n return [{ text: label, highlight: false }];\r\n }\r\n const parts: { text: string; highlight: boolean }[] = [];\r\n if (qi > 0) {\r\n parts.push({ text: label.slice(0, qi), highlight: false });\r\n }\r\n parts.push({ text: label.slice(qi, qi + q.length), highlight: true });\r\n if (qi + q.length < label.length) {\r\n parts.push({ text: label.slice(qi + q.length), highlight: false });\r\n }\r\n return parts;\r\n }\r\n\r\n /** Messaggio per `aria-live` in base allo stato del pannello. */\r\n getStatusMessage(): string {\r\n switch (this.panelState) {\r\n case 'loading':\r\n return 'Ricerca indirizzi in corso';\r\n case 'results':\r\n return `${this.suggestions.length} suggerimenti disponibili`;\r\n case 'empty':\r\n return 'Nessun risultato per la ricerca';\r\n case 'error':\r\n return 'Errore durante la ricerca. Riprova.';\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n // ─── ControlValueAccessor ───────────────────────────────────────\r\n\r\n writeValue(value: UiGeocodedLocationInput | null): void {\r\n if (value && typeof value === 'object' && 'latitude' in value) {\r\n this.selected = this.ensureTerritory(value);\r\n this.searchControl.setValue(value.label, { emitEvent: false });\r\n } else {\r\n this.selected = null;\r\n this.searchControl.setValue('', { emitEvent: false });\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (v: UiGeocodedLocationType | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled = isDisabled;\r\n this.syncDisabled();\r\n }\r\n\r\n private syncDisabled(): void {\r\n if (this._disabled) {\r\n this.searchControl.disable({ emitEvent: false });\r\n } else {\r\n this.searchControl.enable({ emitEvent: false });\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Completa `territory` e gli slice `italian` / `foreign` se assenti (payload legacy o altri provider).\r\n */\r\n private ensureTerritory(v: UiGeocodedLocationInput): UiGeocodedLocationType {\r\n if (v.territory) {\r\n return { ...v, territory: v.territory };\r\n }\r\n const cc = v.countryCode?.toUpperCase();\r\n const isItalian = cc === 'IT';\r\n return {\r\n ...v,\r\n territory: isItalian ? 'italian' : 'foreign',\r\n italian: isItalian\r\n ? (v.italian ?? {\r\n comune: v.city,\r\n provincia: v.province,\r\n regione: v.region,\r\n })\r\n : undefined,\r\n foreign: !isItalian\r\n ? (v.foreign ?? {\r\n locality: v.city,\r\n adminArea: v.province ?? v.region,\r\n countryCode: cc,\r\n })\r\n : undefined,\r\n };\r\n }\r\n}\r\n","<div class=\"ui-location-geocoded\">\r\n <span class=\"cdk-visually-hidden\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {{ getStatusMessage() }}\r\n </span>\r\n\r\n <mat-form-field appearance=\"outline\" class=\"ui-location-geocoded__field\" subscriptSizing=\"dynamic\">\r\n <input\r\n #autoTrigger=\"matAutocompleteTrigger\"\r\n matInput\r\n type=\"text\"\r\n [attr.id]=\"inputId || null\"\r\n [formControl]=\"searchControl\"\r\n [matAutocomplete]=\"auto\"\r\n [placeholder]=\"placeholder\"\r\n [readonly]=\"readonly\"\r\n [attr.aria-label]=\"inputAriaLabel\"\r\n [attr.aria-invalid]=\"panelState === 'error'\"\r\n [attr.aria-busy]=\"panelState === 'loading'\"\r\n autocomplete=\"off\"\r\n autocorrect=\"off\"\r\n spellcheck=\"false\"\r\n (blur)=\"onBlur($event)\"\r\n />\r\n\r\n @if (panelState === 'loading') {\r\n <mat-spinner matSuffix class=\"ui-location-geocoded__spinner\" diameter=\"20\" />\r\n }\r\n\r\n <mat-autocomplete\r\n #auto=\"matAutocomplete\"\r\n class=\"ui-location-geocoded__panel\"\r\n (optionSelected)=\"onOptionSelected($event)\"\r\n [autoActiveFirstOption]=\"false\"\r\n >\r\n @for (opt of suggestions; track trackSuggestion(opt)) {\r\n <mat-option class=\"ui-location-geocoded__option\" [value]=\"opt.label\">\r\n <span class=\"ui-location-geocoded__option-text\">\r\n <ng-container *ngFor=\"let part of highlightParts(opt.label)\">\r\n <span [class.ui-location-geocoded__match]=\"part.highlight\">{{ part.text }}</span>\r\n </ng-container>\r\n </span>\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n\r\n @if (panelState !== 'error') {\r\n <mat-hint class=\"ui-location-geocoded__hint\">\r\n @if (config.biasCountry) {\r\n <span class=\"ui-location-geocoded__scope\">\r\n Ambito: solo paese {{ config.biasCountry.toUpperCase() }} — luoghi in altri paesi non compaiono tra i risultati.\r\n </span>\r\n }\r\n @if (panelState === 'idle') {\r\n Digita almeno {{ config.minChars ?? 3 }} caratteri per cercare.\r\n } @else if (panelState === 'loading') {\r\n Ricerca in corso...\r\n } @else if (panelState === 'empty') {\r\n @if (config.biasCountry) {\r\n Nessun risultato in questo paese. Per cercare fuori da questo paese rimuovi il filtro paese dalla configurazione del campo.\r\n } @else {\r\n Nessun indirizzo trovato. Modifica la ricerca.\r\n }\r\n } @else if (panelState === 'results') {\r\n {{ suggestions.length }} risultati. Usa frecce e Invio per selezionare.\r\n }\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n\r\n @if (panelState === 'error') {\r\n <div class=\"ui-location-geocoded__api-error\" role=\"alert\">\r\n Impossibile contattare il servizio di geocoding. Riprova.\r\n </div>\r\n }\r\n</div>\r\n","import { FormControl, FormGroupDirective, NgForm } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\n\r\n/**\r\n * ErrorStateMatcher condiviso tra form-builder e campi atomici.\r\n * Mostra errore quando il controllo è invalido e (touched o dirty).\r\n */\r\nexport class UiFormErrorStateMatcher implements ErrorStateMatcher {\r\n isErrorState(control: FormControl | null, _form: FormGroupDirective | NgForm | null): boolean {\r\n return !!(control && control.invalid && (control.touched || control.dirty));\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n ViewEncapsulation,\r\n inject,\r\n} from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiFormFieldErrorService } from '../../services/form-field-error.service';\r\nimport { UiFormErrorStateMatcher } from '../../services/form-error-state.matcher';\r\nimport { UiFormFieldDescriptor, UiFieldOption } from '../../types/field.types';\r\nimport { UiValidationRule } from '../../types/validation.types';\r\n\r\n/**\r\n * Campo atomico text / email / password — stesso rendering del form-builder.\r\n * Modalità builder: `field` + `formGroup`. Modalità standalone: `control` + `label`.\r\n *\r\n * @selector ui-form-text-field\r\n */\r\n@Component({\r\n selector: 'ui-form-text-field',\r\n standalone: true,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatAutocompleteModule,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [{ provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher }],\r\n templateUrl: './form-text-field.component.html',\r\n styleUrl: './form-fields.scss',\r\n})\r\nexport class UiFormTextFieldComponent {\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\n\r\n /** Descriptor schema (modalità builder). */\r\n @Input() field?: UiFormFieldDescriptor;\r\n /** FormGroup dell'istanza (modalità builder). */\r\n @Input() formGroup?: FormGroup;\r\n /** Readonly globale dal form-builder. */\r\n @Input() readonly = false;\r\n /** Errori pre-calcolati dal builder; se null, derivati dal controllo. */\r\n @Input() errors: string[] | null = null;\r\n\r\n /** Control diretto (modalità standalone / CVA). */\r\n @Input() control?: FormControl;\r\n @Input() label?: string;\r\n @Input() placeholder?: string;\r\n @Input() maxLength?: number;\r\n @Input() inputType: 'text' | 'email' | 'password' = 'text';\r\n @Input() validationRules?: UiValidationRule[];\r\n\r\n /** Opzioni autocomplete (campo text searchable nel builder). */\r\n @Input() options: UiFieldOption[] = [];\r\n @Output() optionsFilter = new EventEmitter<string>();\r\n @Output() blurred = new EventEmitter<void>();\r\n\r\n /** True se il campo schema è text searchable. */\r\n get isSearchableText(): boolean {\r\n return this.field?.searchable === true && this.field?.type === 'text';\r\n }\r\n\r\n /** Etichetta effettiva. */\r\n get effectiveLabel(): string {\r\n return this.field?.label ?? this.label ?? '';\r\n }\r\n\r\n /** Placeholder effettivo. */\r\n get effectivePlaceholder(): string {\r\n return this.field?.placeholder ?? this.placeholder ?? '';\r\n }\r\n\r\n /** Tipo input HTML nativo. */\r\n get nativeInputType(): string {\r\n if (this.field) {\r\n switch (this.field.type) {\r\n case 'password':\r\n return 'password';\r\n case 'email':\r\n return 'email';\r\n default:\r\n return 'text';\r\n }\r\n }\r\n return this.inputType;\r\n }\r\n\r\n /** Readonly effettivo sul campo. */\r\n get isReadonly(): boolean {\r\n return this.readonly || this.field?.readonly === true;\r\n }\r\n\r\n /** Controllo risolto per modalità standalone. */\r\n get resolvedControl(): FormControl | null {\r\n return this.control ?? null;\r\n }\r\n\r\n /** Regole validation per messaggi errore. */\r\n get effectiveRules(): UiValidationRule[] {\r\n return this.field?.validation ?? this.validationRules ?? [];\r\n }\r\n\r\n /** Max length da regole o input. */\r\n get effectiveMaxLength(): number | undefined {\r\n if (this.maxLength != null) return this.maxLength;\r\n return this.fieldErrorService.resolveMaxLength(this.effectiveRules);\r\n }\r\n\r\n /** Controllo del campo in modalità builder. */\r\n get fieldControl(): FormControl | null {\r\n if (!this.field || !this.formGroup) return null;\r\n const c = this.formGroup.get(this.field.key);\r\n return c instanceof FormControl ? c : null;\r\n }\r\n\r\n /** Messaggi errore da mostrare in mat-error. */\r\n resolvedErrors(control: FormControl | null): string[] {\r\n if (this.errors != null) return this.errors;\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\n }\r\n\r\n /** Conteggio caratteri (solo text con maxLength). */\r\n charCount(control: FormControl | null): { current: number; max: number } | null {\r\n if (this.field && this.field.type !== 'text') return null;\r\n return this.fieldErrorService.getCharCount(control, this.effectiveMaxLength);\r\n }\r\n\r\n onInput(query: string): void {\r\n this.optionsFilter.emit(query);\r\n }\r\n\r\n onBlur(): void {\r\n this.blurred.emit();\r\n }\r\n}\r\n","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-fb-text-ctx\">\r\n @if (isSearchableText) {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <input\r\n matInput\r\n [formControlName]=\"field.key\"\r\n [type]=\"nativeInputType\"\r\n [matAutocomplete]=\"textAuto\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <mat-autocomplete #textAuto=\"matAutocomplete\">\r\n @for (opt of options; track opt.value) {\r\n <mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\r\n }\r\n </mat-autocomplete>\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n } @else {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <input\r\n matInput\r\n [formControlName]=\"field.key\"\r\n [type]=\"nativeInputType\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (field.iconTooltip) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\"\r\n [attr.aria-label]=\"field.iconTooltip.text\"\r\n >\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"18\" />\r\n </button>\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n @if (charCount(fieldControl); as cc) {\r\n <mat-hint\r\n align=\"end\"\r\n class=\"ui-form-builder__char-count\"\r\n [class.ui-form-builder__char-count--warn]=\"cc.current > cc.max * 0.9\"\r\n [class.ui-form-builder__char-count--error]=\"cc.current > cc.max\"\r\n >\r\n {{ cc.current }} / {{ cc.max }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n }\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n <input\r\n matInput\r\n [formControl]=\"control\"\r\n [type]=\"nativeInputType\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [attr.maxlength]=\"effectiveMaxLength\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n @if (charCount(control); as cc) {\r\n <mat-hint\r\n align=\"end\"\r\n class=\"ui-form-builder__char-count\"\r\n [class.ui-form-builder__char-count--warn]=\"cc.current > cc.max * 0.9\"\r\n [class.ui-form-builder__char-count--error]=\"cc.current > cc.max\"\r\n >\r\n {{ cc.current }} / {{ cc.max }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n </div>\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n ViewEncapsulation,\r\n inject,\r\n} from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { UiFormFieldErrorService } from '../../services/form-field-error.service';\r\nimport { UiFormErrorStateMatcher } from '../../services/form-error-state.matcher';\r\nimport { UiFormFieldDescriptor } from '../../types/field.types';\r\nimport { UiValidationRule } from '../../types/validation.types';\r\n\r\n/**\r\n * Campo atomico textarea — stesso rendering del form-builder.\r\n *\r\n * @selector ui-form-textarea-field\r\n */\r\n@Component({\r\n selector: 'ui-form-textarea-field',\r\n standalone: true,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [{ provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher }],\r\n templateUrl: './form-textarea-field.component.html',\r\n styleUrl: './form-fields.scss',\r\n})\r\nexport class UiFormTextareaFieldComponent {\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\n\r\n @Input() field?: UiFormFieldDescriptor;\r\n @Input() formGroup?: FormGroup;\r\n @Input() readonly = false;\r\n @Input() errors: string[] | null = null;\r\n\r\n @Input() control?: FormControl;\r\n @Input() label?: string;\r\n @Input() placeholder?: string;\r\n @Input() rows = 4;\r\n @Input() maxLength?: number;\r\n @Input() validationRules?: UiValidationRule[];\r\n\r\n @Output() blurred = new EventEmitter<void>();\r\n\r\n get effectiveLabel(): string {\r\n return this.field?.label ?? this.label ?? '';\r\n }\r\n\r\n get effectivePlaceholder(): string {\r\n return this.field?.placeholder ?? this.placeholder ?? '';\r\n }\r\n\r\n get isReadonly(): boolean {\r\n return this.readonly || this.field?.readonly === true;\r\n }\r\n\r\n get effectiveRules(): UiValidationRule[] {\r\n return this.field?.validation ?? this.validationRules ?? [];\r\n }\r\n\r\n /** Controllo del campo in modalità builder. */\r\n get fieldControl(): FormControl | null {\r\n if (!this.field || !this.formGroup) return null;\r\n const c = this.formGroup.get(this.field.key);\r\n return c instanceof FormControl ? c : null;\r\n }\r\n\r\n get effectiveMaxLength(): number | undefined {\r\n if (this.maxLength != null) return this.maxLength;\r\n return this.fieldErrorService.resolveMaxLength(this.effectiveRules);\r\n }\r\n\r\n resolvedErrors(control: FormControl | null): string[] {\r\n if (this.errors != null) return this.errors;\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\n }\r\n\r\n charCount(control: FormControl | null): { current: number; max: number } | null {\r\n return this.fieldErrorService.getCharCount(control, this.effectiveMaxLength);\r\n }\r\n\r\n onBlur(): void {\r\n this.blurred.emit();\r\n }\r\n}\r\n","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-form-builder__textarea-wrapper\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <textarea\r\n matInput\r\n [formControlName]=\"field.key\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n [rows]=\"rows\"\r\n (blur)=\"onBlur()\"\r\n ></textarea>\r\n @if (field.iconTooltip) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\"\r\n [attr.aria-label]=\"field.iconTooltip.text\"\r\n >\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"18\" />\r\n </button>\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n @if (charCount(fieldControl); as cc) {\r\n <mat-hint\r\n align=\"end\"\r\n class=\"ui-form-builder__char-count\"\r\n [class.ui-form-builder__char-count--warn]=\"cc.current > cc.max * 0.9\"\r\n [class.ui-form-builder__char-count--error]=\"cc.current > cc.max\"\r\n >\r\n {{ cc.current }} / {{ cc.max }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom ui-form-builder__textarea-wrapper\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n <textarea\r\n matInput\r\n [formControl]=\"control\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [rows]=\"rows\"\r\n [attr.maxlength]=\"effectiveMaxLength\"\r\n (blur)=\"onBlur()\"\r\n ></textarea>\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n @if (charCount(control); as cc) {\r\n <mat-hint\r\n align=\"end\"\r\n class=\"ui-form-builder__char-count\"\r\n [class.ui-form-builder__char-count--warn]=\"cc.current > cc.max * 0.9\"\r\n [class.ui-form-builder__char-count--error]=\"cc.current > cc.max\"\r\n >\r\n {{ cc.current }} / {{ cc.max }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n </div>\r\n}\r\n","import { Directive, ElementRef, HostListener, Input, OnInit, Renderer2, forwardRef } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n/**\r\n * Direttiva per formattazione input valuta.\r\n *\r\n * Formatta il valore numerico con separatori italiani (1.234,56)\r\n * e simbolo valuta opzionale. In fase di focus l'utente modifica\r\n * il valore raw, al blur viene riformattato.\r\n *\r\n * Implementa `ControlValueAccessor` per integrazione con Reactive Forms.\r\n *\r\n * @selector [uiCurrencyInput]\r\n *\r\n * @example\r\n * ```html\r\n * <input uiCurrencyInput currencySymbol=\"EUR\" [decimalPlaces]=\"2\" />\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[uiCurrencyInput]',\r\n standalone: true,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UiCurrencyInputDirective),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class UiCurrencyInputDirective implements ControlValueAccessor, OnInit {\r\n /** Simbolo valuta visualizzato. @default 'EUR' */\r\n @Input() currencySymbol = 'EUR';\r\n\r\n /** Numero di decimali. @default 2 */\r\n @Input() decimalPlaces = 2;\r\n\r\n private rawValue: number | null = null;\r\n private onChange: (value: number | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n private isFocused = false;\r\n\r\n constructor(\r\n private el: ElementRef<HTMLInputElement>,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.renderer.setStyle(this.el.nativeElement, 'text-align', 'right');\r\n }\r\n\r\n // ── ControlValueAccessor ──\r\n\r\n writeValue(value: any): void {\r\n this.rawValue = value != null ? Number(value) : null;\r\n if (!this.isFocused) {\r\n this.displayFormatted();\r\n }\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.renderer.setProperty(this.el.nativeElement, 'disabled', isDisabled);\r\n }\r\n\r\n // ── Gestione eventi ──\r\n\r\n @HostListener('focus')\r\n onFocus(): void {\r\n this.isFocused = true;\r\n this.renderer.setStyle(this.el.nativeElement, 'text-align', 'left');\r\n // Mostra valore raw per editing\r\n if (this.rawValue != null) {\r\n this.el.nativeElement.value = this.rawValue.toString().replace('.', ',');\r\n } else {\r\n this.el.nativeElement.value = '';\r\n }\r\n }\r\n\r\n @HostListener('blur')\r\n onBlur(): void {\r\n this.isFocused = false;\r\n this.onTouched();\r\n this.parseInput();\r\n this.displayFormatted();\r\n this.renderer.setStyle(this.el.nativeElement, 'text-align', 'right');\r\n }\r\n\r\n @HostListener('input', ['$event.target.value'])\r\n onInput(value: string): void {\r\n // Permetti solo cifre, virgola e punto (come separatore decimale)\r\n const sanitized = value.replace(/[^0-9,.\\-]/g, '');\r\n if (sanitized !== value) {\r\n this.el.nativeElement.value = sanitized;\r\n }\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent): void {\r\n const allowed = [\r\n 'Backspace',\r\n 'Delete',\r\n 'Tab',\r\n 'Escape',\r\n 'Enter',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'Home',\r\n 'End',\r\n ];\r\n if (allowed.includes(event.key)) return;\r\n\r\n // Permetti Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X\r\n if (event.ctrlKey || event.metaKey) return;\r\n\r\n // Permetti cifre\r\n if (/^\\d$/.test(event.key)) return;\r\n\r\n // Permetti virgola e punto (un solo separatore decimale)\r\n if ((event.key === ',' || event.key === '.') && !this.el.nativeElement.value.includes(',')) {\r\n return;\r\n }\r\n\r\n // Permetti segno meno solo all'inizio\r\n if (event.key === '-' && this.el.nativeElement.selectionStart === 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n }\r\n\r\n // ── Utilita interne ──\r\n\r\n private parseInput(): void {\r\n const input = this.el.nativeElement.value.trim();\r\n if (!input) {\r\n this.rawValue = null;\r\n this.onChange(null);\r\n return;\r\n }\r\n\r\n // Normalizza: rimuovi punti migliaia, sostituisci virgola con punto\r\n const normalized = input.replace(/\\./g, '').replace(',', '.');\r\n const num = parseFloat(normalized);\r\n\r\n if (isNaN(num)) {\r\n this.rawValue = null;\r\n this.onChange(null);\r\n } else {\r\n this.rawValue = num;\r\n this.onChange(num);\r\n }\r\n }\r\n\r\n /** Mostra il valore formattato con separatori italiani e simbolo. */\r\n private displayFormatted(): void {\r\n if (this.rawValue == null) {\r\n this.el.nativeElement.value = '';\r\n return;\r\n }\r\n\r\n const formatted = this.formatItalian(this.rawValue, this.decimalPlaces);\r\n this.el.nativeElement.value = this.currencySymbol ? `${formatted} ${this.currencySymbol}` : formatted;\r\n }\r\n\r\n /** Formattazione italiana: 1.234,56 */\r\n private formatItalian(value: number, decimals: number): string {\r\n const parts = value.toFixed(decimals).split('.');\r\n const intPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.'); // NOSONAR - Used on controlled number strings from toFixed(), low ReDoS risk\r\n return decimals > 0 ? `${intPart},${parts[1]}` : intPart;\r\n }\r\n}\r\n","import {\r\r\n ChangeDetectionStrategy,\r\r\n Component,\r\r\n EventEmitter,\r\r\n Input,\r\r\n Output,\r\r\n ViewEncapsulation,\r\r\n inject,\r\r\n} from '@angular/core';\r\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\r\nimport { MatInputModule } from '@angular/material/input';\r\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\r\nimport { LucideAngularModule } from 'lucide-angular';\r\r\nimport { UiCurrencyInputDirective } from '../../directives/currency-input.directive';\r\r\nimport { UiFormErrorStateMatcher } from '../../services/form-error-state.matcher';\r\r\nimport { UiFormFieldErrorService } from '../../services/form-field-error.service';\r\r\nimport { UiFormFieldDescriptor } from '../../types/field.types';\r\r\nimport { UiValidationRule } from '../../types/validation.types';\r\r\n\r\r\n/**\r\r\n * Campo atomico number / currency — stesso rendering del form-builder.\r\r\n *\r\r\n * @selector ui-form-number-field\r\r\n */\r\r\n@Component({\r\r\n selector: 'ui-form-number-field',\r\r\n standalone: true,\r\r\n imports: [\r\r\n ReactiveFormsModule,\r\r\n MatFormFieldModule,\r\r\n MatInputModule,\r\r\n MatTooltipModule,\r\r\n LucideAngularModule,\r\r\n UiCurrencyInputDirective,\r\r\n ],\r\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\r\n encapsulation: ViewEncapsulation.None,\r\r\n providers: [{ provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher }],\r\r\n templateUrl: './form-number-field.component.html',\r\r\n styleUrl: './form-fields.scss',\r\r\n})\r\r\nexport class UiFormNumberFieldComponent {\r\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\r\n\r\r\n @Input() field?: UiFormFieldDescriptor;\r\r\n @Input() formGroup?: FormGroup;\r\r\n @Input() readonly = false;\r\r\n @Input() errors: string[] | null = null;\r\r\n\r\r\n @Input() control?: FormControl;\r\r\n @Input() label?: string;\r\r\n @Input() placeholder?: string;\r\r\n @Input() validationRules?: UiValidationRule[];\r\r\n /** Modalità valuta standalone (equivalente a `field.metadata.type === 'currency'`). */\r\r\n @Input() currencyMode = false;\r\r\n @Input() currencySymbol = 'EUR';\r\r\n @Input() decimalPlaces = 2;\r\r\n\r\r\n @Output() blurred = new EventEmitter<void>();\r\r\n\r\r\n get effectiveLabel(): string {\r\r\n return this.field?.label ?? this.label ?? '';\r\r\n }\r\r\n\r\r\n get effectivePlaceholder(): string {\r\r\n return this.field?.placeholder ?? this.placeholder ?? '';\r\r\n }\r\r\n\r\r\n get isReadonly(): boolean {\r\r\n return this.readonly || this.field?.readonly === true;\r\r\n }\r\r\n\r\r\n get isCurrency(): boolean {\r\r\n if (this.field?.metadata?.['type'] === 'currency') return true;\r\r\n return this.currencyMode;\r\r\n }\r\r\n\r\r\n get effectiveCurrencySymbol(): string {\r\r\n return (this.field?.metadata?.['currency'] as string) || this.currencySymbol;\r\r\n }\r\r\n\r\r\n get effectiveDecimalPlaces(): number {\r\r\n const fromField = this.field?.metadata?.['decimals'];\r\r\n return fromField != null ? Number(fromField) : this.decimalPlaces;\r\r\n }\r\r\n\r\r\n get effectiveRules(): UiValidationRule[] {\r\r\n return this.field?.validation ?? this.validationRules ?? [];\r\r\n }\r\r\n\r\r\n get fieldControl(): FormControl | null {\r\r\n if (!this.field || !this.formGroup) return null;\r\r\n const c = this.formGroup.get(this.field.key);\r\r\n return c instanceof FormControl ? c : null;\r\r\n }\r\r\n\r\r\n resolvedErrors(control: FormControl | null): string[] {\r\r\n if (this.errors != null) return this.errors;\r\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\r\n }\r\r\n\r\r\n onBlur(): void {\r\r\n this.blurred.emit();\r\r\n }\r\r\n}\r\r\n\r","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-fb-field-ctx\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n @if (isCurrency) {\r\n <input\r\n matInput\r\n type=\"text\"\r\n [formControlName]=\"field.key\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n uiCurrencyInput\r\n [currencySymbol]=\"effectiveCurrencySymbol\"\r\n [decimalPlaces]=\"effectiveDecimalPlaces\"\r\n (blur)=\"onBlur()\"\r\n />\r\n } @else {\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControlName]=\"field.key\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n (blur)=\"onBlur()\"\r\n />\r\n }\r\n @if (field.iconTooltip) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\"\r\n [attr.aria-label]=\"field.iconTooltip.text\"\r\n >\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"18\" />\r\n </button>\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom\">\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n @if (isCurrency) {\r\n <input\r\n matInput\r\n type=\"text\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n uiCurrencyInput\r\n [currencySymbol]=\"effectiveCurrencySymbol\"\r\n [decimalPlaces]=\"effectiveDecimalPlaces\"\r\n (blur)=\"onBlur()\"\r\n />\r\n } @else {\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n (blur)=\"onBlur()\"\r\n />\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n}\r\n","import {\r\r\n ChangeDetectionStrategy,\r\r\n Component,\r\r\n EventEmitter,\r\r\n Input,\r\r\n Output,\r\r\n ViewEncapsulation,\r\r\n inject,\r\r\n} from '@angular/core';\r\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\r\nimport { MatInputModule } from '@angular/material/input';\r\r\nimport { MatSelectModule } from '@angular/material/select';\r\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\r\nimport { LucideAngularModule } from 'lucide-angular';\r\r\nimport { UiFormErrorStateMatcher } from '../../services/form-error-state.matcher';\r\r\nimport { UiFormFieldErrorService } from '../../services/form-field-error.service';\r\r\nimport { UiFieldOption, UiFormFieldDescriptor } from '../../types/field.types';\r\r\nimport { UiValidationRule } from '../../types/validation.types';\r\r\n\r\r\n/**\r\r\n * Campo atomico select (mat-select o autocomplete searchable).\r\r\n *\r\r\n * @selector ui-form-select-field\r\r\n */\r\r\n@Component({\r\r\n selector: 'ui-form-select-field',\r\r\n standalone: true,\r\r\n imports: [\r\r\n ReactiveFormsModule,\r\r\n MatFormFieldModule,\r\r\n MatInputModule,\r\r\n MatSelectModule,\r\r\n MatAutocompleteModule,\r\r\n MatTooltipModule,\r\r\n LucideAngularModule,\r\r\n ],\r\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\r\n encapsulation: ViewEncapsulation.None,\r\r\n providers: [{ provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher }],\r\r\n templateUrl: './form-select-field.component.html',\r\r\n styleUrl: './form-fields.scss',\r\r\n})\r\r\nexport class UiFormSelectFieldComponent {\r\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\r\n\r\r\n @Input() field?: UiFormFieldDescriptor;\r\r\n @Input() formGroup?: FormGroup;\r\r\n @Input() readonly = false;\r\r\n @Input() errors: string[] | null = null;\r\r\n @Input() options: UiFieldOption[] = [];\r\r\n\r\r\n @Input() control?: FormControl;\r\r\n @Input() label?: string;\r\r\n @Input() placeholder?: string;\r\r\n @Input() searchable = false;\r\r\n @Input() hideEmptyOption = false;\r\r\n @Input() validationRules?: UiValidationRule[];\r\r\n\r\r\n @Output() optionsFilter = new EventEmitter<string>();\r\r\n @Output() blurred = new EventEmitter<void>();\r\r\n\r\r\n get effectiveLabel(): string {\r\r\n return this.field?.label ?? this.label ?? '';\r\r\n }\r\r\n\r\r\n get effectivePlaceholder(): string {\r\r\n return this.field?.placeholder ?? this.placeholder ?? '';\r\r\n }\r\r\n\r\r\n get isReadonly(): boolean {\r\r\n return this.readonly || this.field?.readonly === true;\r\r\n }\r\r\n\r\r\n get isSearchable(): boolean {\r\r\n return this.field?.searchable === true || this.searchable;\r\r\n }\r\r\n\r\r\n get showEmptyOption(): boolean {\r\r\n if (this.field) return !this.field.hideEmptyOption;\r\r\n return !this.hideEmptyOption;\r\r\n }\r\r\n\r\r\n get effectiveOptions(): UiFieldOption[] {\r\r\n return this.options;\r\r\n }\r\r\n\r\r\n get effectiveRules(): UiValidationRule[] {\r\r\n return this.field?.validation ?? this.validationRules ?? [];\r\r\n }\r\r\n\r\r\n get fieldControl(): FormControl | null {\r\r\n if (!this.field || !this.formGroup) return null;\r\r\n const c = this.formGroup.get(this.field.key);\r\r\n return c instanceof FormControl ? c : null;\r\r\n }\r\r\n\r\r\n resolvedErrors(control: FormControl | null): string[] {\r\r\n if (this.errors != null) return this.errors;\r\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\r\n }\r\r\n\r\r\n displayWith = (value: unknown): string => {\r\r\n const opt = this.effectiveOptions.find((o) => o.value === value);\r\r\n return opt?.label ?? '';\r\r\n };\r\r\n\r\r\n onInput(query: string): void {\r\r\n this.optionsFilter.emit(query);\r\r\n }\r\r\n\r\r\n onBlur(): void {\r\r\n this.blurred.emit();\r\r\n }\r\r\n}\r\r\n\r","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-fb-field-ctx\">\r\n @if (isSearchable) {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <input\r\n matInput\r\n [formControlName]=\"field.key\"\r\n [matAutocomplete]=\"selectAuto\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [readonly]=\"isReadonly\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <mat-autocomplete #selectAuto=\"matAutocomplete\" [displayWith]=\"displayWith\">\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" class=\"ui-form-builder__option-icon\" />\r\n }\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n } @else {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n <mat-select [formControlName]=\"field.key\" [placeholder]=\"effectivePlaceholder\">\r\n @if (showEmptyOption) {\r\n <mat-option [value]=\"null\">--</mat-option>\r\n }\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" class=\"ui-form-builder__option-icon\" />\r\n }\r\n {{ opt.label }}\r\n @if (opt.tooltip) {\r\n <lucide-icon\r\n name=\"info\"\r\n [size]=\"14\"\r\n [matTooltip]=\"opt.tooltip\"\r\n class=\"ui-form-builder__option-info\"\r\n />\r\n }\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (field.iconTooltip) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n type=\"button\"\r\n [matTooltip]=\"field.iconTooltip.text\"\r\n [attr.aria-label]=\"field.iconTooltip.text\"\r\n >\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"18\" />\r\n </button>\r\n }\r\n <mat-error>\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom\">\r\n @if (isSearchable) {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n <input\r\n matInput\r\n [formControl]=\"control\"\r\n [matAutocomplete]=\"selectAutoStandalone\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <mat-autocomplete #selectAutoStandalone=\"matAutocomplete\" [displayWith]=\"displayWith\">\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" class=\"ui-form-builder__option-icon\" />\r\n }\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n } @else {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\" subscriptSizing=\"dynamic\">\r\n @if (effectiveLabel) {\r\n <mat-label>{{ effectiveLabel }}</mat-label>\r\n }\r\n <mat-select [formControl]=\"control\" [placeholder]=\"effectivePlaceholder\">\r\n @if (showEmptyOption) {\r\n <mat-option [value]=\"null\">--</mat-option>\r\n }\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" class=\"ui-form-builder__option-icon\" />\r\n }\r\n {{ opt.label }}\r\n @if (opt.tooltip) {\r\n <lucide-icon\r\n name=\"info\"\r\n [size]=\"14\"\r\n [matTooltip]=\"opt.tooltip\"\r\n class=\"ui-form-builder__option-info\"\r\n />\r\n }\r\n </mat-option>\r\n }\r\n </mat-select>\r\n <mat-error>\r\n @for (err of resolvedErrors(control); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n </div>\r\n}\r\n","import {\r\r\n ChangeDetectionStrategy,\r\r\n Component,\r\r\n EventEmitter,\r\r\n Input,\r\r\n Output,\r\r\n ViewEncapsulation,\r\r\n inject,\r\r\n} from '@angular/core';\r\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\r\nimport { MatRadioModule } from '@angular/material/radio';\r\r\nimport { LucideAngularModule } from 'lucide-angular';\r\r\nimport { UiFormFieldErrorService, UiFieldErrorDisplayOptions } from '../../services/form-field-error.service';\r\r\nimport { UiFieldOption, UiFormFieldDescriptor } from '../../types/field.types';\r\r\nimport { UiValidationRule } from '../../types/validation.types';\r\r\n\r\r\n/**\r\r\n * Campo atomico radio group — stesso rendering del form-builder.\r\r\n *\r\r\n * @selector ui-form-radio-field\r\r\n */\r\r\n@Component({\r\r\n selector: 'ui-form-radio-field',\r\r\n standalone: true,\r\r\n imports: [ReactiveFormsModule, MatRadioModule, LucideAngularModule],\r\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\r\n encapsulation: ViewEncapsulation.None,\r\r\n templateUrl: './form-radio-field.component.html',\r\r\n styleUrl: './form-fields.scss',\r\r\n})\r\r\nexport class UiFormRadioFieldComponent {\r\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\r\n\r\r\n @Input() field?: UiFormFieldDescriptor;\r\r\n @Input() formGroup?: FormGroup;\r\r\n @Input() readonly = false;\r\r\n @Input() errors: string[] | null = null;\r\r\n @Input() options: UiFieldOption[] = [];\r\r\n /** Indica asterisco obbligatorio (builder: `isFieldRequired`). */\r\r\n @Input() required = false;\r\r\n /** Override visibilità errori; se null deriva dal controllo. */\r\r\n @Input() showErrors: boolean | null = null;\r\r\n @Input() errorDisplayOptions: UiFieldErrorDisplayOptions = {};\r\r\n\r\r\n @Input() control?: FormControl;\r\r\n @Input() label?: string;\r\r\n @Input() validationRules?: UiValidationRule[];\r\r\n @Input() color: 'primary' | 'accent' | 'warn' = 'primary';\r\r\n\r\r\n @Output() blurred = new EventEmitter<void>();\r\r\n\r\r\n get effectiveLabel(): string {\r\r\n return this.field?.label ?? this.label ?? '';\r\r\n }\r\r\n\r\r\n get isDisabled(): boolean {\r\r\n return this.readonly || this.field?.readonly === true || this.field?.disabled === true;\r\r\n }\r\r\n\r\r\n get effectiveOptions(): UiFieldOption[] {\r\r\n return this.options;\r\r\n }\r\r\n\r\r\n get effectiveColor(): 'primary' | 'accent' | 'warn' {\r\r\n return this.field?.appearance?.color ?? this.color;\r\r\n }\r\r\n\r\r\n get effectiveRules(): UiValidationRule[] {\r\r\n return this.field?.validation ?? this.validationRules ?? [];\r\r\n }\r\r\n\r\r\n get showRequiredMarker(): boolean {\r\r\n if (this.required) return true;\r\r\n return this.effectiveRules.some((r) => r.type === 'required' && !r.conditions?.length);\r\r\n }\r\r\n\r\r\n get fieldControl(): FormControl | null {\r\r\n if (!this.field || !this.formGroup) return null;\r\r\n const c = this.formGroup.get(this.field.key);\r\r\n return c instanceof FormControl ? c : null;\r\r\n }\r\r\n\r\r\n resolvedErrors(control: FormControl | null): string[] {\r\r\n if (this.errors != null) return this.errors;\r\r\n return this.fieldErrorService.getFieldErrors(control, this.effectiveRules);\r\r\n }\r\r\n\r\r\n shouldShowErrors(control: FormControl | null): boolean {\r\r\n if (this.showErrors != null) return this.showErrors;\r\r\n return this.fieldErrorService.shouldShowFieldErrors(control, this.errorDisplayOptions);\r\r\n }\r\r\n\r\r\n onBlur(): void {\r\r\n this.blurred.emit();\r\r\n }\r\r\n}\r\r\n\r","@if (field && formGroup) {\r\n <div [formGroup]=\"formGroup\" class=\"ui-fb-field-ctx\">\r\n <div class=\"ui-form-builder__radio-wrapper\">\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ effectiveLabel }}\r\n @if (showRequiredMarker) {\r\n <span class=\"ui-form-builder__required\">*</span>\r\n }\r\n </label>\r\n <mat-radio-group\r\n [formControlName]=\"field.key\"\r\n [color]=\"effectiveColor\"\r\n (blur)=\"onBlur()\"\r\n >\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-radio-button [value]=\"opt.value\" [disabled]=\"opt.disabled || isDisabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" />\r\n }\r\n {{ opt.label }}\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n @if (shouldShowErrors(fieldControl)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of resolvedErrors(fieldControl); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n} @else if (control) {\r\n <div class=\"ui-form-field-atom ui-form-builder__radio-wrapper\">\r\n @if (effectiveLabel) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ effectiveLabel }}\r\n @if (showRequiredMarker) {\r\n <span class=\"ui-form-builder__required\">*</span>\r\n }\r\n </label>\r\n }\r\n <mat-radio-group [formControl]=\"control\" [color]=\"effectiveColor\" (blur)=\"onBlur()\">\r\n @for (opt of effectiveOptions; track opt.value) {\r\n <mat-radio-button [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n @if (opt.icon) {\r\n <lucide-icon [name]=\"opt.icon\" [size]=\"16\" />\r\n }\r\n {{ opt.label }}\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n @if (shouldShowErrors(control)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of resolvedErrors(control); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n}\r\n","/**\r\n * @module ng-ui-system/form-builder\r\n * Adapter e formati per il datepicker italiano (DD/MM/YYYY).\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { NativeDateAdapter, MatDateFormats } from '@angular/material/core';\r\n\r\n/**\r\n * Adapter personalizzato per il parsing delle date in formato italiano DD/MM/YYYY.\r\n *\r\n * Estende il NativeDateAdapter di Angular Material per gestire:\r\n * - Parsing: converte stringhe DD/MM/YYYY in oggetti Date\r\n * - Formattazione: visualizza le date nel formato italiano\r\n * - Primo giorno della settimana: Lunedi (1)\r\n */\r\n@Injectable()\r\nexport class UiItalianDateAdapter extends NativeDateAdapter {\r\n /**\r\n * Il primo giorno della settimana e Lunedi (1).\r\n */\r\n override getFirstDayOfWeek(): number {\r\n return 1;\r\n }\r\n\r\n /**\r\n * Parsing di una stringa di data in formato DD/MM/YYYY.\r\n * Supporta sia il formato con separatore `/` che `-`.\r\n */\r\n override parse(value: any): Date | null {\r\n if (typeof value === 'string' && value.length > 0) {\r\n // Gestisci formato DD/MM/YYYY o DD-MM-YYYY\r\n const parts = value.split(/[\\/\\-]/);\r\n if (parts.length === 3) {\r\n const day = parseInt(parts[0], 10);\r\n const month = parseInt(parts[1], 10) - 1; // Mesi 0-based\r\n const year = parseInt(parts[2], 10);\r\n\r\n if (!isNaN(day) && !isNaN(month) && !isNaN(year)) {\r\n // Validazione base\r\n if (day >= 1 && day <= 31 && month >= 0 && month <= 11 && year >= 1900 && year <= 2100) {\r\n return new Date(year, month, day);\r\n }\r\n }\r\n }\r\n }\r\n return super.parse(value);\r\n }\r\n\r\n /**\r\n * Formatta una data in formato DD/MM/YYYY per la visualizzazione.\r\n */\r\n override format(date: Date, displayFormat: object): string {\r\n if ((displayFormat as any) === 'input') {\r\n const day = date.getDate().toString().padStart(2, '0');\r\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const year = date.getFullYear();\r\n return `${day}/${month}/${year}`;\r\n }\r\n return date.toLocaleDateString('it-IT', {\r\n year: 'numeric',\r\n month: 'long',\r\n day: 'numeric',\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Formati data italiani per Angular Material.\r\n * Configura il datepicker per usare DD/MM/YYYY.\r\n */\r\nexport const UI_IT_DATE_FORMATS: MatDateFormats = {\r\n parse: {\r\n dateInput: 'input',\r\n },\r\n display: {\r\n dateInput: 'input',\r\n monthYearLabel: { year: 'numeric', month: 'short' },\r\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\r\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\r\n },\r\n};\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnInit,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n ViewEncapsulation,\r\n inject,\r\n ElementRef,\r\n TemplateRef,\r\n} from '@angular/core';\r\nimport {\r\n FormGroup,\r\n FormControl,\r\n FormArray,\r\n ReactiveFormsModule,\r\n Validators,\r\n AbstractControl,\r\n} from '@angular/forms';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport {\r\n MatNativeDateModule,\r\n DateAdapter,\r\n MAT_DATE_FORMATS,\r\n MAT_DATE_LOCALE,\r\n ErrorStateMatcher,\r\n} from '@angular/material/core';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { UiAccordionComponent, UiAccordionDescriptor } from '../accordion/index';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { LucideAngularModule } from 'lucide-angular';\r\nimport { Subject, Subscription, Observable } from 'rxjs';\r\nimport { debounceTime, takeUntil, distinctUntilChanged, filter as rxFilter } from 'rxjs/operators';\r\nimport { UiButtonComponent, UiButtonDescriptor } from '../../components/button/index';\r\nimport { UiButtonAreaComponent } from '../../components/button/button-area.component';\r\nimport { UiBlackboxService } from '../blackbox/blackbox.service';\r\nimport { UiLoggerService } from '../../core/logging/logger.service';\r\nimport { Router } from '@angular/router';\r\n\r\nimport { UiFormSchema, UiFormSection, UiFormData, UiFormCustomEvent, UiFormBuilderConfig, UiRepeatableConfig } from './types/schema.types';\r\nimport {\r\n UiFormFieldDescriptor,\r\n UiFieldOption,\r\n UiFieldType,\r\n UiCustomFieldTemplateContext,\r\n} from './types/field.types';\r\nimport {\r\n UiFormValidationState,\r\n UiFormErrorDetail,\r\n UiValidationRule,\r\n UI_FORM_NESTED_FIELD_ERRORS_KEY,\r\n} from './types/validation.types';\r\nimport { UiFieldCondition } from './types/condition.types';\r\nimport { UiFormConditionService } from './services/form-condition.service';\r\nimport { UiFormValidationService } from './services/form-validation.service';\r\nimport { UiFormFieldErrorService } from './services/form-field-error.service';\r\nimport { UiFormErrorSummaryComponent } from './sub-components/error-summary/form-error-summary.component';\r\nimport { UiFileInputComponent } from './sub-components/file-input/file-input.component';\r\nimport { UiSpecificaTerritorialeComponent } from './sub-components/specifica-territoriale/specifica-territoriale.component';\r\nimport { UiTableTerritorialeComponent } from './sub-components/table-territoriale/table-territoriale.component';\r\nimport { UiLocationGeocodedComponent } from './sub-components/location-geocoded/location-geocoded.component';\r\nimport { UiFormTextFieldComponent, UiFormTextareaFieldComponent, UiFormNumberFieldComponent, UiFormSelectFieldComponent, UiFormRadioFieldComponent } from './sub-components/form-fields/index';\r\nimport { UiFormErrorStateMatcher } from './services/form-error-state.matcher';\r\nimport { UiItalianDateAdapter, UI_IT_DATE_FORMATS } from './adapters/it-date-adapter';\r\n\r\n/**\r\n * Form builder data-driven e schema-based.\r\n *\r\n * Genera un form completo a partire da uno schema dichiarativo (`UiFormSchema`).\r\n * Supporta i tipi di campo del form builder, validazione condizionale, cross-field validation,\r\n * date con offset, opzioni dipendenti/dinamiche, sezioni collapsibili,\r\n * error summary con scroll-to-field e button override.\r\n *\r\n * @selector ui-form-builder\r\n *\r\n * @example\r\n * ```html\r\n * <ui-form-builder\r\n * [schema]=\"formSchema\"\r\n * [initialData]=\"userData\"\r\n * (formSubmit)=\"onSubmit($event)\"\r\n * (valueChange)=\"onChange($event)\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ui-form-builder',\r\n standalone: true,\r\n imports: [\r\n ReactiveFormsModule,\r\n NgTemplateOutlet,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatCheckboxModule,\r\n MatSlideToggleModule,\r\n MatRadioModule,\r\n MatDatepickerModule,\r\n MatNativeDateModule,\r\n MatAutocompleteModule,\r\n MatChipsModule,\r\n UiAccordionComponent,\r\n MatTooltipModule,\r\n LucideAngularModule,\r\n UiButtonComponent,\r\n UiButtonAreaComponent,\r\n UiFormErrorSummaryComponent,\r\n UiFileInputComponent,\r\n UiSpecificaTerritorialeComponent,\r\n UiTableTerritorialeComponent,\r\n UiLocationGeocodedComponent,\r\n UiFormTextFieldComponent,\r\n UiFormTextareaFieldComponent,\r\n UiFormNumberFieldComponent,\r\n UiFormSelectFieldComponent,\r\n UiFormRadioFieldComponent,\r\n ],\r\n providers: [\r\n { provide: ErrorStateMatcher, useClass: UiFormErrorStateMatcher },\r\n // Locale italiano per il datepicker Material\r\n { provide: MAT_DATE_LOCALE, useValue: 'it-IT' },\r\n // Adapter personalizzato per parsing DD/MM/YYYY\r\n { provide: DateAdapter, useClass: UiItalianDateAdapter },\r\n // Formati data italiani (DD/MM/YYYY)\r\n { provide: MAT_DATE_FORMATS, useValue: UI_IT_DATE_FORMATS },\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n host: { class: 'ui-form-builder-host' },\r\n templateUrl: './form-builder.component.html',\r\n styleUrl: './form-builder.component.scss',\r\n})\r\nexport class UiFormBuilderComponent implements OnInit, OnChanges, OnDestroy, AfterViewInit {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly elRef = inject(ElementRef);\r\n private readonly conditionService = inject(UiFormConditionService);\r\n private readonly validationService = inject(UiFormValidationService);\r\n private readonly fieldErrorService = inject(UiFormFieldErrorService);\r\n\r\n /** @internal Optional BlackBox service — auto-tracks form events when available. */\r\n private readonly blackbox = inject(UiBlackboxService, { optional: true });\r\n /** @internal Router inject for BlackBox route context. */\r\n private readonly bbRouter = inject(Router, { optional: true });\r\n /** @internal Optional Logger service — logs form actions when available. */\r\n private readonly logger = inject(UiLoggerService, { optional: true });\r\n\r\n private readonly destroy$ = new Subject<void>();\r\n private valueChangeSub?: Subscription;\r\n /** @internal Listener cleanup for BlackBox focus/blur tracking. */\r\n private bbFocusHandler: ((e: FocusEvent) => void) | null = null;\r\n private bbBlurHandler: ((e: FocusEvent) => void) | null = null;\r\n\r\n /** ID schema corrente -- usato per evitare rebuild superflui. */\r\n private currentSchemaId: string | null = null;\r\n\r\n // ─── Input ──────────────────────────────────────────────────────\r\n\r\n /** Schema del form. */\r\n @Input() schema!: UiFormSchema;\r\n\r\n /** Dati iniziali per la prevalorizzazione. */\r\n @Input() initialData: UiFormData = {};\r\n\r\n /** Modalita sola lettura globale. */\r\n @Input() readonly = false;\r\n\r\n /** Stato disabilitato globale. */\r\n @Input() disabled = false;\r\n\r\n /** Override dei pulsanti di default. */\r\n @Input() buttonsOverride?: UiButtonDescriptor[];\r\n\r\n /** Chiave del pulsante in stato di caricamento. */\r\n @Input() loadingFor: string | null = null;\r\n\r\n /**\r\n * Mappa chiave logica → template per campi `type: 'custom'`.\r\n * La chiave si risolve con `customConfig.templateKey`, poi `customConfig.component`, poi `field.key`.\r\n */\r\n @Input() customFieldTemplates: Record<string, TemplateRef<unknown>> = {};\r\n\r\n /**\r\n * Template usato quando non esiste una voce in `customFieldTemplates` per la chiave risolta\r\n * (es. un unico `ng-template` con `@switch` sul campo).\r\n */\r\n @Input() customFieldTemplateFallback?: TemplateRef<unknown>;\r\n\r\n // ─── Output ─────────────────────────────────────────────────────\r\n\r\n @Output() valueChange = new EventEmitter<UiFormData>();\r\n @Output() validationChange = new EventEmitter<UiFormValidationState>();\r\n @Output() formSubmit = new EventEmitter<UiFormData>();\r\n @Output() formReset = new EventEmitter<void>();\r\n @Output() customEvent = new EventEmitter<UiFormCustomEvent>();\r\n\r\n // ─── Stato interno ──────────────────────────────────────────────\r\n\r\n formGroup!: FormGroup;\r\n\r\n /** Mappa campo -> opzioni filtrate (per autocomplete e dependent). */\r\n filteredOptions: Record<string, UiFieldOption[]> = {};\r\n\r\n /** Campi prevalorizzati (mostrano errori subito). */\r\n prevalorizedFields = new Set<string>();\r\n\r\n /** Mappa campo -> regole di validazione (per lookup rapido). */\r\n private validationRulesMap: Record<string, UiValidationRule[]> = {};\r\n\r\n /** Mappa dipendenze: campoTarget -> campi dipendenti. */\r\n private fieldDependencies = new Map<string, Set<string>>();\r\n\r\n /** @internal Accordion descriptors per le sezioni collapsibili. */\r\n sectionAccordionMap = new Map<string, UiAccordionDescriptor[]>();\r\n\r\n /** @internal Accordion descriptors per le istanze repeatable (sectionId -> descriptors). */\r\n repeatableAccordionMap = new Map<string, UiAccordionDescriptor[]>();\r\n\r\n /** Flag per evitare emissioni durante l'inizializzazione. */\r\n private isInitializing = true;\r\n\r\n // ─── Getter calcolati ───────────────────────────────────────────\r\n\r\n /** Tutti i campi di tutte le sezioni (incluse repeatable). */\r\n get allFields(): UiFormFieldDescriptor[] {\r\n return this.schema?.sections?.flatMap((s) => s.fields) || [];\r\n }\r\n\r\n /** Campi delle sole sezioni non-repeatable (piatti nel root FormGroup). */\r\n get allFlatFields(): UiFormFieldDescriptor[] {\r\n return this.schema?.sections?.filter((s) => !s.repeatable).flatMap((s) => s.fields) || [];\r\n }\r\n\r\n /** Sezioni con configurazione repeatable. */\r\n get repeatableSections(): UiFormSection[] {\r\n return this.schema?.sections?.filter((s) => !!s.repeatable) || [];\r\n }\r\n\r\n get formErrors(): UiFormErrorDetail[] {\r\n return this.getDetailedFormErrors();\r\n }\r\n\r\n get formButtons(): UiButtonDescriptor[] {\r\n if (this.buttonsOverride) return this.buttonsOverride;\r\n if (!this.schema?.config?.showButtons && this.schema?.config?.showButtons !== undefined) return [];\r\n return [\r\n { label: this.schema?.config?.buttonLabels?.reset || 'Reset', variant: 'outline', action: () => this.onReset() },\r\n {\r\n label: this.schema?.config?.buttonLabels?.submit || 'Invia',\r\n variant: 'primary',\r\n action: () => this.onSubmit(),\r\n },\r\n ];\r\n }\r\n\r\n // ─── Lifecycle ──────────────────────────────────────────────────\r\n //\r\n // ORDINE LIFECYCLE ANGULAR:\r\n // 1. constructor\r\n // 2. ngOnChanges (prima chiamata con valori iniziali)\r\n // 3. ngOnInit\r\n // 4. ngAfterViewInit\r\n // 5. ngOnChanges (chiamate successive per cambio input)\r\n //\r\n // PER IL WIZARD:\r\n // Il wizard crea un nuovo schema (con id diverso) ad ogni cambio step.\r\n // Lo schema viene cachato nel wizard per evitare rebuild infiniti.\r\n // ngOnChanges rileva il cambio di schema.id e ricostruisce il form.\r\n\r\n ngOnInit(): void {\r\n this.logger?.logFormAction('init', { schemaId: this.schema?.id ?? 'unknown', hasFormGroup: !!this.formGroup });\r\n if (!this.schema) {\r\n this.logger?.logFormAction('init', { schemaId: 'unknown', error: 'schema non presente' });\r\n return;\r\n }\r\n this.initFormFromSchema();\r\n }\r\n\r\n /**\r\n * Rileva cambiamenti sugli @Input.\r\n * Ricostruisce il form quando cambia lo schema (id diverso).\r\n * Cruciale per il wizard che cambia schema ad ogni step.\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['schema'] && !changes['schema'].firstChange) {\r\n const newSchema = changes['schema'].currentValue as UiFormSchema;\r\n if (newSchema && newSchema.id !== this.currentSchemaId) {\r\n this.logger?.debug('form', 'schemaRebuild', {\r\n schemaId: newSchema?.id,\r\n previousSchemaId: this.currentSchemaId,\r\n });\r\n this.destroyForm();\r\n this.initFormFromSchema();\r\n }\r\n }\r\n\r\n // Aggiorna lo stato disabled/readonly globalmente\r\n if (changes['disabled'] && !changes['disabled'].firstChange && this.formGroup) {\r\n this.allFlatFields.forEach((field) => {\r\n const control = this.formGroup.get(field.key);\r\n if (!control) return;\r\n if (this.disabled && control.enabled) {\r\n control.disable({ emitEvent: false });\r\n } else if (!this.disabled && control.disabled && !field.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n });\r\n\r\n // Aggiorna disabled anche nelle istanze repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n for (const field of section.fields) {\r\n const control = instanceFg.get(field.key);\r\n if (!control) continue;\r\n if (this.disabled && control.enabled) {\r\n control.disable({ emitEvent: false });\r\n } else if (!this.disabled && control.disabled && !field.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.logger?.debug('form', 'afterViewInit', {\r\n schemaId: this.schema?.id,\r\n hasFormGroup: !!this.formGroup,\r\n fieldCount: this.formGroup ? Object.keys(this.formGroup.controls).length : 0,\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.logger?.logFormAction('destroy', { schemaId: this.currentSchemaId ?? 'unknown' });\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n this.valueChangeSub?.unsubscribe();\r\n\r\n // BlackBox: cleanup DOM listeners\r\n if (this.bbFocusHandler) {\r\n this.elRef.nativeElement.removeEventListener('focusin', this.bbFocusHandler, true);\r\n }\r\n if (this.bbBlurHandler) {\r\n this.elRef.nativeElement.removeEventListener('focusout', this.bbBlurHandler, true);\r\n }\r\n }\r\n\r\n /**\r\n * Inizializza il form dallo schema corrente.\r\n * Estratto per poter essere richiamato sia da ngOnInit che da ngOnChanges.\r\n */\r\n private initFormFromSchema(): void {\r\n if (!this.schema) {\r\n this.logger?.logFormAction('init', { schemaId: 'unknown', error: 'schema nullo' });\r\n return;\r\n }\r\n const totalFields = this.schema.sections?.reduce((sum, s) => sum + s.fields.length, 0) ?? 0;\r\n this.logger?.logFormAction('init', {\r\n schemaId: this.schema.id,\r\n sectionCount: this.schema.sections?.length,\r\n fieldCount: totalFields,\r\n });\r\n this.currentSchemaId = this.schema.id;\r\n this.buildSectionAccordionMap();\r\n this.buildForm();\r\n // Dopo il FormArray reale, allinea i descriptor accordion (max tra min e righe initialData).\r\n for (const section of this.repeatableSections) {\r\n this.rebuildRepeatableAccordion(section);\r\n }\r\n this.isInitializing = false;\r\n this.logger?.debug('form', 'formBuilt', {\r\n schemaId: this.schema.id,\r\n controlKeys: Object.keys(this.formGroup.controls),\r\n });\r\n }\r\n\r\n /**\r\n * Pulisce lo stato del form prima di un rebuild.\r\n */\r\n private destroyForm(): void {\r\n this.logger?.debug('form', 'destroyForm', { schemaId: this.currentSchemaId });\r\n this.valueChangeSub?.unsubscribe();\r\n this.valueChangeSub = undefined;\r\n this.filteredOptions = {};\r\n this.prevalorizedFields.clear();\r\n this.validationRulesMap = {};\r\n this.fieldDependencies.clear();\r\n this.sectionAccordionMap.clear();\r\n this.isInitializing = true;\r\n this.currentSchemaId = null;\r\n }\r\n\r\n // ─── Costruzione form ───────────────────────────────────────────\r\n\r\n private buildForm(): void {\r\n const controls: Record<string, AbstractControl> = {};\r\n\r\n // Campi piatti (sezioni non-repeatable)\r\n for (const field of this.allFlatFields) {\r\n const initialValue = this.initialData?.[field.key] ?? field.defaultValue ?? null;\r\n const isDisabled = field.disabled || this.disabled;\r\n\r\n const control = new FormControl({ value: initialValue, disabled: isDisabled });\r\n\r\n if (field.validation?.length) {\r\n this.validationRulesMap[field.key] = field.validation;\r\n }\r\n\r\n if (initialValue != null && initialValue !== '' && initialValue !== false) {\r\n this.prevalorizedFields.add(field.key);\r\n }\r\n\r\n if (field.options && !this.isObservable(field.options)) {\r\n this.filteredOptions[field.key] = [...(field.options as UiFieldOption[])];\r\n }\r\n\r\n controls[field.key] = control;\r\n }\r\n\r\n // FormArray per sezioni repeatable\r\n for (const section of this.repeatableSections) {\r\n const initialArray = this.initialData?.[section.id] as Record<string, any>[] | undefined;\r\n const count = this.getRepeatableInitialInstanceCount(section);\r\n\r\n const groups: FormGroup[] = [];\r\n for (let i = 0; i < count; i++) {\r\n groups.push(this.buildInstanceFormGroup(section, initialArray?.[i]));\r\n }\r\n controls[section.id] = new FormArray(groups);\r\n }\r\n\r\n this.formGroup = new FormGroup(controls);\r\n\r\n // Applica validatori iniziali\r\n this.applyAllValidators();\r\n\r\n // Registra dipendenze\r\n this.buildDependencyMap();\r\n\r\n // Sottoscrivi ai cambiamenti di valore\r\n this.valueChangeSub = this.formGroup.valueChanges.pipe(debounceTime(50), takeUntil(this.destroy$)).subscribe(() => {\r\n this.evaluateAllConditions();\r\n this.updateDependentOptions();\r\n if (!this.isInitializing) {\r\n this.valueChange.emit(this.getFormValue());\r\n this.validationChange.emit(this.getValidationState());\r\n this.cdr.markForCheck();\r\n }\r\n });\r\n\r\n // Valutazione condizioni iniziale\r\n this.evaluateAllConditions();\r\n\r\n // BlackBox: setup form event tracking\r\n this.setupBlackboxTracking();\r\n }\r\n\r\n /** Costruisce un FormGroup per una singola istanza di sezione repeatable. */\r\n private buildInstanceFormGroup(section: UiFormSection, data?: Record<string, any>): FormGroup {\r\n const controls: Record<string, FormControl> = {};\r\n\r\n for (const field of section.fields) {\r\n const initialValue = data?.[field.key] ?? field.defaultValue ?? null;\r\n const isDisabled = field.disabled || this.disabled;\r\n controls[field.key] = new FormControl({ value: initialValue, disabled: isDisabled });\r\n\r\n if (field.options && !this.isObservable(field.options)) {\r\n this.filteredOptions[field.key] = [...(field.options as UiFieldOption[])];\r\n }\r\n }\r\n\r\n const fg = new FormGroup(controls);\r\n\r\n // Applica validatori all'istanza\r\n for (const field of section.fields) {\r\n if (field.validation?.length) {\r\n const formData = fg.getRawValue();\r\n this.validationService.updateFieldValidators(fg.get(field.key)!, field.validation, formData);\r\n }\r\n }\r\n\r\n return fg;\r\n }\r\n\r\n // ─── BlackBox form tracking ──────────────────────────────────────\r\n\r\n /**\r\n * Sets up BlackBox form event tracking.\r\n * - Focus/blur: DOM event delegation on the host element\r\n * - Value changes: per-field subscriptions with debounce\r\n * - Validation errors: per-field statusChanges subscriptions\r\n * @internal\r\n */\r\n private setupBlackboxTracking(): void {\r\n if (!this.blackbox) return;\r\n const config = this.blackbox.getConfig().formTracking;\r\n const currentRoute = this.bbRouter?.url ?? '';\r\n const formId = this.schema?.id ?? 'unknown';\r\n\r\n // Focus tracking via event delegation\r\n if (config.trackFocus) {\r\n this.bbFocusHandler = (e: FocusEvent) => {\r\n const fieldKey = this.resolveFieldKeyFromEvent(e);\r\n if (!fieldKey) return;\r\n this.blackbox!.trackFormEvent({\r\n timestamp: Date.now(),\r\n route: this.bbRouter?.url ?? currentRoute,\r\n formId,\r\n fieldKey,\r\n eventType: 'focus',\r\n });\r\n };\r\n this.elRef.nativeElement.addEventListener('focusin', this.bbFocusHandler, true);\r\n }\r\n\r\n // Blur tracking via event delegation\r\n if (config.trackBlur) {\r\n this.bbBlurHandler = (e: FocusEvent) => {\r\n const fieldKey = this.resolveFieldKeyFromEvent(e);\r\n if (!fieldKey) return;\r\n this.blackbox!.trackFormEvent({\r\n timestamp: Date.now(),\r\n route: this.bbRouter?.url ?? currentRoute,\r\n formId,\r\n fieldKey,\r\n eventType: 'blur',\r\n });\r\n };\r\n this.elRef.nativeElement.addEventListener('focusout', this.bbBlurHandler, true);\r\n }\r\n\r\n // Per-field value change + validation tracking\r\n for (const field of this.allFields) {\r\n const control = this.formGroup.get(field.key);\r\n if (!control) continue;\r\n\r\n // Value changes\r\n if (config.trackValueChanges) {\r\n control.valueChanges\r\n .pipe(\r\n debounceTime(config.debounceMs),\r\n distinctUntilChanged(),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe((value) => {\r\n this.blackbox!.trackFormEvent({\r\n timestamp: Date.now(),\r\n route: this.bbRouter?.url ?? currentRoute,\r\n formId,\r\n fieldKey: field.key,\r\n eventType: 'valueChange',\r\n metadata: {\r\n value: config.trackValues ? value : undefined,\r\n valid: control.valid,\r\n formValues: config.trackValues ? this.formGroup.getRawValue() : undefined,\r\n },\r\n });\r\n });\r\n }\r\n\r\n // Validation errors\r\n if (config.trackValidation) {\r\n control.statusChanges\r\n .pipe(\r\n rxFilter((status) => status === 'INVALID'),\r\n distinctUntilChanged(),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe(() => {\r\n const errors = control.errors\r\n ? Object.keys(control.errors)\r\n : [];\r\n this.blackbox!.trackFormEvent({\r\n timestamp: Date.now(),\r\n route: this.bbRouter?.url ?? currentRoute,\r\n formId,\r\n fieldKey: field.key,\r\n eventType: 'validationError',\r\n metadata: {\r\n valid: false,\r\n errors,\r\n },\r\n });\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resolve the form field key from a focus/blur DOM event.\r\n * Walks up from the event target looking for `formControlName` or `data-field-key`.\r\n * @internal\r\n */\r\n private resolveFieldKeyFromEvent(e: FocusEvent): string | null {\r\n let target = e.target as HTMLElement | null;\r\n const maxDepth = 5;\r\n let depth = 0;\r\n\r\n while (target && depth < maxDepth) {\r\n // formControlName attribute\r\n const fcn = target.getAttribute('formControlName');\r\n if (fcn) return fcn;\r\n\r\n // data-field-key attribute\r\n const dfk = target.getAttribute('data-field-key');\r\n if (dfk) return dfk;\r\n\r\n target = target.parentElement;\r\n depth++;\r\n }\r\n return null;\r\n }\r\n\r\n // ─── Validazione ────────────────────────────────────────────────\r\n\r\n private applyAllValidators(): void {\r\n // Campi piatti\r\n for (const field of this.allFlatFields) {\r\n if (field.validation?.length) {\r\n const formData = this.formGroup.getRawValue();\r\n this.validationService.updateFieldValidators(this.formGroup.get(field.key)!, field.validation, formData);\r\n }\r\n }\r\n\r\n // Campi nelle istanze repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n for (const field of section.fields) {\r\n if (field.validation?.length) {\r\n const formData = instanceFg.getRawValue();\r\n this.validationService.updateFieldValidators(instanceFg.get(field.key)!, field.validation, formData);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ─── Condizioni ─────────────────────────────────────────────────\r\n\r\n private evaluateAllConditions(): void {\r\n const formData = this.formGroup.getRawValue();\r\n\r\n // Campi piatti\r\n for (const field of this.allFlatFields) {\r\n this.evaluateFieldConditions(field, this.formGroup, formData);\r\n }\r\n\r\n // Campi nelle istanze repeatable (scope intra-istanza)\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n const instanceData = instanceFg.getRawValue();\r\n for (const field of section.fields) {\r\n this.evaluateFieldConditions(field, instanceFg, instanceData);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Valuta condizioni di visibilita/disabilitazione per un singolo campo nel contesto del FormGroup dato. */\r\n private evaluateFieldConditions(field: UiFormFieldDescriptor, fg: FormGroup, formData: Record<string, any>): void {\r\n if (field.conditions?.length) {\r\n const visible = this.conditionService.evaluateConditions(field.conditions, formData);\r\n const control = fg.get(field.key);\r\n if (control) {\r\n if (!visible && control.enabled) {\r\n control.disable({ emitEvent: false });\r\n if (!field.freezeValueOnDisable) {\r\n control.setValue(field.defaultValue ?? null, { emitEvent: false });\r\n }\r\n } else if (visible && control.disabled && !field.disabled && !this.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n }\r\n }\r\n\r\n if (field.disableConditions?.length && !field.conditions?.length) {\r\n const shouldDisable = this.conditionService.evaluateConditions(field.disableConditions, formData);\r\n const control = fg.get(field.key);\r\n if (control) {\r\n if (shouldDisable && control.enabled) {\r\n control.disable({ emitEvent: false });\r\n if (!field.freezeValueOnDisable) {\r\n control.setValue(field.defaultValue ?? null, { emitEvent: false });\r\n }\r\n } else if (!shouldDisable && control.disabled && !field.disabled && !this.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n }\r\n }\r\n\r\n if (field.validation?.some((r) => r.conditions?.length)) {\r\n this.validationService.updateFieldValidators(fg.get(field.key)!, field.validation!, formData);\r\n }\r\n }\r\n\r\n // ─── Dipendenze opzioni ─────────────────────────────────────────\r\n\r\n private buildDependencyMap(): void {\r\n for (const field of this.allFields) {\r\n if (field.dependentOptions?.dependsOn) {\r\n const depKey = field.dependentOptions.dependsOn;\r\n if (!this.fieldDependencies.has(depKey)) {\r\n this.fieldDependencies.set(depKey, new Set());\r\n }\r\n this.fieldDependencies.get(depKey)!.add(field.key);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Costruisce la mappa dei descriptors accordion per le sezioni collapsibili.\r\n * Ogni sezione collapsibile viene mappata a un singolo UiAccordionDescriptor.\r\n * @internal\r\n */\r\n private buildSectionAccordionMap(): void {\r\n this.sectionAccordionMap.clear();\r\n this.repeatableAccordionMap.clear();\r\n\r\n for (const section of this.schema.sections) {\r\n if (section.repeatable) {\r\n this.rebuildRepeatableAccordion(section);\r\n } else if (section.collapsible) {\r\n this.sectionAccordionMap.set(section.id, [{\r\n id: section.id,\r\n title: section.title || '',\r\n icon: section.icon,\r\n expanded: !section.collapsed,\r\n subtitle: section.description,\r\n }]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Numero di istanze repeatable da creare al build/reset:\r\n * almeno `repeatable.min` (se `min > 0` o omesso default 1), mai meno delle righe in `initialData[section.id]`.\r\n * Con `min: 0` non si aggiungono righe oltre a quelle già presenti nei dati iniziali.\r\n */\r\n private getRepeatableInitialInstanceCount(section: UiFormSection): number {\r\n const cfg = section.repeatable;\r\n if (!cfg) return 0;\r\n const initialArray = this.initialData?.[section.id] as Record<string, any>[] | undefined;\r\n const initialLen = initialArray?.length ?? 0;\r\n const minReq = cfg.min;\r\n if (minReq === 0) {\r\n return initialLen;\r\n }\r\n const minInstances = minReq ?? 1;\r\n return Math.max(initialLen, minInstances);\r\n }\r\n\r\n /** Ricostruisce i descriptor accordion per le istanze di una sezione repeatable. */\r\n private rebuildRepeatableAccordion(section: UiFormSection): void {\r\n const arr = this.getRepeatableArray(section.id);\r\n const count = arr?.length ?? this.getRepeatableInitialInstanceCount(section);\r\n const titleTemplate = section.repeatable!.instanceTitle || (section.title ? `${section.title} {index}` : 'Elemento {index}');\r\n const items: UiAccordionDescriptor[] = [];\r\n\r\n for (let i = 0; i < count; i++) {\r\n items.push({\r\n id: `${section.id}-${i}`,\r\n title: titleTemplate.replace('{index}', String(i + 1)),\r\n icon: section.icon,\r\n expanded: true,\r\n index: i,\r\n });\r\n }\r\n\r\n this.repeatableAccordionMap.set(section.id, items);\r\n }\r\n\r\n private updateDependentOptions(): void {\r\n const formData = this.formGroup.getRawValue();\r\n\r\n for (const field of this.allFields) {\r\n // Dynamic options\r\n if (field.dynamicOptions) {\r\n if (field.dynamicOptions.type === 'year-range') {\r\n const min = field.dynamicOptions.minYear || new Date().getFullYear() - 10;\r\n const max = field.dynamicOptions.maxYear || new Date().getFullYear();\r\n const opts: UiFieldOption[] = [];\r\n for (let y = max; y >= min; y--) {\r\n opts.push({ value: y, label: String(y) });\r\n }\r\n this.filteredOptions[field.key] = opts;\r\n } else if (field.dynamicOptions.generator) {\r\n this.filteredOptions[field.key] = field.dynamicOptions.generator(formData);\r\n }\r\n }\r\n\r\n // Dependent options\r\n if (field.dependentOptions && field.options && !this.isObservable(field.options)) {\r\n const dep = field.dependentOptions;\r\n const depValue = formData[dep.dependsOn];\r\n const allOptions = field.options as UiFieldOption[];\r\n\r\n if (depValue == null || depValue === '') {\r\n this.filteredOptions[field.key] = [...allOptions];\r\n continue;\r\n }\r\n\r\n this.filteredOptions[field.key] = allOptions.filter((opt) => {\r\n if (dep.filterType === 'custom' && dep.filterFn) {\r\n return dep.filterFn(opt, depValue, formData);\r\n }\r\n const optVal = Number(opt.value);\r\n const depVal = Number(depValue);\r\n if (isNaN(optVal) || isNaN(depVal)) return true;\r\n\r\n switch (dep.filterType) {\r\n case 'greater_than':\r\n return optVal > depVal;\r\n case 'greater_equal':\r\n return optVal >= depVal;\r\n case 'less_than':\r\n return optVal < depVal;\r\n case 'less_equal':\r\n return optVal <= depVal;\r\n case 'equals':\r\n return optVal === depVal;\r\n case 'not_equals':\r\n return optVal !== depVal;\r\n default:\r\n return true;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // ─── API pubblica ───────────────────────────────────────────────\r\n\r\n /** Verifica se un campo e visibile (opzionalmente nel contesto di un FormGroup specifico). */\r\n isFieldVisible(fieldKey: string, fg?: FormGroup): boolean {\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n if (!field?.conditions?.length) return true;\r\n const target = fg || this.formGroup;\r\n return this.conditionService.evaluateConditions(field.conditions, target.getRawValue());\r\n }\r\n\r\n /** Verifica se un campo e obbligatorio (include validazione condizionale). */\r\n isFieldRequired(fieldKey: string, fg?: FormGroup): boolean {\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n if (field?.required) return true;\r\n\r\n const rules = field?.validation || [];\r\n const target = fg || this.formGroup;\r\n const formData = target.getRawValue();\r\n return rules.some((r) => {\r\n if (r.type !== 'required') return false;\r\n if (!r.conditions?.length) return true;\r\n return this.conditionService.evaluateConditions(r.conditions, formData);\r\n });\r\n }\r\n\r\n /** Verifica se una sezione e visibile. */\r\n isSectionVisible(sectionId: string): boolean {\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section?.conditions?.length) return true;\r\n return this.conditionService.evaluateConditions(section.conditions, this.formGroup.getRawValue());\r\n }\r\n\r\n /** Descriptors accordion per una sezione collapsibile. */\r\n getSectionAccordionItems(sectionId: string): UiAccordionDescriptor[] {\r\n return this.sectionAccordionMap.get(sectionId) || [];\r\n }\r\n\r\n /** Descriptors accordion per le istanze di una sezione repeatable. */\r\n getRepeatableAccordionItems(sectionId: string): UiAccordionDescriptor[] {\r\n return this.repeatableAccordionMap.get(sectionId) || [];\r\n }\r\n\r\n /** Verifica se mostrare errori per un campo. */\r\n shouldShowFieldErrors(fieldKey: string, fg?: FormGroup): boolean {\r\n const target = fg || this.formGroup;\r\n const control = target.get(fieldKey);\r\n return this.fieldErrorService.shouldShowFieldErrors(control, {\r\n treatAsPrevalorized: this.prevalorizedFields.has(fieldKey),\r\n });\r\n }\r\n\r\n /** Errori di un campo come array di messaggi. */\r\n getFieldErrors(fieldKey: string, fg?: FormGroup): string[] {\r\n const target = fg || this.formGroup;\r\n const control = target.get(fieldKey);\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n return this.fieldErrorService.getFieldErrors(control, field?.validation);\r\n }\r\n\r\n /** Valore completo del form (include campi disabilitati). */\r\n getFormValue(): UiFormData {\r\n return this.formGroup.getRawValue();\r\n }\r\n\r\n /** Il form e valido. */\r\n isFormValid(): boolean {\r\n return this.formGroup.valid;\r\n }\r\n\r\n /**\r\n * True se tutti i controlli sono validi, ignorando le chiavi indicate\r\n * (flat e dentro ogni istanza repeatable).\r\n */\r\n isFormValidExcludingFieldKeys(excludedKeys: ReadonlySet<string>): boolean {\r\n return this.isFormGroupValidExcluding(this.formGroup, excludedKeys);\r\n }\r\n\r\n /**\r\n * Risolve la chiave per `customFieldTemplates` (`templateKey` → `component` → `field.key`).\r\n */\r\n resolveCustomTemplateKey(field: UiFormFieldDescriptor): string {\r\n const cc = field.customConfig;\r\n return cc?.templateKey ?? cc?.component ?? field.key;\r\n }\r\n\r\n /**\r\n * Template Angular registrato per il campo custom, o fallback globale.\r\n */\r\n getCustomTemplateRef(field: UiFormFieldDescriptor): TemplateRef<unknown> | null {\r\n const key = this.resolveCustomTemplateKey(field);\r\n return this.customFieldTemplates[key] ?? this.customFieldTemplateFallback ?? null;\r\n }\r\n\r\n /**\r\n * Contesto passato a `ngTemplateOutlet` per il campo custom (CVA sul `control`).\r\n */\r\n getCustomFieldOutletContext(\r\n field: UiFormFieldDescriptor,\r\n fg: FormGroup,\r\n nestedErrorKeyPrefix?: string,\r\n ): UiCustomFieldTemplateContext {\r\n const control = fg.get(field.key) as FormControl;\r\n return {\r\n $implicit: field,\r\n field,\r\n formGroup: fg,\r\n control,\r\n config: field.customConfig?.config ?? {},\r\n nestedErrorKeyPrefix,\r\n emitCustomEvent: (event: string, data?: unknown) => {\r\n this.customEvent.emit({ field: field.key, event, data });\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Template e contesto in un solo oggetto (evita doppie valutazioni nel template).\r\n */\r\n getCustomFieldOutlet(\r\n field: UiFormFieldDescriptor,\r\n fg: FormGroup,\r\n nestedErrorKeyPrefix?: string,\r\n ): { template: TemplateRef<unknown>; context: UiCustomFieldTemplateContext } | null {\r\n const template = this.getCustomTemplateRef(field);\r\n if (!template) return null;\r\n return { template, context: this.getCustomFieldOutletContext(field, fg, nestedErrorKeyPrefix) };\r\n }\r\n\r\n /** Prefisso chiavi errore per campi custom annidati (flat o repeatable). */\r\n buildNestedErrorKeyPrefix(fieldKey: string, instanceKeyPrefix?: string): string {\r\n const base = instanceKeyPrefix ? `${instanceKeyPrefix}${fieldKey}` : fieldKey;\r\n return `${base}__`;\r\n }\r\n\r\n /** Merge errori nested da CVA custom nel dettaglio error-summary. */\r\n private appendCustomNestedFieldErrors(\r\n details: UiFormErrorDetail[],\r\n field: UiFormFieldDescriptor,\r\n control: AbstractControl,\r\n labelPrefix: string,\r\n nestedErrorKeyPrefix: string,\r\n ): void {\r\n if (field.type !== 'custom') return;\r\n const nested = control.errors?.[UI_FORM_NESTED_FIELD_ERRORS_KEY];\r\n if (!Array.isArray(nested) || nested.length === 0) return;\r\n\r\n for (const item of nested as UiFormErrorDetail[]) {\r\n if (!item?.errors?.length) continue;\r\n const relativeKey = item.fieldKey ?? '';\r\n details.push({\r\n fieldKey: relativeKey ? `${nestedErrorKeyPrefix}${relativeKey}` : nestedErrorKeyPrefix.slice(0, -2),\r\n fieldLabel: `${labelPrefix} > ${item.fieldLabel}`,\r\n errors: item.errors,\r\n });\r\n }\r\n }\r\n\r\n private isFormGroupValidExcluding(group: FormGroup, excludedKeys: ReadonlySet<string>): boolean {\r\n for (const key of Object.keys(group.controls)) {\r\n const c = group.get(key);\r\n if (!c) continue;\r\n if (c instanceof FormArray) {\r\n for (let i = 0; i < c.length; i++) {\r\n const row = c.at(i);\r\n if (row instanceof FormGroup && !this.isFormGroupValidExcluding(row, excludedKeys)) {\r\n return false;\r\n }\r\n }\r\n } else if (c instanceof FormGroup) {\r\n if (!this.isFormGroupValidExcluding(c, excludedKeys)) return false;\r\n } else if (c instanceof FormControl) {\r\n if (excludedKeys.has(key)) continue;\r\n if (c.invalid) return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Stato di validazione completo. */\r\n getValidationState(): UiFormValidationState {\r\n const errors: Record<string, string[]> = {};\r\n const dirty: string[] = [];\r\n const touched: string[] = [];\r\n\r\n for (const field of this.allFlatFields) {\r\n const control = this.formGroup.get(field.key);\r\n if (!control) continue;\r\n if (control.dirty) dirty.push(field.key);\r\n if (control.touched) touched.push(field.key);\r\n const fieldErrors = this.getFieldErrors(field.key);\r\n if (fieldErrors.length) errors[field.key] = fieldErrors;\r\n }\r\n\r\n // Includi errori delle istanze repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n for (const field of section.fields) {\r\n const control = instanceFg.get(field.key);\r\n if (!control) continue;\r\n const prefixedKey = `${section.id}[${i}].${field.key}`;\r\n if (control.dirty) dirty.push(prefixedKey);\r\n if (control.touched) touched.push(prefixedKey);\r\n const fieldErrors = this.getFieldErrors(field.key, instanceFg);\r\n if (fieldErrors.length) errors[prefixedKey] = fieldErrors;\r\n }\r\n }\r\n }\r\n\r\n return { valid: this.formGroup.valid, errors, dirty, touched };\r\n }\r\n\r\n /** Errori dettagliati per l'error summary. */\r\n getDetailedFormErrors(): UiFormErrorDetail[] {\r\n const details: UiFormErrorDetail[] = [];\r\n\r\n // Campi piatti\r\n for (const field of this.allFlatFields) {\r\n if (field.type === 'flag' || field.type === 'divider') continue;\r\n if (!this.isFieldVisible(field.key)) continue;\r\n const control = this.formGroup.get(field.key);\r\n if (!control?.errors) continue;\r\n\r\n const nestedPrefix = this.buildNestedErrorKeyPrefix(field.key);\r\n this.appendCustomNestedFieldErrors(details, field, control, field.label, nestedPrefix);\r\n\r\n if (field.type === 'custom' && control.errors[UI_FORM_NESTED_FIELD_ERRORS_KEY]) {\r\n continue;\r\n }\r\n\r\n const errors = this.getFieldErrors(field.key);\r\n if (errors.length) {\r\n details.push({ fieldKey: field.key, fieldLabel: field.label, errors });\r\n }\r\n }\r\n\r\n // Campi nelle istanze repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n const titleTemplate = section.repeatable!.instanceTitle || (section.title ? `${section.title} {index}` : 'Elemento {index}');\r\n for (let i = 0; i < arr.length; i++) {\r\n const instanceFg = arr.at(i) as FormGroup;\r\n const instanceLabel = titleTemplate.replace('{index}', String(i + 1));\r\n const instanceKeyPrefix = `${section.id}[${i}].`;\r\n for (const field of section.fields) {\r\n if (field.type === 'flag' || field.type === 'divider') continue;\r\n if (!this.isFieldVisible(field.key, instanceFg)) continue;\r\n const control = instanceFg.get(field.key);\r\n if (!control?.errors) continue;\r\n\r\n const nestedPrefix = this.buildNestedErrorKeyPrefix(field.key, instanceKeyPrefix);\r\n this.appendCustomNestedFieldErrors(\r\n details,\r\n field,\r\n control,\r\n `${instanceLabel} > ${field.label}`,\r\n nestedPrefix,\r\n );\r\n\r\n if (field.type === 'custom' && control.errors[UI_FORM_NESTED_FIELD_ERRORS_KEY]) {\r\n continue;\r\n }\r\n\r\n const errors = this.getFieldErrors(field.key, instanceFg);\r\n if (errors.length) {\r\n details.push({\r\n fieldKey: `${section.id}[${i}].${field.key}`,\r\n fieldLabel: `${instanceLabel} > ${field.label}`,\r\n errors,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return details;\r\n }\r\n\r\n /** Conta errori totali. */\r\n getFormErrorsCount(): number {\r\n return this.getDetailedFormErrors().reduce((sum, d) => sum + d.errors.length, 0);\r\n }\r\n\r\n /** Controlla se ci sono errori. */\r\n hasFormErrors(): boolean {\r\n return this.getFormErrorsCount() > 0;\r\n }\r\n\r\n /** Controllo per un campo. */\r\n getFieldControl(key: string): FormControl | null {\r\n return (this.formGroup.get(key) as FormControl) ?? null;\r\n }\r\n\r\n /** Aggiorna il valore di un campo programmaticamente. */\r\n updateFieldValue(key: string, value: any): void {\r\n const control = this.formGroup.get(key);\r\n if (control) {\r\n control.setValue(value);\r\n control.markAsDirty();\r\n }\r\n }\r\n\r\n /** Forza la validazione di tutti i campi (incluse istanze repeatable). */\r\n validateAllFields(): void {\r\n // Campi piatti\r\n Object.keys(this.formGroup.controls).forEach((key) => {\r\n const control = this.formGroup.get(key);\r\n if (control instanceof FormArray) {\r\n for (let i = 0; i < control.length; i++) {\r\n const fg = control.at(i) as FormGroup;\r\n Object.keys(fg.controls).forEach((fk) => {\r\n const c = fg.get(fk);\r\n c?.markAsTouched();\r\n c?.markAsDirty();\r\n c?.updateValueAndValidity();\r\n });\r\n }\r\n } else {\r\n control?.markAsTouched();\r\n control?.markAsDirty();\r\n control?.updateValueAndValidity();\r\n }\r\n });\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ─── API Repeatable ────────────────────────────────────────────\r\n\r\n /** Restituisce il FormArray di una sezione repeatable. */\r\n getRepeatableArray(sectionId: string): FormArray | null {\r\n const control = this.formGroup?.get(sectionId);\r\n return control instanceof FormArray ? control : null;\r\n }\r\n\r\n /** Restituisce il FormGroup di una specifica istanza repeatable. */\r\n getInstanceFormGroup(sectionId: string, index: number): FormGroup | null {\r\n const arr = this.getRepeatableArray(sectionId);\r\n return arr?.at(index) as FormGroup ?? null;\r\n }\r\n\r\n /** Verifica se e possibile aggiungere nuove istanze. */\r\n canAddInstance(sectionId: string): boolean {\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section?.repeatable) return false;\r\n const arr = this.getRepeatableArray(sectionId);\r\n if (!arr) return false;\r\n return section.repeatable.max == null || arr.length < section.repeatable.max;\r\n }\r\n\r\n /** Verifica se e possibile rimuovere istanze. */\r\n canRemoveInstance(sectionId: string): boolean {\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section?.repeatable) return false;\r\n const arr = this.getRepeatableArray(sectionId);\r\n if (!arr) return false;\r\n return arr.length > (section.repeatable.min ?? 1);\r\n }\r\n\r\n /** Aggiunge una nuova istanza vuota a una sezione repeatable. */\r\n addRepeatableInstance(sectionId: string): void {\r\n if (!this.canAddInstance(sectionId)) return;\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section) return;\r\n\r\n const arr = this.getRepeatableArray(sectionId)!;\r\n arr.push(this.buildInstanceFormGroup(section));\r\n this.rebuildRepeatableAccordion(section);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Rimuove un'istanza da una sezione repeatable. */\r\n removeRepeatableInstance(sectionId: string, index: number): void {\r\n if (!this.canRemoveInstance(sectionId)) return;\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section?.repeatable) return;\r\n\r\n if (section.repeatable.confirmRemove) {\r\n const msg = section.repeatable.confirmMessage ?? 'Sei sicuro di voler rimuovere questa sezione?';\r\n if (!confirm(msg)) return;\r\n }\r\n\r\n const arr = this.getRepeatableArray(sectionId)!;\r\n arr.removeAt(index);\r\n this.rebuildRepeatableAccordion(section);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Duplica un'istanza esistente con i suoi valori. */\r\n duplicateRepeatableInstance(sectionId: string, index: number): void {\r\n if (!this.canAddInstance(sectionId)) return;\r\n const section = this.schema.sections.find((s) => s.id === sectionId);\r\n if (!section) return;\r\n\r\n const arr = this.getRepeatableArray(sectionId)!;\r\n const sourceData = (arr.at(index) as FormGroup).getRawValue();\r\n const newGroup = this.buildInstanceFormGroup(section, sourceData);\r\n arr.insert(index + 1, newGroup);\r\n this.rebuildRepeatableAccordion(section);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Titolo di un'istanza repeatable. */\r\n getInstanceTitle(section: UiFormSection, index: number): string {\r\n const template = section.repeatable?.instanceTitle || (section.title ? `${section.title} {index}` : 'Elemento {index}');\r\n return template.replace('{index}', String(index + 1));\r\n }\r\n\r\n /** Scrolla al campo e lo evidenzia. */\r\n scrollToField(fieldKey: string): void {\r\n const control = this.formGroup.get(fieldKey);\r\n if (control) {\r\n control.markAsTouched();\r\n control.markAsDirty();\r\n control.updateValueAndValidity();\r\n }\r\n\r\n setTimeout(() => {\r\n const selectors = [`[data-field-key=\"${fieldKey}\"]`, `[formControlName=\"${fieldKey}\"]`];\r\n let targetElement: HTMLElement | null = null;\r\n for (const sel of selectors) {\r\n targetElement = this.elRef.nativeElement.querySelector(sel);\r\n if (targetElement) break;\r\n }\r\n if (!targetElement) return;\r\n\r\n // Se trovato il formControlName, risali al wrapper\r\n if (targetElement.hasAttribute('formControlName')) {\r\n const wrapper = targetElement.closest('.ui-form-builder__field-wrapper, mat-form-field');\r\n if (wrapper) targetElement = wrapper as HTMLElement;\r\n }\r\n\r\n targetElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n\r\n // Aggiungi classe highlight e rimuovila dopo l'animazione\r\n targetElement.classList.add('ui-form-field--highlight');\r\n setTimeout(() => targetElement!.classList.remove('ui-form-field--highlight'), 2000);\r\n }, 100);\r\n }\r\n\r\n /** Submit del form. */\r\n onSubmit(): void {\r\n this.validateAllFields();\r\n const formValue = this.getFormValue();\r\n const isValid = this.formGroup.valid;\r\n this.logger?.logFormAction('submit', {\r\n schemaId: this.schema?.id ?? 'unknown',\r\n valid: isValid,\r\n fieldCount: Object.keys(formValue).length,\r\n });\r\n if (isValid) {\r\n this.formSubmit.emit(formValue);\r\n }\r\n }\r\n\r\n /** Reset del form. */\r\n onReset(): void {\r\n // Resetta campi piatti\r\n for (const field of this.allFlatFields) {\r\n const value = this.initialData?.[field.key] ?? field.defaultValue ?? null;\r\n const control = this.formGroup.get(field.key);\r\n control?.setValue(value, { emitEvent: false });\r\n control?.markAsPristine();\r\n control?.markAsUntouched();\r\n }\r\n\r\n // Resetta sezioni repeatable\r\n for (const section of this.repeatableSections) {\r\n const arr = this.getRepeatableArray(section.id);\r\n if (!arr) continue;\r\n const initialArray = this.initialData?.[section.id] as Record<string, any>[] | undefined;\r\n const count = this.getRepeatableInitialInstanceCount(section);\r\n\r\n arr.clear();\r\n for (let i = 0; i < count; i++) {\r\n arr.push(this.buildInstanceFormGroup(section, initialArray?.[i]));\r\n }\r\n this.rebuildRepeatableAccordion(section);\r\n }\r\n\r\n this.formGroup.updateValueAndValidity();\r\n this.formReset.emit();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ─── Template helpers ───────────────────────────────────────────\r\n\r\n /** Opzioni per un campo (filtrando per autocomplete query). */\r\n getFieldOptions(field: UiFormFieldDescriptor): UiFieldOption[] {\r\n return this.filteredOptions[field.key] || [];\r\n }\r\n\r\n /** Filtra opzioni per autocomplete. */\r\n filterOptions(field: UiFormFieldDescriptor, query: string): void {\r\n if (!query) {\r\n if (field.options && !this.isObservable(field.options)) {\r\n this.filteredOptions[field.key] = [...(field.options as UiFieldOption[])];\r\n }\r\n return;\r\n }\r\n\r\n const lowerQuery = query.toLowerCase();\r\n\r\n if (field.asyncOptions) {\r\n field.asyncOptions(query).then((opts) => {\r\n this.filteredOptions[field.key] = opts;\r\n this.cdr.markForCheck();\r\n });\r\n } else if (field.options && !this.isObservable(field.options)) {\r\n this.filteredOptions[field.key] = (field.options as UiFieldOption[]).filter((o) =>\r\n o.label.toLowerCase().includes(lowerQuery),\r\n );\r\n }\r\n }\r\n\r\n /** Display fn per autocomplete. */\r\n displayFn(options: UiFieldOption[]): (value: any) => string {\r\n return (value: any) => {\r\n const opt = options.find((o) => o.value === value);\r\n return opt?.label || '';\r\n };\r\n }\r\n\r\n /** Seleziona tutte le opzioni per multiselect. */\r\n selectAll(field: UiFormFieldDescriptor): void {\r\n const options = this.getFieldOptions(field);\r\n const allValues = options.filter((o) => !o.disabled).map((o) => o.value);\r\n this.formGroup.get(field.key)?.setValue(allValues);\r\n }\r\n\r\n /** Aggiunge un chip al freemultiselect (da token: Enter o virgola). */\r\n addFreeChip(field: UiFormFieldDescriptor, event: any): void {\r\n const value = (event.value || '').trim();\r\n if (!value) return;\r\n\r\n const current = this.formGroup.get(field.key)?.value || [];\r\n if (!current.includes(value)) {\r\n this.formGroup.get(field.key)?.setValue([...current, value]);\r\n }\r\n event.chipInput?.clear();\r\n }\r\n\r\n /** Aggiunge un chip al freemultiselect sull'evento blur dell'input. */\r\n addFreeChipOnBlur(field: UiFormFieldDescriptor, event: FocusEvent): void {\r\n const input = event.target as HTMLInputElement;\r\n const value = (input.value || '').trim();\r\n if (!value) return;\r\n\r\n const current = this.formGroup.get(field.key)?.value || [];\r\n if (!current.includes(value)) {\r\n this.formGroup.get(field.key)?.setValue([...current, value]);\r\n }\r\n input.value = '';\r\n }\r\n\r\n /** Rimuove un chip dal freemultiselect. */\r\n removeFreeChip(field: UiFormFieldDescriptor, chipValue: string): void {\r\n const current = this.formGroup.get(field.key)?.value || [];\r\n const protected_ = field.metadata?.['cantDeleteList'] || [];\r\n if (protected_.includes(chipValue)) return;\r\n this.formGroup.get(field.key)?.setValue(current.filter((v: string) => v !== chipValue));\r\n }\r\n\r\n /** Verifica se un chip e protetto dalla cancellazione. */\r\n isChipProtected(field: UiFormFieldDescriptor, chipValue: string): boolean {\r\n return (field.metadata?.['cantDeleteList'] || []).includes(chipValue);\r\n }\r\n\r\n /** Rimuove chip da multiselect. */\r\n removeMultiselectChip(field: UiFormFieldDescriptor, chipValue: any): void {\r\n const current = this.formGroup.get(field.key)?.value || [];\r\n this.formGroup.get(field.key)?.setValue(current.filter((v: any) => v !== chipValue));\r\n }\r\n\r\n /** Trova label di un'opzione dal valore. */\r\n getOptionLabel(field: UiFormFieldDescriptor, value: any): string {\r\n const options = this.getFieldOptions(field);\r\n return options.find((o) => o.value === value)?.label || String(value);\r\n }\r\n\r\n /** Tipo di input nativo per il campo. */\r\n getNativeInputType(field: UiFormFieldDescriptor): string {\r\n switch (field.type) {\r\n case 'password':\r\n return 'password';\r\n case 'email':\r\n return 'email';\r\n default:\r\n return 'text';\r\n }\r\n }\r\n\r\n /**\r\n * Genera le classi CSS per il wrapper di un campo,\r\n * combinando eventuali cssClasses dallo schema con le classi\r\n * responsive per il sistema a griglia base-12.\r\n *\r\n * Mobile-first: tutti i campi sono span-12 di default (100%).\r\n * Le classi `ui-col-{breakpoint}-{n}` attivano la larghezza\r\n * configurata solo dal breakpoint indicato in su.\r\n *\r\n * Breakpoint supportati: sm (≥576px), md (≥768px), lg (≥1024px), xl (≥1280px).\r\n */\r\n getFieldWrapperClasses(field: UiFormFieldDescriptor): string {\r\n const classes: string[] = [];\r\n\r\n if (field.cssClasses?.length) {\r\n classes.push(...field.cssClasses);\r\n }\r\n\r\n // layout.columns → classe per il breakpoint md (default desktop)\r\n if (field.layout?.columns) {\r\n classes.push(`ui-col-md-${field.layout.columns}`);\r\n }\r\n\r\n // layout.breakpoints → classi per breakpoint specifici\r\n if (field.layout?.breakpoints) {\r\n for (const [bp, cols] of Object.entries(field.layout.breakpoints)) {\r\n classes.push(`ui-col-${bp}-${cols}`);\r\n }\r\n }\r\n\r\n return classes.join(' ');\r\n }\r\n\r\n /** Character count per textarea/text con maxLength. */\r\n getCharCount(fieldKey: string, fg?: FormGroup): { current: number; max: number } | null {\r\n const field = this.allFields.find((f) => f.key === fieldKey);\r\n const maxLength = this.fieldErrorService.resolveMaxLength(field?.validation);\r\n if (maxLength == null) return null;\r\n\r\n const target = fg || this.formGroup;\r\n return this.fieldErrorService.getCharCount(target.get(fieldKey), maxLength);\r\n }\r\n\r\n // ─── Utilita private ────────────────────────────────────────────\r\n\r\n private isObservable(value: any): value is Observable<any> {\r\n return value && typeof value.subscribe === 'function';\r\n }\r\n\r\n getRepeatableAddButtons(section: UiFormSection): UiButtonDescriptor[] {\r\n return [{\r\n label: section.repeatable?.addLabel || '+ Aggiungi',\r\n icon: section.repeatable?.addIcon || 'plus',\r\n variant: 'outline',\r\n action: () => this.addRepeatableInstance(section.id)\r\n }];\r\n }\r\n}\r\n","<!--\r\n ============================================================\r\n UI FORM BUILDER - TEMPLATE PRINCIPALE\r\n ============================================================\r\n ARCHITETTURA:\r\n Ogni <ng-template> che contiene direttive [formControlName]\r\n DEVE wrappare il proprio contenuto in un <div [formGroup]>.\r\n Questo perche Angular risolve l'injector di formControlName\r\n dal CONTESTO DI DICHIARAZIONE del template, non dal punto\r\n di inserimento (ngTemplateOutlet).\r\n\r\n Il FormGroup viene passato tramite context per supportare\r\n sia campi piatti (root FormGroup) che campi in istanze\r\n repeatable (instance FormGroup).\r\n\r\n Senza questo wrapper, formControlName non trova il\r\n FormGroupDirective e lancia NG01050.\r\n ============================================================\r\n-->\r\n\r\n@if (schema && formGroup) {\r\n<div class=\"ui-form-builder\" [formGroup]=\"formGroup\" [class]=\"schema.config?.cssClasses?.join(' ')\">\r\n\r\n <!-- ==================== HEADER ==================== -->\r\n @if (schema.title || schema.description) {\r\n <div class=\"ui-form-builder__header\">\r\n @if (schema.title) {\r\n <h2 class=\"ui-form-builder__title\">{{ schema.title }}</h2>\r\n }\r\n @if (schema.description) {\r\n <p class=\"ui-form-builder__description\">{{ schema.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- ==================== SEZIONI ==================== -->\r\n <div class=\"ui-form-builder__sections\">\r\n @for (section of schema.sections; track section.id) {\r\n @if (isSectionVisible(section.id)) {\r\n\r\n <!-- ─── Sezione REPEATABLE ─── -->\r\n @if (section.repeatable) {\r\n <div class=\"ui-form-builder__section ui-form-builder__section--repeatable\" [class]=\"section.cssClasses?.join(' ')\">\r\n @if (section.title || section.description) {\r\n <div class=\"ui-form-builder__section-header\">\r\n @if (section.title) {\r\n <h3 class=\"ui-form-builder__section-title\">{{ section.title }}</h3>\r\n }\r\n @if (section.description) {\r\n <p class=\"ui-form-builder__section-description\">{{ section.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <ui-accordion [items]=\"getRepeatableAccordionItems(section.id)\" [itemTemplate]=\"repeatableBodyTpl\"\r\n [actionsTemplate]=\"repeatableActionsTpl\" mode=\"multi\" class=\"ui-form-builder__repeatable-accordion\">\r\n <!-- Contenuto di ogni istanza -->\r\n <ng-template #repeatableBodyTpl let-item>\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key, getInstanceFormGroup(section.id, item.index)!) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: getInstanceFormGroup(section.id, item.index), nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key, section.id + '[' + item.index + '].') }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Azioni per ogni istanza (duplica / elimina) -->\r\n <ng-template #repeatableActionsTpl let-item>\r\n @if (canAddInstance(section.id)) {\r\n <button type=\"button\" class=\"ui-form-builder__repeatable-action\"\r\n (click)=\"duplicateRepeatableInstance(section.id, item.index)\" aria-label=\"Duplica\">\r\n <lucide-icon name=\"copy\" [size]=\"15\" />\r\n </button>\r\n }\r\n @if (canRemoveInstance(section.id)) {\r\n <button type=\"button\" class=\"ui-form-builder__repeatable-action ui-form-builder__repeatable-action--danger\"\r\n (click)=\"removeRepeatableInstance(section.id, item.index)\" aria-label=\"Elimina\">\r\n <lucide-icon name=\"trash-2\" [size]=\"15\" />\r\n </button>\r\n }\r\n </ng-template>\r\n </ui-accordion>\r\n\r\n @if (canAddInstance(section.id)) {\r\n <div class=\"ui-form-builder__repeatable-add\">\r\n <ui-button-area [buttons]=\"getRepeatableAddButtons(section)\" align=\"end\" />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- ─── Sezione COLLASSABILE ─── -->\r\n } @else if (section.collapsible) {\r\n <ui-accordion [items]=\"getSectionAccordionItems(section.id)\" [itemTemplate]=\"collapsibleTpl\" mode=\"multi\"\r\n class=\"ui-form-builder__section ui-form-builder__section--collapsible\" [class]=\"section.cssClasses?.join(' ')\">\r\n <ng-template #collapsibleTpl let-item>\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: formGroup, nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key) }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </ui-accordion>\r\n\r\n <!-- ─── Sezione STANDARD ─── -->\r\n } @else {\r\n <div class=\"ui-form-builder__section\" [class]=\"section.cssClasses?.join(' ')\">\r\n @if (section.title || section.description) {\r\n <div class=\"ui-form-builder__section-header\">\r\n @if (section.title) {\r\n <h3 class=\"ui-form-builder__section-title\">{{ section.title }}</h3>\r\n }\r\n @if (section.description) {\r\n <p class=\"ui-form-builder__section-description\">{{ section.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: formGroup, nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key) }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n\r\n <!-- ==================== FOOTER ==================== -->\r\n <div class=\"ui-form-builder__footer\">\r\n @if (!schema.config?.hideErrorSummary) {\r\n <ui-form-error-summary [errors]=\"formErrors\" [totalErrorCount]=\"getFormErrorsCount()\"\r\n [validMessage]=\"schema.config?.errorSummaryValidMessage ?? 'Il form è compilato correttamente'\"\r\n (fieldClick)=\"scrollToField($event)\" />\r\n }\r\n @if (!schema.config?.hideFooter) {\r\n <ui-button-area [buttons]=\"formButtons\" align=\"end\" [loadingIds]=\"loadingFor\" />\r\n }\r\n </div>\r\n</div>\r\n}\r\n\r\n<!-- ============================================================ -->\r\n<!-- FIELD TEMPLATE -->\r\n<!-- ============================================================ -->\r\n<!--\r\n CRITICO: Questo template e dichiarato FUORI dal <div [formGroup]>.\r\n Angular risolve l'injector dal contesto di DICHIARAZIONE.\r\n Il FormGroup viene passato via context (fg) per supportare\r\n sia il root FormGroup che i FormGroup delle istanze repeatable.\r\n-->\r\n<ng-template #fieldTpl let-field let-fg=\"formGroup\" let-nestedErrorKeyPrefix=\"nestedErrorKeyPrefix\">\r\n @if (fg) {\r\n <div [formGroup]=\"fg\" class=\"ui-fb-field-ctx\">\r\n @switch (field.type) {\r\n\r\n <!-- TEXT / EMAIL / PASSWORD -->\r\n @case ('text') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n (optionsFilter)=\"filterOptions(field, $event)\"\r\n />\r\n }\r\n @case ('email') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n @case ('password') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- NUMBER -->\r\n @case ('number') {\r\n <ui-form-number-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- TEXTAREA -->\r\n @case ('textarea') {\r\n <ui-form-textarea-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- SELECT -->\r\n @case ('select') {\r\n <ui-form-select-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n (optionsFilter)=\"filterOptions(field, $event)\"\r\n />\r\n }\r\n\r\n <!-- MULTISELECT -->\r\n @case ('multiselect') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <mat-select [formControlName]=\"field.key\" multiple [placeholder]=\"field.placeholder || ''\">\r\n @if (field.allowSelectAll) {\r\n <mat-option (click)=\"selectAll(field)\" (keydown.enter)=\"selectAll(field)\" (keydown.space)=\"selectAll(field)\">\r\n <em>Seleziona tutto</em>\r\n </mat-option>\r\n }\r\n @for (opt of getFieldOptions(field); track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n @if (fg.get(field.key)?.value?.length) {\r\n <div class=\"ui-form-builder__chips-preview\">\r\n @for (val of fg.get(field.key)!.value; track val) {\r\n <span class=\"ui-form-builder__chip\">\r\n {{ getOptionLabel(field, val) }}\r\n <button type=\"button\" (click)=\"removeMultiselectChip(field, val)\" class=\"ui-form-builder__chip-remove\"\r\n aria-label=\"Rimuovi\">\r\n <lucide-icon name=\"x\" [size]=\"12\" />\r\n </button>\r\n </span>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- FREEMULTISELECT -->\r\n @case ('freemultiselect') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width ui-form-builder__free-multi-field\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <mat-chip-grid #chipGrid [formControlName]=\"field.key\">\r\n @for (chip of fg.get(field.key)?.value || []; track chip) {\r\n <mat-chip-row [removable]=\"!isChipProtected(field, chip)\" (removed)=\"removeFreeChip(field, chip)\">\r\n {{ chip }}\r\n @if (!isChipProtected(field, chip)) {\r\n <button matChipRemove aria-label=\"Rimuovi\">\r\n <lucide-icon name=\"x\" [size]=\"14\" />\r\n </button>\r\n }\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input matInput [matChipInputFor]=\"chipGrid\" [placeholder]=\"field.placeholder || 'Aggiungi...'\"\r\n [readonly]=\"field.readonly || readonly\" (matChipInputTokenEnd)=\"addFreeChip(field, $event)\"\r\n (blur)=\"addFreeChipOnBlur(field, $event)\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- CHECKBOX -->\r\n @case ('checkbox') {\r\n @if (field.appearance?.style === 'switch') {\r\n <mat-slide-toggle [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n </mat-slide-toggle>\r\n } @else {\r\n <mat-checkbox [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\" [matTooltip]=\"field.iconTooltip.text\"\r\n class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-checkbox>\r\n }\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- SWITCH -->\r\n @case ('switch') {\r\n <mat-slide-toggle [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\" [matTooltip]=\"field.iconTooltip.text\"\r\n class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-slide-toggle>\r\n }\r\n\r\n <!-- RADIO -->\r\n @case ('radio') {\r\n <ui-form-radio-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n [required]=\"isFieldRequired(field.key, fg)\"\r\n [showErrors]=\"shouldShowFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- DATE -->\r\n @case ('date') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput [matDatepicker]=\"datepicker\" [formControlName]=\"field.key\"\r\n [placeholder]=\"field.placeholder || 'GG/MM/AAAA'\" [readonly]=\"field.readonly || readonly\" />\r\n <mat-datepicker-toggle matSuffix [for]=\"datepicker\" />\r\n <mat-datepicker #datepicker [startView]=\"field.customConfig?.config?.['monthView'] ? 'year' : 'month'\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- DATETIME -->\r\n @case ('datetime') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput type=\"datetime-local\" [formControlName]=\"field.key\" [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly || readonly\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- FILE -->\r\n @case ('file') {\r\n <div class=\"ui-form-builder__file-wrapper\">\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n <ui-file-input [formControlName]=\"field.key\" [config]=\"field.fileConfig\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- DIVIDER -->\r\n @case ('divider') {\r\n <div class=\"ui-form-builder__divider\">\r\n @if (field.label) {\r\n <span class=\"ui-form-builder__divider-label\">{{ field.label }}</span>\r\n }\r\n <hr class=\"ui-form-builder__divider-line\" />\r\n </div>\r\n }\r\n\r\n <!-- LOCATION (selezione territorio) -->\r\n @case ('location') {\r\n <div class=\"ui-form-builder__location-wrapper\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-specifica-territoriale [formControlName]=\"field.key\" [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- LOCATION-TABLE (tabella CRUD di location) -->\r\n @case ('location-table') {\r\n <div class=\"ui-form-builder__location-table-wrapper\">\r\n <ui-table-territoriale [formControlName]=\"field.key\" [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- LOCATION-GEOCODED (ricerca indirizzo Nominatim) -->\r\n @case ('location-geocoded') {\r\n <div class=\"ui-form-builder__location-geocoded-wrapper\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\" [attr.for]=\"'ui-loc-' + field.key\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-location-geocoded [formControlName]=\"field.key\" [config]=\"field.locationGeocodedConfig || {}\"\r\n [placeholder]=\"field.placeholder || 'Cerca indirizzo...'\"\r\n [inputAriaLabel]=\"field.label || field.placeholder || 'Indirizzo'\"\r\n [inputId]=\"'ui-loc-' + field.key\"\r\n [readonly]=\"field.readonly || readonly\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- CUSTOM -->\r\n @case ('custom') {\r\n <div class=\"ui-form-builder__custom-wrapper\" [attr.data-component]=\"field.customConfig?.component\"\r\n [attr.data-template-key]=\"resolveCustomTemplateKey(field)\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n @if (getCustomFieldOutlet(field, fg, nestedErrorKeyPrefix); as customOutlet) {\r\n <ng-container *ngTemplateOutlet=\"customOutlet.template; context: customOutlet.context\" />\r\n } @else {\r\n <div class=\"ui-form-builder__custom-placeholder\" role=\"status\">\r\n <span>Nessun template registrato per «{{ resolveCustomTemplateKey(field) }}»</span>\r\n </div>\r\n }\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n</ng-template>","import { 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 TemplateRef,\r\n HostListener,\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 {\r\n UiFormErrorDetail,\r\n UiFormValidationState,\r\n} from './types/validation.types';\r\nimport {\r\n UiWizardSyncService,\r\n UiWizardSyncData,\r\n} from './services/wizard-sync.service';\r\nimport { UiLoggerService } from '../../core/logging/logger.service';\r\n\r\n// ─── Componenti interni ───────────────────────────────────────────\r\n\r\n/**\r\n * Header del wizard: progresso e info dello step corrente.\r\n * Con `progressStyle: 'steps'` emette `stepSelect` per saltare a uno step già completato.\r\n */\r\n@Component({\r\n selector: 'ui-wizard-header',\r\n standalone: true,\r\n imports: [LucideAngularModule],\r\n encapsulation: ViewEncapsulation.None,\r\n template: `\r\n <div class=\"ui-form-wizard__header\">\r\n @if (config.showProgress !== false) {\r\n @if (config.progressStyle !== 'steps') {\r\n <div class=\"ui-form-wizard__progress-bar\">\r\n <div\r\n class=\"ui-form-wizard__progress-fill\"\r\n [style.width.%]=\"progressPercent\"\r\n ></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 <div class=\"ui-form-wizard__steps\">\r\n @for (\r\n group of stepGroups;\r\n track $index;\r\n let i = $index\r\n ) {\r\n <div\r\n class=\"ui-form-wizard__step\"\r\n [class.ui-form-wizard__step--current]=\"\r\n i === state.currentStep\r\n \"\r\n [class.ui-form-wizard__step--completed]=\"\r\n state.completedSteps.has(i)\r\n \"\r\n [class.ui-form-wizard__step--visited]=\"\r\n state.visitedSteps.has(i)\r\n \"\r\n [class.ui-form-wizard__step--navigable]=\"\r\n isStepIndicatorNavigable(i)\r\n \"\r\n >\r\n @if (isStepIndicatorNavigable(i)) {\r\n <button\r\n type=\"button\"\r\n class=\"ui-form-wizard__step-trigger\"\r\n [attr.aria-label]=\"\r\n stepAriaLabel(\r\n group[0].wizardStep?.stepTitle ||\r\n group[0].title ||\r\n 'Step ' + (i + 1)\r\n )\r\n \"\r\n (click)=\"stepSelect.emit(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 {{\r\n group[0].wizardStep?.stepTitle ||\r\n group[0].title ||\r\n 'Step ' + (i + 1)\r\n }}\r\n </div>\r\n </button>\r\n } @else {\r\n <div\r\n class=\"ui-form-wizard__step-static\"\r\n [attr.aria-current]=\"\r\n i === state.currentStep ? 'step' : null\r\n \"\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 {{\r\n group[0].wizardStep?.stepTitle ||\r\n group[0].title ||\r\n 'Step ' + (i + 1)\r\n }}\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n\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\">\r\n {{ currentStepDescription }}\r\n </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\nexport class UiWizardHeaderComponent {\r\n @Input() config!: UiWizardConfig;\r\n @Input() stepGroups: UiFormSection[][] = [];\r\n @Input() state!: UiWizardState;\r\n @Input() progressPercent = 0;\r\n @Input() currentStepTitle = '';\r\n @Input() currentStepDescription = '';\r\n /** Quando true, i bullet step non sono interattivi (es. wizard disabilitato). */\r\n @Input() disableStepIndicators = false;\r\n\r\n @Output() stepSelect = new EventEmitter<number>();\r\n\r\n /** Indice step selezionabile tramite bullet/titolo (solo step già completati, non il corrente). */\r\n isStepIndicatorNavigable(stepIndex: number): boolean {\r\n if (this.config.allowStepIndicatorNavigation === false) return false;\r\n if (this.disableStepIndicators) return false;\r\n if (this.config.allowBackNavigation === false) return false;\r\n return (\r\n stepIndex !== this.state.currentStep &&\r\n this.state.completedSteps.has(stepIndex)\r\n );\r\n }\r\n\r\n /** Testo accessibile per il pulsante step (navigazione). */\r\n stepAriaLabel(stepTitle: string): string {\r\n return `Vai allo step: ${stepTitle}`;\r\n }\r\n}\r\n\r\n/**\r\n * Footer del wizard: pulsanti di navigazione e salvataggio.\r\n * Emette eventi per Previous, Next, Finish, Save.\r\n */\r\n@Component({\r\n selector: 'ui-wizard-footer',\r\n standalone: true,\r\n imports: [UiButtonComponent],\r\n encapsulation: ViewEncapsulation.None,\r\n template: `\r\n <div class=\"ui-form-wizard__footer\">\r\n @if (\r\n config.allowBackNavigation !== false && state.currentStep > 0\r\n ) {\r\n <div class=\"ui-form-wizard__nav-action\">\r\n <ui-button\r\n [label]=\"config.buttonLabels?.previous ?? 'Indietro'\"\r\n variant=\"outline\"\r\n icon=\"chevron-left\"\r\n (click)=\"previous.emit()\"\r\n />\r\n <span class=\"ui-form-wizard__nav-hint\">Ctrl + ←</span>\r\n </div>\r\n } @else {\r\n <div></div>\r\n }\r\n\r\n <div class=\"ui-form-wizard__footer-right\">\r\n @if (config.autoSave && config.buttonLabels?.save) {\r\n <ui-button\r\n [label]=\"config.buttonLabels!.save!\"\r\n variant=\"outline\"\r\n (click)=\"save.emit()\"\r\n />\r\n }\r\n <div class=\"ui-form-wizard__nav-action\">\r\n @if (isLastStep) {\r\n <ui-button\r\n [label]=\"config.buttonLabels?.finish ?? 'Completa'\"\r\n variant=\"primary\"\r\n icon=\"check\"\r\n iconPosition=\"trailing\"\r\n (click)=\"finish.emit()\"\r\n />\r\n } @else {\r\n <ui-button\r\n [label]=\"\r\n config.buttonLabels?.next ??\r\n config.buttonLabels?.submit ??\r\n 'Avanti'\r\n \"\r\n variant=\"primary\"\r\n icon=\"chevron-right\"\r\n iconPosition=\"trailing\"\r\n (click)=\"next.emit()\"\r\n />\r\n }\r\n <span class=\"ui-form-wizard__nav-hint\">Ctrl + →</span>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n})\r\nexport class UiWizardFooterComponent {\r\n @Input() config!: UiWizardConfig;\r\n @Input() state!: UiWizardState;\r\n @Input() isLastStep = false;\r\n\r\n @Output() previous = new EventEmitter<void>();\r\n @Output() next = new EventEmitter<void>();\r\n @Output() finish = new EventEmitter<void>();\r\n @Output() save = new EventEmitter<void>();\r\n}\r\n\r\n// ─── Componente wizard principale ─────────────────────────────────\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 * Più sezioni schema con lo stesso `wizardStep.stepNumber` formano un unico passo\r\n * (es. più blocchi collassabili per step); metadati del passo dalla prima sezione del gruppo.\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: [\r\n LucideAngularModule,\r\n UiButtonComponent,\r\n UiFormBuilderComponent,\r\n UiWizardHeaderComponent,\r\n UiWizardFooterComponent,\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n template: `\r\n @if (schema && wizardConfig) {\r\n <div class=\"ui-form-wizard\">\r\n <!-- Header wizard (nascosto se wireless) -->\r\n @if (!wizardConfig.wirelessHeading) {\r\n <ui-wizard-header\r\n [config]=\"wizardConfig\"\r\n [stepGroups]=\"wizardStepGroups\"\r\n [state]=\"state\"\r\n [progressPercent]=\"progressPercent\"\r\n [currentStepTitle]=\"currentStepTitle\"\r\n [currentStepDescription]=\"currentStepDescription\"\r\n [disableStepIndicators]=\"disabled\"\r\n (stepSelect)=\"onWizardStepIndicatorSelect($event)\"\r\n />\r\n }\r\n\r\n <!-- Navigazione sopra il form -->\r\n @if (showTopNav) {\r\n <ui-wizard-footer\r\n class=\"ui-form-wizard__footer ui-form-wizard__footer--top\"\r\n [config]=\"wizardConfig\"\r\n [state]=\"state\"\r\n [isLastStep]=\"isLastStep\"\r\n (previous)=\"goToPreviousStep()\"\r\n (next)=\"goToNextStep()\"\r\n (finish)=\"finishWizard()\"\r\n (save)=\"saveCurrentStep()\"\r\n />\r\n }\r\n\r\n <div class=\"ui-form-wizard__content\">\r\n <!-- Form builder per lo step corrente -->\r\n <ui-form-builder\r\n [schema]=\"currentStepSchema!\"\r\n [initialData]=\"mergedInitialDataForBuilder\"\r\n [readonly]=\"readonly\"\r\n [disabled]=\"disabled\"\r\n [loadingFor]=\"loadingFor\"\r\n [customFieldTemplates]=\"customFieldTemplates\"\r\n [customFieldTemplateFallback]=\"customFieldTemplateFallback\"\r\n (valueChange)=\"onValueChange($event)\"\r\n (validationChange)=\"onValidationChange($event)\"\r\n (customEvent)=\"customEvent.emit($event)\"\r\n />\r\n </div>\r\n\r\n <!-- Navigazione sotto il form -->\r\n @if (showBottomNav) {\r\n <ui-wizard-footer\r\n class=\"ui-form-wizard__footer\"\r\n [config]=\"wizardConfig\"\r\n [state]=\"state\"\r\n [isLastStep]=\"isLastStep\"\r\n (previous)=\"goToPreviousStep()\"\r\n (next)=\"goToNextStep()\"\r\n (finish)=\"finishWizard()\"\r\n (save)=\"saveCurrentStep()\"\r\n />\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 logger = inject(UiLoggerService, { optional: true });\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 /** Template per campi `type: 'custom'` (inoltro al form builder). */\r\n @Input() customFieldTemplates: Record<string, TemplateRef<unknown>> = {};\r\n\r\n /** Fallback template per campi custom (inoltro al form builder). */\r\n @Input() customFieldTemplateFallback?: TemplateRef<unknown>;\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<{\r\n step: number;\r\n errors: string[];\r\n }>();\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 /**\r\n * Gruppi di sezioni schema per passo logico del wizard.\r\n * Sezioni con lo stesso `wizardStep.stepNumber` compongono un unico passo (ordine: come in `schema.sections` dopo sort per numero).\r\n */\r\n wizardStepGroups: 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 (\r\n this._cachedStepIndex === this.state.currentStep &&\r\n this._cachedStepSchema\r\n ) {\r\n return this._cachedStepSchema;\r\n }\r\n\r\n const group = this.wizardStepGroups[this.state.currentStep];\r\n if (!group?.length) return null;\r\n\r\n this._cachedStepSchema = {\r\n id: this.schema.id + '-step-' + this.state.currentStep,\r\n sections: group,\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 primary = this.wizardStepGroups[this.state.currentStep]?.[0];\r\n return primary?.wizardStep?.stepTitle || primary?.title || '';\r\n }\r\n\r\n get currentStepDescription(): string {\r\n const primary = this.wizardStepGroups[this.state.currentStep]?.[0];\r\n return primary?.wizardStep?.stepDescription || primary?.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(\r\n (this.state.currentStep / (this.state.totalSteps - 1)) * 100,\r\n );\r\n }\r\n\r\n /**\r\n * Dati passati al form builder: unione tra valori forniti dal consumer e\r\n * stato accumulato tra gli step. Senza questo, tornando indietro il builder\r\n * riceverebbe solo `initialData` e ricreerebbe i campi vuoti, pur avendo\r\n * i valori ancora in `accumulatedData`.\r\n */\r\n get mergedInitialDataForBuilder(): UiFormData {\r\n return { ...this.initialData, ...this.accumulatedData };\r\n }\r\n\r\n /** Mostra la navigazione sopra il form builder. */\r\n get showTopNav(): boolean {\r\n if (this.wizardConfig.showNavigationButtons === false) return false;\r\n const pos = this.wizardConfig.navigationPosition;\r\n return pos === 'top' || pos === 'both';\r\n }\r\n\r\n /** Mostra la navigazione sotto il form builder. */\r\n get showBottomNav(): boolean {\r\n if (this.wizardConfig.showNavigationButtons === false) return false;\r\n const pos = this.wizardConfig.navigationPosition;\r\n return pos === 'bottom' || pos === 'both' || pos == null;\r\n }\r\n\r\n // ─── Lifecycle ──────────────────────────────────────────────────\r\n\r\n ngOnInit(): void {\r\n if (!this.schema) {\r\n this.logger?.logWizardAction('init', { wizardId: this.wizardConfig?.wizardId, error: 'schema non presente' });\r\n return;\r\n }\r\n\r\n this.wizardStepGroups = this.buildWizardStepGroups(this.schema.sections);\r\n this.state.totalSteps = this.wizardStepGroups.length;\r\n this.accumulatedData = { ...this.initialData };\r\n\r\n this.logger?.logWizardAction('init', {\r\n wizardId: this.wizardConfig?.wizardId,\r\n schemaId: this.schema.id,\r\n totalSteps: this.state.totalSteps,\r\n totalSections: this.wizardStepGroups.reduce((sum, g) => sum + g.length, 0),\r\n });\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.logger?.logWizardAction('destroy', {\r\n wizardId: this.wizardConfig?.wizardId,\r\n schemaId: this.schema?.id,\r\n currentStep: this.state.currentStep,\r\n });\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 /**\r\n * Scorciatoia: Ctrl + Freccia sinistra/destra per navigare come i pulsanti\r\n * Indietro / Avanti (sull'ultimo step, Avanti equivale a Completa).\r\n * Ignorata se il focus è in un campo di input per non interferire con la digitazione.\r\n */\r\n @HostListener('document:keydown', ['$event'])\r\n onDocumentKeydown(event: KeyboardEvent): void {\r\n if (!this.schema || !this.wizardConfig || this.disabled) return;\r\n if (this.wizardConfig.showNavigationButtons === false) return;\r\n if (!event.ctrlKey || event.altKey || event.metaKey || event.shiftKey)\r\n return;\r\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\r\n if (this.isEditableKeyboardTarget(event.target)) return;\r\n\r\n if (event.key === 'ArrowLeft') {\r\n if (this.wizardConfig.allowBackNavigation === false) return;\r\n if (this.state.currentStep <= 0) return;\r\n event.preventDefault();\r\n this.logger?.logWizardAction('keyboardNavigation', {\r\n wizardId: this.wizardConfig.wizardId,\r\n direction: 'previous',\r\n fromStep: this.state.currentStep,\r\n });\r\n this.goToPreviousStep();\r\n return;\r\n }\r\n\r\n // ArrowRight\r\n event.preventDefault();\r\n this.logger?.logWizardAction('keyboardNavigation', {\r\n wizardId: this.wizardConfig.wizardId,\r\n direction: this.isLastStep ? 'finish' : 'next',\r\n fromStep: this.state.currentStep,\r\n });\r\n if (this.isLastStep) {\r\n void this.finishWizard();\r\n } else {\r\n void this.goToNextStep();\r\n }\r\n }\r\n\r\n /** True se il target del keydown è un elemento dove la digitazione ha priorità sulla shortcut wizard. */\r\n private isEditableKeyboardTarget(target: EventTarget | null): boolean {\r\n if (!target || !(target instanceof HTMLElement)) return false;\r\n const el = target;\r\n if (el.isContentEditable) return true;\r\n const tag = el.tagName;\r\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\r\n return false;\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 /**\r\n * Navigazione tramite indicatori step (bullet + titolo) quando `progressStyle` è `'steps'`.\r\n * Consentito solo verso step già marcati completati.\r\n */\r\n onWizardStepIndicatorSelect(stepIndex: number): void {\r\n if (this.disabled) return;\r\n if (this.wizardConfig.allowStepIndicatorNavigation === false) return;\r\n if (this.wizardConfig.allowBackNavigation === false) return;\r\n if (stepIndex === this.state.currentStep) return;\r\n if (!this.state.completedSteps.has(stepIndex)) return;\r\n\r\n this.logger?.logWizardAction('navigation', {\r\n wizardId: this.wizardConfig.wizardId,\r\n via: 'stepIndicator',\r\n fromStep: this.state.currentStep,\r\n toStep: stepIndex,\r\n });\r\n this.navigateToStep(stepIndex);\r\n }\r\n\r\n /** Completa il wizard. */\r\n async finishWizard(): Promise<void> {\r\n if (!(await this.validateCurrentStep())) {\r\n this.logger?.logWizardAction('stepValidationFailed', {\r\n wizardId: this.wizardConfig.wizardId,\r\n step: this.state.currentStep,\r\n context: 'finish',\r\n });\r\n return;\r\n }\r\n\r\n this.state.completedSteps.add(this.state.currentStep);\r\n await this.autoSaveIfNeeded();\r\n\r\n this.logger?.logWizardAction('complete', {\r\n wizardId: this.wizardConfig.wizardId,\r\n schemaId: this.schema?.id,\r\n totalSteps: this.state.totalSteps,\r\n completedSteps: Array.from(this.state.completedSteps),\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 this.logger?.logWizardAction('save', {\r\n wizardId: this.wizardConfig.wizardId,\r\n step: this.state.currentStep,\r\n schemaId: this.schema?.id,\r\n });\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.logger?.logWizardAction('valueChange', {\r\n wizardId: this.wizardConfig.wizardId,\r\n step: this.state.currentStep,\r\n schemaId: this.schema?.id,\r\n changedKeys: Object.keys(data),\r\n });\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.logger?.logWizardAction('stepChange', {\r\n wizardId: this.wizardConfig.wizardId,\r\n from,\r\n to: targetStep,\r\n direction: targetStep > from ? 'next' : 'previous',\r\n schemaId: this.schema?.id,\r\n });\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 this.formBuilder?.validateAllFields();\r\n const group = this.wizardStepGroups[this.state.currentStep];\r\n const primary = group?.[0];\r\n const validateCustomComponents =\r\n primary?.wizardStep?.validation?.validateCustomComponents !== false;\r\n const customFieldKeys = new Set(this.getCustomFieldKeysForGroup(group));\r\n\r\n const isFormValid = validateCustomComponents\r\n ? (this.formBuilder?.isFormValid() ?? true)\r\n : (this.formBuilder?.isFormValidExcludingFieldKeys(customFieldKeys) ??\r\n true);\r\n\r\n const customFnName = primary?.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 if (!isFormValid && primary?.wizardStep?.validation?.required !== false) {\r\n let details = this.formBuilder?.getDetailedFormErrors() || [];\r\n if (!validateCustomComponents && group?.length) {\r\n details = this.filterErrorDetailsExcludingCustomFields(\r\n details,\r\n group,\r\n customFieldKeys,\r\n );\r\n }\r\n const errors = details.flatMap((e) => e.errors);\r\n this.logger?.logWizardAction('stepValidationFailed', {\r\n wizardId: this.wizardConfig.wizardId,\r\n step: this.state.currentStep,\r\n errors,\r\n });\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.logger?.logWizardAction('stepComplete', {\r\n wizardId: this.wizardConfig.wizardId,\r\n step: this.state.currentStep,\r\n schemaId: this.schema?.id,\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 /**\r\n * Raggruppa le sezioni con `wizardStep` per `stepNumber` (ordine stabile per numero, poi ordine di apparizione nello schema).\r\n */\r\n private buildWizardStepGroups(sections: UiFormSection[]): UiFormSection[][] {\r\n const withWizard = sections.filter((s) => s.wizardStep);\r\n withWizard.sort(\r\n (a, b) =>\r\n (a.wizardStep!.stepNumber || 0) - (b.wizardStep!.stepNumber || 0),\r\n );\r\n const groups: UiFormSection[][] = [];\r\n for (const s of withWizard) {\r\n const num = s.wizardStep!.stepNumber;\r\n const prev = groups[groups.length - 1];\r\n if (\r\n prev?.length &&\r\n (prev[0].wizardStep!.stepNumber || 0) === (num || 0)\r\n ) {\r\n prev.push(s);\r\n } else {\r\n groups.push([s]);\r\n }\r\n }\r\n return groups;\r\n }\r\n\r\n /** Chiavi dei campi `custom` in tutte le sezioni del passo corrente. */\r\n private getCustomFieldKeysForGroup(\r\n group: UiFormSection[] | undefined,\r\n ): string[] {\r\n if (!group?.length) return [];\r\n const keys: string[] = [];\r\n for (const section of group) {\r\n for (const f of section.fields || []) {\r\n if (f.type === 'custom') keys.push(f.key);\r\n }\r\n }\r\n return keys;\r\n }\r\n\r\n /** Rimuove dagli errori i campi custom quando `validateCustomComponents` è false. */\r\n private filterErrorDetailsExcludingCustomFields(\r\n details: UiFormErrorDetail[],\r\n group: UiFormSection[],\r\n customKeys: Set<string>,\r\n ): UiFormErrorDetail[] {\r\n const sectionIds = group.map((s) => s.id);\r\n return details.filter((d) => {\r\n const logicalKey = this.logicalFieldKeyFromDetailKeyForGroup(\r\n d.fieldKey,\r\n sectionIds,\r\n );\r\n return !customKeys.has(logicalKey);\r\n });\r\n }\r\n\r\n /**\r\n * Risolve la chiave logica del campo rispetto a tutte le sezioni del gruppo (campi flat o repeatable).\r\n */\r\n private logicalFieldKeyFromDetailKeyForGroup(\r\n fieldKey: string,\r\n sectionIds: string[],\r\n ): string {\r\n for (const id of sectionIds) {\r\n const k = this.logicalFieldKeyFromDetailKey(fieldKey, id);\r\n if (k !== fieldKey) return k;\r\n }\r\n return fieldKey;\r\n }\r\n\r\n /** Estrae la chiave campo da `fieldKey` flat o `sectionId[i].fieldKey`. */\r\n private logicalFieldKeyFromDetailKey(\r\n fieldKey: string,\r\n sectionId: string,\r\n ): string {\r\n const re = new RegExp(`^${this.escapeRegExp(sectionId)}\\\\[\\\\d+\\\\]\\\\.(.+)$`);\r\n const m = fieldKey.match(re);\r\n return m ? m[1] : fieldKey;\r\n }\r\n\r\n private escapeRegExp(s: string): string {\r\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\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.wizardStepGroups.map((g) => ({\r\n title: g[0]?.wizardStep?.stepTitle || g[0]?.title,\r\n description: g[0]?.wizardStep?.stepDescription || g[0]?.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","// ── Tipi campo ──\nexport {\n UiFieldType,\n UiFieldOption,\n UiDynamicOptionsConfig,\n UiDependentOptionsConfig,\n UiIconTooltip,\n UiFileData,\n UiFileInputConfig,\n UiCustomComponentConfig,\n UiCustomFieldTemplateContext,\n UiCustomFormComponent,\n UiFormFieldDescriptor,\n} from './field.types';\n\n// ── Tipi validazione ──\nexport {\n UiCrossFieldOperator,\n UiCrossFieldConfig,\n UiDateKeyword,\n UiDateValidationConfig,\n UiValidationType,\n UiValidationRule,\n UiFormValidationState,\n UiFormErrorDetail,\n UI_FORM_NESTED_FIELD_ERRORS_KEY,\n} from './validation.types';\n\n// ── Tipi condizione ──\nexport {\n UiConditionalOperator,\n UiFieldCondition,\n} from './condition.types';\n\n// ── Tipi territoriale (location) ──\nexport {\n UiLocationFieldConfig,\n UiLocationConfig,\n UiLocationLabels,\n UiLocationValue,\n UiLocationTableConfig,\n UiLocationRow,\n} from './territoriale.types';\n\n// ── Tipi location geocodificata ──\nexport {\n UiGeocodedLocationType,\n UiGeocodedLocationInput,\n UiGeocodedItalianDetails,\n UiGeocodedForeignDetails,\n UiLocationGeocodedFieldConfig,\n} from './geocoded-location.types';\n\n// ── Tipi schema ──\nexport {\n UiRepeatableConfig,\n UiWizardStepValidation,\n UiWizardValidationFn,\n UiWizardStepConfig,\n UiFormSection,\n UiFormBuilderConfig,\n UiWizardConfig,\n UiWizardState,\n UiFormSchema,\n UiFormData,\n UiFormCustomEvent,\n UiWizardStepChangeEvent,\n UiWizardStepCompleteEvent,\n} from './schema.types';\n","// ── Componenti ──\r\nexport { UiFormBuilderComponent } from './form-builder.component';\r\nexport { UiFormErrorStateMatcher } from './services/form-error-state.matcher';\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\nexport { UiLocationGeocodedComponent } from './sub-components/location-geocoded/location-geocoded.component';\r\nexport { UiFormTextFieldComponent, UiFormTextareaFieldComponent, UiFormNumberFieldComponent, UiFormSelectFieldComponent, UiFormRadioFieldComponent } from './sub-components/form-fields/index';\r\n\r\n// ── Servizi ──\r\nexport { UiFormConditionService } from './services/form-condition.service';\r\nexport { UiFormValidationService } from './services/form-validation.service';\r\nexport { UiFormFieldErrorService } from './services/form-field-error.service';\r\nexport type { UiFieldErrorDisplayOptions } from './services/form-field-error.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\nexport { UiNominatimGeocodingService } from './services/nominatim-geocoding.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","/**\n * Bootstrap del secondary entry `@gnggln/ng-ui-system/form-builder`. Form Builder e Form Wizard.\n */\nexport * from './lib/components/form-builder/index';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './entry-form-builder';\n"],"names":["i2","isDateValid","i1.UiFormConditionService","takeUntil","i1","i2.UiLocationService","i3","i6","i1.UiLocationService","i4","i7","i5","i8","debounceTime","distinctUntilChanged","rxFilter","i10","i11"],"mappings":"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B,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}