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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/esm2022/gnggln-ng-ui-system.mjs +5 -0
  2. package/esm2022/lib/components/accordion/accordion.component.mjs +353 -0
  3. package/esm2022/lib/components/accordion/accordion.types.mjs +6 -0
  4. package/esm2022/lib/components/accordion/index.mjs +2 -0
  5. package/esm2022/lib/components/base-layout/base-layout.component.mjs +218 -0
  6. package/esm2022/lib/components/base-layout/base-layout.types.mjs +6 -0
  7. package/esm2022/lib/components/base-layout/index.mjs +14 -0
  8. package/esm2022/lib/components/button/button-area.component.mjs +196 -0
  9. package/esm2022/lib/components/button/button.component.mjs +164 -0
  10. package/esm2022/lib/components/button/button.types.mjs +6 -0
  11. package/esm2022/lib/components/button/index.mjs +16 -0
  12. package/esm2022/lib/components/crud-table/crud-table.component.mjs +789 -0
  13. package/esm2022/lib/components/crud-table/crud-table.types.mjs +6 -0
  14. package/esm2022/lib/components/crud-table/index.mjs +16 -0
  15. package/esm2022/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
  16. package/esm2022/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
  17. package/esm2022/lib/components/form-builder/form-builder.component.mjs +824 -0
  18. package/esm2022/lib/components/form-builder/form-wizard.component.mjs +510 -0
  19. package/esm2022/lib/components/form-builder/index.mjs +19 -0
  20. package/esm2022/lib/components/form-builder/services/form-condition.service.mjs +132 -0
  21. package/esm2022/lib/components/form-builder/services/form-validation.service.mjs +381 -0
  22. package/esm2022/lib/components/form-builder/services/location.service.mjs +140 -0
  23. package/esm2022/lib/components/form-builder/services/wizard-sync.service.mjs +84 -0
  24. package/esm2022/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +161 -0
  25. package/esm2022/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
  26. package/esm2022/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
  27. package/esm2022/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
  28. package/esm2022/lib/components/form-builder/types/condition.types.mjs +6 -0
  29. package/esm2022/lib/components/form-builder/types/field.types.mjs +6 -0
  30. package/esm2022/lib/components/form-builder/types/index.mjs +2 -0
  31. package/esm2022/lib/components/form-builder/types/schema.types.mjs +6 -0
  32. package/esm2022/lib/components/form-builder/types/territoriale.types.mjs +6 -0
  33. package/esm2022/lib/components/form-builder/types/validation.types.mjs +6 -0
  34. package/esm2022/lib/components/form-builder-editor/form-builder-editor.component.mjs +730 -0
  35. package/esm2022/lib/components/form-builder-editor/form-builder-editor.service.mjs +56 -0
  36. package/esm2022/lib/components/form-builder-editor/index.mjs +21 -0
  37. package/esm2022/lib/components/form-builder-editor/services/editor-persistence.service.mjs +190 -0
  38. package/esm2022/lib/components/form-builder-editor/services/editor-state.service.mjs +324 -0
  39. package/esm2022/lib/components/form-builder-editor/services/field-factory.service.mjs +188 -0
  40. package/esm2022/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.mjs +667 -0
  41. package/esm2022/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.mjs +317 -0
  42. package/esm2022/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.mjs +611 -0
  43. package/esm2022/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.mjs +267 -0
  44. package/esm2022/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.mjs +276 -0
  45. package/esm2022/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.mjs +323 -0
  46. package/esm2022/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +238 -0
  47. package/esm2022/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +472 -0
  48. package/esm2022/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.mjs +473 -0
  49. package/esm2022/lib/components/form-builder-editor/types/editor.types.mjs +6 -0
  50. package/esm2022/lib/components/layout-builder/index.mjs +18 -0
  51. package/esm2022/lib/components/layout-builder/layout-builder.component.mjs +1730 -0
  52. package/esm2022/lib/components/layout-builder/layout-builder.types.mjs +9 -0
  53. package/esm2022/lib/components/layout-builder/layout.service.mjs +239 -0
  54. package/esm2022/lib/components/modal/confirm-dialog.component.mjs +151 -0
  55. package/esm2022/lib/components/modal/index.mjs +4 -0
  56. package/esm2022/lib/components/modal/modal.component.mjs +139 -0
  57. package/esm2022/lib/components/modal/modal.service.mjs +194 -0
  58. package/esm2022/lib/components/modal/modal.types.mjs +6 -0
  59. package/esm2022/lib/components/page-header/breadcrumb.service.mjs +242 -0
  60. package/esm2022/lib/components/page-header/index.mjs +20 -0
  61. package/esm2022/lib/components/page-header/page-header.component.mjs +243 -0
  62. package/esm2022/lib/components/page-header/page-header.types.mjs +21 -0
  63. package/esm2022/lib/components/table/index.mjs +2 -0
  64. package/esm2022/lib/components/table/paginated-table.component.mjs +407 -0
  65. package/esm2022/lib/components/table/table.types.mjs +6 -0
  66. package/esm2022/lib/core/types/index.mjs +6 -0
  67. package/esm2022/lib/core/utils/index.mjs +53 -0
  68. package/esm2022/lib/sources/location-data.opt.json +8942 -0
  69. package/esm2022/lib/sources/nazioni.opt.json +215 -0
  70. package/esm2022/public-api.mjs +34 -0
  71. package/fesm2022/gnggln-ng-ui-system.mjs +55752 -0
  72. package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -0
  73. package/index.d.ts +5 -0
  74. package/lib/components/accordion/accordion.component.d.ts +118 -0
  75. package/lib/components/accordion/accordion.types.d.ts +62 -0
  76. package/lib/components/accordion/index.d.ts +2 -0
  77. package/lib/components/base-layout/base-layout.component.d.ts +83 -0
  78. package/lib/components/base-layout/base-layout.types.d.ts +26 -0
  79. package/lib/components/base-layout/index.d.ts +13 -0
  80. package/lib/components/button/button-area.component.d.ts +88 -0
  81. package/lib/components/button/button.component.d.ts +55 -0
  82. package/lib/components/button/button.types.d.ts +70 -0
  83. package/lib/components/button/index.d.ts +15 -0
  84. package/lib/components/crud-table/crud-table.component.d.ts +143 -0
  85. package/lib/components/crud-table/crud-table.types.d.ts +207 -0
  86. package/lib/components/crud-table/index.d.ts +15 -0
  87. package/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
  88. package/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
  89. package/lib/components/form-builder/form-builder.component.d.ts +183 -0
  90. package/lib/components/form-builder/form-wizard.component.d.ts +87 -0
  91. package/lib/components/form-builder/index.d.ts +13 -0
  92. package/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
  93. package/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
  94. package/lib/components/form-builder/services/location.service.d.ts +83 -0
  95. package/lib/components/form-builder/services/wizard-sync.service.d.ts +63 -0
  96. package/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +28 -0
  97. package/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
  98. package/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
  99. package/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
  100. package/lib/components/form-builder/types/condition.types.d.ts +51 -0
  101. package/lib/components/form-builder/types/field.types.d.ts +288 -0
  102. package/lib/components/form-builder/types/index.d.ts +5 -0
  103. package/lib/components/form-builder/types/schema.types.d.ts +227 -0
  104. package/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
  105. package/lib/components/form-builder/types/validation.types.d.ts +174 -0
  106. package/lib/components/form-builder-editor/form-builder-editor.component.d.ts +117 -0
  107. package/lib/components/form-builder-editor/form-builder-editor.service.d.ts +38 -0
  108. package/lib/components/form-builder-editor/index.d.ts +15 -0
  109. package/lib/components/form-builder-editor/services/editor-persistence.service.d.ts +42 -0
  110. package/lib/components/form-builder-editor/services/editor-state.service.d.ts +66 -0
  111. package/lib/components/form-builder-editor/services/field-factory.service.d.ts +28 -0
  112. package/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.d.ts +139 -0
  113. package/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.d.ts +43 -0
  114. package/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.d.ts +83 -0
  115. package/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.d.ts +40 -0
  116. package/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.d.ts +51 -0
  117. package/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.d.ts +63 -0
  118. package/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.d.ts +68 -0
  119. package/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.d.ts +82 -0
  120. package/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.d.ts +112 -0
  121. package/lib/components/form-builder-editor/types/editor.types.d.ts +124 -0
  122. package/lib/components/layout-builder/index.d.ts +16 -0
  123. package/lib/components/layout-builder/layout-builder.component.d.ts +85 -0
  124. package/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
  125. package/lib/components/layout-builder/layout.service.d.ts +100 -0
  126. package/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  127. package/lib/components/modal/index.d.ts +4 -0
  128. package/lib/components/modal/modal.component.d.ts +44 -0
  129. package/lib/components/modal/modal.service.d.ts +93 -0
  130. package/lib/components/modal/modal.types.d.ts +110 -0
  131. package/lib/components/page-header/breadcrumb.service.d.ts +96 -0
  132. package/lib/components/page-header/index.d.ts +16 -0
  133. package/lib/components/page-header/page-header.component.d.ts +59 -0
  134. package/lib/components/page-header/page-header.types.d.ts +96 -0
  135. package/lib/components/table/index.d.ts +2 -0
  136. package/lib/components/table/paginated-table.component.d.ts +85 -0
  137. package/lib/components/table/table.types.d.ts +81 -0
  138. package/lib/core/types/index.d.ts +57 -0
  139. package/lib/core/utils/index.d.ts +29 -0
  140. package/package.json +44 -0
  141. package/public-api.d.ts +22 -0
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @module ng-ui-system/crud-table
3
+ * Tipi e interfacce per UiCrudTable.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC10YWJsZS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXVpLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC10YWJsZS9jcnVkLXRhYmxlLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBuZy11aS1zeXN0ZW0vY3J1ZC10YWJsZVxuICogVGlwaSBlIGludGVyZmFjY2UgcGVyIFVpQ3J1ZFRhYmxlLlxuICovXG5cbmltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVaUljb25OYW1lIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcyc7XG5pbXBvcnQgeyBVaUZvcm1TY2hlbWEgfSBmcm9tICcuLi9mb3JtLWJ1aWxkZXIvdHlwZXMvc2NoZW1hLnR5cGVzJztcblxuLy8gUmUtZXhwb3J0IHBlciBjb21vZGl0YSBkZWwgY29uc3VtYXRvcmVcbmV4cG9ydCB7IFVpSWNvbk5hbWUgfTtcblxuLy8g4pSA4pSA4pSAIE1vZGFsaXRhIENSVUQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogTW9kYWxpdGEgb3BlcmF0aXZlIGRlbGxhIENSVUQgdGFibGUuXG4gKlxuICogfCBNb2RhbGl0YSAgICB8IERlc2NyaXppb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IGB2aWV3YCAgICAgIHwgVmlzdWFsaXp6YXppb25lIHRhYmVsbGEgKHN0YXRvIGluaXppYWxlKSAgICAgIHxcbiAqIHwgYGluc2VydGAgICAgfCBJbnNlcmltZW50byBudW92byBlbGVtZW50byB0cmFtaXRlIGZvcm0gICAgICAgfFxuICogfCBgZWRpdGAgICAgICB8IE1vZGlmaWNhIGVsZW1lbnRvIGVzaXN0ZW50ZSAgICAgICAgICAgICAgICAgICB8XG4gKiB8IGBkdXBsaWNhdGVgIHwgRHVwbGljYXppb25lIGRpIHVuIGVsZW1lbnRvICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgYHJlYWRvbmx5YCAgfCBWaXN1YWxpenphemlvbmUgZGV0dGFnbGlvIGluIHNvbGEgbGV0dHVyYSAgICAgIHxcbiAqL1xuZXhwb3J0IHR5cGUgVWlDcnVkTW9kZSA9ICd2aWV3JyB8ICdpbnNlcnQnIHwgJ2VkaXQnIHwgJ2R1cGxpY2F0ZScgfCAncmVhZG9ubHknO1xuXG4vLyDilIDilIDilIAgQ29sb25uYSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBEZWZpbml6aW9uZSBkaSB1bmEgY29sb25uYSBkZWxsYSBDUlVEIHRhYmxlLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiAjIyMgQ29sb25uYSB0ZXN0dWFsZSBzZW1wbGljZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29sOiBVaUNydWRUYWJsZUNvbHVtbiA9IHtcbiAqICAga2V5OiAnbmFtZScsXG4gKiAgIGhlYWRlcjogJ05vbWUnLFxuICogICB3aWR0aDogJzIwMHB4JyxcbiAqIH07XG4gKiBgYGBcbiAqXG4gKiAjIyMgQ29sb25uYSBjb24gdGVtcGxhdGUgcGVyc29uYWxpenphdG9cbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNvbDogVWlDcnVkVGFibGVDb2x1bW4gPSB7XG4gKiAgIGtleTogJ3N0YXR1cycsXG4gKiAgIGhlYWRlcjogJ1N0YXRvJyxcbiAqICAgdGVtcGxhdGU6IG15U3RhdHVzVGVtcGxhdGUsXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVWlDcnVkVGFibGVDb2x1bW4ge1xuICAvKiogQ2hpYXZlIGRlbGxhIHByb3ByaWV0YSBuZWxsJ29nZ2V0dG8gcmlnYSAodXNhdGEgcGVyIGFjY2VkZXJlIGFsIHZhbG9yZSkuICovXG4gIGtleTogc3RyaW5nO1xuXG4gIC8qKiBUZXN0byBkZWxsJ2ludGVzdGF6aW9uZSBkZWxsYSBjb2xvbm5hLiAqL1xuICBoZWFkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGVtcGxhdGUgcGVyc29uYWxpenphdG8gcGVyIGxhIGNlbGxhLlxuICAgKiBJbCBjb250ZXN0byBmb3JuaXNjZTogYCRpbXBsaWNpdGAgKHJpZ2EpLCBgY29sdW1uYCAoZGVmaW5pemlvbmUpLCBgaW5kZXhgIChpbmRpY2UgcmlnYSksIGB2YWx1ZWAgKHZhbG9yZSBjZWxsYSkuXG4gICAqL1xuICB0ZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLyoqXG4gICAqIFRlbXBsYXRlIHBlcnNvbmFsaXp6YXRvIHBlciBsJ2ludGVzdGF6aW9uZS5cbiAgICogSWwgY29udGVzdG8gZm9ybmlzY2U6IGAkaW1wbGljaXRgIChjb2xvbm5hKSwgYGNvbHVtbmAgKGRlZmluaXppb25lKS5cbiAgICovXG4gIGhlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvKiogTGFyZ2hlenphIENTUyBkZWxsYSBjb2xvbm5hIChlcy4gJzEyMHB4JywgJzIwJScpLiAqL1xuICB3aWR0aD86IHN0cmluZztcblxuICAvKiogQWxsaW5lYW1lbnRvIGRlbCB0ZXN0byBuZWxsYSBjb2xvbm5hLiBAZGVmYXVsdCAnbGVmdCcgKi9cbiAgYWxpZ24/OiAnbGVmdCcgfCAnY2VudGVyJyB8ICdyaWdodCc7XG5cbiAgLyoqXG4gICAqIFRyb25jYSBpbCB0ZXN0byBvbHRyZSBtYXhMZW5ndGggY2FyYXR0ZXJpIGNvbiBlbGxpcHNpcyBlIHRvb2x0aXAgYXV0b21hdGljby5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGVsbGlwc2lzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTnVtZXJvIG1hc3NpbW8gZGkgY2FyYXR0ZXJpIHByaW1hIGRlbCB0cm9uY2FtZW50by5cbiAgICogQXR0aXZvIHNvbG8gcXVhbmRvIGBlbGxpcHNpc2AgZSBgdHJ1ZWAuXG4gICAqIEBkZWZhdWx0IDUwXG4gICAqL1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG59XG5cbi8vIOKUgOKUgOKUgCBDb25maWd1cmF6aW9uZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBDb25maWd1cmF6aW9uZSBjb21wbGV0YSBkZWxsYSBDUlVEIHRhYmxlLlxuICpcbiAqIENvbnRyb2xsYSBsbyBzY2hlbWEgZGVsIGZvcm0sIGxlIGxhYmVsIGRlaSBwdWxzYW50aSwgaSBwZXJtZXNzaVxuICogcGVyIGF6aW9uZSAoZ2xvYmFsaSBlIHBlci1yaWdhKSBlIGkgY2FsbGJhY2sgcHJlLWFwZXJ0dXJhIGZvcm0uXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqICMjIyBDb25maWd1cmF6aW9uZSBiYXNlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb25maWc6IFVpQ3J1ZFRhYmxlQ29uZmlnID0ge1xuICogICBmb3JtU2NoZW1hOiBteUZvcm1TY2hlbWEsXG4gKiAgIHRhYmxlTGFiZWw6ICdVdGVudGknLFxuICogICBlbXB0eU1lc3NhZ2U6ICdOZXNzdW4gdXRlbnRlIHByZXNlbnRlJyxcbiAqIH07XG4gKiBgYGBcbiAqXG4gKiAjIyMgVGFiZWxsYSBjb24gcGVybWVzc2kgZ3JhbnVsYXJpXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb25maWc6IFVpQ3J1ZFRhYmxlQ29uZmlnID0ge1xuICogICBmb3JtU2NoZW1hOiBteVNjaGVtYSxcbiAqICAgYWxsb3dFZGl0OiB0cnVlLFxuICogICBhbGxvd0RlbGV0ZTogdHJ1ZSxcbiAqICAgYWxsb3dEdXBsaWNhdGU6IHRydWUsXG4gKiAgIGNhbkVkaXQ6IChpdGVtKSA9PiBpdGVtLnN0YXR1cyAhPT0gJ2xvY2tlZCcsXG4gKiAgIGNhbkRlbGV0ZTogKGl0ZW0pID0+IGl0ZW0ucm9sZSAhPT0gJ2FkbWluJyxcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVaUNydWRUYWJsZUNvbmZpZyB7XG4gIC8qKiBTY2hlbWEgcGVyIGlsIGZvcm0gYnVpbGRlciAoaW5zZXJpbWVudG8vbW9kaWZpY2EpLiAqL1xuICBmb3JtU2NoZW1hOiBVaUZvcm1TY2hlbWE7XG5cbiAgLyoqIEV0aWNoZXR0YSBkZWxsYSB0YWJlbGxhIChwZXIgYWNjZXNzaWJpbGl0YSkuICovXG4gIHRhYmxlTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqIE1lc3NhZ2dpbyB2aXN1YWxpenphdG8gcXVhbmRvIG5vbiBjaSBzb25vIGRhdGkuIEBkZWZhdWx0ICdOZXNzdW4gZWxlbWVudG8gcHJlc2VudGUnICovXG4gIGVtcHR5TWVzc2FnZT86IHN0cmluZztcblxuICAvLyDilIDilIAgTGFiZWwgcHVsc2FudGkg4pSA4pSAXG5cbiAgLyoqIExhYmVsIGRlbCBwdWxzYW50ZSBcIkFnZ2l1bmdpXCIuIEBkZWZhdWx0ICdBZ2dpdW5naScgKi9cbiAgYWRkQnV0dG9uTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqIExhYmVsIGRlbCBwdWxzYW50ZSBcIlNhbHZhXCIgKGluc2VydCkuIEBkZWZhdWx0ICdTYWx2YScgKi9cbiAgc2F2ZUJ1dHRvbkxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKiBMYWJlbCBkZWwgcHVsc2FudGUgXCJBbm51bGxhXCIuIEBkZWZhdWx0ICdBbm51bGxhJyAqL1xuICBjYW5jZWxCdXR0b25MYWJlbD86IHN0cmluZztcblxuICAvKiogTGFiZWwgZGVsIHB1bHNhbnRlIFwiQWdnaW9ybmFcIiAoZWRpdCkuIEBkZWZhdWx0ICdBZ2dpb3JuYScgKi9cbiAgdXBkYXRlQnV0dG9uTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqIExhYmVsIGRlbCBwdWxzYW50ZSBcIkR1cGxpY2FcIiAoZHVwbGljYXRlKS4gQGRlZmF1bHQgJ0R1cGxpY2EnICovXG4gIGR1cGxpY2F0ZUJ1dHRvbkxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKiBNZXNzYWdnaW8gcGVyIGlsIGRpYWxvZ28gZGkgY29uZmVybWEgZWxpbWluYXppb25lLiAqL1xuICBkZWxldGVDb25maXJtTWVzc2FnZT86IHN0cmluZztcblxuICAvLyDilIDilIAgUGVybWVzc2kgZ2xvYmFsaSDilIDilIBcblxuICAvKipcbiAgICogQWJpbGl0YSBpbCBwdWxzYW50ZSBcIkFnZ2l1bmdpXCIgaW4gbW9kYWxpdGEgdmlldy5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgYWxsb3dBZGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBYmlsaXRhIGxhIG1vZGlmaWNhIGRlZ2xpIGVsZW1lbnRpLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBhbGxvd0VkaXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBYmlsaXRhIGwnZWxpbWluYXppb25lIGRlZ2xpIGVsZW1lbnRpLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBhbGxvd0RlbGV0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFiaWxpdGEgbGEgZHVwbGljYXppb25lIGRlZ2xpIGVsZW1lbnRpLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgYWxsb3dEdXBsaWNhdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBYmlsaXRhIGxhIHZpc3VhbGl6emF6aW9uZSBpbiBzb2xhIGxldHR1cmEuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBhbGxvd1ZpZXc/OiBib29sZWFuO1xuXG4gIC8vIOKUgOKUgCBQZXJtZXNzaSBwZXItcmlnYSAoY2FsbGJhY2spIOKUgOKUgFxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmEgc2UgdW5hIHNwZWNpZmljYSByaWdhIHB1byBlc3NlcmUgbW9kaWZpY2F0YS5cbiAgICogU2Ugbm9uIHNwZWNpZmljYXRhLCB1c2EgYGFsbG93RWRpdGAgZ2xvYmFsZS5cbiAgICovXG4gIGNhbkVkaXQ/OiAoaXRlbTogYW55LCByZWFkb25seTogYm9vbGVhbikgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5hIHNlIHVuYSBzcGVjaWZpY2EgcmlnYSBwdW8gZXNzZXJlIGVsaW1pbmF0YS5cbiAgICogU2Ugbm9uIHNwZWNpZmljYXRhLCB1c2EgYGFsbG93RGVsZXRlYCBnbG9iYWxlLlxuICAgKi9cbiAgY2FuRGVsZXRlPzogKGl0ZW06IGFueSwgcmVhZG9ubHk6IGJvb2xlYW4pID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERldGVybWluYSBzZSB1bmEgc3BlY2lmaWNhIHJpZ2EgcHVvIGVzc2VyZSBkdXBsaWNhdGEuXG4gICAqIFNlIG5vbiBzcGVjaWZpY2F0YSwgdXNhIGBhbGxvd0R1cGxpY2F0ZWAgZ2xvYmFsZS5cbiAgICovXG4gIGNhbkR1cGxpY2F0ZT86IChpdGVtOiBhbnksIHJlYWRvbmx5OiBib29sZWFuKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmEgc2UgdW5hIHNwZWNpZmljYSByaWdhIHB1byBlc3NlcmUgdmlzdWFsaXp6YXRhIGluIHJlYWRvbmx5LlxuICAgKiBTZSBub24gc3BlY2lmaWNhdGEsIHVzYSBgYWxsb3dWaWV3YCBnbG9iYWxlLlxuICAgKi9cbiAgY2FuVmlldz86IChpdGVtOiBhbnkpID0+IGJvb2xlYW47XG5cbiAgLy8g4pSA4pSAIENsYXNzaSBDU1MgcGVyLXJpZ2Eg4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc3RpdHVpc2NlIGNsYXNzaSBDU1MgYWdnaXVudGl2ZSBwZXIgdW5hIHNwZWNpZmljYSByaWdhLlxuICAgKiBVdGlsZSBwZXIgZXZpZGVuemlhcmUgcmlnaGUgaW4gYmFzZSBhbGxvIHN0YXRvLlxuICAgKi9cbiAgZ2V0Um93Q2xhc3M/OiAoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvLyDilIDilIAgVG9vbHRpcCBwZXJzb25hbGl6emF0aSDilIDilIBcblxuICAvKiogVG9vbHRpcCBwZXJzb25hbGl6emF0byBwZXIgbCdhemlvbmUgRWRpdC4gKi9cbiAgZ2V0RWRpdFRvb2x0aXA/OiAoaXRlbTogYW55KSA9PiBzdHJpbmc7XG5cbiAgLyoqIFRvb2x0aXAgcGVyc29uYWxpenphdG8gcGVyIGwnYXppb25lIERlbGV0ZS4gKi9cbiAgZ2V0RGVsZXRlVG9vbHRpcD86IChpdGVtOiBhbnkpID0+IHN0cmluZztcblxuICAvKiogVG9vbHRpcCBwZXJzb25hbGl6emF0byBwZXIgbCdhemlvbmUgRHVwbGljYXRlLiAqL1xuICBnZXREdXBsaWNhdGVUb29sdGlwPzogKGl0ZW06IGFueSkgPT4gc3RyaW5nO1xuXG4gIC8qKiBUb29sdGlwIHBlcnNvbmFsaXp6YXRvIHBlciBsJ2F6aW9uZSBWaWV3LiAqL1xuICBnZXRWaWV3VG9vbHRpcD86IChpdGVtOiBhbnkpID0+IHN0cmluZztcblxuICAvLyDilIDilIAgVHJhY2tpbmcg4pSA4pSAXG5cbiAgLyoqIFByb3ByaWV0YSB1c2F0YSBjb21lIGNoaWF2ZSBkaSB0cmFja2luZyBwZXIgbGUgcmlnaGUuIEBkZWZhdWx0ICdpZCcgKi9cbiAgdHJhY2tCeVByb3BlcnR5Pzogc3RyaW5nO1xuXG4gIC8vIOKUgOKUgCBDYWxsYmFjayBwcmUtYXBlcnR1cmEgZm9ybSDilIDilIBcblxuICAvKipcbiAgICogQ2FsbGJhY2sgaW52b2NhdG8gcHJpbWEgZGVsbCdhcGVydHVyYSBkZWwgZm9ybS5cbiAgICogUGVybWV0dGUgYWwgY29tcG9uZW50ZSBnZW5pdG9yZSBkaSBtb2RpZmljYXJlIGxvIHNjaGVtYVxuICAgKiAoZXMuIGRpc2FiaWxpdGFyZSBvcHppb25pIGdpYSB1dGlsaXp6YXRlKS5cbiAgICovXG4gIG9uQmVmb3JlRm9ybU9wZW4/OiAobW9kZTogVWlDcnVkTW9kZSwgZWRpdGluZ0l0ZW06IGFueSwgYWxsRGF0YTogYW55W10pID0+IHZvaWQ7XG59XG5cbi8vIOKUgOKUgOKUgCBFdmVudGkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRXZlbnRvIGVtZXNzbyBhbGxhIG1vZGlmaWNhIGRpIHVuIGVsZW1lbnRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVpQ3J1ZEVkaXRFdmVudDxUID0gYW55PiB7XG4gIC8qKiBFbGVtZW50byBtb2RpZmljYXRvLiAqL1xuICBpdGVtOiBUO1xuICAvKiogSW5kaWNlIGRlbGwnZWxlbWVudG8gbmVsbGEgbGlzdGEuICovXG4gIGluZGV4OiBudW1iZXI7XG4gIC8qKiBEYXRpIG9yaWdpbmFsaSBwcmltYSBkZWxsYSBtb2RpZmljYS4gKi9cbiAgb3JpZ2luYWxEYXRhOiBhbnk7XG59XG5cbi8qKlxuICogRXZlbnRvIGVtZXNzbyBhbGwnZWxpbWluYXppb25lIGRpIHVuIGVsZW1lbnRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVpQ3J1ZERlbGV0ZUV2ZW50PFQgPSBhbnk+IHtcbiAgLyoqIEVsZW1lbnRvIGVsaW1pbmF0by4gKi9cbiAgaXRlbTogVDtcbiAgLyoqIEluZGljZSBkZWxsJ2VsZW1lbnRvIG5lbGxhIGxpc3RhLiAqL1xuICBpbmRleDogbnVtYmVyO1xufVxuIl19
@@ -0,0 +1,16 @@
1
+ /**
2
+ * ng-ui-system — CRUD Table entry point.
3
+ *
4
+ * @example
5
+ * ```typescript
6
+ * import {
7
+ * UiCrudTableComponent,
8
+ * UiCrudTableColumn,
9
+ * UiCrudTableConfig,
10
+ * UiCrudMode,
11
+ * } from 'ng-ui-system';
12
+ * ```
13
+ */
14
+ // Componente
15
+ export { UiCrudTableComponent } from './crud-table.component';
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy11aS1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2NydWQtdGFibGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsYUFBYTtBQUNiLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIG5nLXVpLXN5c3RlbSDigJQgQ1JVRCBUYWJsZSBlbnRyeSBwb2ludC5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBpbXBvcnQge1xyXG4gKiAgIFVpQ3J1ZFRhYmxlQ29tcG9uZW50LFxyXG4gKiAgIFVpQ3J1ZFRhYmxlQ29sdW1uLFxyXG4gKiAgIFVpQ3J1ZFRhYmxlQ29uZmlnLFxyXG4gKiAgIFVpQ3J1ZE1vZGUsXHJcbiAqIH0gZnJvbSAnbmctdWktc3lzdGVtJztcclxuICogYGBgXHJcbiAqL1xyXG5cclxuLy8gQ29tcG9uZW50ZVxyXG5leHBvcnQgeyBVaUNydWRUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4vY3J1ZC10YWJsZS5jb21wb25lbnQnO1xyXG5cclxuLy8gVGlwaVxyXG5leHBvcnQge1xyXG4gIFVpQ3J1ZFRhYmxlQ29sdW1uLFxyXG4gIFVpQ3J1ZFRhYmxlQ29uZmlnLFxyXG4gIFVpQ3J1ZE1vZGUsXHJcbiAgVWlDcnVkRWRpdEV2ZW50LFxyXG4gIFVpQ3J1ZERlbGV0ZUV2ZW50LFxyXG59IGZyb20gJy4vY3J1ZC10YWJsZS50eXBlcyc7XHJcbiJdfQ==
@@ -0,0 +1,82 @@
1
+ /**
2
+ * @module ng-ui-system/form-builder
3
+ * Adapter e formati per il datepicker italiano (DD/MM/YYYY).
4
+ */
5
+ import { Injectable } from '@angular/core';
6
+ import { NativeDateAdapter } from '@angular/material/core';
7
+ import * as i0 from "@angular/core";
8
+ /**
9
+ * Adapter personalizzato per il parsing delle date in formato italiano DD/MM/YYYY.
10
+ *
11
+ * Estende il NativeDateAdapter di Angular Material per gestire:
12
+ * - Parsing: converte stringhe DD/MM/YYYY in oggetti Date
13
+ * - Formattazione: visualizza le date nel formato italiano
14
+ * - Primo giorno della settimana: Lunedi (1)
15
+ */
16
+ export class UiItalianDateAdapter extends NativeDateAdapter {
17
+ /**
18
+ * Il primo giorno della settimana e Lunedi (1).
19
+ */
20
+ getFirstDayOfWeek() {
21
+ return 1;
22
+ }
23
+ /**
24
+ * Parsing di una stringa di data in formato DD/MM/YYYY.
25
+ * Supporta sia il formato con separatore `/` che `-`.
26
+ */
27
+ parse(value) {
28
+ if (typeof value === 'string' && value.length > 0) {
29
+ // Gestisci formato DD/MM/YYYY o DD-MM-YYYY
30
+ const parts = value.split(/[\/\-]/);
31
+ if (parts.length === 3) {
32
+ const day = parseInt(parts[0], 10);
33
+ const month = parseInt(parts[1], 10) - 1; // Mesi 0-based
34
+ const year = parseInt(parts[2], 10);
35
+ if (!isNaN(day) && !isNaN(month) && !isNaN(year)) {
36
+ // Validazione base
37
+ if (day >= 1 && day <= 31 && month >= 0 && month <= 11 && year >= 1900 && year <= 2100) {
38
+ return new Date(year, month, day);
39
+ }
40
+ }
41
+ }
42
+ }
43
+ return super.parse(value);
44
+ }
45
+ /**
46
+ * Formatta una data in formato DD/MM/YYYY per la visualizzazione.
47
+ */
48
+ format(date, displayFormat) {
49
+ if (displayFormat === 'input') {
50
+ const day = date.getDate().toString().padStart(2, '0');
51
+ const month = (date.getMonth() + 1).toString().padStart(2, '0');
52
+ const year = date.getFullYear();
53
+ return `${day}/${month}/${year}`;
54
+ }
55
+ return date.toLocaleDateString('it-IT', {
56
+ year: 'numeric',
57
+ month: 'long',
58
+ day: 'numeric',
59
+ });
60
+ }
61
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiItalianDateAdapter, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
62
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiItalianDateAdapter }); }
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiItalianDateAdapter, decorators: [{
65
+ type: Injectable
66
+ }] });
67
+ /**
68
+ * Formati data italiani per Angular Material.
69
+ * Configura il datepicker per usare DD/MM/YYYY.
70
+ */
71
+ export const UI_IT_DATE_FORMATS = {
72
+ parse: {
73
+ dateInput: 'input',
74
+ },
75
+ display: {
76
+ dateInput: 'input',
77
+ monthYearLabel: { year: 'numeric', month: 'short' },
78
+ dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },
79
+ monthYearA11yLabel: { year: 'numeric', month: 'long' },
80
+ },
81
+ };
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXQtZGF0ZS1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXIvYWRhcHRlcnMvaXQtZGF0ZS1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFrQixNQUFNLHdCQUF3QixDQUFDOztBQUUzRTs7Ozs7OztHQU9HO0FBRUgsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGlCQUFpQjtJQUN6RDs7T0FFRztJQUNNLGlCQUFpQjtRQUN4QixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRDs7O09BR0c7SUFDTSxLQUFLLENBQUMsS0FBVTtRQUN2QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xELDJDQUEyQztZQUMzQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbkMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxlQUFlO2dCQUN6RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUVwQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ2pELG1CQUFtQjtvQkFDbkIsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUN2RixPQUFPLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ3BDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNNLE1BQU0sQ0FBQyxJQUFVLEVBQUUsYUFBcUI7UUFDL0MsSUFBSyxhQUFxQixLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDaEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sR0FBRyxHQUFHLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUU7WUFDdEMsSUFBSSxFQUFFLFNBQVM7WUFDZixLQUFLLEVBQUUsTUFBTTtZQUNiLEdBQUcsRUFBRSxTQUFTO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0EvQ1Usb0JBQW9CO21IQUFwQixvQkFBb0I7OzRGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVU7O0FBbURYOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFtQjtJQUNoRCxLQUFLLEVBQUU7UUFDTCxTQUFTLEVBQUUsT0FBTztLQUNuQjtJQUNELE9BQU8sRUFBRTtRQUNQLFNBQVMsRUFBRSxPQUFPO1FBQ2xCLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtRQUNuRCxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRTtRQUNqRSxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtLQUN2RDtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQG1vZHVsZSBuZy11aS1zeXN0ZW0vZm9ybS1idWlsZGVyXHJcbiAqIEFkYXB0ZXIgZSBmb3JtYXRpIHBlciBpbCBkYXRlcGlja2VyIGl0YWxpYW5vIChERC9NTS9ZWVlZKS5cclxuICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5hdGl2ZURhdGVBZGFwdGVyLCBNYXREYXRlRm9ybWF0cyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5cclxuLyoqXHJcbiAqIEFkYXB0ZXIgcGVyc29uYWxpenphdG8gcGVyIGlsIHBhcnNpbmcgZGVsbGUgZGF0ZSBpbiBmb3JtYXRvIGl0YWxpYW5vIEREL01NL1lZWVkuXHJcbiAqXHJcbiAqIEVzdGVuZGUgaWwgTmF0aXZlRGF0ZUFkYXB0ZXIgZGkgQW5ndWxhciBNYXRlcmlhbCBwZXIgZ2VzdGlyZTpcclxuICogLSBQYXJzaW5nOiBjb252ZXJ0ZSBzdHJpbmdoZSBERC9NTS9ZWVlZIGluIG9nZ2V0dGkgRGF0ZVxyXG4gKiAtIEZvcm1hdHRhemlvbmU6IHZpc3VhbGl6emEgbGUgZGF0ZSBuZWwgZm9ybWF0byBpdGFsaWFub1xyXG4gKiAtIFByaW1vIGdpb3JubyBkZWxsYSBzZXR0aW1hbmE6IEx1bmVkaSAoMSlcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFVpSXRhbGlhbkRhdGVBZGFwdGVyIGV4dGVuZHMgTmF0aXZlRGF0ZUFkYXB0ZXIge1xyXG4gIC8qKlxyXG4gICAqIElsIHByaW1vIGdpb3JubyBkZWxsYSBzZXR0aW1hbmEgZSBMdW5lZGkgKDEpLlxyXG4gICAqL1xyXG4gIG92ZXJyaWRlIGdldEZpcnN0RGF5T2ZXZWVrKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gMTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhcnNpbmcgZGkgdW5hIHN0cmluZ2EgZGkgZGF0YSBpbiBmb3JtYXRvIEREL01NL1lZWVkuXHJcbiAgICogU3VwcG9ydGEgc2lhIGlsIGZvcm1hdG8gY29uIHNlcGFyYXRvcmUgYC9gIGNoZSBgLWAuXHJcbiAgICovXHJcbiAgb3ZlcnJpZGUgcGFyc2UodmFsdWU6IGFueSk6IERhdGUgfCBudWxsIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gR2VzdGlzY2kgZm9ybWF0byBERC9NTS9ZWVlZIG8gREQtTU0tWVlZWVxyXG4gICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KC9bXFwvXFwtXS8pO1xyXG4gICAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSB7XHJcbiAgICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcclxuICAgICAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCkgLSAxOyAvLyBNZXNpIDAtYmFzZWRcclxuICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQocGFydHNbMl0sIDEwKTtcclxuXHJcbiAgICAgICAgaWYgKCFpc05hTihkYXkpICYmICFpc05hTihtb250aCkgJiYgIWlzTmFOKHllYXIpKSB7XHJcbiAgICAgICAgICAvLyBWYWxpZGF6aW9uZSBiYXNlXHJcbiAgICAgICAgICBpZiAoZGF5ID49IDEgJiYgZGF5IDw9IDMxICYmIG1vbnRoID49IDAgJiYgbW9udGggPD0gMTEgJiYgeWVhciA+PSAxOTAwICYmIHllYXIgPD0gMjEwMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VwZXIucGFyc2UodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9ybWF0dGEgdW5hIGRhdGEgaW4gZm9ybWF0byBERC9NTS9ZWVlZIHBlciBsYSB2aXN1YWxpenphemlvbmUuXHJcbiAgICovXHJcbiAgb3ZlcnJpZGUgZm9ybWF0KGRhdGU6IERhdGUsIGRpc3BsYXlGb3JtYXQ6IG9iamVjdCk6IHN0cmluZyB7XHJcbiAgICBpZiAoKGRpc3BsYXlGb3JtYXQgYXMgYW55KSA9PT0gJ2lucHV0Jykge1xyXG4gICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgIGNvbnN0IG1vbnRoID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgcmV0dXJuIGAke2RheX0vJHttb250aH0vJHt5ZWFyfWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoJ2l0LUlUJywge1xyXG4gICAgICB5ZWFyOiAnbnVtZXJpYycsXHJcbiAgICAgIG1vbnRoOiAnbG9uZycsXHJcbiAgICAgIGRheTogJ251bWVyaWMnLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogRm9ybWF0aSBkYXRhIGl0YWxpYW5pIHBlciBBbmd1bGFyIE1hdGVyaWFsLlxyXG4gKiBDb25maWd1cmEgaWwgZGF0ZXBpY2tlciBwZXIgdXNhcmUgREQvTU0vWVlZWS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBVSV9JVF9EQVRFX0ZPUk1BVFM6IE1hdERhdGVGb3JtYXRzID0ge1xyXG4gIHBhcnNlOiB7XHJcbiAgICBkYXRlSW5wdXQ6ICdpbnB1dCcsXHJcbiAgfSxcclxuICBkaXNwbGF5OiB7XHJcbiAgICBkYXRlSW5wdXQ6ICdpbnB1dCcsXHJcbiAgICBtb250aFllYXJMYWJlbDogeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnc2hvcnQnIH0sXHJcbiAgICBkYXRlQTExeUxhYmVsOiB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycgfSxcclxuICAgIG1vbnRoWWVhckExMXlMYWJlbDogeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycgfSxcclxuICB9LFxyXG59O1xyXG4iXX0=
@@ -0,0 +1,184 @@
1
+ import { Directive, HostListener, Input, forwardRef } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Direttiva per formattazione input valuta.
6
+ *
7
+ * Formatta il valore numerico con separatori italiani (1.234,56)
8
+ * e simbolo valuta opzionale. In fase di focus l'utente modifica
9
+ * il valore raw, al blur viene riformattato.
10
+ *
11
+ * Implementa `ControlValueAccessor` per integrazione con Reactive Forms.
12
+ *
13
+ * @selector [uiCurrencyInput]
14
+ *
15
+ * @example
16
+ * ```html
17
+ * <input uiCurrencyInput currencySymbol="EUR" [decimalPlaces]="2" />
18
+ * ```
19
+ */
20
+ export class UiCurrencyInputDirective {
21
+ constructor(el, renderer) {
22
+ this.el = el;
23
+ this.renderer = renderer;
24
+ /** Simbolo valuta visualizzato. @default 'EUR' */
25
+ this.currencySymbol = 'EUR';
26
+ /** Numero di decimali. @default 2 */
27
+ this.decimalPlaces = 2;
28
+ this.rawValue = null;
29
+ this.onChange = () => { };
30
+ this.onTouched = () => { };
31
+ this.isFocused = false;
32
+ }
33
+ ngOnInit() {
34
+ this.renderer.setStyle(this.el.nativeElement, 'text-align', 'right');
35
+ }
36
+ // ── ControlValueAccessor ──
37
+ writeValue(value) {
38
+ this.rawValue = value != null ? Number(value) : null;
39
+ if (!this.isFocused) {
40
+ this.displayFormatted();
41
+ }
42
+ }
43
+ registerOnChange(fn) {
44
+ this.onChange = fn;
45
+ }
46
+ registerOnTouched(fn) {
47
+ this.onTouched = fn;
48
+ }
49
+ setDisabledState(isDisabled) {
50
+ this.renderer.setProperty(this.el.nativeElement, 'disabled', isDisabled);
51
+ }
52
+ // ── Gestione eventi ──
53
+ onFocus() {
54
+ this.isFocused = true;
55
+ this.renderer.setStyle(this.el.nativeElement, 'text-align', 'left');
56
+ // Mostra valore raw per editing
57
+ if (this.rawValue != null) {
58
+ this.el.nativeElement.value = this.rawValue.toString().replace('.', ',');
59
+ }
60
+ else {
61
+ this.el.nativeElement.value = '';
62
+ }
63
+ }
64
+ onBlur() {
65
+ this.isFocused = false;
66
+ this.onTouched();
67
+ this.parseInput();
68
+ this.displayFormatted();
69
+ this.renderer.setStyle(this.el.nativeElement, 'text-align', 'right');
70
+ }
71
+ onInput(value) {
72
+ // Permetti solo cifre, virgola e punto (come separatore decimale)
73
+ const sanitized = value.replace(/[^0-9,.\-]/g, '');
74
+ if (sanitized !== value) {
75
+ this.el.nativeElement.value = sanitized;
76
+ }
77
+ }
78
+ onKeyDown(event) {
79
+ const allowed = [
80
+ 'Backspace',
81
+ 'Delete',
82
+ 'Tab',
83
+ 'Escape',
84
+ 'Enter',
85
+ 'ArrowLeft',
86
+ 'ArrowRight',
87
+ 'ArrowUp',
88
+ 'ArrowDown',
89
+ 'Home',
90
+ 'End',
91
+ ];
92
+ if (allowed.includes(event.key))
93
+ return;
94
+ // Permetti Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X
95
+ if (event.ctrlKey || event.metaKey)
96
+ return;
97
+ // Permetti cifre
98
+ if (/^\d$/.test(event.key))
99
+ return;
100
+ // Permetti virgola e punto (un solo separatore decimale)
101
+ if ((event.key === ',' || event.key === '.') && !this.el.nativeElement.value.includes(',')) {
102
+ return;
103
+ }
104
+ // Permetti segno meno solo all'inizio
105
+ if (event.key === '-' && this.el.nativeElement.selectionStart === 0) {
106
+ return;
107
+ }
108
+ event.preventDefault();
109
+ }
110
+ // ── Utilita interne ──
111
+ parseInput() {
112
+ const input = this.el.nativeElement.value.trim();
113
+ if (!input) {
114
+ this.rawValue = null;
115
+ this.onChange(null);
116
+ return;
117
+ }
118
+ // Normalizza: rimuovi punti migliaia, sostituisci virgola con punto
119
+ const normalized = input.replace(/\./g, '').replace(',', '.');
120
+ const num = parseFloat(normalized);
121
+ if (isNaN(num)) {
122
+ this.rawValue = null;
123
+ this.onChange(null);
124
+ }
125
+ else {
126
+ this.rawValue = num;
127
+ this.onChange(num);
128
+ }
129
+ }
130
+ /** Mostra il valore formattato con separatori italiani e simbolo. */
131
+ displayFormatted() {
132
+ if (this.rawValue == null) {
133
+ this.el.nativeElement.value = '';
134
+ return;
135
+ }
136
+ const formatted = this.formatItalian(this.rawValue, this.decimalPlaces);
137
+ this.el.nativeElement.value = this.currencySymbol ? `${formatted} ${this.currencySymbol}` : formatted;
138
+ }
139
+ /** Formattazione italiana: 1.234,56 */
140
+ formatItalian(value, decimals) {
141
+ const parts = value.toFixed(decimals).split('.');
142
+ const intPart = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, '.'); // NOSONAR - Used on controlled number strings from toFixed(), low ReDoS risk
143
+ return decimals > 0 ? `${intPart},${parts[1]}` : intPart;
144
+ }
145
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiCurrencyInputDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
146
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: UiCurrencyInputDirective, isStandalone: true, selector: "[uiCurrencyInput]", inputs: { currencySymbol: "currencySymbol", decimalPlaces: "decimalPlaces" }, host: { listeners: { "focus": "onFocus()", "blur": "onBlur()", "input": "onInput($event.target.value)", "keydown": "onKeyDown($event)" } }, providers: [
147
+ {
148
+ provide: NG_VALUE_ACCESSOR,
149
+ useExisting: forwardRef(() => UiCurrencyInputDirective),
150
+ multi: true,
151
+ },
152
+ ], ngImport: i0 }); }
153
+ }
154
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiCurrencyInputDirective, decorators: [{
155
+ type: Directive,
156
+ args: [{
157
+ selector: '[uiCurrencyInput]',
158
+ standalone: true,
159
+ providers: [
160
+ {
161
+ provide: NG_VALUE_ACCESSOR,
162
+ useExisting: forwardRef(() => UiCurrencyInputDirective),
163
+ multi: true,
164
+ },
165
+ ],
166
+ }]
167
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { currencySymbol: [{
168
+ type: Input
169
+ }], decimalPlaces: [{
170
+ type: Input
171
+ }], onFocus: [{
172
+ type: HostListener,
173
+ args: ['focus']
174
+ }], onBlur: [{
175
+ type: HostListener,
176
+ args: ['blur']
177
+ }], onInput: [{
178
+ type: HostListener,
179
+ args: ['input', ['$event.target.value']]
180
+ }], onKeyDown: [{
181
+ type: HostListener,
182
+ args: ['keydown', ['$event']]
183
+ }] } });
184
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3ktaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXIvZGlyZWN0aXZlcy9jdXJyZW5jeS1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFxQixVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUV6RTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFZSCxNQUFNLE9BQU8sd0JBQXdCO0lBWW5DLFlBQ1UsRUFBZ0MsRUFDaEMsUUFBbUI7UUFEbkIsT0FBRSxHQUFGLEVBQUUsQ0FBOEI7UUFDaEMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQWI3QixrREFBa0Q7UUFDekMsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFaEMscUNBQXFDO1FBQzVCLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLGFBQVEsR0FBa0IsSUFBSSxDQUFDO1FBQy9CLGFBQVEsR0FBbUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQ3BELGNBQVMsR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDakMsY0FBUyxHQUFHLEtBQUssQ0FBQztJQUt2QixDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsNkJBQTZCO0lBRTdCLFVBQVUsQ0FBQyxLQUFVO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFD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QWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQzs0QkFDdkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0Y7dUdBR1UsY0FBYztzQkFBdEIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQXVDTixPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTztnQkFhckIsTUFBTTtzQkFETCxZQUFZO3VCQUFDLE1BQU07Z0JBVXBCLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztnQkFVOUMsU0FBUztzQkFEUixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25Jbml0LCBSZW5kZXJlcjIsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuLyoqXHJcbiAqIERpcmV0dGl2YSBwZXIgZm9ybWF0dGF6aW9uZSBpbnB1dCB2YWx1dGEuXHJcbiAqXHJcbiAqIEZvcm1hdHRhIGlsIHZhbG9yZSBudW1lcmljbyBjb24gc2VwYXJhdG9yaSBpdGFsaWFuaSAoMS4yMzQsNTYpXHJcbiAqIGUgc2ltYm9sbyB2YWx1dGEgb3B6aW9uYWxlLiBJbiBmYXNlIGRpIGZvY3VzIGwndXRlbnRlIG1vZGlmaWNhXHJcbiAqIGlsIHZhbG9yZSByYXcsIGFsIGJsdXIgdmllbmUgcmlmb3JtYXR0YXRvLlxyXG4gKlxyXG4gKiBJbXBsZW1lbnRhIGBDb250cm9sVmFsdWVBY2Nlc3NvcmAgcGVyIGludGVncmF6aW9uZSBjb24gUmVhY3RpdmUgRm9ybXMuXHJcbiAqXHJcbiAqIEBzZWxlY3RvciBbdWlDdXJyZW5jeUlucHV0XVxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDxpbnB1dCB1aUN1cnJlbmN5SW5wdXQgY3VycmVuY3lTeW1ib2w9XCJFVVJcIiBbZGVjaW1hbFBsYWNlc109XCIyXCIgLz5cclxuICogYGBgXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1t1aUN1cnJlbmN5SW5wdXRdJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVWlDdXJyZW5jeUlucHV0RGlyZWN0aXZlKSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9LFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVaUN1cnJlbmN5SW5wdXREaXJlY3RpdmUgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcclxuICAvKiogU2ltYm9sbyB2YWx1dGEgdmlzdWFsaXp6YXRvLiBAZGVmYXVsdCAnRVVSJyAqL1xyXG4gIEBJbnB1dCgpIGN1cnJlbmN5U3ltYm9sID0gJ0VVUic7XHJcblxyXG4gIC8qKiBOdW1lcm8gZGkgZGVjaW1hbGkuIEBkZWZhdWx0IDIgKi9cclxuICBASW5wdXQoKSBkZWNpbWFsUGxhY2VzID0gMjtcclxuXHJcbiAgcHJpdmF0ZSByYXdWYWx1ZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBudW1iZXIgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuICBwcml2YXRlIGlzRm9jdXNlZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4sXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndGV4dC1hbGlnbicsICdyaWdodCcpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSAIENvbnRyb2xWYWx1ZUFjY2Vzc29yIOKUgOKUgFxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucmF3VmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gTnVtYmVyKHZhbHVlKSA6IG51bGw7XHJcbiAgICBpZiAoIXRoaXMuaXNGb2N1c2VkKSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheUZvcm1hdHRlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgCBHZXN0aW9uZSBldmVudGkg4pSA4pSAXHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJylcclxuICBvbkZvY3VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0ZvY3VzZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd0ZXh0LWFsaWduJywgJ2xlZnQnKTtcclxuICAgIC8vIE1vc3RyYSB2YWxvcmUgcmF3IHBlciBlZGl0aW5nXHJcbiAgICBpZiAodGhpcy5yYXdWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMucmF3VmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKCcuJywgJywnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpXHJcbiAgb25CbHVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICB0aGlzLnBhcnNlSW5wdXQoKTtcclxuICAgIHRoaXMuZGlzcGxheUZvcm1hdHRlZCgpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd0ZXh0LWFsaWduJywgJ3JpZ2h0Jyk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50LnRhcmdldC52YWx1ZSddKVxyXG4gIG9uSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gUGVybWV0dGkgc29sbyBjaWZyZSwgdmlyZ29sYSBlIHB1bnRvIChjb21lIHNlcGFyYXRvcmUgZGVjaW1hbGUpXHJcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSB2YWx1ZS5yZXBsYWNlKC9bXjAtOSwuXFwtXS9nLCAnJyk7XHJcbiAgICBpZiAoc2FuaXRpemVkICE9PSB2YWx1ZSkge1xyXG4gICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBzYW5pdGl6ZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFsbG93ZWQgPSBbXHJcbiAgICAgICdCYWNrc3BhY2UnLFxyXG4gICAgICAnRGVsZXRlJyxcclxuICAgICAgJ1RhYicsXHJcbiAgICAgICdFc2NhcGUnLFxyXG4gICAgICAnRW50ZXInLFxyXG4gICAgICAnQXJyb3dMZWZ0JyxcclxuICAgICAgJ0Fycm93UmlnaHQnLFxyXG4gICAgICAnQXJyb3dVcCcsXHJcbiAgICAgICdBcnJvd0Rvd24nLFxyXG4gICAgICAnSG9tZScsXHJcbiAgICAgICdFbmQnLFxyXG4gICAgXTtcclxuICAgIGlmIChhbGxvd2VkLmluY2x1ZGVzKGV2ZW50LmtleSkpIHJldHVybjtcclxuXHJcbiAgICAvLyBQZXJtZXR0aSBDdHJsK0EsIEN0cmwrQywgQ3RybCtWLCBDdHJsK1hcclxuICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHJldHVybjtcclxuXHJcbiAgICAvLyBQZXJtZXR0aSBjaWZyZVxyXG4gICAgaWYgKC9eXFxkJC8udGVzdChldmVudC5rZXkpKSByZXR1cm47XHJcblxyXG4gICAgLy8gUGVybWV0dGkgdmlyZ29sYSBlIHB1bnRvICh1biBzb2xvIHNlcGFyYXRvcmUgZGVjaW1hbGUpXHJcbiAgICBpZiAoKGV2ZW50LmtleSA9PT0gJywnIHx8IGV2ZW50LmtleSA9PT0gJy4nKSAmJiAhdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlLmluY2x1ZGVzKCcsJykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFBlcm1ldHRpIHNlZ25vIG1lbm8gc29sbyBhbGwnaW5pemlvXHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnLScgJiYgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0ID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSAIFV0aWxpdGEgaW50ZXJuZSDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBwYXJzZUlucHV0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUudHJpbSgpO1xyXG4gICAgaWYgKCFpbnB1dCkge1xyXG4gICAgICB0aGlzLnJhd1ZhbHVlID0gbnVsbDtcclxuICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE5vcm1hbGl6emE6IHJpbXVvdmkgcHVudGkgbWlnbGlhaWEsIHNvc3RpdHVpc2NpIHZpcmdvbGEgY29uIHB1bnRvXHJcbiAgICBjb25zdCBub3JtYWxpemVkID0gaW5wdXQucmVwbGFjZSgvXFwuL2csICcnKS5yZXBsYWNlKCcsJywgJy4nKTtcclxuICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQobm9ybWFsaXplZCk7XHJcblxyXG4gICAgaWYgKGlzTmFOKG51bSkpIHtcclxuICAgICAgdGhpcy5yYXdWYWx1ZSA9IG51bGw7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UobnVsbCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJhd1ZhbHVlID0gbnVtO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKG51bSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTW9zdHJhIGlsIHZhbG9yZSBmb3JtYXR0YXRvIGNvbiBzZXBhcmF0b3JpIGl0YWxpYW5pIGUgc2ltYm9sby4gKi9cclxuICBwcml2YXRlIGRpc3BsYXlGb3JtYXR0ZWQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5yYXdWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZm9ybWF0dGVkID0gdGhpcy5mb3JtYXRJdGFsaWFuKHRoaXMucmF3VmFsdWUsIHRoaXMuZGVjaW1hbFBsYWNlcyk7XHJcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLmN1cnJlbmN5U3ltYm9sID8gYCR7Zm9ybWF0dGVkfSAke3RoaXMuY3VycmVuY3lTeW1ib2x9YCA6IGZvcm1hdHRlZDtcclxuICB9XHJcblxyXG4gIC8qKiBGb3JtYXR0YXppb25lIGl0YWxpYW5hOiAxLjIzNCw1NiAqL1xyXG4gIHByaXZhdGUgZm9ybWF0SXRhbGlhbih2YWx1ZTogbnVtYmVyLCBkZWNpbWFsczogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHBhcnRzID0gdmFsdWUudG9GaXhlZChkZWNpbWFscykuc3BsaXQoJy4nKTtcclxuICAgIGNvbnN0IGludFBhcnQgPSBwYXJ0c1swXS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLicpOyAvLyBOT1NPTkFSIC0gVXNlZCBvbiBjb250cm9sbGVkIG51bWJlciBzdHJpbmdzIGZyb20gdG9GaXhlZCgpLCBsb3cgUmVEb1Mgcmlza1xyXG4gICAgcmV0dXJuIGRlY2ltYWxzID4gMCA/IGAke2ludFBhcnR9LCR7cGFydHNbMV19YCA6IGludFBhcnQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==