@ldquocc/dynamic-form 0.0.9 → 0.0.11

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 (298) hide show
  1. package/fesm2022/ldquocc-dynamic-form.mjs +4928 -0
  2. package/fesm2022/ldquocc-dynamic-form.mjs.map +1 -0
  3. package/index.d.ts +5 -0
  4. package/lib/dynamic-form.component.d.ts +67 -0
  5. package/lib/shared/base/base-select.component.d.ts +19 -0
  6. package/lib/shared/base/base-value-accessor.d.ts +69 -0
  7. package/{src/lib/shared/components/component.ts → lib/shared/components/component.d.ts} +14 -34
  8. package/lib/shared/components/dynamic-field/dynamic-field.component.d.ts +23 -0
  9. package/lib/shared/components/field-user-config/field-user-config.component.d.ts +10 -0
  10. package/lib/shared/components/fields/components/suffix/suffix.component.d.ts +12 -0
  11. package/lib/shared/components/fields/date/date-picker/date-picker.component.d.ts +17 -0
  12. package/lib/shared/components/fields/date/date-range/date-range.component.d.ts +17 -0
  13. package/lib/shared/components/fields/input/input-formatted/input-formatted.component.d.ts +20 -0
  14. package/lib/shared/components/fields/input/input-password/input-password.component.d.ts +12 -0
  15. package/lib/shared/components/fields/input/input-text/input-text.component.d.ts +14 -0
  16. package/lib/shared/components/fields/select/multi-select/multi-select.component.d.ts +21 -0
  17. package/lib/shared/components/fields/select/single-select/single-select.component.d.ts +22 -0
  18. package/lib/shared/components/fields/select/tree-select/tree-select.component.d.ts +28 -0
  19. package/lib/shared/components/fields/textarea/textarea.component.d.ts +14 -0
  20. package/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.d.ts +25 -0
  21. package/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.d.ts +76 -0
  22. package/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.d.ts +27 -0
  23. package/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.d.ts +29 -0
  24. package/lib/shared/config/dynamic-form.config.d.ts +9 -0
  25. package/lib/shared/consts/common/common.const.d.ts +5 -0
  26. package/lib/shared/consts/common/field-dependency.const.d.ts +1 -0
  27. package/lib/shared/consts/common/file.const.d.ts +148 -0
  28. package/{src/lib/shared/consts/common/index.ts → lib/shared/consts/common/index.d.ts} +4 -4
  29. package/lib/shared/consts/common/standalone-import.const.d.ts +7 -0
  30. package/lib/shared/consts/controls/control.const.d.ts +1 -0
  31. package/{src/lib/shared/consts/controls/index.ts → lib/shared/consts/controls/index.d.ts} +1 -1
  32. package/lib/shared/consts/fields/date-field.const.d.ts +7 -0
  33. package/lib/shared/consts/fields/field.const.d.ts +4 -0
  34. package/{src/lib/shared/consts/fields/index.ts → lib/shared/consts/fields/index.d.ts} +5 -5
  35. package/lib/shared/consts/fields/input-field.const.d.ts +4 -0
  36. package/lib/shared/consts/fields/input-formatted-field.const.d.ts +4 -0
  37. package/lib/shared/consts/fields/radio-field.const.d.ts +10 -0
  38. package/lib/shared/consts/fields/select-field.const.d.ts +6 -0
  39. package/lib/shared/consts/fields/upload-field.const.d.ts +1 -0
  40. package/lib/shared/consts/validators/pattern.const.d.ts +2 -0
  41. package/lib/shared/enums/common/field-dependency.enum.d.ts +9 -0
  42. package/lib/shared/enums/common/file-size-type.enum.d.ts +6 -0
  43. package/{src/lib/shared/enums/common/index.ts → lib/shared/enums/common/index.d.ts} +4 -4
  44. package/lib/shared/enums/common/output-value-type.enum.d.ts +19 -0
  45. package/lib/shared/enums/common/view-mode.enum.d.ts +4 -0
  46. package/lib/shared/enums/controls/control.enum.d.ts +11 -0
  47. package/{src/lib/shared/enums/controls/index.ts → lib/shared/enums/controls/index.d.ts} +1 -1
  48. package/lib/shared/enums/fields/date-field.enum.d.ts +4 -0
  49. package/lib/shared/enums/fields/field.enum.d.ts +20 -0
  50. package/{src/lib/shared/enums/fields/index.ts → lib/shared/enums/fields/index.d.ts} +6 -6
  51. package/lib/shared/enums/fields/input-field.enum.d.ts +6 -0
  52. package/lib/shared/enums/fields/input-formatted-field.enum.d.ts +6 -0
  53. package/lib/shared/enums/fields/select-field.enum.d.ts +4 -0
  54. package/lib/shared/enums/fields/upload-field.enum.d.ts +5 -0
  55. package/lib/shared/enums/form/dynamic-form.enum.d.ts +6 -0
  56. package/{src/lib/shared/enums/form/index.ts → lib/shared/enums/form/index.d.ts} +1 -1
  57. package/{src/lib/shared/enums/validators/index.ts → lib/shared/enums/validators/index.d.ts} +2 -2
  58. package/lib/shared/enums/validators/regex.enum.d.ts +38 -0
  59. package/lib/shared/enums/validators/validators.enum.d.ts +14 -0
  60. package/lib/shared/factories/auto-numeric-options.factory.d.ts +5 -0
  61. package/lib/shared/models/common/api-config.model.d.ts +4 -0
  62. package/lib/shared/models/common/api-response.model.d.ts +19 -0
  63. package/lib/shared/models/common/common.model.d.ts +29 -0
  64. package/lib/shared/models/common/field-dependency.model.d.ts +16 -0
  65. package/lib/shared/models/common/file-config.model.d.ts +11 -0
  66. package/{src/lib/shared/models/common/index.ts → lib/shared/models/common/index.d.ts} +7 -7
  67. package/lib/shared/models/common/obj-field.model.d.ts +59 -0
  68. package/lib/shared/models/common/object-storage.model.d.ts +15 -0
  69. package/{src/lib/shared/models/common/output-value-type.model.ts → lib/shared/models/common/output-value-type.model.d.ts} +4 -4
  70. package/lib/shared/models/common/table-models.d.ts +15 -0
  71. package/{src/lib/shared/models/common/view-mode.model.ts → lib/shared/models/common/view-mode.model.d.ts} +1 -1
  72. package/{src/lib/shared/models/controls/control.model.ts → lib/shared/models/controls/control.model.d.ts} +2 -3
  73. package/{src/lib/shared/models/controls/index.ts → lib/shared/models/controls/index.d.ts} +1 -1
  74. package/lib/shared/models/fields/date/base-date-field.model.d.ts +19 -0
  75. package/lib/shared/models/fields/date/date-picker-field.model.d.ts +12 -0
  76. package/lib/shared/models/fields/date/date-range-field.model.d.ts +12 -0
  77. package/{src/lib/shared/models/fields/date/index.ts → lib/shared/models/fields/date/index.d.ts} +3 -3
  78. package/lib/shared/models/fields/field-grid.model.d.ts +9 -0
  79. package/lib/shared/models/fields/field-group.model.d.ts +21 -0
  80. package/lib/shared/models/fields/field-user-config.model.d.ts +3 -0
  81. package/lib/shared/models/fields/field.model.d.ts +57 -0
  82. package/{src/lib/shared/models/fields/index.ts → lib/shared/models/fields/index.d.ts} +2 -2
  83. package/{src/lib/shared/models/fields/input/index.ts → lib/shared/models/fields/input/index.d.ts} +4 -4
  84. package/lib/shared/models/fields/input/input-field.model.d.ts +31 -0
  85. package/lib/shared/models/fields/input/input-formatted-field.model.d.ts +13 -0
  86. package/lib/shared/models/fields/input/input-password-field.model.d.ts +11 -0
  87. package/lib/shared/models/fields/input/input-text-field.model.d.ts +9 -0
  88. package/lib/shared/models/fields/radio/radio-base-field.model.d.ts +26 -0
  89. package/lib/shared/models/fields/select/multi-select-field.model.d.ts +11 -0
  90. package/lib/shared/models/fields/select/select-base-field.model.d.ts +40 -0
  91. package/lib/shared/models/fields/select/single-select-field.model.d.ts +9 -0
  92. package/lib/shared/models/fields/select/tree-select-field.model.d.ts +10 -0
  93. package/lib/shared/models/fields/textarea/textarea-field.model.d.ts +20 -0
  94. package/lib/shared/models/fields/upload/avatar-upload-field.model.d.ts +9 -0
  95. package/lib/shared/models/fields/upload/base-upload-field.model.d.ts +25 -0
  96. package/{src/lib/shared/models/fields/upload/index.ts → lib/shared/models/fields/upload/index.d.ts} +5 -5
  97. package/lib/shared/models/fields/upload/multi-file-upload-field.model.d.ts +10 -0
  98. package/lib/shared/models/fields/upload/multi-image-upload-field.model.d.ts +12 -0
  99. package/lib/shared/models/fields/upload/single-file-upload-field.model.d.ts +11 -0
  100. package/{src/lib/shared/models/form/dynamic-form.model.ts → lib/shared/models/form/dynamic-form.model.d.ts} +1 -1
  101. package/{src/lib/shared/models/form/index.ts → lib/shared/models/form/index.d.ts} +1 -1
  102. package/lib/shared/services/dynamic-form.service.d.ts +48 -0
  103. package/lib/shared/services/field.service.d.ts +41 -0
  104. package/lib/shared/services/file.service.d.ts +20 -0
  105. package/lib/shared/services/form-config.service.d.ts +10 -0
  106. package/lib/shared/services/form-data.service.d.ts +53 -0
  107. package/lib/shared/services/form-utils.d.ts +5 -0
  108. package/lib/shared/services/suffix.service.d.ts +12 -0
  109. package/lib/shared/services/validation.service.d.ts +10 -0
  110. package/lib/shared/utils/common/common.utils.d.ts +7 -0
  111. package/{src/lib/shared/utils/common/index.ts → lib/shared/utils/common/index.d.ts} +1 -1
  112. package/lib/shared/utils/date/date.utils.d.ts +6 -0
  113. package/{src/lib/shared/utils/date/index.ts → lib/shared/utils/date/index.d.ts} +1 -1
  114. package/lib/shared/utils/dynamic-form/dynamic-form.d.ts +11 -0
  115. package/lib/shared/utils/fields/fields.d.ts +20 -0
  116. package/{src/lib/shared/utils/fields/index.ts → lib/shared/utils/fields/index.d.ts} +1 -1
  117. package/lib/shared/utils/file/file.utils.d.ts +4 -0
  118. package/{src/lib/shared/utils/file/index.ts → lib/shared/utils/file/index.d.ts} +1 -1
  119. package/lib/shared/utils/validators/custom-validators.d.ts +11 -0
  120. package/lib/shared/utils/validators/default-error-message.d.ts +6 -0
  121. package/{src/lib/shared/utils/validators/index.ts → lib/shared/utils/validators/index.d.ts} +3 -3
  122. package/lib/shared/utils/validators/pattern.d.ts +4 -0
  123. package/package.json +31 -20
  124. package/{src/public-api.ts → public-api.d.ts} +29 -68
  125. package/ng-package.json +0 -15
  126. package/src/lib/dynamic-form.component.html +0 -121
  127. package/src/lib/dynamic-form.component.scss +0 -7
  128. package/src/lib/dynamic-form.component.spec.ts +0 -21
  129. package/src/lib/dynamic-form.component.ts +0 -237
  130. package/src/lib/dynamic-form.service.spec.ts +0 -16
  131. package/src/lib/dynamic-form.service.ts +0 -9
  132. package/src/lib/shared/base/base-select.component.ts +0 -183
  133. package/src/lib/shared/base/base-value-accessor.ts +0 -192
  134. package/src/lib/shared/components/d-form-testing/d-form-testing.component.html +0 -197
  135. package/src/lib/shared/components/d-form-testing/d-form-testing.component.less +0 -12
  136. package/src/lib/shared/components/d-form-testing/d-form-testing.component.spec.ts +0 -22
  137. package/src/lib/shared/components/d-form-testing/d-form-testing.component.ts +0 -197
  138. package/src/lib/shared/components/dynamic-field/dynamic-field.component.html +0 -218
  139. package/src/lib/shared/components/dynamic-field/dynamic-field.component.scss +0 -28
  140. package/src/lib/shared/components/dynamic-field/dynamic-field.component.spec.ts +0 -21
  141. package/src/lib/shared/components/dynamic-field/dynamic-field.component.ts +0 -67
  142. package/src/lib/shared/components/field-user-config/field-user-config.component.html +0 -38
  143. package/src/lib/shared/components/field-user-config/field-user-config.component.scss +0 -29
  144. package/src/lib/shared/components/field-user-config/field-user-config.component.ts +0 -33
  145. package/src/lib/shared/components/fields/components/suffix/suffix.component.html +0 -42
  146. package/src/lib/shared/components/fields/components/suffix/suffix.component.scss +0 -3
  147. package/src/lib/shared/components/fields/components/suffix/suffix.component.spec.ts +0 -22
  148. package/src/lib/shared/components/fields/components/suffix/suffix.component.ts +0 -32
  149. package/src/lib/shared/components/fields/date/date-picker/date-picker.component.html +0 -20
  150. package/src/lib/shared/components/fields/date/date-picker/date-picker.component.scss +0 -5
  151. package/src/lib/shared/components/fields/date/date-picker/date-picker.component.spec.ts +0 -21
  152. package/src/lib/shared/components/fields/date/date-picker/date-picker.component.ts +0 -148
  153. package/src/lib/shared/components/fields/date/date-range/date-range.component.html +0 -33
  154. package/src/lib/shared/components/fields/date/date-range/date-range.component.scss +0 -22
  155. package/src/lib/shared/components/fields/date/date-range/date-range.component.spec.ts +0 -21
  156. package/src/lib/shared/components/fields/date/date-range/date-range.component.ts +0 -133
  157. package/src/lib/shared/components/fields/input/input-formatted/input-formatted.component.html +0 -31
  158. package/src/lib/shared/components/fields/input/input-formatted/input-formatted.component.scss +0 -3
  159. package/src/lib/shared/components/fields/input/input-formatted/input-formatted.component.spec.ts +0 -21
  160. package/src/lib/shared/components/fields/input/input-formatted/input-formatted.component.ts +0 -148
  161. package/src/lib/shared/components/fields/input/input-password/input-password.component.html +0 -18
  162. package/src/lib/shared/components/fields/input/input-password/input-password.component.scss +0 -0
  163. package/src/lib/shared/components/fields/input/input-password/input-password.component.spec.ts +0 -21
  164. package/src/lib/shared/components/fields/input/input-password/input-password.component.ts +0 -56
  165. package/src/lib/shared/components/fields/input/input-text/input-text.component.html +0 -73
  166. package/src/lib/shared/components/fields/input/input-text/input-text.component.scss +0 -0
  167. package/src/lib/shared/components/fields/input/input-text/input-text.component.spec.ts +0 -21
  168. package/src/lib/shared/components/fields/input/input-text/input-text.component.ts +0 -98
  169. package/src/lib/shared/components/fields/select/multi-select/multi-select.component.html +0 -73
  170. package/src/lib/shared/components/fields/select/multi-select/multi-select.component.scss +0 -21
  171. package/src/lib/shared/components/fields/select/multi-select/multi-select.component.spec.ts +0 -21
  172. package/src/lib/shared/components/fields/select/multi-select/multi-select.component.ts +0 -212
  173. package/src/lib/shared/components/fields/select/single-select/single-select.component.html +0 -55
  174. package/src/lib/shared/components/fields/select/single-select/single-select.component.scss +0 -1
  175. package/src/lib/shared/components/fields/select/single-select/single-select.component.spec.ts +0 -21
  176. package/src/lib/shared/components/fields/select/single-select/single-select.component.ts +0 -217
  177. package/src/lib/shared/components/fields/select/single-select/sl.component.old.txt +0 -337
  178. package/src/lib/shared/components/fields/select/single-select/sl.component.old2.txt +0 -340
  179. package/src/lib/shared/components/fields/select/tree-select/tree-select.component.html +0 -38
  180. package/src/lib/shared/components/fields/select/tree-select/tree-select.component.scss +0 -1
  181. package/src/lib/shared/components/fields/select/tree-select/tree-select.component.spec.ts +0 -21
  182. package/src/lib/shared/components/fields/select/tree-select/tree-select.component.ts +0 -401
  183. package/src/lib/shared/components/fields/textarea/textarea.component.html +0 -29
  184. package/src/lib/shared/components/fields/textarea/textarea.component.scss +0 -17
  185. package/src/lib/shared/components/fields/textarea/textarea.component.spec.ts +0 -21
  186. package/src/lib/shared/components/fields/textarea/textarea.component.ts +0 -76
  187. package/src/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.html +0 -30
  188. package/src/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.scss +0 -22
  189. package/src/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.spec.ts +0 -22
  190. package/src/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.ts +0 -217
  191. package/src/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.html +0 -101
  192. package/src/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.scss +0 -117
  193. package/src/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.spec.ts +0 -22
  194. package/src/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.ts +0 -480
  195. package/src/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.html +0 -82
  196. package/src/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.less +0 -80
  197. package/src/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.spec.ts +0 -22
  198. package/src/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.ts +0 -288
  199. package/src/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.html +0 -104
  200. package/src/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.scss +0 -37
  201. package/src/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.spec.ts +0 -21
  202. package/src/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.ts +0 -317
  203. package/src/lib/shared/config/dynamic-form.config.ts +0 -11
  204. package/src/lib/shared/consts/common/common.const.ts +0 -5
  205. package/src/lib/shared/consts/common/field-dependency.const.ts +0 -1
  206. package/src/lib/shared/consts/common/file.const.ts +0 -130
  207. package/src/lib/shared/consts/common/sample-test.const.ts +0 -1648
  208. package/src/lib/shared/consts/common/standalone-import.const.ts +0 -51
  209. package/src/lib/shared/consts/controls/control.const.ts +0 -11
  210. package/src/lib/shared/consts/fields/date-field.const.ts +0 -12
  211. package/src/lib/shared/consts/fields/field.const.ts +0 -23
  212. package/src/lib/shared/consts/fields/input-field.const.ts +0 -4
  213. package/src/lib/shared/consts/fields/input-formatted-field.const.ts +0 -35
  214. package/src/lib/shared/consts/fields/radio-field.const.ts +0 -31
  215. package/src/lib/shared/consts/fields/select-field.const.ts +0 -7
  216. package/src/lib/shared/consts/fields/upload-field.const.ts +0 -1
  217. package/src/lib/shared/consts/validators/index.ts +0 -0
  218. package/src/lib/shared/consts/validators/pattern.const.ts +0 -117
  219. package/src/lib/shared/enums/common/component-ui.enum.ts +0 -8
  220. package/src/lib/shared/enums/common/field-dependency.enum.ts +0 -10
  221. package/src/lib/shared/enums/common/file-size-type.enum.ts +0 -6
  222. package/src/lib/shared/enums/common/output-value-type.enum.ts +0 -22
  223. package/src/lib/shared/enums/common/view-mode.enum.ts +0 -4
  224. package/src/lib/shared/enums/controls/control.enum.ts +0 -12
  225. package/src/lib/shared/enums/fields/date-field.enum.ts +0 -4
  226. package/src/lib/shared/enums/fields/field.enum.ts +0 -21
  227. package/src/lib/shared/enums/fields/input-field.enum.ts +0 -6
  228. package/src/lib/shared/enums/fields/input-formatted-field.enum.ts +0 -6
  229. package/src/lib/shared/enums/fields/select-field.enum.ts +0 -4
  230. package/src/lib/shared/enums/fields/upload-field.enum.ts +0 -5
  231. package/src/lib/shared/enums/form/dynamic-form.enum.ts +0 -6
  232. package/src/lib/shared/enums/validators/regex.enum.ts +0 -47
  233. package/src/lib/shared/enums/validators/validators.enum.ts +0 -17
  234. package/src/lib/shared/factories/auto-numeric-options.factory.ts +0 -14
  235. package/src/lib/shared/models/common/api-config.model.ts +0 -7
  236. package/src/lib/shared/models/common/api-response.model.ts +0 -20
  237. package/src/lib/shared/models/common/common.model.ts +0 -39
  238. package/src/lib/shared/models/common/field-dependency.model.ts +0 -27
  239. package/src/lib/shared/models/common/file-config.model.ts +0 -22
  240. package/src/lib/shared/models/common/obj-field.model.ts +0 -68
  241. package/src/lib/shared/models/common/object-storage.model.ts +0 -15
  242. package/src/lib/shared/models/common/table-models.ts +0 -16
  243. package/src/lib/shared/models/fields/date/base-date-field.model.ts +0 -52
  244. package/src/lib/shared/models/fields/date/date-picker-field.model.ts +0 -43
  245. package/src/lib/shared/models/fields/date/date-range-field.model.ts +0 -52
  246. package/src/lib/shared/models/fields/field-grid.model.ts +0 -10
  247. package/src/lib/shared/models/fields/field-group.model.ts +0 -50
  248. package/src/lib/shared/models/fields/field-user-config.model.ts +0 -8
  249. package/src/lib/shared/models/fields/field.model.ts +0 -184
  250. package/src/lib/shared/models/fields/input/input-field.model.ts +0 -111
  251. package/src/lib/shared/models/fields/input/input-formatted-field.model.ts +0 -38
  252. package/src/lib/shared/models/fields/input/input-password-field.model.ts +0 -38
  253. package/src/lib/shared/models/fields/input/input-text-field.model.ts +0 -26
  254. package/src/lib/shared/models/fields/radio/index.ts +0 -0
  255. package/src/lib/shared/models/fields/radio/radio-base-field.model.ts +0 -84
  256. package/src/lib/shared/models/fields/select/index.ts +0 -0
  257. package/src/lib/shared/models/fields/select/multi-select-field.model.ts +0 -46
  258. package/src/lib/shared/models/fields/select/select-base-field.model.ts +0 -125
  259. package/src/lib/shared/models/fields/select/single-select-field.model.ts +0 -43
  260. package/src/lib/shared/models/fields/select/tree-select-field.model.ts +0 -44
  261. package/src/lib/shared/models/fields/textarea/index.ts +0 -0
  262. package/src/lib/shared/models/fields/textarea/textarea-field.model.ts +0 -97
  263. package/src/lib/shared/models/fields/upload/avatar-upload-field.model.ts +0 -33
  264. package/src/lib/shared/models/fields/upload/base-upload-field.model.ts +0 -105
  265. package/src/lib/shared/models/fields/upload/multi-file-upload-field.model.ts +0 -34
  266. package/src/lib/shared/models/fields/upload/multi-image-upload-field.model.ts +0 -42
  267. package/src/lib/shared/models/fields/upload/single-file-upload-field.model.ts +0 -33
  268. package/src/lib/shared/models/validations/index.ts +0 -1
  269. package/src/lib/shared/models/validations/validations.model.ts +0 -14
  270. package/src/lib/shared/services/dynamic-form.service.spec.ts +0 -16
  271. package/src/lib/shared/services/dynamic-form.service.ts +0 -251
  272. package/src/lib/shared/services/field.service.spec.ts +0 -16
  273. package/src/lib/shared/services/field.service.ts +0 -152
  274. package/src/lib/shared/services/file.service.spec.ts +0 -16
  275. package/src/lib/shared/services/file.service.ts +0 -53
  276. package/src/lib/shared/services/form-config.service.ts +0 -53
  277. package/src/lib/shared/services/form-data.service.spec.ts +0 -16
  278. package/src/lib/shared/services/form-data.service.ts +0 -114
  279. package/src/lib/shared/services/form-utils.ts +0 -52
  280. package/src/lib/shared/services/suffix.service.spec.ts +0 -16
  281. package/src/lib/shared/services/suffix.service.ts +0 -16
  282. package/src/lib/shared/services/validation.service.spec.ts +0 -16
  283. package/src/lib/shared/services/validation.service.ts +0 -38
  284. package/src/lib/shared/utils/common/common.utils.ts +0 -52
  285. package/src/lib/shared/utils/date/date.utils.ts +0 -129
  286. package/src/lib/shared/utils/dynamic-field/dynamic-field.ts +0 -0
  287. package/src/lib/shared/utils/dynamic-field/index.ts +0 -0
  288. package/src/lib/shared/utils/dynamic-form/dynamic-form.ts +0 -114
  289. package/src/lib/shared/utils/dynamic-form/index.ts +0 -0
  290. package/src/lib/shared/utils/fields/fields.ts +0 -78
  291. package/src/lib/shared/utils/file/file.utils.ts +0 -37
  292. package/src/lib/shared/utils/validators/custom-validators.ts +0 -158
  293. package/src/lib/shared/utils/validators/default-error-message.ts +0 -42
  294. package/src/lib/shared/utils/validators/pattern.ts +0 -26
  295. package/tsconfig.lib.json +0 -15
  296. package/tsconfig.lib.prod.json +0 -11
  297. package/tsconfig.spec.json +0 -15
  298. /package/{src/lib/shared/styles → styles}/_common-form.scss +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ldquocc-dynamic-form.mjs","sources":["../../../projects/dynamic-form/src/lib/shared/consts/common/standalone-import.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/common/common.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/common/file.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/common/field-dependency.const.ts","../../../projects/dynamic-form/src/lib/shared/utils/file/file.utils.ts","../../../projects/dynamic-form/src/lib/shared/enums/common/file-size-type.enum.ts","../../../projects/dynamic-form/src/lib/shared/utils/common/common.utils.ts","../../../projects/dynamic-form/src/lib/shared/utils/validators/custom-validators.ts","../../../projects/dynamic-form/src/lib/shared/enums/validators/validators.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/validators/regex.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/form/dynamic-form.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/common/output-value-type.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/common/field-dependency.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/common/view-mode.enum.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/field-group.model.ts","../../../projects/dynamic-form/src/lib/shared/consts/validators/pattern.const.ts","../../../projects/dynamic-form/src/lib/shared/utils/validators/pattern.ts","../../../projects/dynamic-form/src/lib/shared/utils/validators/default-error-message.ts","../../../projects/dynamic-form/src/lib/shared/enums/controls/control.enum.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/input/input-field.model.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/field.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/input-field.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/input-formatted-field.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/date-field.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/select-field.enum.ts","../../../projects/dynamic-form/src/lib/shared/enums/fields/upload-field.enum.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/input/input-text-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/input/input-password-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/input/input-formatted-field.model.ts","../../../projects/dynamic-form/src/lib/shared/utils/dynamic-form/dynamic-form.ts","../../../projects/dynamic-form/src/lib/shared/utils/fields/fields.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/textarea/textarea-field.model.ts","../../../projects/dynamic-form/src/lib/shared/consts/fields/select-field.const.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/select/select-base-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/select/single-select-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/select/multi-select-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/date/base-date-field.model.ts","../../../projects/dynamic-form/src/lib/shared/consts/fields/field.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/fields/input-field.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/fields/date-field.const.ts","../../../projects/dynamic-form/src/lib/shared/consts/fields/input-formatted-field.const.ts","../../../projects/dynamic-form/src/lib/shared/utils/date/date.utils.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/date/date-picker-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/date/date-range-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/base-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/single-file-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/multi-file-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/multi-image-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/config/dynamic-form.config.ts","../../../projects/dynamic-form/src/lib/shared/services/form-utils.ts","../../../projects/dynamic-form/src/lib/shared/services/form-config.service.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/upload/avatar-upload-field.model.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/select/tree-select-field.model.ts","../../../projects/dynamic-form/src/lib/shared/services/dynamic-form.service.ts","../../../projects/dynamic-form/src/lib/shared/services/field.service.ts","../../../projects/dynamic-form/src/lib/shared/services/form-data.service.ts","../../../projects/dynamic-form/src/lib/shared/base/base-value-accessor.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/date/date-picker/date-picker.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/date/date-picker/date-picker.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/date/date-range/date-range.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/date/date-range/date-range.component.html","../../../projects/dynamic-form/src/lib/shared/services/suffix.service.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/components/suffix/suffix.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/components/suffix/suffix.component.html","../../../projects/dynamic-form/src/lib/shared/factories/auto-numeric-options.factory.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/input/input-formatted/input-formatted.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/input/input-formatted/input-formatted.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/input/input-password/input-password.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/input/input-password/input-password.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/input/input-text/input-text.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/input/input-text/input-text.component.html","../../../projects/dynamic-form/src/lib/shared/base/base-select.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/select/multi-select/multi-select.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/select/multi-select/multi-select.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/select/single-select/single-select.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/select/single-select/single-select.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/select/tree-select/tree-select.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/select/tree-select/tree-select.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/textarea/textarea.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/textarea/textarea.component.html","../../../projects/dynamic-form/src/lib/shared/services/file.service.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.html","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.ts","../../../projects/dynamic-form/src/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.html","../../../projects/dynamic-form/src/lib/shared/components/component.ts","../../../projects/dynamic-form/src/lib/shared/services/validation.service.ts","../../../projects/dynamic-form/src/lib/shared/components/field-user-config/field-user-config.component.ts","../../../projects/dynamic-form/src/lib/shared/components/field-user-config/field-user-config.component.html","../../../projects/dynamic-form/src/lib/shared/components/dynamic-field/dynamic-field.component.ts","../../../projects/dynamic-form/src/lib/shared/components/dynamic-field/dynamic-field.component.html","../../../projects/dynamic-form/src/lib/dynamic-form.component.ts","../../../projects/dynamic-form/src/lib/dynamic-form.component.html","../../../projects/dynamic-form/src/lib/shared/models/common/table-models.ts","../../../projects/dynamic-form/src/lib/shared/models/fields/radio/radio-base-field.model.ts","../../../projects/dynamic-form/src/public-api.ts","../../../projects/dynamic-form/src/ldquocc-dynamic-form.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { RouterModule } from '@angular/router';\r\n\r\n// NG-ZORRO\r\nimport { NzAlertModule } from 'ng-zorro-antd/alert';\r\nimport { NzAvatarModule } from 'ng-zorro-antd/avatar';\r\nimport { NzBadgeModule } from 'ng-zorro-antd/badge';\r\nimport { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\r\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\r\nimport { NzDividerModule } from 'ng-zorro-antd/divider';\r\nimport { NzDrawerModule } from 'ng-zorro-antd/drawer';\r\nimport { NzDropDownModule } from 'ng-zorro-antd/dropdown';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzInputNumberModule } from 'ng-zorro-antd/input-number';\r\nimport { NzListModule } from 'ng-zorro-antd/list';\r\nimport { NzModalModule } from 'ng-zorro-antd/modal';\r\nimport { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';\r\nimport { NzPopoverModule } from 'ng-zorro-antd/popover';\r\nimport { NzProgressModule } from 'ng-zorro-antd/progress';\r\nimport { NzRadioModule } from 'ng-zorro-antd/radio';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\nimport { NzSwitchModule } from 'ng-zorro-antd/switch';\r\nimport { NzTableModule } from 'ng-zorro-antd/table';\r\nimport { NzTabsModule } from 'ng-zorro-antd/tabs';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\nimport { NzTimePickerModule } from 'ng-zorro-antd/time-picker';\r\nimport { NzToolTipModule } from 'ng-zorro-antd/tooltip';\r\nimport { NzCollapseModule } from 'ng-zorro-antd/collapse';\r\nimport { NzUploadModule } from 'ng-zorro-antd/upload';\r\nimport { NzImageModule } from 'ng-zorro-antd/image';\r\nimport { NzCascaderModule } from 'ng-zorro-antd/cascader';\r\n\r\n// Core Angular modules (cần thiết ở hầu hết các component).\r\nexport const CORE_MODULES = [CommonModule];\r\n\r\n// Form handling (thường dùng với Reactive)\r\nexport const FORM_MODULES = [FormsModule, ReactiveFormsModule];\r\n\r\n// Routing (thường dùng khi component dùng `<router-outlet>` hoặc cần navigate)\r\nexport const ROUTING_MODULES = [RouterModule];\r\n\r\n// 🧩 All common shared modules (nếu bạn muốn gộp nhanh)\r\nexport const SHARED_MODULES = [...CORE_MODULES, ...FORM_MODULES, ...ROUTING_MODULES];\r\n","export const NO_INFO_TEXT = \"Không có thông tin\";\r\nexport const UPLOAD_FILE_TEXT = \"Tải lên tập tin\";\r\nexport const NO_FILE_NAME = \"Chưa có thông tin tên tập tin\";\r\nexport const UPLOAD_FILE_ERROR = \"Lỗi trong quá trình tải tập tin đến máy chủ!\";\r\nexport const DELETE_FILE_ERROR = \"Lỗi trong quá trình xóa tập tin đến máy chủ!\";\r\n","export const IMAGE_TYPES = {\r\n apng: 'image/apng',\r\n avif: 'image/avif',\r\n bmp: 'image/bmp',\r\n gif: 'image/gif',\r\n jpeg: 'image/jpeg',\r\n jpg: 'image/jpeg',\r\n png: 'image/png',\r\n svg: 'image/svg+xml',\r\n tif: 'image/tiff',\r\n tiff: 'image/tiff',\r\n webp: 'image/webp',\r\n};\r\n\r\nexport const AUDIO_TYPES = {\r\n aac: 'audio/aac',\r\n mp3: 'audio/mpeg',\r\n oga: 'audio/ogg',\r\n opus: 'audio/ogg',\r\n wav: 'audio/wav',\r\n weba: 'audio/webm',\r\n};\r\n\r\nexport const VIDEO_TYPES = {\r\n avi: 'video/avi',\r\n mp4: 'video/mp4',\r\n mpeg: 'video/mpeg',\r\n ogv: 'video/ogg',\r\n ts: 'video/mp2t',\r\n webm: 'video/webm',\r\n};\r\n\r\nexport const videoTypesPath = ['mp4', 'avi'];\r\n\r\nexport const TEXT_TYPES = {\r\n css: 'text/css',\r\n csv: 'text/csv',\r\n html: 'text/html',\r\n ics: 'text/calendar',\r\n js: 'text/javascript ',\r\n mjs: 'text/javascript ',\r\n txt: 'text/plain',\r\n};\r\n\r\nexport const APPLICATION_TYPES = {\r\n abw: 'application/x-abiword',\r\n arc: 'application/x-freearc',\r\n azw: 'application/vnd.amazon.ebook',\r\n bin: 'application/octet-stream',\r\n bz: 'application/x-bzip',\r\n bz2: 'application/x-bzip2',\r\n cda: 'application/x-cdf',\r\n csh: 'application/x-csh',\r\n doc: 'application/msword',\r\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n eot: 'application/vnd.ms-fontobject',\r\n epub: 'application/epub+zip',\r\n jar: 'application/java-archive',\r\n json: 'application/json',\r\n jsonld: 'application/ld+json',\r\n mpkg: 'application/vnd.apple.installer+xml',\r\n ods: 'application/vnd.oasis.opendocument.spreadsheet',\r\n odt: 'application/vnd.oasis.opendocument.text',\r\n ogx: 'application/ogg',\r\n pdf: 'application/pdf',\r\n php: 'application/x-httpd-php',\r\n ppt: 'application/vnd.ms-powerpoint',\r\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n rar: 'application/vnd.rar',\r\n rarX: 'application/x-rar',\r\n rtf: 'application/rtf',\r\n sh: 'application/x-sh',\r\n tar: 'application/x-tar',\r\n vsd: 'application/vnd.visio',\r\n xhtml: 'application/xhtml+xml',\r\n xls: 'application/vnd.ms-excel',\r\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n zip: 'application/x-zip-compressed',\r\n zipN: 'application/zip',\r\n sevenZ: 'application/x-7z-compressed',\r\n csv: 'text/csv',\r\n};\r\n\r\nexport const MIME_TYPES_TO_EXTENSION = Object.entries(APPLICATION_TYPES).reduce(\r\n (acc, [key, value]) => {\r\n acc[value] = key;\r\n return acc;\r\n },\r\n {} as Record<string, string>,\r\n);\r\n\r\nexport const ALL_MIME_TYPES = {\r\n ...IMAGE_TYPES,\r\n ...AUDIO_TYPES,\r\n ...VIDEO_TYPES,\r\n ...TEXT_TYPES,\r\n ...APPLICATION_TYPES,\r\n};\r\n\r\nexport const ALL_MIME_TYPES_VALUE = Object.values({\r\n ...IMAGE_TYPES,\r\n ...AUDIO_TYPES,\r\n ...VIDEO_TYPES,\r\n ...TEXT_TYPES,\r\n ...APPLICATION_TYPES,\r\n});\r\n\r\nexport const DEFAULT_ACCEPTED_MIME_TYPES = [\r\n IMAGE_TYPES.jpg,\r\n IMAGE_TYPES.jpeg,\r\n IMAGE_TYPES.png,\r\n IMAGE_TYPES.svg,\r\n APPLICATION_TYPES.doc,\r\n APPLICATION_TYPES.docx,\r\n APPLICATION_TYPES.pdf,\r\n APPLICATION_TYPES.xls,\r\n APPLICATION_TYPES.xlsx,\r\n APPLICATION_TYPES.zip,\r\n APPLICATION_TYPES.zipN,\r\n TEXT_TYPES.txt,\r\n VIDEO_TYPES.mp4,\r\n VIDEO_TYPES.avi,\r\n];\r\n\r\nexport const DEFAULT_ACCEPTED_IMAGE_MIME_TYPES = [\r\n IMAGE_TYPES.jpg,\r\n IMAGE_TYPES.jpeg,\r\n IMAGE_TYPES.png,\r\n IMAGE_TYPES.svg,\r\n];\r\n","export const COMBINE_DEPEND_TYPES = ['skip', 'null', 'valid'] as const;\r\n","import { MIME_TYPES_TO_EXTENSION } from '../../consts/common';\r\nimport { FileSizeTypeEnum } from '../../enums/common/file-size-type.enum';\r\n\r\n// Format file size, đầu vào là Byte, và loại muốn format sang.\r\nexport const formatFileSize = (size: number, type: FileSizeTypeEnum): number => {\r\n let returnVal = 0;\r\n switch (type) {\r\n case 'KB':\r\n returnVal = size / 1024;\r\n break;\r\n case 'MB':\r\n returnVal = size / (1024 * 1024);\r\n break;\r\n case 'GB':\r\n returnVal = size / (1024 * 1024 * 1024);\r\n break;\r\n case 'TB':\r\n returnVal = size / (1024 * 1024 * 1024 * 1024);\r\n break;\r\n default:\r\n returnVal = size;\r\n break;\r\n }\r\n return returnVal;\r\n};\r\n\r\n// Lấy extension. dựa vào các cấu hình mimeTypes sẵn.\r\nexport const getExtensions = (acptMimeTypes: string[]): string[] => {\r\n return acptMimeTypes.map(mime => `.${MIME_TYPES_TO_EXTENSION[mime] || mime}`);\r\n};\r\n\r\n// Tạo một file giả từ thông tin name, type và size.\r\nexport const createFakeFile = (name: string, type: string, size: number): File => {\r\n const buffer = new Uint8Array(size); // tạo buffer theo size, không crash nếu file có dung lượng lớn.\r\n const blob = new Blob([buffer], { type });\r\n return new File([blob], name, { type, lastModified: Date.now() });\r\n};\r\n","export enum FileSizeTypeEnum {\r\n MB = 'MB',\r\n KB = 'KB',\r\n GB = 'GB',\r\n TB = 'TB',\r\n}\r\n","import { BaseField } from '../../models/fields/field.model';\r\n\r\n// Kiểm tra tính hợp lệ của JSON string.\r\nexport const isValidJSON = (str: string): boolean => {\r\n try {\r\n JSON.parse(str);\r\n } catch (e) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\n// Tạo một chuỗi uuid.\r\nexport const uuidGenerator = (): string => {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n var r = (Math.random() * 16) | 0,\r\n v = c == 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n};\r\n\r\nexport const lowerCaseFirstChar = (str: string): string => {\r\n return str.charAt(0).toLowerCase() + str.slice(1);\r\n};\r\n\r\nexport const upperCaseFirstChar = (str: string): string => {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n};\r\n\r\nexport const deepCopyArray = (array: BaseField<any>[]): BaseField<any>[] => {\r\n return array.map(item => {\r\n if (Array.isArray(item)) {\r\n return deepCopyArray(item); // Deep copy nếu phần tử là mảng lồng nhau\r\n } else if (item && typeof item === 'object') {\r\n return deepCopyObject(item); // Deep copy nếu phần tử là đối tượng\r\n }\r\n return item; // Trả về giá trị gốc nếu không phải mảng hoặc đối tượng\r\n }) as BaseField<any>[];\r\n};\r\n\r\nexport const deepCopyObject = (obj: BaseField<any>): BaseField<any> => {\r\n return Object.fromEntries(\r\n Object.entries(obj).map(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n return [key, deepCopyArray(value)]; // Deep copy nếu giá trị là mảng\r\n } else if (value && typeof value === 'object') {\r\n return [key, deepCopyObject(value)]; // Deep copy nếu giá trị là đối tượng\r\n }\r\n return [key, value]; // Trả về giá trị gốc\r\n }),\r\n ) as BaseField<any>;\r\n};\r\n","import {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n ValidationErrors,\r\n ValidatorFn,\r\n} from \"@angular/forms\";\r\nimport { delay, Observable, of } from \"rxjs\";\r\nimport { formatFileSize } from \"../file\";\r\nimport { FileSizeTypeEnum } from \"../../enums/common/file-size-type.enum\";\r\nimport { isValidJSON } from \"../common\";\r\n\r\n// Không cho phép nhập khoảng trắng ở đầu chuỗi, nếu không nhập gì vẫn tính đúng.\r\nexport const noLeadingSpaceValidator = (): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = (control.value ?? \"\").toString();\r\n if (!value) return null; // Không required thì để trống là hợp lệ\r\n return value[0] === \" \" ? { leadingSpace: true } : null;\r\n };\r\n};\r\n\r\n// Không cho phép nhập toàn khoảng trắng.\r\nexport const noWhitespaceValidator = (): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const isWhitespace = (control.value || \"\").toString().trim().length === 0;\r\n return isWhitespace ? { whitespace: true } : null;\r\n };\r\n};\r\n\r\n// Bắt đầu với một kí tự được chỉ định.\r\nexport const startsWithValidator = (prefix: string): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control.value ?? \"\";\r\n return value.startsWith(prefix)\r\n ? null\r\n : { startsWith: { requiredPrefix: prefix } };\r\n };\r\n};\r\n\r\n// So sánh giá trị field A không được lớn hơn field B.\r\nexport const minMaxFieldValidator = (\r\n minKey: string,\r\n maxKey: string,\r\n): ValidatorFn => {\r\n // group: AbstractControl sẽ đại diện cho FormGroup tức là cha bao hàm các field.\r\n return (group: AbstractControl): ValidationErrors | null => {\r\n const min = group.get(minKey)?.value;\r\n const max = group.get(maxKey)?.value;\r\n if (min != null && max != null && min > max) {\r\n return { minMaxInvalid: true };\r\n }\r\n return null;\r\n };\r\n};\r\n\r\n// Match giữa hai field (ví dụ: password/confirmPassword,...).\r\nexport const matchFieldsValidator = (fieldToMatch: string): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const parent = control.parent;\r\n if (!parent) return null;\r\n\r\n const target = parent.get(fieldToMatch);\r\n if (!target?.value) return null;\r\n\r\n // Nếu đang validate chính nó (ví dụ: confirmPassword)\r\n const isMismatch = control.value !== target.value;\r\n\r\n // Nếu trước đó password (target) đang bị lỗi matchField nhưng giờ đã khớp\r\n if (!isMismatch && target.hasError(\"matchField\")) {\r\n const errors = { ...target.errors };\r\n delete errors[\"matchField\"];\r\n\r\n // Nếu không còn lỗi nào khác, set null\r\n target.setErrors(Object.keys(errors).length ? errors : null);\r\n }\r\n\r\n return isMismatch ? { matchField: true } : null;\r\n };\r\n};\r\n\r\n// Async: Check if username is taken (simulate API).\r\nexport const asyncUsernameValidator = (\r\n takenUsernames: string[],\r\n): AsyncValidatorFn => {\r\n return (control: AbstractControl): Observable<ValidationErrors | null> => {\r\n const value = control.value ?? \"\";\r\n const isTaken = takenUsernames.includes(value);\r\n return of(isTaken ? { usernameTaken: true } : null).pipe(delay(500));\r\n };\r\n};\r\n\r\n// Không có ký tự đặc biệt.\r\nexport const noSpecialCharValidator = (): ValidatorFn => {\r\n return (control: AbstractControl) => {\r\n const valid = /^[a-zA-Z0-9]*$/.test(control.value);\r\n return valid ? null : { noSpecialChar: true };\r\n };\r\n};\r\n\r\n// Username không được nằm trong blacklist.\r\nexport const usernameBlacklistValidator = (\r\n blacklist: string[],\r\n): ValidatorFn => {\r\n return (control: AbstractControl) => {\r\n return blacklist.includes(control.value) ? { blacklisted: true } : null;\r\n };\r\n};\r\n\r\n// Có thuộc mimetypes từ mảng mimetypes được chỉ định hay không?\r\nexport const acceptedMimeTypesValidator = (\r\n acceptedMimeTypes: string[],\r\n): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control?.value;\r\n\r\n if (value) {\r\n let fileType = \"\";\r\n if (value instanceof File) {\r\n fileType = (value as File).type;\r\n }\r\n\r\n if (isValidJSON(value as string)) {\r\n const { contentType } = JSON.parse(value)[0] || {};\r\n if (contentType) fileType = contentType;\r\n }\r\n\r\n if (fileType) {\r\n if (!acceptedMimeTypes.includes(fileType)) {\r\n return {\r\n acceptedMimeTypes: {\r\n actualValue: fileType,\r\n requiredValue: `Nằm trong ${acceptedMimeTypes}`,\r\n },\r\n };\r\n }\r\n }\r\n }\r\n return null;\r\n };\r\n};\r\n\r\nexport const maxFileSizeInMBValidator = (maxSizeInMB: number): ValidatorFn => {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const file = control?.value as File;\r\n if (file) {\r\n const fileSizeInMB = formatFileSize(file.size, FileSizeTypeEnum.MB);\r\n\r\n if (fileSizeInMB > maxSizeInMB) {\r\n return {\r\n maxSizeInMB: {\r\n actualValue: fileSizeInMB,\r\n requiredValue: `Nhỏ hơn ${maxSizeInMB}`,\r\n },\r\n };\r\n }\r\n }\r\n return null;\r\n };\r\n};\r\n","// Enum cho các validator chung được angular reactive form hỗ trợ.\r\nexport enum CommonValidaterEnum {\r\n Required = 'required',\r\n MinLength = 'minlength',\r\n MaxLength = 'maxlength',\r\n Min = 'min',\r\n Max = 'max',\r\n Pattern = 'pattern',\r\n}\r\n\r\n// Enum cho các validator tùy chỉnh.\r\nexport enum CustomValidaterEnum {\r\n MatchField = 'matchField',\r\n AcceptedMimiTypes = 'acceptedMimeTypes',\r\n MaxSizeInMB = 'maxSizeInMB',\r\n LeadingSpace = 'leadingSpace',\r\n}\r\n","export enum RegexTypeEnum {\r\n Alpha = '^[a-zA-Z]+$',\r\n AlphaNumeric = '^[a-zA-Z0-9]+$',\r\n Name = \"^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\.+,:%&=;s.\\\\/\\\\-_'\\\\()]+$\",\r\n Username = '^[a-z0-9_.s]+$',\r\n RegexPostCode = '^[a-zA-Z0-9-s]+$',\r\n AlphaDash = '^[a-zA-Z0-9_-s.]+$',\r\n AlphaVN = '^[a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\,s]+$',\r\n AlphaNumericVN = '^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\s]+$',\r\n AlphaDashVN = \"^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\.+,:%&=;s.\\\\/\\\\-_'\\\\()]+$\",\r\n UnitName = '^[a-zA-Z0-9 ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵỷỹs_-]+$',\r\n Date = '([12]\\\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\\\d|3[01]))',\r\n Time = '(?=[01]\\\\d|2[0123])=(?=[012345]\\\\d)=(?=[012345]\\\\d)',\r\n DateTime = '[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[01][0-9])=[0-5][0-9]=[0-5][0-9]',\r\n // dateVN= \"^(0?[1-9]|[12][0-9]|3[01])[\\\\/](0?[1-9]|1[012])[\\\\/]\\\\d{4}$\",\r\n // dateVN= /^(0?[1-9]|[12][0-9]|3[01])[\\/\\-](0?[1-9]|1[012])[\\/\\-](19|20)\\d\\d/,\r\n // dateVN= \"^([0-2][0-9]|(3)[0-1])(\\-)(((0)[0-9])|((1)[0-2]))(\\-)\\d{4}$\",\r\n DateVN = '^(?=0[1-9]|[12]d|3[01])([/.-])(?=0[1-9]|1[012])\\\\1(?=19|20)dd$',\r\n DateTimeVN = '^(0?[1-9]|[12][0-9]|3[01])[\\\\/](0?[1-9]|1[012])[\\\\/]\\\\d{4} (\\\\d{2})=(\\\\d{2})=(\\\\d{2})$',\r\n DateShortTimeVN = '^(0?[1-9]|[12][0-9]|3[01])[\\\\/](0?[1-9]|1[012])[\\\\/]\\\\d{4} (\\\\d{2})=(\\\\d{2})$',\r\n Integer = '^\\\\-?[0-9]+$',\r\n Decimal = '^\\\\-?[0-9]*\\\\.?[0-9]+$',\r\n IpAddress = '^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\\\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})$',\r\n Base64 = '[^a-zA-Z0-9\\\\/\\\\+=]',\r\n Indentityid = '^\\\\d{12}$',\r\n // dnkhcn = \"/^DNKHCN-[A-Z]{2}-d{4}$/\",\r\n // msdn = \"/^d{10}$/\",\r\n IntergerNotZero = '^[0-9]*[1-9][0-9]*$',\r\n //link = \"(https?=//(?=www.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9].[^s]{2,}|www.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9].[^s]{2,}|https?=//(?=www.|(?!www))[a-zA-Z0-9]+.[^s]{2,}|www.[a-zA-Z0-9]+.[^s]{2,})\",\r\n // code = \"^['A-Z''0-9''._\\\\-']*$\",\r\n Code = \"^['A-Z''0-9''./_\\\\-\\\\/\\\\Đ']*$\",\r\n CodeHsda = \"^['A-Z''0-9''./_\\\\-']*$\",\r\n LinkLocation = '(https?://)?([\\\\da-z.-]+)\\\\.([a-z.]{2,6})([/\\\\w .-]*)?(\\\\?[\\\\w=&,.%-]*)?',\r\n Link = '(https?://)?([\\\\da-z.-]+)\\\\.([a-z.]{2,6})[/\\\\w .-]*/?',\r\n //password = \"/(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@$!%*?&]).{8,}/\",\r\n AccountName = '^[a-zA-Z0-9_.]{2,20}$',\r\n NameOrFullName = '^[a-zA-Z0-9_ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂưăạảấầẩẫậắằẳẵặẹẻẽềềểỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễếệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵỷỹ ]{1,20}$',\r\n PackageName = '^(?:[a-zA-Z]+(?:d*[a-zA-Z_]*)*)(?:.[a-zA-Z]+(?:d*[a-zA-Z_]*)*)+$',\r\n Email = '^[a-z0-9._%+-]+@[a-z0-9.-]+\\\\.[a-z]{2,4}$',\r\n PasswordRegex = '^(?!.*\\\\s)(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[~`!@#$%^&*()--+={}\\\\[\\\\]|\\\\\\\\:;\"\\'<>,.?/_₹]).{8,}$',\r\n // phoneNumber = \"^(\\\\+84|0)([235789])([0-9]{8,9})\\\\b\",\r\n PhoneNumber = '^(\\\\+84|0)([235789])([0-9]{8,9})$',\r\n SeqNum = '^(100|[0-9]{1,2})$',\r\n LinkBasemap = '(https://www.|http://www.|https://|http://)?[a-zA-Z]{2,}(.[a-zA-Z]{2,})(.[a-zA-Z]{2,})?/[a-zA-Z0-9]{2,}|((https://www.|http://www.|https://|http://)?[a-zA-Z]{2,}(.[a-zA-Z]{2,})(.[a-zA-Z]{2,})?)|(https://www.|http://www.|https://|http://)?[a-zA-Z0-9]{2,}.[a-zA-Z0-9]{2,}.[a-zA-Z0-9]{2,}(.[a-zA-Z0-9]{2,})?',\r\n AlphaDashBreakLineVN = \"^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\.+,:%&=;s.\\\\/\\\\-_'\\\\(\\\\)\\n]+$\",\r\n Fax = '^(\\\\+?\\\\d{1,4}[\\\\s-]?)?(\\\\(?\\\\d{2,4}\\\\)?[\\\\s-]?)?[\\\\d\\\\s-]{5,15}$',\r\n}\r\n","export enum FormModeEnum {\r\n Add = 'add',\r\n Edit = 'edit',\r\n View = 'view',\r\n Design = 'design',\r\n}\r\n","export enum SelectOutputValueTypeEnum {\r\n Single = 'single', // Giá trị đơn theo bindValue.\r\n Object = 'object', // Giá trị object chỉ kèm theo 1 prop theo bindValue.\r\n SourceObject = 'sourceObject', // Giá trị object bao gồm cả instance từ list option.\r\n}\r\n\r\nexport enum DatePickerOutputValueTypeEnum {\r\n String = 'string',\r\n Date = 'date',\r\n}\r\n\r\nexport enum DateRangeOutputValueTypeEnum {\r\n String = 'string',\r\n StringArray = 'string-array',\r\n DateArray = 'date-array',\r\n}\r\n\r\nexport enum UploadOutputValueTypeEnum {\r\n File = 'file',\r\n ObjectStorage = 'object-storage',\r\n Object = 'object',\r\n}\r\n","export enum CombineDependTypeEnum {\r\n Valid = 'valid',\r\n Skip = 'skip',\r\n Null = 'null',\r\n}\r\n\r\nexport enum DependTypeEnum {\r\n All = 'any',\r\n Any = 'all',\r\n}\r\n","export enum ViewModeEnum {\r\n form = 'form',\r\n text = 'text',\r\n}\r\n","import { FormControl, ValidatorFn, Validators } from \"@angular/forms\";\r\nimport { FIELD_TYPES } from \"../../consts/fields\";\r\nimport { matchFieldsValidator } from \"../../utils/validators/custom-validators\";\r\nimport { FieldGrid } from \"./field-grid.model\";\r\nimport { NzLabelAlignType } from \"ng-zorro-antd/form\";\r\nimport {\r\n CommonValidaterEnum,\r\n CustomValidaterEnum,\r\n} from \"../../enums/validators\";\r\nimport { ControlType } from \"../controls\";\r\nimport { FormMode } from \"../form\";\r\nimport { FormModeEnum } from \"../../enums/form\";\r\nimport { uuidGenerator } from \"../../utils/common\";\r\nimport { ViewMode } from \"../common\";\r\nimport { ViewModeEnum } from \"../../enums/common\";\r\nimport { FieldUserConfig } from \"../fields/field-user-config.model\";\r\n\r\n/**\r\n * typeof FIELD_TYPES[number] có nghĩa là:\r\n - FIELD_TYPES là readonly ['input', 'select', 'checkbox']\r\n - FIELD_TYPES[number] = FIELD_TYPES[0] | FIELD_TYPES[1] | ... = 'input' | 'select' | 'checkbox'\r\n => FieldType = 'input' | 'select' | 'checkbox'\r\n*/\r\nexport type FieldType = (typeof FIELD_TYPES)[number];\r\n\r\n/**\r\n * Abstract class chung cho Field.\r\n */\r\nexport abstract class BaseField<T> {\r\n id: string;\r\n\r\n // Giá trị Binding với Reactive Form dùng ở formControlName.\r\n key!: string;\r\n\r\n // Nhãn hiển thị tên của Field.\r\n label!: string;\r\n\r\n // Giá trị của Field.\r\n value?: T;\r\n\r\n // Giá trị ban đầu để reset.\r\n initialValue?: T;\r\n\r\n // Giá gốc từ model.\r\n modelValue?: T;\r\n\r\n // Loại Field: input-text, single-select,...\r\n type!: FieldType;\r\n\r\n // Loại control: input, select,... gom nhóm các dạng field.\r\n controlType!: ControlType;\r\n\r\n // Nhãn hint.\r\n placeholder?: string;\r\n\r\n // Hiển thị text khi hover.\r\n tooltip?: string;\r\n\r\n /** Props validation chung */\r\n required: boolean;\r\n\r\n /** Props validation custom chung */\r\n matchField?: string;\r\n\r\n icon?: string;\r\n\r\n // Custom error message theo validation props.\r\n errorMessages?: Record<string, string>;\r\n\r\n // Grid layout của Field.\r\n grid: FieldGrid;\r\n\r\n // Grid layout của Label nằm trong Field.\r\n labelGrid: FieldGrid;\r\n\r\n // Vị trí của Label khi ở trong một khối cụ thể.\r\n labelAlign: NzLabelAlignType;\r\n\r\n // Grid layout của Control nằm trong Field.\r\n controlGrid: FieldGrid;\r\n\r\n // Ẩn field và không thao tác bất kì gì liên quan.\r\n isHidden: boolean;\r\n\r\n // Vô hiệu hóa field.\r\n isDisabled: boolean;\r\n\r\n // Đánh dấu giá trị của field sẽ cần cho field khác có thuộc tính dependsOn.\r\n isParent: boolean;\r\n\r\n // Cho phép gán first data ở cả mode add hoặc edit hay không.\r\n allowSetValue: FormMode[];\r\n\r\n // Gom nhóm field theo mã của nhóm. Mã này sẽ config theo code của FieldGroup model và config ở FE.\r\n groupCode?: string; // Không thuộc nhóm thì bỏ trống hoặc điền None.\r\n\r\n // Mode view: form (view theo control được disable) hoặc text (chỉ hiện thị text có thể là paragraph). Riêng upload thì không áp dụng vì không phân biệt control.\r\n viewMode: ViewMode;\r\n\r\n // Nhãn phu hiển thị tên của Field.\r\n sublabel?: string;\r\n\r\n // Thứ tự hiển thị của field\r\n seqNum: number = 0;\r\n\r\n // Cho phép field phát sự kiện change khi thay đổi giá trị.\r\n enableFieldChange: boolean;\r\n\r\n // Cấu hình các tính năng cho phép người dùng tự thay đổi trên field\r\n userConfigs?: FieldUserConfig;\r\n\r\n constructor(init?: Partial<BaseField<T>>) {\r\n if (!init?.key || !init?.label) {\r\n throw new Error(\"key, label, and type are required\");\r\n }\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở BaseField.\r\n */\r\n this.id = uuidGenerator();\r\n this.required = false;\r\n this.grid = { xs: 24 };\r\n this.labelGrid = { xs: 24 };\r\n this.controlGrid = { xs: 24 };\r\n this.labelAlign = \"left\";\r\n this.isHidden = false;\r\n this.isDisabled = false;\r\n this.isParent = false;\r\n this.allowSetValue = [\r\n FormModeEnum.Add,\r\n FormModeEnum.Edit,\r\n FormModeEnum.View,\r\n ];\r\n this.viewMode = ViewModeEnum.form;\r\n this.enableFieldChange = false;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Tạo control cho từng loại field.\r\n abstract toFormControl(): FormControl;\r\n\r\n // Default value ban đầu cho từng loại field.\r\n abstract getDefaultValue(): T;\r\n\r\n abstract toFormValue(modelValue: unknown): T;\r\n\r\n // Tạo các validate chung cho các props ở abstract. this khi gọi trong class con sẽ đại diện cho đối tượng tạo từ class đó.\r\n protected getCommonValidators(): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n\r\n if (this.required) validators.push(Validators.required);\r\n\r\n return validators;\r\n }\r\n\r\n // Tạo các validate custom chung cho các props ở abstract. this khi gọi trong class con sẽ đại diện cho đối tượng tạo từ class đó.\r\n protected getCustomValidators(): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n\r\n if (this.matchField) validators.push(matchFieldsValidator(this.matchField));\r\n\r\n return validators;\r\n }\r\n\r\n getErrorMessage(\r\n errorKey: string,\r\n errorValue: any,\r\n allFields: BaseField<any>[],\r\n ): string {\r\n if (errorKey === CommonValidaterEnum.Required) {\r\n return `${this.label || \"Trường này\"} là bắt buộc`;\r\n }\r\n\r\n if (errorKey === CustomValidaterEnum.MatchField) {\r\n const matchKey = this.matchField;\r\n const targetLabel =\r\n allFields.find((f) => f.key === matchKey)?.label || matchKey;\r\n return `${this.label} không khớp với ${targetLabel}`;\r\n }\r\n\r\n return \"\";\r\n }\r\n}\r\n","import { TemplateRef } from '@angular/core';\r\nimport { BaseField } from './field.model';\r\n\r\n// Dữ liệu sau khi đã tiến hành xử lý gom nhóm từ fields và groups.\r\nexport class GroupedFields {\r\n noGroup: BaseField<any>[];\r\n grouped: {\r\n group: FieldGroup;\r\n fields: BaseField<any>[];\r\n }[];\r\n\r\n constructor(init: Partial<GroupedFields>) {\r\n this.noGroup = [];\r\n this.grouped = [];\r\n\r\n Object.assign(this, init);\r\n }\r\n}\r\n\r\n// Đại diện cho 1 group.\r\nexport class FieldGroup {\r\n // Nhãn của nhóm field.\r\n label!: string;\r\n\r\n // Mã nhóm field.\r\n code!: string;\r\n\r\n template?: TemplateRef<any>;\r\n\r\n // Thứ tự hiển thị nhóm field.\r\n order!: number;\r\n\r\n // Có mở sẵn collapse hay không?\r\n isActive: boolean;\r\n\r\n showArrow: boolean;\r\n\r\n required: boolean;\r\n\r\n disabled: boolean;\r\n\r\n constructor(init: Partial<FieldGroup>) {\r\n this.isActive = false;\r\n this.showArrow = true;\r\n this.disabled = false;\r\n this.required = false;\r\n\r\n Object.assign(this, init);\r\n }\r\n}\r\n","// Các patterns regex thường dùng trong ứng dụng\r\nexport const PATTERN_PRESETS: Record<string, string | RegExp> = {\r\n alpha: '^[a-zA-Z]+$',\r\n alphaNumeric: '^[a-zA-Z0-9]+$',\r\n name: \"^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\.+,:%&=;s.\\\\/\\\\-_'\\\\()]+$\",\r\n username: '^[a-z0-9_.s]+$',\r\n regexPostCode: '^[a-zA-Z0-9-s]+$',\r\n alphaDash: '^[a-zA-Z0-9_-s.]+$',\r\n alphaVN:\r\n '^[a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\,s]+$',\r\n alphaNumericVN:\r\n '^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\s]+$',\r\n alphaDashVN:\r\n \"^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\.+,:%&=;s.\\\\/\\\\-_'\\\\()]+$\",\r\n unitName:\r\n '^[a-zA-Z0-9 ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵỷỹs_-]+$',\r\n date: '([12]\\\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\\\d|3[01]))',\r\n time: '(?=[01]\\\\d|2[0123])=(?=[012345]\\\\d)=(?=[012345]\\\\d)',\r\n dateTime:\r\n '[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[01][0-9])=[0-5][0-9]=[0-5][0-9]',\r\n // dateV: \"^(0?[1-9]|[12][0-9]|3[01])[\\\\/](0?[1-9]|1[012])[\\\\/]\\\\d{4}$\",\r\n // dateV: /^(0?[1-9]|[12][0-9]|3[01])[\\/\\-](0?[1-9]|1[012])[\\/\\-](19|20)\\d\\d/,\r\n // dateV: \"^([0-2][0-9]|(3)[0-1])(\\-)(((0)[0-9])|((1)[0-2]))(\\-)\\d{4}$\",\r\n dateVN: '^(?=0[1-9]|[12]d|3[01])([/.-])(?=0[1-9]|1[012])\\\\1(?=19|20)dd$',\r\n dateTimeVN:\r\n '^(0?[1-9]|[12][0-9]|3[01])[\\\\/](0?[1-9]|1[012])[\\\\/]\\\\d{4} (\\\\d{2})=(\\\\d{2})=(\\\\d{2})$',\r\n dateShortTimeVN: '^(0?[1-9]|[12][0-9]|3[01])[\\\\/](0?[1-9]|1[012])[\\\\/]\\\\d{4} (\\\\d{2})=(\\\\d{2})$',\r\n integer: '^\\\\-?[0-9]+$',\r\n decimal: '^\\\\-?[0-9]*\\\\.?[0-9]+$',\r\n ipAddress:\r\n '^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\\\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})$',\r\n base64: '[^a-zA-Z0-9\\\\/\\\\+=]',\r\n citizenId: '^\\\\d{12}$',\r\n passport: '^[A-Z0-9]{6,12}$', // Hộ chiếu - 6-12 ký tự (chữ IN HOA và số)\r\n // dnkhcn: \"/^DNKHCN-[A-Z]{2}-d{4}$/\",\r\n // msdn: \"/^d{10}$/\",\r\n intergerNotZero: '^[0-9]*[1-9][0-9]*$',\r\n //link: \"(https?=//(?=www.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9].[^s]{2,}|www.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9].[^s]{2,}|https?=//(?=www.|(?!www))[a-zA-Z0-9]+.[^s]{2,}|www.[a-zA-Z0-9]+.[^s]{2,})\",\r\n // code: \"^['A-Z''0-9''._\\\\-']*$\",\r\n code: \"^['A-Z''0-9''./_\\\\-\\\\/\\\\Đ']*$\",\r\n codeHsda: \"^['A-Z''0-9''./_\\\\-']*$\",\r\n link_location: '(https?://)?([\\\\da-z.-]+)\\\\.([a-z.]{2,6})([/\\\\w .-]*)?(\\\\?[\\\\w=&,.%-]*)?',\r\n link: '(https?://)?([\\\\da-z.-]+)\\\\.([a-z.]{2,6})[/\\\\w .-]*/?',\r\n //password: \"/(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@$!%*?&]).{8,}/\",\r\n accountName: '^[a-zA-Z0-9_.]{2,20}$',\r\n name_or_fullName:\r\n '^[a-zA-Z0-9_ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂưăạảấầẩẫậắằẳẵặẹẻẽềềểỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễếệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵỷỹ ]{1,20}$',\r\n packageName: '^(?:[a-zA-Z]+(?:d*[a-zA-Z_]*)*)(?:.[a-zA-Z]+(?:d*[a-zA-Z_]*)*)+$',\r\n email: '^[a-z0-9._%+-]+@[a-z0-9.-]+\\\\.[a-z]{2,4}$',\r\n passwordRegex:\r\n '^(?!.*\\\\s)(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[~`!@#$%^&*()--+={}\\\\[\\\\]|\\\\\\\\:;\"\\'<>,.?/_₹]).{8,}$',\r\n // phoneNumber: \"^(\\\\+84|0)([235789])([0-9]{8,9})\\\\b\",\r\n phoneNumber: '^(\\\\+84|0)([235789])([0-9]{8,9})$',\r\n seqNum: '^(100|[0-9]{1,2})$',\r\n link_basemap:\r\n '(https://www.|http://www.|https://|http://)?[a-zA-Z]{2,}(.[a-zA-Z]{2,})(.[a-zA-Z]{2,})?/[a-zA-Z0-9]{2,}|((https://www.|http://www.|https://|http://)?[a-zA-Z]{2,}(.[a-zA-Z]{2,})(.[a-zA-Z]{2,})?)|(https://www.|http://www.|https://|http://)?[a-zA-Z0-9]{2,}.[a-zA-Z0-9]{2,}.[a-zA-Z0-9]{2,}(.[a-zA-Z0-9]{2,})?',\r\n alphaDashBreakLineVN:\r\n \"^[0-9a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\\\.+,:%&=;s.\\\\/\\\\-_'\\\\(\\\\)\\n]+$\",\r\n fax: '^(\\\\+?\\\\d{1,4}[\\\\s-]?)?(\\\\(?\\\\d{2,4}\\\\)?[\\\\s-]?)?[\\\\d\\\\s-]{5,15}$',\r\n alphaDashNameVN:\r\n \"^[a-zA-Z_ ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂẾưăạảấầẩẫậắằẳẵặẹẻẽềềểếỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵýỷỹ\\.s.\\/\\-\\_'\\\\(\\\\)]{2,}$\",\r\n businessCode: '^\\\\d{10}(-\\\\d{3})?$',\r\n};\r\n\r\n// Các error message cho các pattern regex.\r\nexport const PATTERN_ERROR_MESSAGES: Record<string, string> = {\r\n required: '%s không được để trống!',\r\n number: '%s phải là số!',\r\n email: '%s không đúng định dạng địa chỉ Email!',\r\n minlength: '%s có kích thước tối thiểu %s ký tự!',\r\n maxlength: '%s có kích thước tối đa %s ký tự!',\r\n min: '%s phải lớn hơn hoặc bằng %s!',\r\n max: '%s phải nhỏ hơn hoặc bằng %s!',\r\n alpha: '%s chỉ chứa ký tự thường và ký tự in hoa không dấu!',\r\n alphaNumeric: '%s chỉ chứa ký tự thường, ký tự in hoa không dấu và số!',\r\n name: '%s chỉ chứa ký tự thường, ký tự in hoa có dấu, số, dấu chấm, dấu phẩy, gạch dưới _ hoặc gạch ngang -, dấu ngoặc ()!',\r\n username: '%s chỉ chứa ký tự thường, số, dấu chấm và dấu gạch dưới _',\r\n regexPostCode: '%s chỉ chứa ký tự thường, ký tự in hoa không dấu, số, gạch ngang -',\r\n alphaDash:\r\n '%s chỉ chứa ký tự thường, ký tự in hoa không dấu, số, gạch dưới _ hoặc gạch ngang -, dấu ngoặc ()!',\r\n alphaVN: '%s chỉ chứa ký tự thường và ký tự in hoa có dấu!',\r\n alphaNumericVN: '%s chỉ chứa ký tự thường, ký tự in hoa có dấu và số!',\r\n alphaDashVN:\r\n '%s chỉ chứa ký tự thường, ký tự in hoa có dấu, số, dấu chấm, dấu phẩy, gạch dưới _ hoặc gạch ngang -, dấu ngoặc ()!',\r\n alphaDashNameVN: '%s chỉ chứa ký tự thường, ký tự in hoa có dấu và ít nhất 2 ký tự!',\r\n unitName: '%s chỉ chứa ký tự thường, ký tự in hoa có dấu, số, gạch dưới _ hoặc gạch ngang -',\r\n date: '%s không đúng định dạng năm tháng ngày (YYYY-MM-DD)!',\r\n time: '%s không đúng định dạng giờ phút giây (HH:MM:SS)!',\r\n dateTime: '%s không đúng định dạng năm tháng ngày giờ phút giây (YYYY-MM-DD HH:MM:SS)!',\r\n dateVN: '%s không đúng định dạng ngày tháng năm (DD/MM/YYYY)!',\r\n dateTimeVN: '%s không đúng định dạng ngày tháng năm giờ phút giây (DD/MM/YYYY HH:MI:SS)!',\r\n dateShortTimeVN: '%s không đúng định dạng ngày tháng năm giờ phút (DD/MM/YYYY HH:MI)!',\r\n integer: '%s phải là số nguyên!',\r\n decimal: '%s phải là số thập phân!',\r\n ipAddress: '%s không đúng định dạng địa chỉ IP!',\r\n base64: '%s không đúng định dạng Base64!',\r\n intergerNotZero: '%s phải là số nguyên dương khác 0!',\r\n link_location: '%s không đúng định dạng!',\r\n link: '%s không đúng định dạng!',\r\n codeHsda: \"%s chỉ chứa các chữ cái in hoa không dấu, số và dấu '.', '_', '-'\",\r\n code: \"%s chỉ chứa các chữ cái in hoa không dấu, số và dấu '.', '_', '-', '/'\",\r\n // code: \"%s chỉ chứa các chữ cái in hoa,chữ cái thường không dấu, số và dấu '.', '_', '-'\",\r\n accountName: '%s chỉ bao gồm các kí tự từ A-Z, các số từ 0-9 và ít nhất 2 ký tự',\r\n name_or_fullName: '',\r\n // pwdErrorTip:\r\n // \"%s phải có ít nhất 8 ký tự. Ít nhất 1 ký tự hoa, số, ký tự thường và ký tự đặc biệt\",\r\n phoneNumber:\r\n 'Số điện thoại không hợp lệ (Gợi ý: Số điện thoại phải bắt đầu bằng đầu số 02, 03, 05, 07, 08, 09 hoặc +84 và có độ dài 10-11 ký tự)',\r\n seqNum: '(Gợi ý: Thứ tự hiển thị phải là dạng số và có giá trị từ 1-100)',\r\n link_basemap: '%s không đúng định dạng!',\r\n passwordRegex:\r\n '%s phải có ít nhất 8 ký tự. Ít nhất 1 ký tự hoa, ký tự thường, số và ký tự đặc biệt',\r\n alphaDashBreakLineVN:\r\n '%s chỉ chứa ký tự thường, ký tự in hoa có dấu, số, dấu chấm, dấu phẩy, gạch dưới _ hoặc gạch ngang -, dấu ngoặc ()!',\r\n citizenId: '%s phải đúng định dạng 12 số!',\r\n businessCode: '',\r\n};\r\n","import { PATTERN_PRESETS } from '../../consts/validators/pattern.const';\r\n\r\nexport const resolvePattern = (\r\n pattern: string | RegExp | undefined,\r\n): {\r\n type: 'regexKey' | 'regexString' | 'regexObject' | 'unknown';\r\n value: string | RegExp;\r\n} => {\r\n if (!pattern) return { type: 'unknown', value: '' };\r\n\r\n // Trường hợp là RegExp thực sự\r\n if (pattern instanceof RegExp) return { type: 'regexObject', value: pattern };\r\n\r\n // Trường hợp là tên preset (ưu tiên nếu trùng)\r\n if (pattern in PATTERN_PRESETS) {\r\n return { type: 'regexKey', value: PATTERN_PRESETS[pattern] };\r\n }\r\n\r\n try {\r\n // Trường hợp là chuỗi regex dạng \"^abc$\"\r\n return { type: 'regexString', value: new RegExp(pattern) };\r\n } catch (err) {\r\n console.warn(`Không thể parse pattern \"${pattern}\"`, err);\r\n return { type: 'unknown', value: '' };\r\n }\r\n};\r\n","import { PATTERN_ERROR_MESSAGES } from '../../consts/validators/pattern.const';\r\nimport { resolvePattern } from './pattern';\r\n\r\nexport const getDefaultPatternErrorMessage = (label: string, pattern: string | RegExp): string => {\r\n let finalErrorMessage = '';\r\n const resolvePatternResult = resolvePattern(pattern);\r\n\r\n // if (resolvePatternResult?.type === 'unknown') {\r\n // return finalErrorMessage; // Không phải pattern hợp lệ\r\n // }\r\n\r\n if (resolvePatternResult.type === 'regexObject') {\r\n finalErrorMessage = `${label || 'Trường này'} không hợp lệ!`;\r\n }\r\n\r\n if (resolvePatternResult.type === 'regexKey') {\r\n const patternMess = PATTERN_ERROR_MESSAGES?.[pattern as string] ?? '';\r\n finalErrorMessage = `${label || 'Trường này'} không hợp lệ! ${patternMess.replace(/%s/g, () => label)}`;\r\n }\r\n\r\n return finalErrorMessage;\r\n};\r\n\r\nexport const getDefaultMinLengthErrorMessage = (label: string, errorValue: any): string => {\r\n return `${label || 'Trường này'} cần tối thiểu ${errorValue.requiredLength} ký tự`;\r\n};\r\n\r\nexport const getDefaultMaxLengthErrorMessage = (label: string, errorValue: any): string => {\r\n return `${label || 'Trường này'} cần đât thiểu ${errorValue.requiredLength} ký tự`;\r\n};\r\n\r\nexport const getDefaultAcptMimeTypesErrorMessage = (typeString: string): string => {\r\n return `Tập tin tải lên không được hỗ trợ. Vui lòng tải các tập tin có định dạng ${typeString}`;\r\n};\r\n\r\nexport const getDefaultMaxSizeInMBErrorMessage = (maxSizeInMB: number): string => {\r\n return `Kích thước tập tin tải lên không được phép vượt quá ${maxSizeInMB} MB`;\r\n};\r\n\r\nexport const getLeadingSpaceErrorMessage = (label: string): string => {\r\n return `${label || 'Trường này'} không được bắt đầu bằng khoảng trắng`;\r\n};\r\n","// Dạng control.\r\nexport enum ControlTypeEnum {\r\n Input = 'input',\r\n Textarea = 'textarea',\r\n Select = 'select',\r\n Checkbox = 'checkbox',\r\n Radio = 'radio',\r\n Date = 'date',\r\n Upload = 'upload',\r\n Switch = 'switch',\r\n Autocomplete = 'autocomplete',\r\n}\r\n","import { FormControl, ValidatorFn, Validators } from '@angular/forms';\r\nimport { INPUT_FIELD_TYPES } from '../../../consts/fields/input-field.const';\r\nimport { BaseField } from '../field.model';\r\nimport { noLeadingSpaceValidator } from '../../../utils/validators/custom-validators';\r\nimport { resolvePattern } from '../../../utils/validators/pattern';\r\nimport { CommonValidaterEnum, CustomValidaterEnum } from '../../../enums/validators';\r\nimport {\r\n getDefaultMaxLengthErrorMessage,\r\n getDefaultMinLengthErrorMessage,\r\n getDefaultPatternErrorMessage,\r\n getLeadingSpaceErrorMessage,\r\n} from '../../../utils/validators';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\nimport { Suffix } from '../../common/common.model';\r\n\r\n/**\r\n * typeof FIELD_TYPES[number] có nghĩa là:\r\n - INPUT_FIELD_TYPES là readonly ['text','email','password','number']\r\n - INPUT_FIELD_TYPES[number] = INPUT_FIELD_TYPES[0] | INPUT_FIELD_TYPES[1] | ... = 'text' | 'email' | ...\r\n => FieldType = 'input' | 'select' | 'checkbox'\r\n*/\r\nexport type InputFieldType = (typeof INPUT_FIELD_TYPES)[number];\r\n\r\nconst DEFAULT_INPUT_VALUE = '';\r\n\r\n/**\r\n * Interface base chung cho Các dạng Input Field.\r\n */\r\nexport abstract class InputBaseField extends BaseField<string> {\r\n suffixes: Suffix[];\r\n\r\n /**\r\n * Props validation chung cho các dạng Input.\r\n */\r\n // Độ dài tối thiểu của chuỗi nhập vào.\r\n minLength?: number;\r\n // Độ dài tối đa của chuỗi nhập vào.\r\n maxLength?: number;\r\n // Theo mẫu regex hoặc đối tượng RegExr\r\n pattern?: string | RegExp;\r\n\r\n isCurrency: boolean;\r\n\r\n constructor(init: Partial<InputBaseField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Input.\r\n */\r\n this.controlType = ControlTypeEnum.Input;\r\n this.value = DEFAULT_INPUT_VALUE;\r\n this.initialValue = DEFAULT_INPUT_VALUE;\r\n this.suffixes = [];\r\n this.isCurrency = false;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Input.\r\n protected getInputCommonValidators(): ValidatorFn[] {\r\n const validators = this.getCommonValidators();\r\n\r\n if (this.minLength) validators.push(Validators.minLength(this.minLength));\r\n if (this.maxLength) validators.push(Validators.maxLength(this.maxLength));\r\n if (this.pattern) {\r\n const resolvePatternResult = resolvePattern(this.pattern);\r\n if (resolvePatternResult?.type !== 'unknown')\r\n validators.push(Validators.pattern(resolvePatternResult.value));\r\n }\r\n\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các custom validation có thể dùng cho Input.\r\n protected getInputCustomValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n\r\n validators.push(noLeadingSpaceValidator());\r\n\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getInputCommonValidators();\r\n const customValidators = this.getInputCustomValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n // Giá trị mặc định.\r\n override getDefaultValue(): string {\r\n return DEFAULT_INPUT_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string {\r\n return String(modelValue);\r\n }\r\n\r\n override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n if (errorKey === CommonValidaterEnum.Pattern) {\r\n if (this.pattern) return getDefaultPatternErrorMessage(this.label, this.pattern);\r\n }\r\n if (errorKey === CommonValidaterEnum.MinLength)\r\n return getDefaultMinLengthErrorMessage(this.label, errorValue);\r\n if (errorKey === CommonValidaterEnum.MaxLength)\r\n return getDefaultMaxLengthErrorMessage(this.label, errorValue);\r\n if (errorKey === CustomValidaterEnum.LeadingSpace)\r\n return getLeadingSpaceErrorMessage(this.label);\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","// Dạng field cụ thể.\r\nexport enum FieldTypeEnum {\r\n InputText = \"input-text\",\r\n InputPassword = \"input-password\",\r\n InputFormatted = \"input-formatted\",\r\n Textarea = \"textarea\",\r\n DatePicker = \"date-picker\",\r\n DateRange = \"date-range\",\r\n SingleSelect = \"single-select\",\r\n TreeSelect = \"tree-select\",\r\n MultiSelect = \"multi-select\",\r\n SingleFileUpload = \"single-file-upload\",\r\n MultiFileUpload = \"multi-file-upload\",\r\n MultiImageUpload = \"multi-image-upload\",\r\n AvatarUpload = \"avatar-upload\",\r\n Checkbox = \"checkbox\",\r\n Radio = \"radio\",\r\n ReminderTypeRadio = \"reminder-type-radio\",\r\n Switch = \"switch\",\r\n Autocomplete = \"autocomplete\",\r\n}\r\n","export enum InputFieldTypeEnum {\r\n Text = 'text',\r\n Email = 'email',\r\n Password = 'password',\r\n Number = 'number',\r\n}\r\n","export enum NumericPreset {\r\n Integer = \"integer\",\r\n Decimal = \"decimal\",\r\n Currency = \"currency\",\r\n Manual = \"manual\",\r\n}\r\n","export enum DateFieldTypeEnum {\r\n Picker = 'picker',\r\n Range = 'range',\r\n}\r\n","export enum SelectFieldTypeEnum {\r\n Single = 'single',\r\n Multi = 'multi',\r\n}\r\n","export enum UploadFieldTypeEnum {\r\n SingleFile = 'single-file',\r\n MultiFile = 'multi-file',\r\n Avatar = 'avatar',\r\n}\r\n","import { FormControl } from '@angular/forms';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { InputBaseField } from './input-field.model';\r\n\r\n/**\r\n * Interface của Input Field type là Text.\r\n */\r\nexport class InputTextField extends InputBaseField {\r\n constructor(init: Partial<InputTextField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Input Text.\r\n */\r\n this.type = FieldTypeEnum.InputText;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Tạo Form Control cho Input Text Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getInputCommonValidators();\r\n const customValidators = this.getInputCustomValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n}\r\n","import { FormControl, ValidatorFn } from '@angular/forms';\r\nimport { FieldTypeEnum, InputFieldTypeEnum } from '../../../enums/fields';\r\nimport { InputBaseField } from './input-field.model';\r\n\r\n/**\r\n * Interface của Input Field type là Password.\r\n */\r\nexport class InputPasswordField extends InputBaseField {\r\n constructor(init: Partial<InputPasswordField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Input Password.\r\n */\r\n this.type = FieldTypeEnum.InputPassword;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Input Password.\r\n protected getInputPasswordCommonValidators(): ValidatorFn[] {\r\n const validators = this.getInputCommonValidators();\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi angular cho Input Password.\r\n protected getInputPasswordCustomValidators(): ValidatorFn[] {\r\n const validators = this.getInputCustomValidators();\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Password Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getInputPasswordCommonValidators();\r\n const customValidators = this.getInputPasswordCustomValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n}\r\n","import { FormControl } from \"@angular/forms\";\r\nimport { FieldTypeEnum } from \"../../../enums/fields\";\r\nimport { InputBaseField } from \"./input-field.model\";\r\nimport { NumericPreset } from \"../../../enums/fields/input-formatted-field.enum\";\r\nimport AutoNumeric from \"@zeedhi/autonumeric\";\r\n\r\n/**\r\n * Interface của Input Field dạng format.\r\n */\r\nexport class InputFormattedField extends InputBaseField {\r\n // Kiểu định dạng số.\r\n format: NumericPreset;\r\n\r\n // Option cho autoNumeric. Có thê custom với dạng format là custom và truyền options từ ngoài vào.\r\n autoNumericOptions?: Partial<AutoNumeric.Options>;\r\n\r\n constructor(init: Partial<InputFormattedField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở InputFormatted.\r\n */\r\n this.type = FieldTypeEnum.InputFormatted;\r\n this.format = NumericPreset.Integer;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Tạo Form Control cho Input Formatted Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getInputCommonValidators();\r\n const customValidators = this.getInputCustomValidators();\r\n return new FormControl(this.value ?? \"\", [\r\n ...commonValidators,\r\n ...customValidators,\r\n ]);\r\n }\r\n}\r\n","import { AbstractControl, FormGroup } from \"@angular/forms\";\r\nimport { BaseField } from \"../../models/fields/field.model\";\r\nimport { FormMode } from \"../../models/form\";\r\nimport { FormModeEnum } from \"../../enums/form\";\r\nimport { SelectBaseField } from \"../../models/fields/select/select-base-field.model\";\r\nimport { InputPasswordField } from \"../../models/fields/input\";\r\nimport { FieldTypeEnum } from \"../../enums/fields\";\r\n\r\nexport const buildForm = (\r\n fields: BaseField<any>[],\r\n mode: FormMode,\r\n model?: Record<string, any>,\r\n): FormGroup => {\r\n const groupObj: Record<string, AbstractControl<any, any>> = {};\r\n // console.log(\"model\", model);\r\n\r\n for (const field of fields) {\r\n // Loại bỏ nếu quyết định ẩn field đi.\r\n if (field.isHidden) continue;\r\n // Nếu là dạng InputPasswordField nhưng ở mode edit và view thì không được dùng.\r\n if (\r\n field instanceof InputPasswordField &&\r\n (mode === FormModeEnum.Edit || mode === FormModeEnum.View)\r\n )\r\n continue;\r\n\r\n const fieldKey = field?.key;\r\n // field.value = field.allowSetValue ? (model?.[fieldKey] || field.value) : null;\r\n\r\n // 1. Luôn luôn reset về default trước để xoá cache cũ của instance field\r\n field.value = field.getDefaultValue();\r\n field.modelValue = null;\r\n // 2. Kiểm tra quyền set value theo FormMode hiện tại\r\n const isAllowedSet = Array.isArray(field.allowSetValue)\r\n ? field.allowSetValue.includes(mode)\r\n : Boolean(field.allowSetValue);\r\n // 3. Chỉ nạp từ model nếu mode cho phép và model có key đó\r\n if (\r\n isAllowedSet &&\r\n model &&\r\n fieldKey in model &&\r\n model[fieldKey] !== undefined\r\n ) {\r\n field.value = field.toFormValue(model[fieldKey]);\r\n field.modelValue = model[fieldKey];\r\n }\r\n field.initialValue = field.value;\r\n // console.log(\"e\", field.value );\r\n // field.value = field.allowSetValue ? field.toFormValue(model?.[fieldKey] | field.getDefaultValue()) : field.getDefaultValue();\r\n const control = field.toFormControl();\r\n control.reset(field.value);\r\n if (field.isDisabled) {\r\n //console.log(field.key, 'dfdfdfdf');\r\n\r\n control?.disable();\r\n }\r\n groupObj[fieldKey] = control;\r\n }\r\n\r\n return new FormGroup(groupObj);\r\n};\r\n\r\n// Tạo tự động placeholder cho các dạng control nhập với label hoặc key từ field\r\nexport const createInputPlaceholder = (field: BaseField<any>): string => {\r\n const label = field?.label;\r\n if (label) return `Nhập ${label?.toLowerCase()}`;\r\n\r\n return `Nhập ${field.key?.toLowerCase()}`;\r\n};\r\n\r\n// Tạo tự động placeholder cho các dạng single select với label hoặc key từ field\r\nexport const createSingleSelectPlaceholder = (\r\n field: BaseField<any>,\r\n): string => {\r\n const label = field?.label;\r\n if (label) return `Chọn ${label?.toLowerCase()}`;\r\n\r\n return `Chọn ${field.key?.toLowerCase()}`;\r\n};\r\n\r\n// Tạo tự động placeholder cho các dạng multi select với label hoặc key từ field\r\nexport const createMultiSelectPlaceholder = (field: BaseField<any>): string => {\r\n const label = field?.label;\r\n if (label) return `Chọn các ${label?.toLowerCase()}`;\r\n\r\n return `Chọn các ${field.key?.toLowerCase()}`;\r\n};\r\n\r\n// Tạo tự động placeholder cho các dạng date-picker với label hoặc key từ field\r\nexport const createDatePickerPlaceholder = (field: BaseField<any>): string => {\r\n const label = field?.label;\r\n if (label) return `Chọn ${label?.toLowerCase()}`;\r\n\r\n return `Chọn ${field.key?.toLowerCase()}`;\r\n};\r\n\r\n// Tạo placeholder mặc định cho các dạng Input, Textarea.\r\nexport const createPlaceholder = (field: BaseField<any>): string => {\r\n const placeholder = field?.placeholder;\r\n if (placeholder) return placeholder;\r\n\r\n const label = field?.label;\r\n if (label) return `Nhập ${label?.toLowerCase()}`;\r\n\r\n return `Nhập ${field.key?.toLowerCase()}`;\r\n};\r\n\r\n// Tạo placeholder mặc định cho các dạng Select.\r\nexport const createSelectPlaceholder = <K>(\r\n field: SelectBaseField<K>,\r\n): string => {\r\n const placeholder = field?.placeholder;\r\n if (placeholder) return placeholder;\r\n\r\n const label = field?.label;\r\n if (label) {\r\n const isSingleSelect = field?.type === FieldTypeEnum.SingleSelect;\r\n return `Chọn ${isSingleSelect ? \"\" : \"các\"} ${label?.toLowerCase()}`;\r\n }\r\n\r\n return `Nhập ${field.key?.toLowerCase()}`;\r\n};\r\n","import { ControlTypeEnum } from '../../enums/controls';\r\nimport { FieldTypeEnum, InputFieldTypeEnum } from '../../enums/fields';\r\nimport { DateFieldTypeEnum } from '../../enums/fields/date-field.enum';\r\nimport { SelectFieldTypeEnum } from '../../enums/fields/select-field.enum';\r\nimport { UploadFieldTypeEnum } from '../../enums/fields/upload-field.enum';\r\nimport { DatePickerField } from '../../models/fields/date/date-picker-field.model';\r\nimport { DateRangeField } from '../../models/fields/date/date-range-field.model';\r\nimport { FieldGroup, GroupedFields } from '../../models/fields/field-group.model';\r\nimport { BaseField } from '../../models/fields/field.model';\r\nimport { InputPasswordField, InputTextField } from '../../models/fields/input';\r\nimport { MultiSelectField } from '../../models/fields/select/multi-select-field.model';\r\nimport { SingleSelectField } from '../../models/fields/select/single-select-field.model';\r\nimport { AvatarUploadField } from '../../models/fields/upload/avatar-upload-field.model';\r\nimport { MultiFileUploadField } from '../../models/fields/upload/multi-file-upload-field.model';\r\nimport { SingleFileUploadField } from '../../models/fields/upload/single-file-upload-field.model';\r\n\r\nexport const isInputTextField = (field: BaseField<any>): field is InputTextField => {\r\n return field.controlType === ControlTypeEnum.Input && field.type === FieldTypeEnum.InputText;\r\n};\r\n\r\nexport const isInputPasswordField = (field: BaseField<any>): field is InputPasswordField => {\r\n return field.controlType === ControlTypeEnum.Input && field.type === FieldTypeEnum.InputPassword;\r\n};\r\n\r\nexport const isSingleSelectField = (field: BaseField<any>): field is SingleSelectField => {\r\n return field.controlType === ControlTypeEnum.Select && field.type === FieldTypeEnum.SingleSelect;\r\n};\r\n\r\nexport const isMultiSelectField = (field: BaseField<any>): field is MultiSelectField => {\r\n return field.controlType === ControlTypeEnum.Select && field.type === FieldTypeEnum.MultiSelect;\r\n};\r\n\r\nexport const isDatePickerField = (field: BaseField<any>): field is DatePickerField => {\r\n return field.controlType === ControlTypeEnum.Date && field.type === FieldTypeEnum.DatePicker;\r\n};\r\n\r\nexport const isDateRangeField = (field: BaseField<any>): field is DateRangeField => {\r\n return field.controlType === ControlTypeEnum.Date && field.type === FieldTypeEnum.DateRange;\r\n};\r\n\r\nexport const isSingleFileUploadField = (field: BaseField<any>): field is SingleFileUploadField => {\r\n return (\r\n field.controlType === ControlTypeEnum.Upload && field.type === FieldTypeEnum.SingleFileUpload\r\n );\r\n};\r\n\r\nexport const isMultiFileUploadField = (field: BaseField<any>): field is MultiFileUploadField => {\r\n return (\r\n field.controlType === ControlTypeEnum.Upload && field.type === FieldTypeEnum.MultiFileUpload\r\n );\r\n};\r\n\r\nexport const isAvatarUploadField = (field: BaseField<any>): field is AvatarUploadField => {\r\n return field.controlType === ControlTypeEnum.Upload && field.type === FieldTypeEnum.AvatarUpload;\r\n};\r\n\r\n// Tạo FieldGroup render UI từ thông tin fields và groups truyền vào cho dynamic-form.\r\nexport const buildGroupedFields = (\r\n fields: BaseField<any>[],\r\n groups: FieldGroup[] = [],\r\n): GroupedFields => {\r\n const noGroup = fields.filter(\r\n field => !field?.groupCode || field?.groupCode.toLowerCase() === 'none',\r\n );\r\n\r\n const sortedGroups = [...groups].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n const grouped = sortedGroups\r\n .map(group => ({\r\n group,\r\n fields: fields.filter(field => field.groupCode?.toLowerCase() === group.code.toLowerCase()),\r\n }))\r\n .filter(groupedFields => groupedFields.fields.length > 0);\r\n\r\n return new GroupedFields({\r\n noGroup,\r\n grouped,\r\n });\r\n};\r\n","import { FormControl, ValidatorFn, Validators } from '@angular/forms';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { BaseField } from '../field.model';\r\nimport {\r\n getDefaultMaxLengthErrorMessage,\r\n getDefaultMinLengthErrorMessage,\r\n getDefaultPatternErrorMessage,\r\n getLeadingSpaceErrorMessage,\r\n noLeadingSpaceValidator,\r\n resolvePattern,\r\n} from '../../../utils/validators';\r\nimport { CommonValidaterEnum, CustomValidaterEnum } from '../../../enums/validators';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\n\r\nconst DEFAULT_TEXTAREA_VALUE = '';\r\n\r\n/**\r\n * Interface cho Các dạng Textarea.\r\n */\r\nexport class TextareaField extends BaseField<string> {\r\n /**\r\n * Props validation chung cho dạng Textarea.\r\n */\r\n // Độ dài tối thiểu của chuỗi nhập vào.\r\n minLength?: number;\r\n // Độ dài tối đa của chuỗi nhập vào.\r\n maxLength?: number;\r\n // Theo mẫu regex hoặc đối tượng RegExr\r\n pattern?: string | RegExp;\r\n\r\n constructor(init: Partial<TextareaField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Input.\r\n */\r\n this.controlType = ControlTypeEnum.Textarea;\r\n this.type = FieldTypeEnum.Textarea;\r\n this.value = DEFAULT_TEXTAREA_VALUE;\r\n this.initialValue = DEFAULT_TEXTAREA_VALUE;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Input.\r\n protected getCommonTextareaValidators(): ValidatorFn[] {\r\n const validators = this.getCommonValidators();\r\n\r\n if (this.minLength) validators.push(Validators.minLength(this.minLength));\r\n if (this.maxLength) validators.push(Validators.maxLength(this.maxLength));\r\n if (this.pattern) {\r\n const resolvePatternResult = resolvePattern(this.pattern);\r\n if (resolvePatternResult?.type !== 'unknown')\r\n validators.push(Validators.pattern(resolvePatternResult.value));\r\n }\r\n\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các custom validation có thể dùng cho Input.\r\n protected getCustomTextareaValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n\r\n validators.push(noLeadingSpaceValidator());\r\n\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonTextareaValidators();\r\n const customValidators = this.getCustomTextareaValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n // Giá trị mặc định.\r\n override getDefaultValue(): string {\r\n return DEFAULT_TEXTAREA_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string {\r\n return String(modelValue);\r\n }\r\n\r\n override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n if (errorKey === CommonValidaterEnum.Pattern) {\r\n if (this.pattern) return getDefaultPatternErrorMessage(this.label, this.pattern);\r\n }\r\n if (errorKey === CommonValidaterEnum.MinLength)\r\n return getDefaultMinLengthErrorMessage(this.label, errorValue);\r\n if (errorKey === CommonValidaterEnum.MaxLength)\r\n return getDefaultMaxLengthErrorMessage(this.label, errorValue);\r\n if (errorKey === CustomValidaterEnum.LeadingSpace)\r\n return getLeadingSpaceErrorMessage(this.label);\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","/**\r\n * FIELD_TYPES là readonly ['single', 'multi', 'tree',...]\r\n */\r\nexport const SELECT_FIELD_TYPES = ['single', 'multi', 'tree'] as const;\r\n\r\nexport const DEFAULT_BIND_LABEL = 'name';\r\nexport const DEFAULT_BIND_VALUE = 'code';\r\n","import { FormControl, ValidatorFn } from \"@angular/forms\";\r\nimport {\r\n DEFAULT_BIND_LABEL,\r\n DEFAULT_BIND_VALUE,\r\n SELECT_FIELD_TYPES,\r\n} from \"../../../consts/fields/select-field.const\";\r\nimport { BaseField } from \"../field.model\";\r\nimport { ApiConfig, FieldDependency, FieldDependencyType } from \"../../common\";\r\nimport { SelectOutputValueType } from \"../../common/output-value-type.model\";\r\nimport {\r\n DependTypeEnum,\r\n SelectOutputValueTypeEnum,\r\n} from \"../../../enums/common\";\r\nimport { ControlTypeEnum } from \"../../../enums/controls\";\r\nimport { Suffix } from \"../../common/common.model\";\r\n\r\nexport type SelectFieldType = (typeof SELECT_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Interface base chung cho Các dạng Input Field.\r\n */\r\nexport abstract class SelectBaseField<K> extends BaseField<K> {\r\n // Key lấy ra nhãn hiển thị ở options.\r\n bindLabel!: string;\r\n\r\n // Key lấy ra giá trị ngầm ở options.\r\n bindValue!: string;\r\n\r\n // Dữ liệu sẽ gửi từ form khi submit.\r\n outputAs!: SelectOutputValueType;\r\n\r\n matchSelectWidth: boolean;\r\n\r\n // Mảng options cho việc lựa chọn được truyền tĩnh từ config.\r\n options: Record<string, unknown>[];\r\n\r\n // Luôn chèn vào vị trí 0\r\n optionsToPrepend: Record<string, unknown>[];\r\n\r\n // Luôn chèn vào vị trí cuối\r\n optionsToAppend: Record<string, unknown>[];\r\n\r\n exceptOptions: Record<string, unknown>[];\r\n\r\n // Phụ thuộc vào một giá trị từ bất kỳ dạng field nào khác: Select, Input,...\r\n dependsOn: FieldDependency[];\r\n\r\n // Cấu hình api nếu danh sách select dựa vào việc gọi api GET. Ưu tiên hơn options tĩnh truyền vào từ config.\r\n apiConfig?: ApiConfig;\r\n\r\n /**\r\n * dependType:\r\n * - 'all' → cần tất cả field cha có giá trị mới gọi API\r\n * - 'any' → chỉ cần 1 field cha có giá trị cũng gọi API theo từng cha\r\n */\r\n\r\n dependType: FieldDependencyType;\r\n\r\n // Biến đổi hiển thị option label từ option của options.\r\n transformLabel?: (option: Record<string, unknown>) => string;\r\n\r\n // Các nút nằm ở hậu tố (bên phải control).\r\n suffixes: Suffix[];\r\n\r\n /**\r\n * Props validation chung cho các dạng Select.\r\n */\r\n // ................. Chưa có .................\r\n\r\n constructor(init: Partial<SelectBaseField<K>>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Select.\r\n */\r\n this.controlType = ControlTypeEnum.Select;\r\n this.bindLabel = DEFAULT_BIND_LABEL;\r\n this.bindValue = DEFAULT_BIND_VALUE;\r\n this.matchSelectWidth = true;\r\n this.outputAs = SelectOutputValueTypeEnum.Object;\r\n this.dependsOn = [];\r\n this.dependType = DependTypeEnum.All;\r\n this.suffixes = [];\r\n this.optionsToPrepend = [];\r\n this.optionsToAppend = [];\r\n this.options = [];\r\n this.exceptOptions = [];\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Select.\r\n protected getCommonSelectValidators(): ValidatorFn[] {\r\n const validators = this.getCommonValidators();\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các custom validation có thể dùng cho Select.\r\n protected getCustomSelectValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonSelectValidators();\r\n const customValidators = this.getCustomSelectValidators();\r\n return new FormControl(this.value ?? \"\", [\r\n ...commonValidators,\r\n ...customValidators,\r\n ]);\r\n }\r\n\r\n abstract override getDefaultValue(): K;\r\n\r\n abstract override toFormValue(modelValue: unknown): K;\r\n\r\n override getErrorMessage(\r\n errorKey: string,\r\n errorValue: any,\r\n allFields: BaseField<any>[],\r\n ): string {\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","import { FieldTypeEnum } from '../../../enums/fields';\r\nimport { SelectBaseField } from './select-base-field.model';\r\n\r\nconst DEFAULT_SINGLE_SELECT_VALUE = null;\r\n\r\n/**\r\n * Interface của Select Field type là dạng Single.\r\n */\r\nexport class SingleSelectField extends SelectBaseField<string | Record<string, unknown> | null> {\r\n constructor(init: Partial<SingleSelectField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Single Select.\r\n */\r\n this.type = FieldTypeEnum.SingleSelect;\r\n this.value = DEFAULT_SINGLE_SELECT_VALUE;\r\n this.initialValue = DEFAULT_SINGLE_SELECT_VALUE;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | Record<string, unknown> | null {\r\n return DEFAULT_SINGLE_SELECT_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string | Record<string, unknown> | null {\r\n if (!modelValue) return null;\r\n const value = modelValue as string | Record<string, unknown>;\r\n\r\n if (typeof value === 'object') {\r\n const valueFromObj = value?.[this.bindValue];\r\n const typeOfValueFromObj = typeof valueFromObj;\r\n if (typeOfValueFromObj !== 'object') return String(valueFromObj);\r\n else {\r\n console.warn('Từ bindValue nhưng đối tượng vẫn là dạng object');\r\n return '';\r\n }\r\n }\r\n\r\n return String(value);\r\n }\r\n}\r\n","import { FieldTypeEnum } from '../../../enums/fields';\r\nimport { SelectBaseField } from './select-base-field.model';\r\n\r\nconst DEFAULT_MULTI_SELECT_VALUE: string[] = [];\r\n\r\n/**\r\n * Interface của Select Field type là dạng Multi.\r\n */\r\nexport class MultiSelectField extends SelectBaseField<string[] | Record<string, unknown>[]> {\r\n // Số lựa chọn (option) sẽ được hiển thị khi người dùng chọn nhiều.\r\n maxTagCount?: number;\r\n maxMultipleCount?: number;\r\n\r\n constructor(init: Partial<MultiSelectField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Multi Select.\r\n */\r\n this.type = FieldTypeEnum.MultiSelect;\r\n this.value = DEFAULT_MULTI_SELECT_VALUE;\r\n this.initialValue = DEFAULT_MULTI_SELECT_VALUE;\r\n this.maxTagCount = 53;\r\n this.maxMultipleCount = Infinity;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string[] | Record<string, unknown>[] {\r\n return DEFAULT_MULTI_SELECT_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string[] | Record<string, unknown>[] {\r\n const value = modelValue as string[] | Record<string, unknown>[];\r\n\r\n const optionsValue = value!.map((val: string | number | Record<string, unknown>) => {\r\n if (typeof val === 'object') {\r\n let transformVal = (val?.[this.bindValue] as string) ?? '';\r\n return transformVal;\r\n }\r\n return val as string;\r\n });\r\n\r\n return optionsValue;\r\n }\r\n}\r\n","import { FormControl } from '@angular/forms';\r\nimport { BaseField } from '../field.model';\r\nimport { DATE_FIELD_TYPES } from '../../../consts/fields';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\n\r\nexport type DateFieldType = (typeof DATE_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Interface base chung cho Các dạng Date.\r\n */\r\nexport abstract class BaseDateField<K> extends BaseField<K> {\r\n // Dạng date hiển thị.\r\n format: string;\r\n\r\n // Cho phép chọn ngày quá khứ?\r\n allowPastDates?: boolean;\r\n\r\n // Cho phép chọn ngày tương lai?\r\n allowFutureDates?: boolean;\r\n\r\n /**\r\n * Props validation chung cho các dạng Date.\r\n */\r\n\r\n constructor(init: Partial<BaseDateField<K>>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Date.\r\n */\r\n this.controlType = ControlTypeEnum.Date;\r\n\r\n this.allowPastDates = true;\r\n this.allowFutureDates = true;\r\n this.format = 'dd-MM-yyyy';\r\n\r\n // this.value = undefined;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonValidators();\r\n const customValidators = this.getCustomValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n abstract override getDefaultValue(): K;\r\n\r\n abstract override toFormValue(modelValue: unknown): K;\r\n}\r\n","/**\r\n * FIELD_TYPES là readonly ['input', 'select', 'checkbox',...]\r\n */\r\nexport const FIELD_TYPES = [\r\n \"input-text\",\r\n \"input-password\",\r\n \"input-formatted\",\r\n \"textarea\",\r\n \"date-picker\",\r\n \"date-range\",\r\n \"single-select\",\r\n \"tree-select\",\r\n \"multi-select\",\r\n \"single-file-upload\",\r\n \"multi-file-upload\",\r\n \"multi-image-upload\",\r\n \"avatar-upload\",\r\n \"checkbox\",\r\n \"radio\",\r\n \"reminder-type-radio\",\r\n \"switch\",\r\n \"autocomplete\",\r\n] as const;\r\n","/**\r\n * FIELD_TYPES là readonly ['input', 'select', 'checkbox',...]\r\n */\r\nexport const INPUT_FIELD_TYPES = ['text', 'email', 'password', 'number'] as const;\r\n","// Loại date field.\r\nexport const DATE_FIELD_TYPES = ['picker', 'range'] as const;\r\n\r\n// Các pattern dùng để check định dạng date.\r\nexport const FORMAT_DATE_PATTERNS = {\r\n YYYY_MM_DD: /^(\\d{4})([-\\/])(0[1-9]|1[0-2])\\2(0[1-9]|[12]\\d|3[01])$/,\r\n DD_MM_YYYY: /^(0[1-9]|[12]\\d|3[01])([-\\/])(0[1-9]|1[0-2])\\2(\\d{4})$/,\r\n MM_DD_YYYY: /^(0[1-9]|1[0-2])([-\\/])(0[1-9]|[12]\\d|3[01])\\2(\\d{4})$/,\r\n\r\n MM_DD_YYYY_HMS:\r\n /^(0[1-9]|1[0-2])([-\\/])(0[1-9]|[12]\\d|3[01])\\2(\\d{4})\\s([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)$/,\r\n};\r\n","import { Options } from \"@zeedhi/autonumeric\";\r\nimport { NumericPreset } from \"../../enums/fields/input-formatted-field.enum\";\r\n\r\nexport const BASE_OPTIONS: Partial<Options> = {\r\n modifyValueOnWheel: false,\r\n selectOnFocus: false,\r\n};\r\n\r\nexport const NUMERIC_PRESETS: Record<\r\n Exclude<NumericPreset, NumericPreset.Manual>,\r\n Partial<Options>\r\n> = {\r\n [NumericPreset.Integer]: {\r\n digitGroupSeparator: \".\",\r\n decimalCharacter: \",\",\r\n decimalPlaces: 0,\r\n minimumValue: \"0\",\r\n },\r\n\r\n [NumericPreset.Decimal]: {\r\n digitGroupSeparator: \".\",\r\n decimalCharacter: \",\",\r\n decimalPlaces: 2,\r\n minimumValue: \"0\",\r\n },\r\n\r\n [NumericPreset.Currency]: {\r\n digitGroupSeparator: \".\",\r\n decimalCharacter: \",\",\r\n decimalPlaces: 0,\r\n currencySymbol: \" ₫\",\r\n currencySymbolPlacement: \"s\",\r\n minimumValue: \"0\",\r\n },\r\n};\r\n","import { FORMAT_DATE_PATTERNS } from '../../consts/fields';\r\n\r\n// Chuyển đổi đối tượng Date thành string có format DDMMYYYY.\r\nexport const formatDateToDDMMYYYY = (date: Date, separator: '-' | '/' = '-'): string => {\r\n const dd = String(date.getDate()).padStart(2, '0');\r\n const mm = String(date.getMonth() + 1).padStart(2, '0');\r\n const yyyy = date.getFullYear();\r\n\r\n return `${dd}${separator}${mm}${separator}${yyyy}`;\r\n};\r\n\r\n// Chuyển đổi đối tượng Date thành string có format DDMMYYYY.\r\nexport const formatDateToYYYYMMDD = (date: Date, separator: '-' | '/' = '-'): string => {\r\n const dd = String(date.getDate()).padStart(2, '0');\r\n const mm = String(date.getMonth() + 1).padStart(2, '0');\r\n const yyyy = date.getFullYear();\r\n\r\n return `${yyyy}${separator}${mm}${separator}${dd}`;\r\n};\r\n\r\n// Chuyển đổi string ở các dạng: YYYY-MM-DD, DD-MM-YYYY, MM-DD-YYYY đến Date, nếu sẵn là Date thì mặc định không đổi.\r\nexport const normalizeToDate = (input: string | Date | undefined): Date | null => {\r\n if (!input) return null;\r\n\r\n if (input instanceof Date && !isNaN(input.getTime())) return input;\r\n if (typeof input !== 'string') return null;\r\n\r\n const inputTrimed = input.trim();\r\n\r\n let match: RegExpMatchArray | null;\r\n let year: number, month: number, day: number;\r\n let hour = 0,\r\n minute = 0,\r\n second = 0;\r\n\r\n if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.YYYY_MM_DD))) {\r\n year = +match[1];\r\n month = +match[3] - 1;\r\n day = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.DD_MM_YYYY))) {\r\n day = +match[1];\r\n month = +match[3] - 1;\r\n year = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.MM_DD_YYYY))) {\r\n month = +match[1] - 1;\r\n day = +match[3];\r\n year = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.MM_DD_YYYY_HMS))) {\r\n month = +match[1] - 1;\r\n day = +match[3];\r\n year = +match[4];\r\n hour = +match[5];\r\n minute = +match[6];\r\n second = +match[7];\r\n } else {\r\n console.warn('Sai định dạng chuỗi date');\r\n return null;\r\n }\r\n\r\n const date = new Date(year, month, day, hour, minute, second);\r\n\r\n if (\r\n date.getFullYear() === year &&\r\n date.getMonth() === month &&\r\n date.getDate() === day &&\r\n date.getHours() === hour &&\r\n date.getMinutes() === minute &&\r\n date.getSeconds() === second\r\n ) {\r\n return date;\r\n }\r\n\r\n console.warn('Ngày hoặc giờ không hợp lệ');\r\n return null;\r\n};\r\n\r\nexport const normalizeToDate1 = (input: string | Date | undefined): Date | null => {\r\n if (input) {\r\n if (input instanceof Date && !isNaN(input.getTime())) return input;\r\n if (typeof input !== 'string') return null;\r\n const inputTrimed = String(input).trim();\r\n let match: RegExpMatchArray | null;\r\n let year: number, month: number, day: number;\r\n if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.YYYY_MM_DD))) {\r\n year = +match[1];\r\n month = +match[3] - 1;\r\n day = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.DD_MM_YYYY))) {\r\n day = +match[1];\r\n month = +match[3] - 1;\r\n year = +match[4];\r\n } else if ((match = inputTrimed.match(FORMAT_DATE_PATTERNS.MM_DD_YYYY))) {\r\n month = +match[1] - 1;\r\n day = +match[3];\r\n year = +match[4];\r\n } else {\r\n console.warn('Sai định dạng chuỗi date');\r\n return null;\r\n }\r\n const date = new Date(year, month, day); // Validate: kiểm tra lại giá trị date (28/29/30/31 hợp lệ)\r\n if (date.getFullYear() === year && date.getMonth() === month && date.getDate() === day) {\r\n return date;\r\n } else {\r\n console.warn('Ngày đưa vào không hợp lệ');\r\n return null;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\n// Tạo danh sách năm chạy ngược từ hiện tại đến năm chỉ định.\r\nexport const generateYearsDesc = (from: number): number[] => {\r\n const currentYear = new Date().getFullYear();\r\n const years: number[] = [];\r\n for (let year = currentYear; year >= from; year--) {\r\n years.push(year);\r\n }\r\n return years;\r\n};\r\n\r\n// Tạo danh sách năm chạy từ năm chỉ định đến năm hiện tại.\r\nexport const generateYearsAsc = (from: number): number[] => {\r\n const currentYear = new Date().getFullYear();\r\n const years: number[] = [];\r\n for (let year = from; year <= currentYear; year++) {\r\n years.push(year);\r\n }\r\n return years;\r\n};\r\n","import { DatePickerOutputValueTypeEnum } from '../../../enums/common';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { normalizeToDate } from '../../../utils/date';\r\nimport { DatePickerOutputValueType } from '../../common';\r\nimport { BaseDateField } from './base-date-field.model';\r\n\r\nconst DEFAULT_DATE_PICKER_VALUE = '';\r\n\r\n/**\r\n * Interface của Date type là Picker.\r\n */\r\nexport class DatePickerField extends BaseDateField<string | Date | null> {\r\n // Dữ liệu sẽ gửi từ form khi submit.\r\n outputAs!: DatePickerOutputValueType;\r\n\r\n // Custom function to disable dates\r\n disabledDateFn?: (current: Date) => boolean;\r\n\r\n constructor(init: Partial<DatePickerField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Date picker.\r\n */\r\n this.type = FieldTypeEnum.DatePicker;\r\n this.value = DEFAULT_DATE_PICKER_VALUE;\r\n this.initialValue = DEFAULT_DATE_PICKER_VALUE;\r\n this.outputAs = DatePickerOutputValueTypeEnum.String;\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | Date {\r\n return DEFAULT_DATE_PICKER_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): Date | null {\r\n const value = modelValue as string | Date;\r\n\r\n if (!value) return null;\r\n\r\n return normalizeToDate(value);\r\n }\r\n}\r\n","import { DateRangeOutputValueTypeEnum } from \"../../../enums/common\";\r\nimport { FieldTypeEnum } from \"../../../enums/fields\";\r\nimport { normalizeToDate } from \"../../../utils/date\";\r\nimport { DateRangeOutputValueType } from \"../../common\";\r\nimport { BaseDateField } from \"./base-date-field.model\";\r\n\r\nconst DEFAULT_DATE_RANGE_VALUE: string[] | Date[] = [];\r\n\r\n/**\r\n * Interface của Date type là Range.\r\n */\r\nexport class DateRangeField extends BaseDateField<string | string[] | Date[]> {\r\n // Dữ liệu sẽ gửi từ form khi submit.\r\n outputAs!: DateRangeOutputValueType;\r\n\r\n // Placeholder cho Date range (mảng gồm ngày bắt đầu và kết thúc)\r\n placeholders?: string[];\r\n\r\n constructor(init: Partial<DateRangeField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Date range.\r\n */\r\n this.type = FieldTypeEnum.DateRange;\r\n this.value = DEFAULT_DATE_RANGE_VALUE;\r\n this.initialValue = DEFAULT_DATE_RANGE_VALUE;\r\n this.outputAs = DateRangeOutputValueTypeEnum.StringArray;\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string[] | Date[] {\r\n return DEFAULT_DATE_RANGE_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string[] | Date[] {\r\n let value = modelValue as string | string[] | Date[];\r\n\r\n if (typeof value === \"string\") {\r\n value = value.split(\",\").map((dateStr) => dateStr.trim());\r\n }\r\n\r\n let dateRange: Date[] = [];\r\n\r\n if (value?.length === 2) {\r\n const startDate = normalizeToDate(value[0]);\r\n const endDate = normalizeToDate(value[1]);\r\n if (startDate && endDate) dateRange = [startDate, endDate];\r\n }\r\n return dateRange;\r\n }\r\n}\r\n","import { FormControl, ValidatorFn } from '@angular/forms';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { BaseField } from '../field.model';\r\nimport { UPLOAD_FIELD_TYPES } from '../../../consts/fields/upload-field.const';\r\nimport { ApiConfig, ApiFileConfig, UploadOutputValueType } from '../../common';\r\nimport {\r\n acceptedMimeTypesValidator,\r\n getDefaultAcptMimeTypesErrorMessage,\r\n getDefaultMaxSizeInMBErrorMessage,\r\n maxFileSizeInMBValidator,\r\n} from '../../../utils/validators';\r\nimport { DEFAULT_ACCEPTED_MIME_TYPES } from '../../../consts/common';\r\nimport { CustomValidaterEnum } from '../../../enums/validators';\r\nimport { getExtensions } from '../../../utils/file';\r\nimport { UploadOutputValueTypeEnum } from '../../../enums/common';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\n\r\nexport type UploadFieldType = (typeof UPLOAD_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Interface base chung cho Các dạng Date.\r\n */\r\nexport abstract class BaseUploadField<K> extends BaseField<K> {\r\n // Dữ liệu sẽ gửi từ form khi submit.\r\n outputAs!: UploadOutputValueType;\r\n\r\n // Config api file liên quan: upload, delete.\r\n apiFileConfig: ApiFileConfig;\r\n\r\n // Các loại mimetypes được chấp nhận.\r\n acceptedMimeTypes: string[];\r\n\r\n // Kích thước tối đa của tập tin tải lên tính bằng MB.\r\n maxSizeInMB: number;\r\n\r\n // Hiển thị thông tin hướng dẫn các định dạng file được phép upload theo config của acceptedMimeTypes\r\n showAcceptedExtensionGuide: boolean;\r\n\r\n // Mở/tắt cơ chế upload tạm.\r\n uploadTemp: boolean;\r\n\r\n /**\r\n * Props validation chung cho các dạng Date.\r\n */\r\n\r\n constructor(init: Partial<BaseUploadField<K>>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Date.\r\n */\r\n this.controlType = ControlTypeEnum.Upload;\r\n this.outputAs = UploadOutputValueTypeEnum.Object;\r\n this.apiFileConfig = {\r\n uploadUrl: '',\r\n deleteUrl: '',\r\n };\r\n this.acceptedMimeTypes = DEFAULT_ACCEPTED_MIME_TYPES;\r\n this.maxSizeInMB = 25;\r\n this.showAcceptedExtensionGuide = true;\r\n this.uploadTemp = true;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi angular cho Input Password.\r\n protected getCustomBaseUploadValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n\r\n // Kiểm tra xem file tải lên có type nằm trong mảng acceptedMimeTypes đã chỉ định hay không.\r\n if (this.acceptedMimeTypes?.length > 0)\r\n validators.push(acceptedMimeTypesValidator(this.acceptedMimeTypes));\r\n\r\n // Kiểm tra kích thước tối đa mà file tải lên được cho phép.\r\n validators.push(maxFileSizeInMBValidator(this.maxSizeInMB));\r\n\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonValidators();\r\n const customValidators = this.getCustomBaseUploadValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n abstract override getDefaultValue(): K;\r\n\r\n abstract override toFormValue(modelValue: unknown): K;\r\n\r\n override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n // Lấy error message mặc định của acceptedMimeTypes.\r\n if (errorKey === CustomValidaterEnum.AcceptedMimiTypes) {\r\n const typeString = getExtensions(this.acceptedMimeTypes).join(', ');\r\n return getDefaultAcptMimeTypesErrorMessage(typeString);\r\n }\r\n\r\n // Lấy error message mặc định của maxSizeInMB.\r\n if (errorKey === CustomValidaterEnum.MaxSizeInMB) {\r\n return getDefaultMaxSizeInMBErrorMessage(this.maxSizeInMB);\r\n }\r\n\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","import { FieldTypeEnum } from '../../../enums/fields';\r\nimport { Suffix } from '../../common/common.model';\r\nimport { BaseUploadField } from './base-upload-field.model';\r\n\r\nconst DEFAULT_SINGLE_FILE_UPLOAD_VALUE = '';\r\n\r\n/**\r\n * Interface của Single file upload. Đầu vào có thể là chuỗi JSON hoặc đối tượng File.\r\n */\r\nexport class SingleFileUploadField extends BaseUploadField<string | File> {\r\n suffixes: Suffix[];\r\n constructor(init: Partial<SingleFileUploadField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Single file upload.\r\n */\r\n\r\n this.type = FieldTypeEnum.SingleFileUpload;\r\n this.value = DEFAULT_SINGLE_FILE_UPLOAD_VALUE;\r\n this.initialValue = DEFAULT_SINGLE_FILE_UPLOAD_VALUE;\r\n this.suffixes = [];\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | File {\r\n return DEFAULT_SINGLE_FILE_UPLOAD_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string {\r\n return String(modelValue);\r\n }\r\n}\r\n","import { BaseUploadField } from './base-upload-field.model';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\n\r\nconst DEFAULT_MULTI_FILE_UPLOAD_VALUE = '';\r\n\r\n/**\r\n * Interface của Multi file upload.\r\n */\r\nexport class MultiFileUploadField extends BaseUploadField<string | File> {\r\n // Số lượng tập tin tối đa có thể tải lên.\r\n maxFileCount: number;\r\n\r\n constructor(init: Partial<MultiFileUploadField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Multi file upload.\r\n */\r\n this.type = FieldTypeEnum.MultiFileUpload;\r\n this.value = DEFAULT_MULTI_FILE_UPLOAD_VALUE;\r\n this.initialValue = DEFAULT_MULTI_FILE_UPLOAD_VALUE;\r\n this.maxFileCount = 6;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | File {\r\n return DEFAULT_MULTI_FILE_UPLOAD_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string | File {\r\n return String(modelValue);\r\n }\r\n}\r\n","import { BaseUploadField } from \"./base-upload-field.model\";\r\nimport { FieldTypeEnum } from \"../../../enums/fields\";\r\n\r\nconst DEFAULT_MULTI_IMAGE_UPLOAD_VALUE = \"\";\r\n\r\n/**\r\n * Interface của Multi image upload.\r\n */\r\nexport class MultiImageUploadField extends BaseUploadField<string | File> {\r\n // Số lượng hình ảnh tối đa có thể tải lên.\r\n maxFileCount: number;\r\n\r\n // Độ dài card bao image.\r\n imageCardWidth: string;\r\n\r\n // Độ cao card bao image.\r\n imageCardHeight: string;\r\n\r\n constructor(init: Partial<MultiImageUploadField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Multi image upload.\r\n */\r\n this.type = FieldTypeEnum.MultiImageUpload;\r\n this.value = DEFAULT_MULTI_IMAGE_UPLOAD_VALUE;\r\n this.initialValue = DEFAULT_MULTI_IMAGE_UPLOAD_VALUE;\r\n this.maxFileCount = 6;\r\n this.imageCardWidth = \"108px\";\r\n this.imageCardHeight = \"108px\";\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | File {\r\n return DEFAULT_MULTI_IMAGE_UPLOAD_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: string | File): string {\r\n return String(modelValue);\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface DynamicFormConfig {\r\n prefix: string;\r\n mainApiUrl: string;\r\n systemApiUrl: string;\r\n portalApiUrl: string;\r\n storageUrl: string;\r\n}\r\n\r\nexport const DYNAMIC_FORM_CONFIG = new InjectionToken<DynamicFormConfig>('DYNAMIC_FORM_CONFIG');\r\n","import { format } from 'date-fns';\r\n\r\nexport class FormUtils {\r\n public static makeFileNameEncode(str: string): string {\r\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a');\r\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, 'e');\r\n str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i');\r\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o');\r\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u');\r\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, 'y');\r\n str = str.replace(/đ/g, 'd');\r\n str = str.replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, 'A');\r\n str = str.replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, 'E');\r\n str = str.replace(/Ì|Í|Ị|Ỉ|Ĩ/g, 'I');\r\n str = str.replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, 'O');\r\n str = str.replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, 'U');\r\n str = str.replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, 'Y');\r\n str = str.replace(/Đ/g, 'D');\r\n str = str.replace(/\\u0300|\\u0301|\\u0303|\\u0309|\\u0323/g, ''); \r\n str = str.replace(/\\u02C6|\\u0306|\\u031B/g, ''); \r\n return str;\r\n }\r\n\r\n public static randomFileName(name: string): string {\r\n const ns = name.split('.');\r\n const extension = ns.pop();\r\n const encodedName = FormUtils.makeFileNameEncode(ns.join('.'));\r\n return `${encodedName}_${Math.floor(Math.random() * 90000) + 10000}.${extension}`.toLocaleLowerCase();\r\n }\r\n\r\n public static convertViewDate(date: unknown, ft: string = 'dd/MM/yyyy'): string {\r\n let d: Date | null = null;\r\n if (date instanceof Date) {\r\n d = date;\r\n } else if (typeof date === 'string') {\r\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(date)) {\r\n d = new Date(date);\r\n } else if (/^\\d{2}\\/\\d{2}\\/\\d{4}\\s\\d{2}:\\d{2}:\\d{2}$/.test(date)) {\r\n const [datePart, timePart] = date.split(' ');\r\n const [month, day, year] = datePart.split('/').map(Number);\r\n const [hour, min, sec] = timePart.split(':').map(Number);\r\n d = new Date(year, month - 1, day, hour, min, sec);\r\n } else {\r\n const parsed = new Date(date);\r\n if (!isNaN(parsed.getTime())) {\r\n d = parsed;\r\n }\r\n }\r\n }\r\n return d && !isNaN(d.getTime()) ? format(d, ft) : '';\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { DYNAMIC_FORM_CONFIG } from '../config/dynamic-form.config';\r\nimport { FormUtils } from './form-utils';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FormConfigService {\r\n private config = inject(DYNAMIC_FORM_CONFIG);\r\n\r\n public handleApiUrlCreation(apiUrlFromApi: string, typeGrpCode?: string): string {\r\n if (!apiUrlFromApi) return '';\r\n let newApiUrl = '';\r\n const domain = apiUrlFromApi.split('/')[0];\r\n\r\n let newDomain = '';\r\n switch (domain.toLowerCase()) {\r\n case '{mainapiurl}':\r\n newDomain = this.config.mainApiUrl;\r\n break;\r\n case '{systemapiurl}':\r\n newDomain = this.config.systemApiUrl;\r\n break;\r\n case '{portalapiurl}':\r\n newDomain = this.config.portalApiUrl;\r\n break;\r\n default:\r\n newDomain = domain;\r\n }\r\n\r\n newApiUrl = apiUrlFromApi.replace(`${domain}/`, newDomain ? `${newDomain}/` : '');\r\n\r\n if (typeGrpCode) {\r\n newApiUrl = newApiUrl.replace('{ObjTypeGroupCode}', typeGrpCode);\r\n }\r\n\r\n return newApiUrl;\r\n }\r\n\r\n public generateRandomFileName(name: string, addition = ''): string {\r\n const encodedName = FormUtils.makeFileNameEncode(name);\r\n return `${this.config.prefix}_${addition || 'file'}_${\r\n Math.floor(Math.random() * 9000000000) + 1000000000\r\n }_${encodedName}`.toLocaleLowerCase();\r\n }\r\n\r\n public getViewFileUrl(fileName: string, isTemp: boolean = false): string {\r\n const type = isTemp ? 'temporary' : 'public';\r\n return `${this.config.storageUrl}${type}/${fileName}`;\r\n }\r\n\r\n public getStorageUrl(): string {\r\n return this.config.storageUrl;\r\n }\r\n}\r\n","import { BaseUploadField } from './base-upload-field.model';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { DEFAULT_ACCEPTED_IMAGE_MIME_TYPES } from '../../../consts/common';\r\n\r\nconst DEFAULT_AVATAR_UPLOAD_VALUE = '';\r\n\r\n/**\r\n * Interface của Avatar upload.\r\n */\r\nexport class AvatarUploadField extends BaseUploadField<string | Record<string, unknown>> {\r\n constructor(init: Partial<AvatarUploadField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Avatar upload.\r\n */\r\n\r\n this.type = FieldTypeEnum.AvatarUpload;\r\n this.value = DEFAULT_AVATAR_UPLOAD_VALUE;\r\n this.acceptedMimeTypes = DEFAULT_ACCEPTED_IMAGE_MIME_TYPES;\r\n this.initialValue = DEFAULT_AVATAR_UPLOAD_VALUE;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | Record<string, unknown> {\r\n return DEFAULT_AVATAR_UPLOAD_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string | Record<string, unknown> {\r\n return String(modelValue);\r\n }\r\n}\r\n","import { FieldTypeEnum } from '../../../enums/fields';\r\nimport { SelectBaseField } from './select-base-field.model';\r\n\r\nconst DEFAULT_TREE_SELECT_VALUE = null;\r\n\r\n/**\r\n * Interface của Select Field type là dạng Single.\r\n */\r\nexport class TreeSelectField extends SelectBaseField<string | Record<string, unknown> | null> {\r\n groupBy?: string;\r\n constructor(init: Partial<TreeSelectField>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Single Select.\r\n */\r\n this.type = FieldTypeEnum.TreeSelect;\r\n this.value = DEFAULT_TREE_SELECT_VALUE;\r\n this.initialValue = DEFAULT_TREE_SELECT_VALUE;\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n override getDefaultValue(): string | Record<string, unknown> | null {\r\n return DEFAULT_TREE_SELECT_VALUE;\r\n }\r\n\r\n override toFormValue(modelValue: unknown): string | Record<string, unknown> | null {\r\n if (!modelValue) return null;\r\n const value = modelValue as string | Record<string, unknown>;\r\n\r\n if (typeof value === 'object') {\r\n const valueFromObj = value?.[this.bindValue];\r\n const typeOfValueFromObj = typeof valueFromObj;\r\n if (typeOfValueFromObj !== 'object') return String(valueFromObj);\r\n else {\r\n console.warn('Từ bindValue nhưng đối tượng vẫn là dạng object');\r\n return '';\r\n }\r\n }\r\n\r\n return String(value);\r\n }\r\n}\r\n","import { computed, inject, Injectable, signal } from \"@angular/core\";\r\nimport { BaseField } from \"../models/fields/field.model\";\r\nimport { Extra, ObjField } from \"../models/common/obj-field.model\";\r\nimport { isValidJSON, lowerCaseFirstChar } from \"../utils/common\";\r\nimport { FieldTypeEnum } from \"../enums/fields\";\r\nimport { InputPasswordField, InputTextField } from \"../models/fields/input\";\r\nimport { TextareaField } from \"../models/fields/textarea/textarea-field.model\";\r\nimport { SingleSelectField } from \"../models/fields/select/single-select-field.model\";\r\nimport { MultiSelectField } from \"../models/fields/select/multi-select-field.model\";\r\nimport { DatePickerField, DateRangeField } from \"../models/fields/date\";\r\nimport { SingleFileUploadField } from \"../models/fields/upload/single-file-upload-field.model\";\r\nimport { MultiFileUploadField } from \"../models/fields/upload/multi-file-upload-field.model\";\r\nimport { FormGroup } from \"@angular/forms\";\r\nimport { MultiImageUploadField } from \"../models/fields/upload/multi-image-upload-field.model\";\r\nimport { FormConfigService } from \"./form-config.service\";\r\nimport { AvatarUploadField } from \"../models/fields/upload/avatar-upload-field.model\";\r\nimport { TreeSelectField } from \"../models/fields/select/tree-select-field.model\";\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class DynamicFormService {\r\n private formConfigService = inject(FormConfigService);\r\n\r\n /**\r\n * Lưu giữ FormGroup hiện tại của dynamic form.\r\n */\r\n private _formGroup!: FormGroup;\r\n\r\n // Lấy FormGroup.\r\n get formGroup() {\r\n return this._formGroup;\r\n }\r\n\r\n // Gán FormGroup.\r\n setFormGroup(formGroup: FormGroup) {\r\n this._formGroup = formGroup;\r\n }\r\n\r\n /**\r\n * Lưu giữ fields hiện tại của dynamic form.\r\n */\r\n private _fields!: BaseField<any>[];\r\n\r\n // Lấy fields.\r\n get fields() {\r\n return this._fields;\r\n }\r\n\r\n // Gán fields.\r\n setFields(fields: BaseField<any>[]) {\r\n this._fields = fields;\r\n }\r\n\r\n /**\r\n * Thao tác với control và fields cũng như output đầu ra của data form.\r\n */\r\n setFieldValue(fieldKey: string, rawValue: unknown) {\r\n const field = this.fields.find((f) => f.key === fieldKey);\r\n if (!field) return;\r\n\r\n const formValue = field.toFormValue(rawValue);\r\n this.formGroup.get(fieldKey)?.setValue(formValue);\r\n }\r\n\r\n /**\r\n * Signal để kích hoạt submit từ bên ngoài.\r\n */\r\n private readonly _submitTrigger = signal<{\r\n formId: string | null;\r\n time: number;\r\n } | null>(null);\r\n\r\n // Lấy signal để track vào effect.\r\n get submitTrigger() {\r\n return this._submitTrigger.asReadonly();\r\n }\r\n\r\n // Tiến hành submit.\r\n triggerSubmit(formId: string | null) {\r\n this._submitTrigger.set({ formId, time: Date.now() }); // trigger tạo theo formId.\r\n }\r\n\r\n /**\r\n * Signal để kích hoạt reset từ bên ngoài.\r\n */\r\n private readonly _resetTrigger = signal<{\r\n formId: string;\r\n time: number;\r\n } | null>(null);\r\n\r\n get resetTrigger() {\r\n return this._resetTrigger.asReadonly();\r\n }\r\n\r\n triggerReset(formId: string) {\r\n if (formId) this._resetTrigger.set({ formId, time: Date.now() });\r\n }\r\n\r\n /**\r\n * Tạo mảng fields đầu vào theo mảng data từ objField.\r\n */\r\n createFieldsByObjFields(\r\n objFields: ObjField[],\r\n formType: string,\r\n options?: {},\r\n ): BaseField<any>[] {\r\n let fields: BaseField<any>[] = [];\r\n\r\n // Nếu không tồn tại objFields hoặc objFields là mảng rỗng.\r\n if (!objFields || objFields.length === 0) return [];\r\n\r\n for (const objField of objFields) {\r\n // Bỏ qua những field không cấu hình.\r\n if (!objField?.extra) {\r\n continue;\r\n }\r\n\r\n // Nếu extra không phải chuỗi JSON hợp lệ.\r\n if (objField?.extra && !isValidJSON(objField?.extra)) {\r\n // console.warn(`Extra của field ${objField.code} không phải chuỗi dạng JSON`);\r\n continue;\r\n }\r\n\r\n const extra: Extra = JSON.parse(objField?.extra);\r\n if (!extra.form) {\r\n continue;\r\n }\r\n\r\n const form = extra.form;\r\n const { formTypes, configs } = form;\r\n\r\n if (!formTypes.includes(formType)) {\r\n // console.error(`Field '${objField.code}' không tồn tại formType '${formType}'`);\r\n continue;\r\n }\r\n\r\n const fieldConfig = configs?.[formType];\r\n if (!fieldConfig) {\r\n // console.error(`Field '${objField.code}' không có config field với formType '${formType}'`);\r\n continue;\r\n }\r\n\r\n const field = this.createFieldFromJson(fieldConfig, objField);\r\n if (field) {\r\n fields.push(field);\r\n } else {\r\n // console.error(`Field '${objField.code}' không có fieldType phù hợp`);\r\n continue;\r\n }\r\n }\r\n\r\n return fields.sort((a, b) => a.seqNum - b.seqNum);\r\n }\r\n\r\n private createFieldFromJson(\r\n fieldConfig: BaseField<any>,\r\n objField: ObjField,\r\n ): BaseField<any> | null {\r\n fieldConfig.key =\r\n fieldConfig?.key || lowerCaseFirstChar(objField.code) || \"\";\r\n fieldConfig.label = fieldConfig?.label || objField?.name || \"\";\r\n fieldConfig.groupCode = fieldConfig.groupCode ?? objField.viewType ?? \"\";\r\n fieldConfig.seqNum = fieldConfig.seqNum ?? objField.seqNum;\r\n fieldConfig.required = fieldConfig.required ?? objField.required === 3;\r\n\r\n const fieldType = fieldConfig.type;\r\n if (fieldType === FieldTypeEnum.InputText) {\r\n return new InputTextField({ ...(fieldConfig as InputTextField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.InputPassword) {\r\n return new InputPasswordField({ ...(fieldConfig as InputPasswordField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.Textarea) {\r\n return new TextareaField({ ...(fieldConfig as TextareaField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.SingleSelect) {\r\n const singleSelect = fieldConfig as SingleSelectField;\r\n if (!singleSelect.apiConfig) {\r\n singleSelect.apiConfig = {\r\n baseUrl: this.formConfigService.handleApiUrlCreation(\r\n objField.apiURL || \"\",\r\n objField.objTypeGroupCode,\r\n ),\r\n };\r\n }\r\n return new SingleSelectField({ ...singleSelect });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.MultiSelect) {\r\n const multiSelect = fieldConfig as MultiSelectField;\r\n if (!multiSelect.apiConfig) {\r\n multiSelect.apiConfig = {\r\n baseUrl: this.formConfigService.handleApiUrlCreation(\r\n objField.apiURL || \"\",\r\n objField.objTypeGroupCode,\r\n ),\r\n };\r\n }\r\n return new MultiSelectField({ ...multiSelect });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.TreeSelect) {\r\n const treeSelect = fieldConfig as TreeSelectField;\r\n if (!treeSelect.apiConfig) {\r\n treeSelect.apiConfig = {\r\n baseUrl: this.formConfigService.handleApiUrlCreation(\r\n objField.apiURL || \"\",\r\n objField.objTypeGroupCode,\r\n ),\r\n };\r\n }\r\n return new TreeSelectField({ ...treeSelect });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.DatePicker) {\r\n return new DatePickerField({ ...(fieldConfig as DatePickerField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.DateRange) {\r\n return new DateRangeField({ ...(fieldConfig as DateRangeField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.SingleFileUpload) {\r\n return new SingleFileUploadField({\r\n ...(fieldConfig as SingleFileUploadField),\r\n });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.MultiFileUpload) {\r\n return new MultiFileUploadField({\r\n ...(fieldConfig as MultiFileUploadField),\r\n });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.AvatarUpload) {\r\n return new AvatarUploadField({ ...(fieldConfig as AvatarUploadField) });\r\n }\r\n\r\n if (fieldType === FieldTypeEnum.MultiImageUpload) {\r\n return new MultiImageUploadField({\r\n ...(fieldConfig as MultiImageUploadField),\r\n });\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport {\r\n inject,\r\n Injectable,\r\n Signal,\r\n signal,\r\n WritableSignal,\r\n} from \"@angular/core\";\r\nimport { ApiResponse } from \"../models/common/api-response.model\";\r\nimport { LastChangedParent } from \"../models/common\";\r\nimport { BehaviorSubject, Observable, Subject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class FieldService {\r\n private httpClient = inject(HttpClient);\r\n\r\n // Options for dropdown.\r\n getAllOptions<T = Record<string, unknown>>(\r\n apiUrl: string,\r\n queryParams: Record<string, unknown>,\r\n ) {\r\n return this.httpClient.get<ApiResponse<T[]>>(apiUrl, {\r\n params: { ...(queryParams as { [key: string]: any }) },\r\n });\r\n }\r\n\r\n // =========================================================================\r\n // --- CODE CŨ (Sử dụng Signal cho luồng phụ thuộc) ---\r\n // =========================================================================\r\n private dependValuesMap = new Map<string, WritableSignal<string>>();\r\n\r\n updateDependValuesMap(key: string, value: string): void {\r\n if (!this.dependValuesMap.has(key)) {\r\n this.dependValuesMap.set(key, signal(value));\r\n return;\r\n }\r\n\r\n const fieldSignal = this.dependValuesMap.get(key)!;\r\n fieldSignal.set(value);\r\n }\r\n\r\n getDependValuesMap(): Map<string, Signal<string>> {\r\n return this.dependValuesMap;\r\n }\r\n\r\n // =========================================================================\r\n // --- CODE MỚI (Sử dụng RxJS BehaviorSubject cho luồng phụ thuộc) ---\r\n // =========================================================================\r\n // Giải thích kiến trúc mới:\r\n // - Dùng BehaviorSubject vì nó lưu lại giá trị cuối cùng. Khi một field Con\r\n // được khởi tạo sau field Cha và subscribe vào, nó sẽ lập tức nhận được\r\n // giá trị hiện hành thay vì phải chờ Cha thay đổi lần nữa.\r\n // - Cách này giúp thiết lập luồng dữ liệu dạng Push, rất dễ dàng kết hợp\r\n // với rxResource hoặc switchMap ở phía Component Con để triệt tiêu lỗi Race-condition.\r\n\r\n private dependValuesSubjectMap = new Map<\r\n string,\r\n BehaviorSubject<string | null>\r\n >();\r\n\r\n /**\r\n * Bắn (Emit) giá trị thay đổi của một trường Parent vào stream.\r\n * Sẽ được gọi bởi Component đóng vai trò là Cha (isParent = true).\r\n */\r\n emitDependValueChange(key: string, value: string): void {\r\n if (!this.dependValuesSubjectMap.has(key)) {\r\n this.dependValuesSubjectMap.set(\r\n key,\r\n new BehaviorSubject<string | null>(value),\r\n );\r\n return;\r\n }\r\n\r\n // Nếu đã có stream, đẩy giá trị mới vào ống nước.\r\n this.dependValuesSubjectMap.get(key)!.next(value);\r\n }\r\n\r\n /**\r\n * Trả về Observable của một trường để các Component Con có thể subscribe/nghe ngóng.\r\n * Sẽ được gọi bởi các Component có chứa `dependsOn`.\r\n */\r\n getDependValueChanges$(key: string): Observable<string | null> {\r\n if (!this.dependValuesSubjectMap.has(key)) {\r\n // Đề phòng trường hợp Con subscribe trước khi Cha khởi tạo (hoặc Cha chưa patch value)\r\n // Ta tạo sẵn một ống nước rỗng với giá trị ban đầu là null.\r\n this.dependValuesSubjectMap.set(\r\n key,\r\n new BehaviorSubject<string | null>(null),\r\n );\r\n }\r\n return this.dependValuesSubjectMap.get(key)!.asObservable();\r\n }\r\n\r\n // Signal lưu trữ đối tượng chứa các prop là fieldKey có isParent là true.\r\n private dependValues = signal<Record<string, string>>({});\r\n\r\n // Cập nhật giá trị theo key vào đối tượng của signal.\r\n updateDependValues(key: string, value: string): void {\r\n this.dependValues.update((curr) => ({ ...curr, [key]: value }));\r\n }\r\n // Xóa giá trị và loại bỏ key theo key khỏi đối tượng của signal.\r\n removeDependValues(key: string): void {\r\n this.dependValues.update(({ [key]: _, ...rest }) => rest);\r\n }\r\n\r\n getDependValues(): Record<string, string> {\r\n return this.dependValues();\r\n }\r\n\r\n clearDependValues(): void {\r\n this.dependValues.set({});\r\n }\r\n\r\n // Lấy trị trị theo key.\r\n getValueProp(key: string) {\r\n return this.dependValues()[key];\r\n }\r\n\r\n // Signal lưu giữ xem field có isParent gần nhất vừa change giá trị.\r\n private lastChangedParent = signal<LastChangedParent | null>(null);\r\n\r\n // Cập nhật key của parent gần nhất change.\r\n updateLastChangedParent(key: string, value: unknown): void {\r\n this.lastChangedParent.set({ key, value });\r\n }\r\n\r\n // Lấy ra key của parent gần nhất change.\r\n getLastChangedParent(): LastChangedParent | null {\r\n return this.lastChangedParent();\r\n }\r\n\r\n clearLastChangedParent(): void {\r\n this.lastChangedParent.set(null);\r\n }\r\n\r\n // Field change cho bên ngoài form\r\n private fieldChange = new Subject<{\r\n key: string;\r\n value: any;\r\n }>();\r\n\r\n fieldChange$ = this.fieldChange.asObservable(); // expose ra ngoài.\r\n\r\n onFieldChange(key: string, value: any) {\r\n this.fieldChange.next({\r\n key,\r\n value,\r\n });\r\n }\r\n}\r\n","import { Injectable, signal, untracked, WritableSignal } from '@angular/core';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FormDataService {\r\n // Lưu một hoặc nhiều form data.\r\n private formDataMap = new Map<string, WritableSignal<Record<string, unknown>>>();\r\n\r\n /**\r\n * Kiểm tra xem đã tồn tại form data với form id truyền vào.\r\n * @param formId Id của form.\r\n * @returns true nếu có và ngược lại\r\n */\r\n has(formId: string): boolean {\r\n if (!this.formDataMap.has(formId)) return false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Cập nhật giá trị của một hoặc nhiều field vào form data theo form id.\r\n * @param formId Id của form.\r\n * @param data Đối tượng các field theo dạng key:value.\r\n */\r\n patch(formId: string, data: Record<string, unknown>) {\r\n // Lấy form data từ formDataMap.\r\n let formData = this.formDataMap.get(formId);\r\n\r\n // Nếu chưa có form data trong formDataMap thì thêm mới. Ngược lại cập nhật field data vào formData.\r\n if (!formData) {\r\n formData = signal(data);\r\n } else {\r\n formData.update(curr => ({ ...curr, ...data }));\r\n }\r\n\r\n // Tiến hành cập nhật vào formDataMap.\r\n this.formDataMap.set(formId, formData);\r\n }\r\n\r\n /**\r\n * Gán form data theo form id.\r\n * @param formId Id của form.\r\n * @param data Đối tượng các field theo dạng key:value.\r\n */\r\n set(formId: string, data: Record<string, unknown>) {\r\n this.formDataMap.set(formId, signal(data));\r\n }\r\n\r\n /**\r\n * Lấy giá trị của form data theo form id có track signal.\r\n * @param formId Id của form.\r\n * @returns Record<string, unknown> nếu có giá trị. Ngược lại undefined.\r\n */\r\n get(formId: string): Record<string, unknown> | undefined {\r\n const formData = this.formDataMap.get(formId);\r\n\r\n if (!formData) return undefined;\r\n\r\n return formData();\r\n }\r\n\r\n /**\r\n * Lấy giá trị của form data theo form id không track signal.\r\n * @param formId Id của form.\r\n * @returns Record<string, unknown> nếu có giá trị. Ngược lại undefined.\r\n */\r\n getSnapshot(formId: string): Record<string, unknown> | undefined {\r\n const formData = this.formDataMap.get(formId);\r\n\r\n if (!formData) return undefined;\r\n\r\n return untracked(() => formData());\r\n }\r\n\r\n /**\r\n * Clear giá trị form data theo form id. Clear chứ không xóa khỏi formDataMap hoàn toàn.\r\n * @param formId Id của form.\r\n */\r\n clear(formId: string) {\r\n let formData = this.formDataMap.get(formId);\r\n\r\n if (formData) {\r\n formData.set({});\r\n this.formDataMap.set(formId, formData);\r\n }\r\n }\r\n\r\n /**\r\n * Delete form data theo form id khỏi formDataMap.\r\n * @param formId Id của form.\r\n */\r\n delete(formId: string) {\r\n let formData = this.formDataMap.get(formId);\r\n if (formData) this.formDataMap.delete(formId);\r\n }\r\n\r\n /**\r\n *\r\n * @param formId Id của form.\r\n * @param key mã trường trong object form data.\r\n * @returns unknown.\r\n */\r\n getFieldValue(formId: string, key: string): unknown {\r\n let formData = this.formDataMap.get(formId);\r\n let fieldValue: unknown = undefined;\r\n\r\n if (formData) {\r\n fieldValue = formData()?.[key];\r\n }\r\n\r\n return fieldValue;\r\n }\r\n}\r\n","import {\r\n computed,\r\n Directive,\r\n inject,\r\n input,\r\n Input,\r\n untracked,\r\n signal,\r\n effect,\r\n} from \"@angular/core\";\r\nimport { AbstractControl, ControlValueAccessor } from \"@angular/forms\";\r\nimport { Subject, takeUntil } from \"rxjs\";\r\nimport { FormMode } from \"../models/form\";\r\nimport { FormModeEnum } from \"../enums/form\";\r\nimport { DynamicFormService } from \"../services/dynamic-form.service\";\r\nimport { FieldService } from \"../services/field.service\";\r\nimport { LastChangedParent } from \"../models/common\";\r\nimport { BaseField } from \"../models/fields/field.model\";\r\nimport { ViewModeEnum } from \"../enums/common\";\r\nimport { FormDataService } from \"../services/form-data.service\";\r\n\r\n@Directive() // Dùng @Directive vì class này không có template riêng\r\nexport abstract class BaseValueAccessor<T> implements ControlValueAccessor {\r\n // Control theo dạng field lấy từ reactive form.\r\n @Input({ required: true }) formId!: string;\r\n\r\n readonly fieldInput = input.required<BaseField<T>>();\r\n protected readonly fieldKey = untracked(() =>\r\n computed<string>(() => this.fieldInput().key),\r\n );\r\n\r\n @Input({ required: false }) control: AbstractControl<T> | null = null;\r\n\r\n // Chế độ form: Add, Edit, View...\r\n readonly modeSignal = input<FormMode>(FormModeEnum.Add);\r\n\r\n readonly isAdd = computed(() => this.modeSignal() === \"add\");\r\n readonly isEdit = computed(() => this.modeSignal() === \"edit\");\r\n readonly isView = computed(() => this.modeSignal() === \"view\");\r\n readonly isAddOrEdit = computed(() =>\r\n [\"add\", \"edit\"].includes(this.modeSignal()),\r\n );\r\n readonly isEditOrView = computed(() =>\r\n [\"edit\", \"view\"].includes(this.modeSignal()),\r\n );\r\n\r\n protected readonly formModeEnum = FormModeEnum;\r\n protected readonly viewModeEnum = ViewModeEnum;\r\n\r\n protected readonly destroy$ = new Subject<void>();\r\n\r\n // Dành cho ControlValueAccessor.\r\n protected value: T | null = null;\r\n protected readonly valueSignal = signal<T | null>(null);\r\n protected onChange: (value: T | null) => void = () => {};\r\n protected onTouched: () => void = () => {};\r\n protected isDisabled = false;\r\n protected readonly disabledSignal = signal(false); // Đang có select dùng isDisableSignal nên sau này đồng bộ lại.\r\n\r\n protected dFormService = inject(DynamicFormService);\r\n protected formDataService = inject(FormDataService);\r\n protected fieldService = inject(FieldService);\r\n\r\n private readonly resetEffect = effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n\r\n // Dành cho UI\r\n protected readonly viewMode = computed(() => this.fieldInput().viewMode);\r\n\r\n protected readonly displayPlaceholder = computed(() => {\r\n if (!this.isAddOrEdit()) return \"\";\r\n\r\n const placeholder = this.fieldInput()?.placeholder;\r\n if (placeholder) return placeholder;\r\n\r\n return this.resolvePlaceholderText();\r\n });\r\n\r\n // 2. Hàm sinh text mặc định (Component con có thể override hàm này)\r\n protected resolvePlaceholderText(): string {\r\n return \"Nhập dữ liệu\";\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n protected takeUntilDestroy<T>() {\r\n return takeUntil<T>(this.destroy$);\r\n }\r\n\r\n writeValue(value: T | null): void {\r\n this.value = value;\r\n this.valueSignal.set(value);\r\n this.writeValueToView(value); // 👈 component con override nếu cần.\r\n }\r\n\r\n registerOnChange(fn: (value: T | 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.isDisabled = isDisabled;\r\n this.disabledSignal.set(isDisabled);\r\n this.setDisabledOnView(isDisabled);\r\n }\r\n\r\n protected propagateValue(value: T | null): void {\r\n this.value = value;\r\n this.valueSignal.set(value);\r\n this.fieldService.onFieldChange(this.fieldKey(), value);\r\n this.onChange(this.value);\r\n // Khi thay đổi value.\r\n this.handleValueChange(value);\r\n }\r\n\r\n // Xử lý reset chung ban đầu.\r\n protected reset(): void {\r\n if (!this.control || !this.isAddOrEdit()) return;\r\n const baseField = untracked(() => this.fieldInput());\r\n this.control.reset(baseField.initialValue as T);\r\n }\r\n\r\n /**\r\n * Thêm dữ liệu ở từng dạng field vào form data theo form id cụ thể.\r\n * @param key Mã của field.\r\n * @param value Giá trị của field.\r\n */\r\n protected patchFormData(key: string, value: T | null): void {\r\n this.formDataService.patch(this.formId, { [key]: value });\r\n }\r\n\r\n // Update data ở từng prop vào dependValuesSignal. Cơ chế nếu falsy thì không được phép cho vào dependValuesSignal.\r\n protected updateDependValues(key: string, value: string): void {\r\n this.fieldService.removeDependValues(key);\r\n if (value) {\r\n this.fieldService.updateDependValues(key, value);\r\n }\r\n }\r\n\r\n // Đánh dấu field có isParent là true vừa thay đổi.\r\n protected updateLastChangedParent(key: string, value: unknown): void {\r\n this.fieldService.updateLastChangedParent(key, value);\r\n }\r\n\r\n protected disableAndResetControl(): void {\r\n this.control?.reset();\r\n this.control?.disable();\r\n }\r\n\r\n protected disableControl(): void {\r\n this.control?.disable();\r\n }\r\n\r\n protected enableControl(): void {\r\n this.control?.enable();\r\n }\r\n\r\n protected resetControl(): void {\r\n this.control?.reset();\r\n }\r\n\r\n /**\r\n * Optional: để component override riêng.\r\n */\r\n // Xử lý giao diện khi ghi giá trị mới.\r\n protected writeValueToView(value: T | null): void {}\r\n\r\n // Khi value change.\r\n protected handleValueChange(value: T | null): void {}\r\n\r\n // Xử lý giao diện khi ghi thay đổi giá trị isDisabled.\r\n protected setDisabledOnView(isDisabled: boolean): void {}\r\n\r\n // Xử lý các logic riêng của reset ở add mode.\r\n protected resetForAdd(): void {}\r\n\r\n // Xử lý các logic riêng của reset ở edit mode.\r\n protected resetForEdit(): void {}\r\n\r\n // Xử lý các logic riêng chung cuối cùng.\r\n protected finalizeReset(): void {}\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n forwardRef,\r\n untracked,\r\n} from \"@angular/core\";\r\nimport { FORM_MODULES } from \"../../../../consts/common\";\r\nimport { NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\nimport { BaseValueAccessor } from \"../../../../base/base-value-accessor\";\r\nimport { DatePickerField } from \"../../../../models/fields/date/date-picker-field.model\";\r\n\r\nimport { differenceInCalendarDays } from \"date-fns\";\r\nimport { DatePickerOutputValueTypeEnum } from \"../../../../enums/common\";\r\nimport {\r\n formatDateToDDMMYYYY,\r\n formatDateToYYYYMMDD,\r\n} from \"../../../../utils/date\";\r\nimport { DatePickerOutputValueType } from \"../../../../models/common/output-value-type.model\";\r\nimport { NO_INFO_TEXT } from \"../../../../consts/common/common.const\";\r\nimport { FieldTypeEnum } from \"../../../../enums/fields\";\r\nimport { ControlTypeEnum } from \"../../../../enums/controls\";\r\nimport { NzDatePickerModule } from \"ng-zorro-antd/date-picker\";\r\nimport { NzInputModule } from \"ng-zorro-antd/input\";\r\nimport { FormUtils } from \"../../../../services/form-utils\";\r\nimport { createDatePickerPlaceholder } from \"../../../../utils/dynamic-form/dynamic-form\";\r\n\r\nconst ZORRO_MODULES = [NzDatePickerModule, NzInputModule];\r\n\r\n@Component({\r\n selector: \"app-date-picker\",\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES],\r\n templateUrl: \"./date-picker.component.html\",\r\n styleUrls: [\"./date-picker.component.scss\"],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DatePickerComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DatePickerComponent extends BaseValueAccessor<string | Date> {\r\n readonly field = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof DatePickerField) ||\r\n (base.type !== FieldTypeEnum.DatePicker &&\r\n base.controlType !== ControlTypeEnum.Date)\r\n ) {\r\n throw new Error(\"Expected DatePickerField\");\r\n }\r\n return base;\r\n });\r\n\r\n // Định dạng ngày\r\n format = computed(() => {\r\n return this.field().format ?? \"dd-MM-yyyy\";\r\n });\r\n\r\n // Kiểm tra có cho phép chọn ngày quá khứ hay ngày tương lai hay không?\r\n disabledDate = computed(() => {\r\n const field = this.field();\r\n\r\n return (current: Date): boolean => {\r\n if (field.disabledDateFn) {\r\n return field.disabledDateFn(current);\r\n }\r\n const today = new Date();\r\n const diff = differenceInCalendarDays(current, today);\r\n\r\n // if (field.onlyToday) return diff !== 0;\r\n if (!field.allowPastDates && diff < 0) return true;\r\n if (!field.allowFutureDates && diff > 0) return true;\r\n\r\n return false;\r\n };\r\n });\r\n\r\n readonly viewDisplayValue = computed(() => {\r\n // 1. Nếu không phải View thì không cần quan tâm text này\r\n if (!this.isView()) return \"\";\r\n\r\n // 2. Lấy giá trị từ valueSignal\r\n const val = this.valueSignal() as Date;\r\n return val ? FormUtils.convertViewDate(val, this.format()) : NO_INFO_TEXT;\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n // Xử lý tạo placeholder text tự động nếu chưa truyền placeholder vào config của field\r\n override resolvePlaceholderText(): string {\r\n return createDatePickerPlaceholder(this.field());\r\n }\r\n\r\n // Sự kiện khi người dùng chọn ngày\r\n handleChangeDate(date: Date): void {\r\n this.propagateValue(date);\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue\r\n protected override writeValueToView(value: Date): void {\r\n if (!this.isAddOrEdit()) return;\r\n\r\n const { outputAs } = this.field();\r\n\r\n this.fieldService.updateDependValuesMap(\r\n this.fieldKey(),\r\n value ? formatDateToYYYYMMDD(value) : \"\",\r\n );\r\n\r\n // Gán data vào đầu ra của form\r\n const newOutputValue = value && this.getValueByOutputAs(value, outputAs);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: Date): void {\r\n const { outputAs, isParent } = this.field();\r\n\r\n if (isParent) {\r\n this.fieldService.updateDependValuesMap(\r\n this.fieldKey(),\r\n value ? formatDateToYYYYMMDD(value) : \"\",\r\n );\r\n }\r\n\r\n // Gán data vào đầu ra của form\r\n const newOutputValue = value && this.getValueByOutputAs(value, outputAs);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Biến đổi giá trị đầu ra theo outputAs\r\n private getValueByOutputAs(\r\n date: Date,\r\n outputAs: DatePickerOutputValueType,\r\n ): string | Date {\r\n let value: string | Date = date;\r\n\r\n if (outputAs === DatePickerOutputValueTypeEnum.String) {\r\n value = formatDateToYYYYMMDD(value);\r\n }\r\n return value;\r\n }\r\n}\r\n","@if (modeSignal() === formModeEnum.View) {\r\n <input\r\n nz-input\r\n [value]=\"viewDisplayValue()\"\r\n [disabled]=\"true\"\r\n class=\"modeView\"\r\n />\r\n} @else {\r\n <nz-date-picker\r\n [id]=\"fieldKey()\"\r\n [class]=\"'w-100'\"\r\n [nzDisabled]=\"disabledSignal()\"\r\n [nzPlaceHolder]=\"displayPlaceholder()\"\r\n [nzFormat]=\"format()\"\r\n [nzDisabledDate]=\"disabledDate()\"\r\n [ngModel]=\"valueSignal()\"\r\n (ngModelChange)=\"handleChangeDate($event)\"\r\n >\r\n </nz-date-picker>\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n forwardRef,\r\n untracked,\r\n} from \"@angular/core\";\r\nimport { FORM_MODULES } from \"../../../../consts/common\";\r\nimport { NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\nimport { BaseValueAccessor } from \"../../../../base/base-value-accessor\";\r\nimport { DateRangeField } from \"../../../../models/fields/date/date-range-field.model\";\r\nimport { DateRangeOutputValueType } from \"../../../../models/common/output-value-type.model\";\r\nimport { DateRangeOutputValueTypeEnum } from \"../../../../enums/common\";\r\nimport { formatDateToYYYYMMDD, normalizeToDate } from \"../../../../utils/date\";\r\nimport { NO_INFO_TEXT } from \"../../../../consts/common/common.const\";\r\nimport { differenceInCalendarDays } from \"date-fns\";\r\nimport { FieldTypeEnum } from \"../../../../enums/fields\";\r\nimport { ControlTypeEnum } from \"../../../../enums/controls\";\r\nimport { NzDatePickerModule } from \"ng-zorro-antd/date-picker\";\r\nimport { NzInputModule } from \"ng-zorro-antd/input\";\r\n\r\nconst ZORRO_MODULES = [NzDatePickerModule, NzInputModule];\r\n\r\n@Component({\r\n selector: \"app-date-range\",\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES],\r\n templateUrl: \"./date-range.component.html\",\r\n styleUrls: [\"./date-range.component.scss\"],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DateRangeComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DateRangeComponent extends BaseValueAccessor<\r\n string | string[] | Date[]\r\n> {\r\n readonly field = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof DateRangeField) ||\r\n (base.type !== FieldTypeEnum.DateRange &&\r\n base.controlType !== ControlTypeEnum.Date)\r\n ) {\r\n throw new Error(\"Expected DatePickerField\");\r\n }\r\n return base;\r\n });\r\n\r\n // Định dạng ngày\r\n format = computed(() => {\r\n return this.field().format ?? \"dd-MM-yyyy\";\r\n });\r\n\r\n placeholders = computed(() => {\r\n return this.field().placeholders ?? [\"Ngày bắt đầu\", \"Ngày kết thúc\"];\r\n });\r\n\r\n // Nếu mảng date không lớn hơn 2\r\n displayValueNoInfo = NO_INFO_TEXT;\r\n\r\n // Kiểm tra có cho phép chọn ngày quá khứ hay ngày tương lai hay không?\r\n disabledDate = computed(() => {\r\n const field = this.field();\r\n return (current: Date): boolean => {\r\n const today = new Date();\r\n const diff = differenceInCalendarDays(current, today);\r\n\r\n // if (field.onlyToday) return diff !== 0;\r\n if (!field.allowPastDates && diff < 0) return true;\r\n if (!field.allowFutureDates && diff > 0) return true;\r\n\r\n return false;\r\n };\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n handleChangeDateRange(dateRange: Date[]): void {\r\n this.propagateValue(dateRange);\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: Date[]): void {\r\n if (!this.isAddOrEdit()) return;\r\n\r\n const { outputAs } = untracked(() => this.field());\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(\r\n this.fieldKey(),\r\n value.length > 0 ? this.getValueByOutputAs(value, outputAs) : null,\r\n );\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: Date[]): void {\r\n const { outputAs } = untracked(() => this.field());\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(\r\n this.fieldKey(),\r\n value.length > 0 ? this.getValueByOutputAs(value, outputAs) : null,\r\n );\r\n }\r\n\r\n // Xử lý output value đầu ra theo outputAs mà người dùng mong muốn.\r\n private getValueByOutputAs(\r\n dateRange: Date[],\r\n outputAs: DateRangeOutputValueType,\r\n ): string | string[] | Date[] {\r\n let value: string | string[] | Date[] = dateRange;\r\n\r\n if (dateRange.length > 0) {\r\n if (outputAs === DateRangeOutputValueTypeEnum.String) {\r\n value = `${formatDateToYYYYMMDD(dateRange[0])},${formatDateToYYYYMMDD(dateRange[1])}`;\r\n }\r\n\r\n if (outputAs === DateRangeOutputValueTypeEnum.StringArray) {\r\n value = [\r\n formatDateToYYYYMMDD(dateRange[0]),\r\n formatDateToYYYYMMDD(dateRange[1]),\r\n ];\r\n }\r\n }\r\n return value;\r\n }\r\n}\r\n","@if (modeSignal() === formModeEnum.View) {\r\n @if (valueSignal()!.length > 0) {\r\n <nz-range-picker\r\n [class]=\"'w-100'\"\r\n [nzFormat]=\"format()\"\r\n [nzDisabled]=\"true\"\r\n [ngModel]=\"valueSignal()\"\r\n class=\"modeView\"\r\n [nzSuffixIcon]=\"suffixIcon\"\r\n ></nz-range-picker>\r\n <ng-template #suffixIcon>\r\n <!-- Để trống, hoặc custom icon khác -->\r\n </ng-template>\r\n } @else {\r\n <input\r\n nz-input\r\n [value]=\"displayValueNoInfo\"\r\n [disabled]=\"true\"\r\n class=\"modeView\"\r\n />\r\n }\r\n} @else {\r\n <nz-range-picker\r\n [id]=\"fieldKey()\"\r\n class=\"w-100\"\r\n [nzDisabled]=\"disabledSignal()\"\r\n [nzFormat]=\"format()\"\r\n [nzDisabledDate]=\"disabledDate()\"\r\n [nzPlaceHolder]=\"placeholders()\"\r\n [ngModel]=\"valueSignal()\"\r\n (ngModelChange)=\"handleChangeDateRange($event)\"\r\n ></nz-range-picker>\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SuffixService {\r\n private suffixClick$ = new Subject<{ key: string; formId: string }>();\r\n\r\n suffixClick = this.suffixClick$.asObservable(); // expose ra ngoài.\r\n\r\n onSuffixClick(key: string, formId: string) {\r\n this.suffixClick$.next({ key, formId });\r\n }\r\n constructor() {}\r\n}\r\n","import { Component, inject, Input } from '@angular/core';\r\nimport { Suffix } from '../../../../models/common/common.model';\r\nimport { CORE_MODULES } from '../../../../consts/common';\r\nimport { SuffixService } from '../../../../services/suffix.service';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\n\r\nconst ZORRO_MODULES = [NzButtonModule, NzIconModule];\r\n\r\n@Component({\r\n selector: 'app-suffix',\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...ZORRO_MODULES],\r\n templateUrl: './suffix.component.html',\r\n styleUrl: './suffix.component.scss',\r\n})\r\nexport class SuffixComponent {\r\n @Input() suffixConfig!: Suffix;\r\n @Input() formId = '';\r\n\r\n protected defaultText = '';\r\n\r\n private suffixService = inject(SuffixService);\r\n\r\n ngOnInit(): void {\r\n this.defaultText = `Suffix ${this.suffixConfig.key}`;\r\n }\r\n\r\n handleSuffix(): void {\r\n this.suffixService.onSuffixClick(this.suffixConfig.key, this.formId);\r\n }\r\n}\r\n","<button\r\n nz-button\r\n nzType=\"primary\"\r\n nzSize=\"small\"\r\n [title]=\"suffixConfig.description\"\r\n class=\"h-100 suffix-btn font-size-12\"\r\n [ngClass]=\"suffixConfig.class ?? ''\"\r\n (click)=\"handleSuffix()\"\r\n>\r\n @if (suffixConfig.icon) {\r\n <span class=\"icon\">\r\n <!-- Nếu là icon Zorro -->\r\n @if (suffixConfig.icon.type === 'zorro') {\r\n <span\r\n nz-icon\r\n [nzType]=\"suffixConfig.icon.value\"\r\n nzTheme=\"outline\"\r\n [ngClass]=\"suffixConfig.icon.class ?? ''\"\r\n >\r\n </span>\r\n }\r\n\r\n <!-- Nếu là Boxicons -->\r\n @if (suffixConfig.icon.type === 'mdi') {\r\n <span [class]=\"'mdi ' + suffixConfig.icon.value\" [ngClass]=\"suffixConfig.icon.class ?? ''\">\r\n </span>\r\n }\r\n </span>\r\n }\r\n\r\n @if (suffixConfig.label) {\r\n <span class=\"label\">\r\n {{ suffixConfig.label }}\r\n </span>\r\n }\r\n\r\n @if (!suffixConfig.icon && !suffixConfig.label) {\r\n <span class=\"label\">\r\n {{ defaultText }}\r\n </span>\r\n }\r\n</button>\r\n","import { NUMERIC_PRESETS } from \"../consts/fields/input-formatted-field.const\";\r\nimport { NumericPreset } from \"../enums/fields/input-formatted-field.enum\";\r\nimport { InputFormattedField } from \"../models/fields/input/input-formatted-field.model\";\r\nimport { Options } from \"@zeedhi/autonumeric\";\r\n\r\nexport class AutoNumericOptionsFactory {\r\n static create(field: InputFormattedField): Options {\r\n if (field.format === NumericPreset.Manual) {\r\n return field.autoNumericOptions ?? NUMERIC_PRESETS.integer;\r\n }\r\n\r\n return NUMERIC_PRESETS[field.format];\r\n }\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n forwardRef,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from \"@angular/core\";\r\nimport { NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\nimport {\r\n createInputPlaceholder,\r\n createPlaceholder,\r\n} from \"../../../../utils/dynamic-form/dynamic-form\";\r\nimport { BaseValueAccessor } from \"../../../../base/base-value-accessor\";\r\nimport { FieldTypeEnum } from \"../../../../enums/fields\";\r\nimport {\r\n CORE_MODULES,\r\n FORM_MODULES,\r\n NO_INFO_TEXT,\r\n} from \"../../../../consts/common\";\r\nimport { ControlTypeEnum } from \"../../../../enums/controls\";\r\nimport { SuffixComponent } from \"../../components/suffix/suffix.component\";\r\nimport { InputFormattedField } from \"../../../../models/fields/input/input-formatted-field.model\";\r\nimport AutoNumeric from \"@zeedhi/autonumeric\";\r\nimport { AutoNumericOptionsFactory } from \"../../../../factories/auto-numeric-options.factory\";\r\nimport { NzInputModule } from \"ng-zorro-antd/input\";\r\n\r\nconst zorroModules = [NzInputModule];\r\n@Component({\r\n selector: \"app-input-formatted\",\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...FORM_MODULES, ...zorroModules, SuffixComponent],\r\n templateUrl: \"./input-formatted.component.html\",\r\n styleUrls: [\"./input-formatted.component.scss\"],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputFormattedComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class InputFormattedComponent extends BaseValueAccessor<string> {\r\n readonly field = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof InputFormattedField) ||\r\n (base.type !== FieldTypeEnum.InputFormatted &&\r\n base.controlType !== ControlTypeEnum.Input)\r\n ) {\r\n throw new Error(\"Expected InputFormattedField\");\r\n }\r\n return base;\r\n });\r\n\r\n private autoNumeric?: AutoNumeric;\r\n\r\n readonly inputFormattedEle =\r\n viewChild<ElementRef<HTMLInputElement>>(\"inputFormatted\");\r\n\r\n readonly autoNumericOptions = computed(() =>\r\n AutoNumericOptionsFactory.create(this.field()),\r\n );\r\n\r\n readonly internalValue = signal<string>(\"\");\r\n\r\n readonly inputDisplayValues = computed(() => {\r\n const isView = this.isView();\r\n const autoNumericOptions = this.autoNumericOptions();\r\n const value = this.internalValue();\r\n if (isView) {\r\n const viewValue = value\r\n ? AutoNumeric.format(value, autoNumericOptions)\r\n : undefined;\r\n return viewValue || NO_INFO_TEXT;\r\n }\r\n return \"\";\r\n });\r\n\r\n readonly autoNumericLifeCycleEffect = effect((onCleanup) => {\r\n const nativeEle = this.inputFormattedEle()?.nativeElement;\r\n const isAddOrEdit = this.isAddOrEdit();\r\n const autoNumericOptions = untracked(() => this.autoNumericOptions());\r\n const value = untracked(() => this.valueSignal());\r\n\r\n // 1. TẠO BIẾN CỤC BỘ Ở ĐÂY (Đây là mấu chốt)\r\n let localAutoNumeric: AutoNumeric | undefined;\r\n\r\n if (nativeEle && isAddOrEdit) {\r\n // 2. Gán vào biến cục bộ\r\n localAutoNumeric = new AutoNumeric(nativeEle, value, autoNumericOptions);\r\n // 3. Vẫn cập nhật biến class để xài ở chỗ khác\r\n this.autoNumeric = localAutoNumeric;\r\n }\r\n\r\n onCleanup(() => {\r\n // 4. CHỈ REMOVE BIẾN CỤC BỘ (Không dùng this.autoNumeric ở đây)\r\n if (localAutoNumeric) {\r\n localAutoNumeric?.remove();\r\n\r\n // Dọn dẹp biến class nếu nó đang giữ cái vừa bị remove\r\n if (this.autoNumeric === localAutoNumeric) {\r\n this.autoNumeric = undefined;\r\n }\r\n }\r\n });\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n // Xử lý tạo placeholder text tự động nếu chưa truyền placeholder vào config của field\r\n override resolvePlaceholderText(): string {\r\n const isDisabled = this.field().isDisabled;\r\n return isDisabled ? NO_INFO_TEXT : createInputPlaceholder(this.field());\r\n }\r\n\r\n // event: Event;\r\n handleChangeInputText(): void {\r\n const { key } = this.field();\r\n // const inputValue = (event.target as HTMLInputElement).value;\r\n\r\n // Lấy giá trị RAW chuẩn từ AutoNumeric (không lấy event.target.value nữa)\r\n // Dùng fallback string rỗng nếu chưa có\r\n const rawNumericValue = this.autoNumeric?.getNumericString() || \"\";\r\n\r\n this.propagateValue(rawNumericValue);\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(key, rawNumericValue.trim());\r\n }\r\n\r\n // Chỗ này vẫn xử lý bình thường cho CVA không liên quan đến AutoNumeric.\r\n protected override writeValueToView(value: string): void {\r\n // 2. NẾU AutoNumeric ĐÃ ĐƯỢC TẠO (đang ở nhánh Add/Edit), thì ép nó format lại giá trị mới\r\n if (this.autoNumeric) {\r\n this.autoNumeric.set(value);\r\n }\r\n\r\n const { key } = untracked(() => this.field());\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(key, value);\r\n }\r\n}\r\n","<div class=\"flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (viewMode() === viewModeEnum.form) {\r\n <input nz-input [value]=\"inputDisplayValues()\" class=\"modeView\" />\r\n }\r\n @if (viewMode() === viewModeEnum.text) {\r\n <span class=\"modeView\">{{ inputDisplayValues() }}</span>\r\n }\r\n } @else {\r\n <!-- [value]=\"value\" -->\r\n\r\n <input\r\n #inputFormatted\r\n nz-input\r\n class=\"input-control custom-input\"\r\n [placeholder]=\"displayPlaceholder()\"\r\n [disabled]=\"isDisabled\"\r\n (input)=\"handleChangeInputText()\"\r\n (blur)=\"onTouched()\"\r\n />\r\n }\r\n\r\n <!-- Suffixes -->\r\n @if (field().suffixes.length > 0) {\r\n @for (suffix of field().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { Component, computed, effect, forwardRef } from \"@angular/core\";\r\nimport { InputPasswordField } from \"../../../../models/fields/input\";\r\nimport { NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\nimport { NzInputModule } from \"ng-zorro-antd/input\";\r\nimport { BaseValueAccessor } from \"../../../../base/base-value-accessor\";\r\nimport { NzIconModule } from \"ng-zorro-antd/icon\";\r\nimport { createInputPlaceholder } from \"../../../../utils/dynamic-form/dynamic-form\";\r\nimport { FieldTypeEnum } from \"../../../../enums/fields\";\r\nimport { ControlTypeEnum } from \"../../../../enums/controls\";\r\n\r\nconst ZORRO_MODULES = [NzInputModule, NzIconModule];\r\n\r\n@Component({\r\n selector: \"app-input-password\",\r\n standalone: true,\r\n imports: [...ZORRO_MODULES],\r\n templateUrl: \"./input-password.component.html\",\r\n styleUrls: [\"./input-password.component.scss\"],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputPasswordComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class InputPasswordComponent extends BaseValueAccessor<string> {\r\n readonly field = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof InputPasswordField) ||\r\n (base.type !== FieldTypeEnum.InputPassword &&\r\n base.controlType !== ControlTypeEnum.Input)\r\n ) {\r\n throw new Error(\"Expected InputPasswordField\");\r\n }\r\n return base;\r\n });\r\n\r\n passwordVisible = false;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n // Xử lý tạo placeholder text tự động nếu chưa truyền placeholder vào config của field\r\n override resolvePlaceholderText(): string {\r\n return createInputPlaceholder(this.field());\r\n }\r\n\r\n handleChangeInputPassword(event: Event): void {\r\n const inputValue = (event.target as HTMLInputElement).value;\r\n this.propagateValue(inputValue);\r\n this.patchFormData(this.fieldKey(), inputValue);\r\n }\r\n}\r\n","<nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input\r\n nz-input\r\n [value]=\"value\"\r\n [type]=\"passwordVisible ? 'text' : 'password'\"\r\n autocomplete=\"new-password\"\r\n [placeholder]=\"displayPlaceholder()\"\r\n (input)=\"handleChangeInputPassword($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n</nz-input-group>\r\n<ng-template #suffixTemplate>\r\n <span\r\n nz-icon\r\n [nzType]=\"passwordVisible ? 'eye-invisible' : 'eye'\"\r\n (click)=\"passwordVisible = !passwordVisible\"\r\n ></span>\r\n</ng-template>\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n forwardRef,\r\n inject,\r\n untracked,\r\n} from \"@angular/core\";\r\nimport { FormsModule, NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\nimport { InputTextField } from \"../../../../models/fields/input\";\r\nimport {\r\n createInputPlaceholder,\r\n createPlaceholder,\r\n} from \"../../../../utils/dynamic-form/dynamic-form\";\r\nimport { BaseValueAccessor } from \"../../../../base/base-value-accessor\";\r\nimport { FieldTypeEnum } from \"../../../../enums/fields\";\r\nimport { NO_INFO_TEXT } from \"../../../../consts/common\";\r\nimport { ControlTypeEnum } from \"../../../../enums/controls\";\r\nimport { SuffixComponent } from \"../../components/suffix/suffix.component\";\r\nimport { NzInputModule } from \"ng-zorro-antd/input\";\r\nimport { CommonModule, CurrencyPipe } from \"@angular/common\";\r\nimport { NgxCurrencyDirective } from \"ngx-currency\";\r\n\r\nconst ZORRO_MODULES = [\r\n NzInputModule,\r\n NgxCurrencyDirective,\r\n CurrencyPipe,\r\n CommonModule,\r\n FormsModule,\r\n];\r\nconst COMPONENTS = [SuffixComponent];\r\n@Component({\r\n selector: \"app-input-text\",\r\n standalone: true,\r\n imports: [...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: \"./input-text.component.html\",\r\n styleUrls: [\"./input-text.component.scss\"],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputTextComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class InputTextComponent extends BaseValueAccessor<string> {\r\n readonly field = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof InputTextField) ||\r\n (base.type !== FieldTypeEnum.InputText &&\r\n base.controlType !== ControlTypeEnum.Input)\r\n ) {\r\n throw new Error(\"Expected InputTextField\");\r\n }\r\n return base;\r\n });\r\n\r\n readonly viewDisplayValue = computed(() => {\r\n // 1. Nếu không phải View thì không cần quan tâm text này\r\n if (!this.isView()) return \"\";\r\n\r\n // 2. Lấy giá trị từ valueSignal\r\n const val = this.valueSignal();\r\n return val ? val : NO_INFO_TEXT;\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n // Xử lý tạo placeholder text tự động nếu chưa truyền placeholder vào config của field\r\n override resolvePlaceholderText(): string {\r\n return createInputPlaceholder(this.field());\r\n }\r\n\r\n // Xử lý khi nhập giá trị mới vào input\r\n handleChangeInputText(event: Event): void {\r\n const inputValue = (event.target as HTMLInputElement).value;\r\n this.propagateValue(inputValue);\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), inputValue);\r\n }\r\n\r\n handleChangeFormValue(value: number): void {\r\n const inputValue = value?.toString();\r\n this.propagateValue(inputValue);\r\n this.patchFormData(this.fieldKey(), inputValue);\r\n }\r\n\r\n protected override writeValueToView(value: string): void {\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n}\r\n","<div class=\"flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (field().viewMode === viewModeEnum.form) {\r\n @if (field().isCurrency) {\r\n <input\r\n nz-input\r\n [ngModel]=\"viewDisplayValue()\"\r\n class=\"modeView\"\r\n [currencyMask]=\"{\r\n prefix: '',\r\n suffix: ' VND',\r\n thousands: ',',\r\n decimal: '.',\r\n precision: 2,\r\n align: 'left',\r\n }\"\r\n />\r\n } @else {\r\n <input nz-input [value]=\"viewDisplayValue()\" class=\"modeView\" />\r\n }\r\n }\r\n @if (field().viewMode === viewModeEnum.text) {\r\n @if (field().isCurrency) {\r\n <span class=\"modeView\">\r\n {{\r\n viewDisplayValue() | currency: \"VND\" : \"symbol\" : \"1.0-0\" : \"vi-VN\"\r\n }}\r\n </span>\r\n } @else {\r\n <span class=\"modeView\">{{ viewDisplayValue() }}</span>\r\n }\r\n }\r\n } @else {\r\n @if (field().isCurrency) {\r\n <input\r\n nz-input\r\n class=\"input-control\"\r\n [currencyMask]=\"{\r\n prefix: '',\r\n suffix: ' VND',\r\n thousands: ',',\r\n decimal: '.',\r\n precision: 2,\r\n align: 'left',\r\n }\"\r\n [(ngModel)]=\"value\"\r\n [placeholder]=\"displayPlaceholder()\"\r\n [disabled]=\"isDisabled\"\r\n (ngModelChange)=\"handleChangeFormValue($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n } @else {\r\n <input\r\n nz-input\r\n class=\"input-control\"\r\n [value]=\"value\"\r\n [placeholder]=\"displayPlaceholder()\"\r\n [disabled]=\"isDisabled\"\r\n (input)=\"handleChangeInputText($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n }\r\n }\r\n\r\n <!-- Suffixes -->\r\n @if (field().suffixes.length > 0) {\r\n @for (suffix of field().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { computed, Directive, effect, untracked } from \"@angular/core\";\r\nimport { rxResource, toObservable, toSignal } from \"@angular/core/rxjs-interop\";\r\nimport { combineLatest, Observable, of } from \"rxjs\";\r\nimport { catchError, map, switchMap } from \"rxjs/operators\";\r\nimport { DependTypeEnum } from \"../enums/common\";\r\nimport { ApiResponse } from \"../models/common/api-response.model\";\r\nimport {\r\n FieldDependency,\r\n FieldDependencyType,\r\n} from \"../models/common/field-dependency.model\";\r\nimport { SelectBaseField } from \"../models/fields/select/select-base-field.model\";\r\nimport { BaseValueAccessor } from \"./base-value-accessor\";\r\n\r\n@Directive()\r\nexport abstract class BaseSelectComponent<T> extends BaseValueAccessor<T> {\r\n // Alias to strongly type the field input for Select base logic\r\n protected readonly selectField = computed(\r\n () => this.fieldInput() as SelectBaseField<any>,\r\n );\r\n\r\n protected isFirstLoad = true;\r\n\r\n // 1. Tạo stream params từ các field phụ thuộc\r\n private dependParams$ = toObservable(this.selectField).pipe(\r\n switchMap((field) => {\r\n const { dependsOn, dependType } = field;\r\n\r\n if (!dependsOn || dependsOn.length === 0) {\r\n return of({ valid: true, params: {} });\r\n }\r\n\r\n const dependObs$ = this.createDependencyStreams(dependsOn);\r\n\r\n return combineLatest(dependObs$).pipe(\r\n map((results) => this.evaluateDependencies(results, dependType)),\r\n );\r\n }),\r\n );\r\n\r\n private createDependencyStreams(\r\n dependsOn: FieldDependency[],\r\n ): Observable<{ key: string; value: string | null }>[] {\r\n return dependsOn.map((depend) =>\r\n this.fieldService\r\n .getDependValueChanges$(depend.fieldKey)\r\n .pipe(map((val) => ({ key: depend.paramKey, value: val }))),\r\n );\r\n }\r\n\r\n private evaluateDependencies(\r\n results: { key: string; value: string | null }[],\r\n dependType: FieldDependencyType,\r\n ): { valid: boolean; params: Record<string, unknown> } {\r\n const isValidValue = (val: string | null) =>\r\n val !== null && val !== \"\" && val !== undefined;\r\n\r\n let isConditionMet = false;\r\n\r\n if (dependType === DependTypeEnum.Any) {\r\n isConditionMet = results.some((r) => isValidValue(r.value));\r\n } else {\r\n isConditionMet = results.every((r) => isValidValue(r.value));\r\n }\r\n\r\n const params = results.reduce(\r\n (acc, curr) => ({ ...acc, [curr.key]: curr.value }),\r\n {},\r\n );\r\n return { valid: isConditionMet, params };\r\n }\r\n\r\n private dependParamsSignal = toSignal(this.dependParams$, {\r\n initialValue: { valid: false, params: {} },\r\n });\r\n\r\n // 2. rxResource lấy danh sách\r\n optionsResource = rxResource({\r\n request: () => {\r\n if (this.isView()) return undefined;\r\n\r\n const state = this.dependParamsSignal();\r\n if (!state || !state.valid) return undefined;\r\n return state.params;\r\n },\r\n loader: ({ request: params }) => {\r\n const field = untracked(() => this.selectField());\r\n const fullApiUrl = field?.apiConfig?.baseUrl || \"\";\r\n const apiParams = field?.apiConfig?.params || {};\r\n\r\n const rawParams = { ...apiParams, ...params };\r\n const finalParams = Object.fromEntries(\r\n Object.entries(rawParams).filter(\r\n ([_, val]) => val !== null && val !== undefined && val !== \"\",\r\n ),\r\n );\r\n\r\n if (!fullApiUrl) {\r\n return of({\r\n code: 0,\r\n message: \"Success\",\r\n data: field?.options ?? [],\r\n } as ApiResponse<Record<string, unknown>[]>);\r\n }\r\n\r\n return this.fieldService.getAllOptions(fullApiUrl, finalParams).pipe(\r\n catchError((error) =>\r\n of({ code: -1, message: \"Error\", data: [] } as ApiResponse<\r\n Record<string, unknown>[]\r\n >),\r\n ),\r\n );\r\n },\r\n });\r\n\r\n // Gom chung loading từ rxResource và isDisabledSignal\r\n disabled = computed(\r\n () => this.optionsResource.isLoading() || this.disabledSignal(),\r\n );\r\n\r\n // 3. Xào nấu Options (Prepend, Append, Filter)\r\n options = computed<Record<string, unknown>[]>(() => {\r\n const state = this.dependParamsSignal();\r\n const isLoading = this.optionsResource.isLoading();\r\n const res = this.optionsResource.value();\r\n\r\n if (!state || !state.valid || isLoading || !res || res.code !== 0) {\r\n return [];\r\n }\r\n\r\n const field = this.selectField();\r\n const { optionsToPrepend, optionsToAppend, exceptOptions } = field;\r\n const rawData = res.data || [];\r\n\r\n return [...optionsToPrepend, ...rawData, ...optionsToAppend].filter(\r\n (opt) =>\r\n !exceptOptions.some(\r\n (ex) => ex[field.bindValue] === opt[field.bindValue],\r\n ),\r\n );\r\n });\r\n\r\n constructor() {\r\n super();\r\n\r\n // 4. Effect xử lý toàn bộ logic Form Control (Disable/Enable/Reset)\r\n effect(() => {\r\n const state = this.dependParamsSignal();\r\n const isLoading = this.optionsResource.isLoading();\r\n const res = this.optionsResource.value();\r\n\r\n untracked(() => {\r\n // CASE 1 & 2: CHƯA ĐỦ ĐIỀU KIỆN HOẶC ĐANG GỌI API -> Disable và Reset\r\n if (!state || !state.valid || isLoading) {\r\n this.disableControl();\r\n if (!this.isFirstLoad) {\r\n this.resetControl();\r\n }\r\n this.isFirstLoad = false;\r\n return;\r\n }\r\n\r\n // CASE 3: API ĐÃ LOAD XONG\r\n if (res) {\r\n if (res.code !== 0) {\r\n this.disableAndResetControl();\r\n return;\r\n }\r\n\r\n const field = this.selectField();\r\n if (!field.isDisabled) {\r\n this.enableControl();\r\n }\r\n \r\n // Móc nối cho các class con có nhu cầu đồng bộ data sau khi load API\r\n this.onApiOptionsLoaded();\r\n }\r\n });\r\n });\r\n }\r\n\r\n // Cho phép component con overide nếu cần (ví dụ để hydrate sourceObject)\r\n protected onApiOptionsLoaded(): void {}\r\n}\r\n","import { Component, computed, forwardRef, untracked } from \"@angular/core\";\r\nimport { CORE_MODULES, FORM_MODULES } from \"../../../../consts/common\";\r\nimport { NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\nimport { BaseSelectComponent } from \"../../../../base/base-select.component\";\r\nimport { MultiSelectField } from \"../../../../models/fields/select/multi-select-field.model\";\r\nimport { createMultiSelectPlaceholder } from \"../../../../utils/dynamic-form/dynamic-form\";\r\nimport { SelectOutputValueTypeEnum } from \"../../../../enums/common\";\r\nimport { NO_INFO_TEXT } from \"../../../../consts/common/common.const\";\r\nimport { FieldTypeEnum } from \"../../../../enums/fields\";\r\nimport { ControlTypeEnum } from \"../../../../enums/controls\";\r\nimport { SuffixComponent } from \"../../components/suffix/suffix.component\";\r\nimport { NzSelectModule } from \"ng-zorro-antd/select\";\r\nimport { NzInputModule } from \"ng-zorro-antd/input\";\r\nimport { NzSpinModule } from \"ng-zorro-antd/spin\";\r\n\r\nconst ZORRO_MODULES = [NzSelectModule, NzInputModule, NzSpinModule];\r\nconst COMPONENTS = [SuffixComponent];\r\n\r\n@Component({\r\n selector: \"app-multi-select\",\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...FORM_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: \"./multi-select.component.html\",\r\n styleUrls: [\"./multi-select.component.scss\"],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MultiSelectComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class MultiSelectComponent extends BaseSelectComponent<\r\n string[] | number[] | Record<string, unknown>[]\r\n> {\r\n readonly field = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof MultiSelectField) ||\r\n (base.type !== FieldTypeEnum.MultiSelect &&\r\n base.controlType !== ControlTypeEnum.Select)\r\n ) {\r\n throw new Error(\"Expected MultiSelectField\");\r\n }\r\n return base;\r\n });\r\n\r\n displayNoValueText = NO_INFO_TEXT;\r\n\r\n // Biến đổi dữ liệu hiển thị ở chế độ View\r\n viewDisplayValue = computed(() => {\r\n if (!this.isView()) return [];\r\n console.log(\"viewDisplayValue\", this.field().modelValue || []);\r\n\r\n return this.getDisplayValue(this.field().modelValue || []);\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n protected override onApiOptionsLoaded(): void {\r\n const field = this.field();\r\n if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {\r\n const newOutputValue =\r\n this.value && this.getValueByOutputAs(this.value as string[]);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n }\r\n\r\n // Xử lý tạo placeholder text tự động nếu chưa truyền placeholder vào config của field\r\n override resolvePlaceholderText(): string {\r\n return createMultiSelectPlaceholder(this.field());\r\n }\r\n\r\n handleChangeOptions(optionValue: string[]): void {\r\n this.propagateValue(optionValue);\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string[]): void {\r\n if (!this.isAddOrEdit()) return;\r\n\r\n this.fieldService.emitDependValueChange(\r\n this.fieldKey(),\r\n value.length ? value.join(\",\") : \"\",\r\n );\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: string[]): void {\r\n const { isParent } = this.field();\r\n if (isParent) {\r\n console.log(\"cscs\");\r\n\r\n this.fieldService.emitDependValueChange(\r\n this.fieldKey(),\r\n value.length ? value.join(\",\") : \"\",\r\n );\r\n }\r\n\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý output value đầu ra theo outputAs mà người dùng mong muốn.\r\n private getValueByOutputAs(\r\n singleValueArr: string[] | number[],\r\n ): string[] | Record<string, unknown>[] {\r\n const field = this.field();\r\n const { outputAs, bindValue, modelValue } = field;\r\n\r\n if (singleValueArr.length === 0) {\r\n return singleValueArr.map(String);\r\n }\r\n\r\n // Nếu outputAs là dạng single.\r\n let value: string[] | Record<string, unknown>[] =\r\n singleValueArr.map(String);\r\n\r\n // Nếu outputAs là dạng object.\r\n if (outputAs === SelectOutputValueTypeEnum.Object) {\r\n value = value.map((val) => ({\r\n [bindValue]: val,\r\n }));\r\n }\r\n\r\n // Nếu outputAs là dạng SourceObject.\r\n if (outputAs === SelectOutputValueTypeEnum.SourceObject) {\r\n const options = untracked(() => this.options());\r\n value = (singleValueArr as string[]).map((val) => {\r\n // 1. Tìm trong options hiện tại\r\n let foundValue = options.find((opt) => opt[bindValue] === val);\r\n\r\n // 2. Fallback tìm trong modelValue (vì modelValue có thể là array of objects)\r\n // if (!foundValue && modelValue && Array.isArray(modelValue)) {\r\n // foundValue = modelValue.find(\r\n // (mOpt: any) => typeof mOpt === \"object\" && mOpt[bindValue] === val\r\n // );\r\n // }\r\n\r\n // 3. Fallback cuối cùng\r\n return foundValue ?? { [bindValue]: val };\r\n });\r\n }\r\n\r\n return value;\r\n }\r\n\r\n // Làm phẳng giá trị để hiện thị ở chế độ View.\r\n protected getDisplayValue(value: string[] | Record<string, unknown>[]) {\r\n const optionsValue = value!.map(\r\n (val: string | number | Record<string, unknown>) => {\r\n if (typeof val === \"object\") {\r\n return this.getCustomLabel(val);\r\n }\r\n return val as string;\r\n },\r\n );\r\n\r\n return optionsValue;\r\n }\r\n\r\n protected transformOptionValue(option: Record<string, unknown>): unknown {\r\n const field = this.field();\r\n\r\n let optionValue: unknown;\r\n\r\n optionValue = option[field.bindValue];\r\n\r\n return optionValue;\r\n }\r\n\r\n protected getOptionLabel(option: Record<string, unknown>): string {\r\n return this.getCustomLabel(option);\r\n }\r\n\r\n // Biến đổi label nếu có thuộc tính hàm biến đổi transformLabel.\r\n private getCustomLabel(option: Record<string, unknown>): string {\r\n const field = this.field();\r\n\r\n // 1. Ưu tiên lấy bindLabel, nếu không có thì fallback sang bindValue\r\n let rawLabel = option[field.bindLabel];\r\n if (rawLabel === undefined || rawLabel === null || rawLabel === \"\") {\r\n rawLabel = option[field.bindValue];\r\n }\r\n\r\n // 2. Kiểm tra nếu không tồn tại hoặc là dạng object/function (kể cả array)\r\n if (\r\n rawLabel === undefined ||\r\n rawLabel === null ||\r\n typeof rawLabel === \"object\" ||\r\n typeof rawLabel === \"function\"\r\n ) {\r\n return NO_INFO_TEXT;\r\n }\r\n\r\n let optionLabel = String(rawLabel);\r\n\r\n // 3. Biến đổi theo transformLabel nếu có\r\n if (field.transformLabel) {\r\n const tranformLabelValue = field.transformLabel(option);\r\n if (tranformLabelValue) optionLabel = tranformLabelValue;\r\n }\r\n\r\n return optionLabel;\r\n }\r\n}\r\n","<div class=\"flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (viewMode() === viewModeEnum.form) {\r\n @if (field().value!.length > 0) {\r\n <nz-select\r\n nzAllowClear\r\n [nzMode]=\"'multiple'\"\r\n [ngModel]=\"viewDisplayValue()\"\r\n [nzMaxTagCount]=\"field().maxTagCount!\"\r\n [nzMaxMultipleCount]=\"field().maxMultipleCount!\"\r\n [nzDisabled]=\"true\"\r\n >\r\n @for (displayOption of viewDisplayValue(); track $index) {\r\n <nz-option [nzValue]=\"displayOption\" [nzLabel]=\"displayOption\">\r\n </nz-option>\r\n }\r\n </nz-select>\r\n } @else {\r\n <input nz-input [value]=\"displayNoValueText\" [disabled]=\"true\" />\r\n }\r\n }\r\n\r\n @if (viewMode() === viewModeEnum.text) {\r\n @if (viewDisplayValue().length) {\r\n <ul class=\"view-list\">\r\n @for (label of viewDisplayValue(); track $index) {\r\n <li>{{ label }}</li>\r\n }\r\n </ul>\r\n } @else {\r\n <span class=\"modeView\">{{ displayNoValueText }}</span>\r\n }\r\n }\r\n } @else {\r\n <nz-select\r\n [id]=\"fieldKey()\"\r\n nzShowSearch\r\n nzAllowClear\r\n [nzDisabled]=\"disabled()\"\r\n [nzMode]=\"'multiple'\"\r\n [nzPlaceHolder]=\"displayPlaceholder()\"\r\n [nzMaxTagCount]=\"field().maxTagCount!\"\r\n [nzMaxMultipleCount]=\"field().maxMultipleCount!\"\r\n [nzSuffixIcon]=\"optionsResource.isLoading() ? loadingIcon : null\"\r\n [ngModel]=\"value\"\r\n (ngModelChange)=\"handleChangeOptions($event)\"\r\n >\r\n @for (\r\n option of options();\r\n track `${option[this.field().bindValue]}-${$index}`\r\n ) {\r\n <nz-option\r\n [nzValue]=\"transformOptionValue(option)\"\r\n [nzLabel]=\"getOptionLabel(option)\"\r\n >\r\n </nz-option>\r\n }\r\n </nz-select>\r\n\r\n <ng-template #loadingIcon>\r\n <nz-spin nzSimple [nzSize]=\"'small'\"></nz-spin>\r\n </ng-template>\r\n }\r\n\r\n <!-- Suffixes -->\r\n @if (field().suffixes.length > 0) {\r\n @for (suffix of field().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n computed,\r\n forwardRef,\r\n Input,\r\n untracked,\r\n} from \"@angular/core\";\r\nimport {\r\n FormsModule,\r\n NG_VALUE_ACCESSOR,\r\n ReactiveFormsModule,\r\n} from \"@angular/forms\";\r\nimport { BaseSelectComponent } from \"../../../../base/base-select.component\";\r\nimport { SingleSelectField } from \"../../../../models/fields/select/single-select-field.model\";\r\nimport { createSingleSelectPlaceholder } from \"../../../../utils/dynamic-form/dynamic-form\";\r\nimport { NO_INFO_TEXT } from \"../../../../consts/common/common.const\";\r\nimport { SelectOutputValueTypeEnum } from \"../../../../enums/common\";\r\nimport { ApiResponse } from \"../../../../models/common/api-response.model\";\r\nimport {\r\n FieldDependency,\r\n FieldDependencyType,\r\n} from \"../../../../models/common/field-dependency.model\";\r\nimport { FieldTypeEnum } from \"../../../../enums/fields\";\r\nimport { ControlTypeEnum } from \"../../../../enums/controls\";\r\nimport { SuffixComponent } from \"../../components/suffix/suffix.component\";\r\nimport { NzSelectModule } from \"ng-zorro-antd/select\";\r\nimport { NzSpinModule } from \"ng-zorro-antd/spin\";\r\nimport { NzInputModule } from \"ng-zorro-antd/input\";\r\nimport { CommonModule } from \"@angular/common\";\r\n\r\nconst modules = [CommonModule, FormsModule, ReactiveFormsModule];\r\nconst zorroModules = [NzSelectModule, NzSpinModule, NzInputModule];\r\nconst components = [SuffixComponent];\r\n\r\n@Component({\r\n selector: \"app-single-select\",\r\n standalone: true,\r\n imports: [...modules, ...zorroModules, ...components],\r\n templateUrl: \"./single-select.component.html\",\r\n styleUrls: [\"./single-select.component.scss\"],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SingleSelectComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SingleSelectComponent extends BaseSelectComponent<\r\n string | Record<string, unknown>\r\n> {\r\n @Input() isCustomInputText!: boolean;\r\n readonly field = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof SingleSelectField) ||\r\n (base.type !== FieldTypeEnum.SingleSelect &&\r\n base.controlType !== ControlTypeEnum.Select)\r\n ) {\r\n throw new Error(\"Expected SingleSelectField\");\r\n }\r\n return base;\r\n });\r\n\r\n // Giá trị dùng hiển thị ở chế độ View.\r\n readonly viewDisplayValue = computed(() => {\r\n if (!this.isView()) return \"\";\r\n if (this.field()?.key === \"role\") {\r\n console.log(`================= ${this.field()?.key} ================`);\r\n console.log(\"modelValue\", this.field().modelValue);\r\n console.log(\"value\", this.valueSignal());\r\n console.log(\r\n \"getDisplayValue\",\r\n this.getDisplayValue(\r\n (this.field().modelValue as any) || this.valueSignal(),\r\n ),\r\n );\r\n }\r\n\r\n return this.getDisplayValue(\r\n (this.field().modelValue as any) || this.valueSignal(),\r\n );\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n protected override onApiOptionsLoaded(): void {\r\n const field = this.field();\r\n if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {\r\n const newOutputValue =\r\n this.value && this.getValueByOutputAs(this.value as string);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n }\r\n\r\n // Xử lý tạo placeholder text tự động nếu chưa truyền placeholder vào config của field\r\n override resolvePlaceholderText(): string {\r\n return createSingleSelectPlaceholder(this.field());\r\n }\r\n displayValue = \"\";\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string | null): void {\r\n if (this.isView()) {\r\n this.displayValue = this.getDisplayValue(\r\n this.field().modelValue as string | Record<string, unknown>,\r\n );\r\n return;\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Bắn giá trị mới vào BehaviorSubject của FieldService.\r\n // Việc này báo cho các component Con biết Parent vừa thay đổi data.\r\n // Lợi ích: Dòng data chạy thẳng đứng (Push) vào ống, không phụ thuộc vào Signal tracking ẩn.\r\n this.fieldService.emitDependValueChange(this.fieldKey(), value ?? \"\");\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: string): void {\r\n const { isParent } = this.field();\r\n if (isParent) {\r\n this.fieldService.emitDependValueChange(this.fieldKey(), value);\r\n }\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n handleChangeOptions(optionValue: string): void {\r\n const { enableFieldChange, bindValue } = untracked(() => this.field());\r\n\r\n if (enableFieldChange) {\r\n const option = this.options().find(\r\n (option) => option[bindValue] === optionValue,\r\n );\r\n this.fieldService.onFieldChange(this.fieldKey(), option);\r\n }\r\n\r\n this.propagateValue(optionValue);\r\n }\r\n\r\n // Xử lý output value đầu ra theo outputAs mà người dùng mong muốn.\r\n private getValueByOutputAs(\r\n singleValue: string,\r\n ): string | Record<string, unknown> {\r\n const { outputAs, bindValue, bindLabel, modelValue } = this.field();\r\n\r\n if (singleValue) {\r\n // Nếu outputAs là dạng single.\r\n let value: string | Record<string, unknown> = singleValue;\r\n\r\n // Nếu outputAs là dạng object.\r\n if (outputAs === SelectOutputValueTypeEnum.Object) {\r\n value = {\r\n [bindValue]: singleValue,\r\n };\r\n }\r\n\r\n // Nếu outputAs là dạng sourceObject.\r\n if (outputAs === SelectOutputValueTypeEnum.SourceObject) {\r\n value =\r\n this.options().find((option) => option[bindValue] === singleValue) ??\r\n (modelValue && typeof modelValue === \"object\"\r\n ? modelValue\r\n : { [bindValue]: value });\r\n }\r\n\r\n return value;\r\n }\r\n return singleValue;\r\n }\r\n\r\n // Làm phẳng giá trị để hiện thị ở chế độ View.\r\n protected getDisplayValue(value: string | Record<string, unknown>): string {\r\n console.log(\"getdisplay\", value);\r\n\r\n if (!value) return NO_INFO_TEXT;\r\n\r\n if (typeof value === \"object\") {\r\n return this.getCustomLabel(value);\r\n }\r\n return value as string;\r\n }\r\n\r\n // Lấy value ở option tag.\r\n protected transformOptionValue(option: Record<string, unknown>): unknown {\r\n const field = this.field()!;\r\n\r\n let optionValue: unknown;\r\n\r\n optionValue = option[field.bindValue];\r\n\r\n return optionValue;\r\n }\r\n\r\n // Lấy label.\r\n protected getOptionLabel(option: Record<string, unknown>): string {\r\n return this.getCustomLabel(option);\r\n }\r\n\r\n // Biến đổi label nếu có thuộc tính hàm biến đổi transformLabel.\r\n private getCustomLabel(option: Record<string, unknown>): string {\r\n const field = this.field();\r\n\r\n // 1. Ưu tiên lấy bindLabel, nếu không có thì fallback sang bindValue\r\n let rawLabel = option[field.bindLabel];\r\n if (rawLabel === undefined || rawLabel === null || rawLabel === \"\") {\r\n rawLabel = option[field.bindValue];\r\n }\r\n\r\n // 2. Kiểm tra nếu không tồn tại hoặc là dạng object/function (kể cả array)\r\n if (\r\n rawLabel === undefined ||\r\n rawLabel === null ||\r\n typeof rawLabel === \"object\" ||\r\n typeof rawLabel === \"function\"\r\n ) {\r\n return NO_INFO_TEXT;\r\n }\r\n\r\n let optionLabel = String(rawLabel);\r\n\r\n // 3. Biến đổi theo transformLabel nếu có\r\n if (field.transformLabel) {\r\n const tranformLabelValue = field.transformLabel(option);\r\n if (tranformLabelValue) optionLabel = tranformLabelValue;\r\n }\r\n\r\n return optionLabel;\r\n }\r\n}\r\n","<div class=\"d-flex\">\r\n @if (isView()) {\r\n @if (viewMode() === viewModeEnum.form) {\r\n haha {{ viewDisplayValue() }}\r\n <input\r\n [title]=\"displayValue\"\r\n nz-input\r\n [value]=\"displayValue\"\r\n class=\"modeView\"\r\n />\r\n }\r\n @if (viewMode() === viewModeEnum.text) {\r\n <span [title]=\"displayValue\" class=\"modeView break-work\">{{\r\n displayValue\r\n }}</span>\r\n }\r\n } @else {\r\n logggg\r\n <nz-select\r\n [id]=\"fieldKey()\"\r\n nzShowSearch\r\n nzAllowClear\r\n [nzDisabled]=\"disabled()\"\r\n [nzPlaceHolder]=\"displayPlaceholder()\"\r\n [nzSuffixIcon]=\"optionsResource.isLoading() ? loadingIcon : null\"\r\n [title]=\"field().tooltip || ''\"\r\n [nzDropdownMatchSelectWidth]=\"field().matchSelectWidth\"\r\n [ngModel]=\"value\"\r\n class=\"flex-1 min-w-0\"\r\n (ngModelChange)=\"handleChangeOptions($event)\"\r\n >\r\n @for (\r\n option of options();\r\n track `${option[this.field().bindValue]}-${$index}`\r\n ) {\r\n <nz-option\r\n [nzValue]=\"transformOptionValue(option)\"\r\n [nzLabel]=\"getOptionLabel(option)\"\r\n >\r\n </nz-option>\r\n }\r\n </nz-select>\r\n\r\n <ng-template #loadingIcon>\r\n <nz-spin nzSimple [nzSize]=\"'small'\"></nz-spin>\r\n </ng-template>\r\n }\r\n\r\n <!-- Suffixes -->\r\n @if (field().suffixes.length > 0) {\r\n @for (suffix of field().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n forwardRef,\r\n Input,\r\n signal,\r\n untracked,\r\n} from \"@angular/core\";\r\nimport { NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\nimport { BaseValueAccessor } from \"../../../../base/base-value-accessor\";\r\nimport { TreeSelectField } from \"../../../../models/fields/select/tree-select-field.model\";\r\nimport {\r\n createSelectPlaceholder,\r\n createSingleSelectPlaceholder,\r\n} from \"../../../../utils/dynamic-form/dynamic-form\";\r\nimport { FORM_MODULES } from \"../../../../consts/common/standalone-import.const\";\r\nimport { NO_INFO_TEXT } from \"../../../../consts/common/common.const\";\r\nimport { SelectOutputValueTypeEnum } from \"../../../../enums/common\";\r\nimport { ApiResponse } from \"../../../../models/common/api-response.model\";\r\nimport { FieldTypeEnum } from \"../../../../enums/fields\";\r\nimport { ControlTypeEnum } from \"../../../../enums/controls\";\r\nimport { SuffixComponent } from \"../../components/suffix/suffix.component\";\r\nimport { NzTreeSelectModule } from \"ng-zorro-antd/tree-select\";\r\nimport { NzSpinModule } from \"ng-zorro-antd/spin\";\r\nimport { NzInputModule } from \"ng-zorro-antd/input\";\r\n\r\nconst ZORRO_MODULES = [NzTreeSelectModule, NzSpinModule, NzInputModule];\r\nconst COMPONENTS = [SuffixComponent];\r\n\r\ninterface FlatItem {\r\n code: string;\r\n name: string;\r\n [key: string]: any;\r\n}\r\n\r\ninterface TreeNode {\r\n key: any;\r\n title: string;\r\n children?: TreeNode[];\r\n selectable?: boolean;\r\n isLeaf?: boolean;\r\n [key: string]: any;\r\n}\r\n\r\n@Component({\r\n selector: \"app-tree-select\",\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: \"./tree-select.component.html\",\r\n styleUrls: [\"./tree-select.component.scss\"],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TreeSelectComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class TreeSelectComponent extends BaseValueAccessor<\r\n string | Record<string, unknown>\r\n> {\r\n @Input() isCustomInputText!: boolean;\r\n readonly field = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof TreeSelectField) ||\r\n (base.type !== FieldTypeEnum.TreeSelect &&\r\n base.controlType !== ControlTypeEnum.Select)\r\n ) {\r\n throw new Error(\"Expected TreeSelectField\");\r\n }\r\n return base;\r\n });\r\n\r\n // Giá trị dùng hiển thị ở chế độ View.\r\n displayValue: string | number = \"\";\r\n\r\n loadingSignal = signal(false);\r\n isDisabledSignal = signal(false);\r\n disabled = computed(() => this.loadingSignal() || this.isDisabledSignal());\r\n\r\n options: any[] = [];\r\n queryParams: Record<string, unknown> = {};\r\n\r\n constructor() {\r\n super();\r\n\r\n // 1. Effect chung Add + Edit\r\n effect(() => {\r\n if (this.isAddOrEdit()) {\r\n const field = untracked(() => this.field());\r\n const { placeholder } = field;\r\n\r\n if (!placeholder) field.placeholder = createSelectPlaceholder(field);\r\n }\r\n });\r\n\r\n // Trigger reset từ bên ngoài form.\r\n effect(() => {\r\n const reset = this.dFormService.resetTrigger();\r\n if (reset?.formId === this.formId) {\r\n this.reset();\r\n }\r\n });\r\n\r\n effect(() => {\r\n if (untracked(() => this.isView())) return;\r\n\r\n const { key, dependsOn, isParent, dependType } = untracked(() =>\r\n this.field(),\r\n );\r\n\r\n // Không dính dáng gì đến isParent và dependsOn.\r\n if (!isParent && dependsOn!.length === 0) {\r\n this.getOptions();\r\n return;\r\n }\r\n\r\n const dependValuesMap = this.fieldService.getDependValuesMap();\r\n\r\n const dependValues = dependsOn?.map((depend) => {\r\n const dependFunc = dependValuesMap.get(depend.fieldKey);\r\n const value =\r\n typeof dependFunc === \"function\" ? dependFunc() : dependFunc;\r\n return [depend.paramKey, value];\r\n });\r\n\r\n // console.log(`${key} dependValue`, dependValues);\r\n\r\n const params = Object.fromEntries(dependValues as any);\r\n\r\n this.queryParams = {\r\n ...this.queryParams,\r\n ...params,\r\n };\r\n\r\n // console.log(`${key} queryParams`, this.queryParams);\r\n\r\n // Nếu tất cả các phụ thuộc có value thì mới gọi API.\r\n const allDependHasValues = dependValues?.every(\r\n ([fieldKey, value]) => value,\r\n );\r\n // console.log(`${key} allDependHasValues`, allDependHasValues);\r\n\r\n if (allDependHasValues) {\r\n // this.isDisabledSignal.set(false);\r\n this.control?.enable();\r\n this.getOptions();\r\n } else {\r\n // Ngược lại reset và disabled.\r\n this.control?.reset();\r\n // this.isDisabledSignal.set(true);\r\n this.control?.disable();\r\n }\r\n });\r\n }\r\n\r\n // Xử lý tạo placeholder text tự động nếu chưa truyền placeholder vào config của field\r\n override resolvePlaceholderText(): string {\r\n return createSingleSelectPlaceholder(this.field());\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string | null): void {\r\n if (this.isView()) {\r\n this.displayValue = this.getDisplayValue(\r\n this.field().modelValue as string | Record<string, unknown>,\r\n );\r\n return;\r\n }\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n this.fieldService.updateDependValuesMap(this.fieldKey(), value ?? \"\");\r\n // const signal = untracked(() => this.fieldService.getDependValuesMap().get(this.fieldKey()))\r\n // console.log(\"DependValuesMap SET\", untracked(() => signal!()));\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n // Xử lý phụ thuộc khi change value\r\n protected override handleValueChange(value: string): void {\r\n const { isParent } = this.field();\r\n if (isParent) {\r\n this.fieldService.updateDependValuesMap(this.fieldKey(), value);\r\n // const signal = untracked(() => this.fieldService.getDependValuesMap().get(this.fieldKey()))\r\n // console.log(\"DependValuesMap UI\", untracked(() => signal!()));\r\n }\r\n\r\n // Gán data vào đầu ra của form.\r\n const newOutputValue = value && this.getValueByOutputAs(value);\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n\r\n private createFullApiUrl(): string {\r\n const field = untracked(() => this.field());\r\n let fullApiUrl = field?.apiConfig?.baseUrl || \"\";\r\n const params = field?.apiConfig?.params || {};\r\n this.queryParams = {\r\n ...this.queryParams,\r\n ...params,\r\n };\r\n return fullApiUrl;\r\n }\r\n\r\n private buildTree(items: FlatItem[], groupBy?: string): any[] {\r\n if (!groupBy) return items;\r\n const map = new Map<string, TreeNode>();\r\n const roots: TreeNode[] = [];\r\n\r\n // Step 1: Transform & store in map\r\n for (const item of items) {\r\n map.set(item.code, {\r\n key: this.transformOptionValue(item),\r\n title: this.getOptionLabel(item),\r\n parentCode: item[groupBy],\r\n isLeaf: true,\r\n });\r\n }\r\n\r\n // Step 2: Build parent-child relation\r\n for (const node of map.values()) {\r\n if (node[\"parentCode\"]) {\r\n const parent = map.get(node[\"parentCode\"]);\r\n if (parent) {\r\n if (!parent.children) parent.children = [];\r\n parent.children.push(node);\r\n parent.isLeaf = false;\r\n } else {\r\n roots.push(node);\r\n }\r\n } else {\r\n roots.push(node);\r\n }\r\n }\r\n\r\n return roots;\r\n }\r\n\r\n // Lấy danh sách options từ GET api.\r\n private getOptions(): void {\r\n const field = untracked(() => this.field());\r\n const { optionsToPrepend, optionsToAppend, exceptOptions } = field;\r\n const fullApiUrl = this.createFullApiUrl();\r\n\r\n if (!fullApiUrl) {\r\n const options = [\r\n ...optionsToPrepend,\r\n ...field.options,\r\n ...optionsToAppend,\r\n ].filter(\r\n (options) =>\r\n !exceptOptions.some(\r\n (opts) => opts[field.bindValue] === options[field.bindValue],\r\n ),\r\n ) as any;\r\n this.options = this.buildTree(options, field.groupBy);\r\n return;\r\n }\r\n\r\n this.loadingSignal.set(true);\r\n this.control?.disable();\r\n this.fieldService\r\n .getAllOptions(fullApiUrl, this.queryParams)\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: (res: ApiResponse<Record<string, unknown>[]>) => {\r\n this.loadingSignal.set(false);\r\n if (!this.field().isDisabled) this.control?.enable();\r\n\r\n if (res?.code === 0) {\r\n const options = [\r\n ...optionsToPrepend,\r\n ...(res?.data ?? []),\r\n ...optionsToAppend,\r\n ].filter(\r\n (options) =>\r\n !exceptOptions.some(\r\n (opts) => opts[field.bindValue] === options[field.bindValue],\r\n ),\r\n ) as any;\r\n this.options = this.buildTree(options, field.groupBy);\r\n\r\n // Nếu outputAs là dạng sourceObject đồng bộ sau khi load xong list.\r\n if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {\r\n const newOutputValue = this.options.find(\r\n (option) => option.key === this.value,\r\n ) ?? {\r\n [field.bindValue]: this.value,\r\n };\r\n this.patchFormData(this.fieldKey(), newOutputValue);\r\n }\r\n }\r\n },\r\n error: (error: Error) => {\r\n this.loadingSignal.set(false);\r\n if (!this.field().isDisabled) this.control?.enable();\r\n },\r\n });\r\n }\r\n\r\n handleChangeOptions(optionValue: string): void {\r\n const { enableFieldChange, bindValue } = untracked(() => this.field());\r\n\r\n if (enableFieldChange) {\r\n const option = this.options.find(\r\n (option) => option[bindValue] === optionValue,\r\n );\r\n this.fieldService.onFieldChange(this.fieldKey(), option);\r\n }\r\n\r\n this.propagateValue(optionValue);\r\n }\r\n\r\n // Xử lý output value đầu ra theo outputAs mà người dùng mong muốn.\r\n private getValueByOutputAs(\r\n singleValue: string,\r\n ): string | Record<string, unknown> {\r\n const field = this.field();\r\n\r\n if (singleValue) {\r\n // Nếu outputAs là dạng single.\r\n let value: string | Record<string, unknown> = singleValue;\r\n\r\n // Nếu outputAs là dạng object.\r\n if (field.outputAs === SelectOutputValueTypeEnum.Object) {\r\n value = {\r\n [field.bindValue]: singleValue,\r\n };\r\n }\r\n\r\n // Nếu outputAs là dạng sourceObject.\r\n if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {\r\n value = this.options.find(\r\n (option) => option[field.bindValue] === singleValue,\r\n ) ?? {\r\n [field.bindValue]: singleValue,\r\n };\r\n }\r\n\r\n return value;\r\n }\r\n return singleValue;\r\n }\r\n\r\n // Làm phẳng giá trị để hiện thị ở chế độ View.\r\n protected getDisplayValue(value: string | Record<string, unknown>): string {\r\n if (!value) return NO_INFO_TEXT;\r\n\r\n if (typeof value === \"object\") {\r\n return this.getCustomLabel(value);\r\n }\r\n return value as string;\r\n }\r\n\r\n // Lấy value ở option tag.\r\n protected transformOptionValue(option: Record<string, unknown>): unknown {\r\n const field = this.field()!;\r\n\r\n let optionValue: unknown;\r\n\r\n optionValue = option[field.bindValue];\r\n\r\n return optionValue;\r\n }\r\n\r\n // Lấy label.\r\n protected getOptionLabel(option: Record<string, unknown>): string {\r\n return this.getCustomLabel(option);\r\n }\r\n\r\n // Biến đổi label nếu có thuộc tính hàm biến đổi transformLabel.\r\n private getCustomLabel(option: Record<string, unknown>): string {\r\n const field = this.field();\r\n\r\n if (\r\n typeof option[field.bindLabel] === \"function\" ||\r\n !option[field.bindLabel]\r\n ) {\r\n let warnMessage =\r\n \"Giá trị label lấy theo bindLabel hiện đang là dạng object, array hoặc các dạng còn lại của complex data\";\r\n if (!option[field.bindLabel])\r\n warnMessage = \"Không tồn tại giá trị label khi lấy theo bindLabel\";\r\n // console.warn(warnMessage);\r\n\r\n return NO_INFO_TEXT;\r\n }\r\n\r\n let optionLabel = option[field.bindLabel] as string;\r\n\r\n if (field.transformLabel) {\r\n const tranformLabelValue = field.transformLabel(option);\r\n if (tranformLabelValue) optionLabel = tranformLabelValue;\r\n }\r\n\r\n return optionLabel;\r\n }\r\n}\r\n","<div class=\"d-flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (viewMode() === viewModeEnum.form) {\r\n <input nz-input [value]=\"displayValue\" class=\"modeView\" />\r\n }\r\n @if (viewMode() === viewModeEnum.text) {\r\n <span class=\"modeView break-work\">{{ displayValue }}</span>\r\n }\r\n } @else {\r\n <nz-tree-select\r\n [nzId]=\"fieldKey()\"\r\n nzShowSearch\r\n nzAllowClear\r\n [nzDisabled]=\"isDisabled\"\r\n [nzPlaceHolder]=\"displayPlaceholder()\"\r\n [title]=\"field().tooltip || ''\"\r\n [nzDropdownMatchSelectWidth]=\"field().matchSelectWidth\"\r\n [ngModel]=\"value\"\r\n [nzNodes]=\"options\"\r\n class=\"flex-1 min-w-0\"\r\n (ngModelChange)=\"handleChangeOptions($event)\"\r\n >\r\n </nz-tree-select>\r\n\r\n <ng-template #loadingIcon>\r\n <nz-spin nzSimple [nzSize]=\"'small'\"></nz-spin>\r\n </ng-template>\r\n }\r\n\r\n <!-- Suffixes -->\r\n @if (field().suffixes.length > 0) {\r\n @for (suffix of field().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { Component, computed, effect, forwardRef } from \"@angular/core\";\r\nimport { NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\nimport { BaseValueAccessor } from \"../../../base/base-value-accessor\";\r\nimport { TextareaField } from \"../../../models/fields/textarea/textarea-field.model\";\r\nimport { createInputPlaceholder } from \"../../../utils/dynamic-form/dynamic-form\";\r\nimport { NO_INFO_TEXT } from \"../../../consts/common/common.const\";\r\nimport { FieldTypeEnum } from \"../../../enums/fields\";\r\nimport { NzInputModule } from \"ng-zorro-antd/input\";\r\n\r\nconst ZORRO_MODULES = [NzInputModule];\r\n\r\n@Component({\r\n selector: \"app-textarea\",\r\n standalone: true,\r\n imports: [...ZORRO_MODULES],\r\n templateUrl: \"./textarea.component.html\",\r\n styleUrls: [\"./textarea.component.scss\"],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TextareaComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class TextareaComponent extends BaseValueAccessor<string> {\r\n readonly field = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof TextareaField) ||\r\n base.type !== FieldTypeEnum.Textarea\r\n ) {\r\n throw new Error(\"Expected TextareaField\");\r\n }\r\n return base;\r\n });\r\n\r\n displayNoValueText = NO_INFO_TEXT;\r\n\r\n readonly viewDisplayValue = computed(() => {\r\n // 1. Nếu không phải View thì không cần quan tâm text này\r\n if (!this.isView()) return \"\";\r\n\r\n // 2. Lấy giá trị từ valueSignal\r\n const val = this.valueSignal();\r\n return val ? val : NO_INFO_TEXT;\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n // Xử lý tạo placeholder text tự động nếu chưa truyền placeholder vào config của field\r\n override resolvePlaceholderText(): string {\r\n return createInputPlaceholder(this.field());\r\n }\r\n\r\n handleChangeTextarea(event: Event): void {\r\n const textareaValue = (event.target as HTMLInputElement).value;\r\n this.propagateValue(textareaValue);\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(\r\n this.fieldKey(),\r\n textareaValue &&\r\n textareaValue.replace(/\\n+/g, \"br_enter\").replace(/br_enter+/g, \"\\n\"),\r\n );\r\n }\r\n\r\n protected override writeValueToView(value: string): void {\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n}\r\n","@if (modeSignal() === formModeEnum.View) {\r\n @if (viewMode() === viewModeEnum.form) {\r\n @if (viewDisplayValue(); as displayValue) {\r\n <p\r\n [innerHTML]=\"displayValue\"\r\n class=\"disabled-textarea break-work mb0\"\r\n ></p>\r\n } @else {\r\n <input nz-input [value]=\"displayNoValueText\" class=\"modeView\" />\r\n }\r\n }\r\n @if (viewMode() === viewModeEnum.text) {\r\n @if (viewDisplayValue(); as displayValue) {\r\n <p [innerHTML]=\"displayValue\" class=\"mode-view mb-0 break-work mb0\"></p>\r\n } @else {\r\n <span class=\"modeView\">{{ displayNoValueText }}</span>\r\n }\r\n }\r\n} @else {\r\n <textarea\r\n nz-input\r\n [nzAutosize]=\"{ minRows: 1, maxRows: 8 }\"\r\n [value]=\"value\"\r\n [disabled]=\"isDisabled\"\r\n [placeholder]=\"displayPlaceholder()\"\r\n (input)=\"handleChangeTextarea($event)\"\r\n >\r\n </textarea>\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { ApiResponse } from '../models/common/api-response.model';\r\nimport { ObjectStorage } from '../models/common/object-storage.model';\r\nimport { Subject } from 'rxjs';\r\nimport { FormConfigService } from './form-config.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FileService {\r\n private httpClient = inject(HttpClient);\r\n private formConfigService = inject(FormConfigService);\r\n\r\n private fileClick$ = new Subject<ObjectStorage>();\r\n\r\n fileClick = this.fileClick$.asObservable(); // expose ra ngoài.\r\n\r\n onFileClick(objStorage: ObjectStorage) {\r\n this.fileClick$.next(objStorage);\r\n }\r\n\r\n // Upload file đến server và trả về 1 ObjectStorage.\r\n uploadFile(\r\n file: File,\r\n formData: FormData,\r\n options?: {\r\n uploadUrl?: string;\r\n directoryId?: string;\r\n },\r\n ) {\r\n if (!options) options = {};\r\n if (!options.uploadUrl) {\r\n options.uploadUrl = this.formConfigService['config'].systemApiUrl + 'ObjectStorage/public/upload'; // fallback\r\n }\r\n return this.httpClient.post<any>(options.uploadUrl, formData);\r\n }\r\n\r\n // Xóa ObjectStorage.\r\n deleteObjStorage(\r\n id: string,\r\n options?: {\r\n deleteUrl?: string;\r\n directoryId?: string;\r\n },\r\n ) {\r\n if (!options) options = {};\r\n if (!options.deleteUrl) {\r\n options.deleteUrl = this.formConfigService['config'].systemApiUrl + 'ObjectStorage/public/delete'; // fallback\r\n }\r\n return this.httpClient.delete<ApiResponse<unknown>>(`${options.deleteUrl}/${id}`);\r\n }\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n forwardRef,\r\n inject,\r\n Input,\r\n signal,\r\n} from \"@angular/core\";\r\nimport {\r\n NzUploadFile,\r\n NzUploadModule,\r\n NzUploadXHRArgs,\r\n} from \"ng-zorro-antd/upload\";\r\nimport { NzIconModule } from \"ng-zorro-antd/icon\";\r\nimport { BaseValueAccessor } from \"../../../../base/base-value-accessor\";\r\nimport { AvatarUploadField } from \"../../../../models/fields/upload/avatar-upload-field.model\";\r\nimport { FieldTypeEnum } from \"../../../../enums/fields\";\r\nimport { ControlTypeEnum } from \"../../../../enums/controls\";\r\nimport { ObjectStorage } from \"../../../../models/common\";\r\nimport { FileService } from \"../../../../services/file.service\";\r\nimport { isValidJSON } from \"../../../../utils/common\";\r\nimport { finalize, Observable, of, Subscription } from \"rxjs\";\r\nimport { formatFileSize } from \"../../../../utils/file\";\r\nimport { FileSizeTypeEnum } from \"../../../../enums/common\";\r\nimport { NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\nimport { FormConfigService } from \"../../../../services/form-config.service\";\r\nimport { NzNotificationService } from \"ng-zorro-antd/notification\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport {\r\n DELETE_FILE_ERROR,\r\n UPLOAD_FILE_ERROR,\r\n} from \"../../../../consts/common\";\r\n\r\nconst modules = [CommonModule];\r\nconst zorroModules = [NzUploadModule, NzIconModule];\r\n\r\n@Component({\r\n selector: \"app-avatar-upload\",\r\n standalone: true,\r\n imports: [...modules, ...zorroModules],\r\n templateUrl: \"./avatar-upload.component.html\",\r\n styleUrl: \"./avatar-upload.component.scss\",\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AvatarUploadComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class AvatarUploadComponent extends BaseValueAccessor<string | File> {\r\n @Input() size: number = 100; // kích thước avatar\r\n\r\n readonly field = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof AvatarUploadField) ||\r\n (base.type !== FieldTypeEnum.AvatarUpload &&\r\n base.controlType !== ControlTypeEnum.Upload)\r\n ) {\r\n throw new Error(\"Expected AvatarUploadField\");\r\n }\r\n return base;\r\n });\r\n\r\n // Inject services\r\n private readonly fileService = inject(FileService);\r\n private readonly formConfigService = inject(FormConfigService);\r\n private readonly nzNotification = inject(NzNotificationService);\r\n\r\n readonly avatarUrl = signal<string | null>(null);\r\n readonly uploading = signal(false);\r\n\r\n // Mảng lưu trữ objectStorage liên quan đến tập tin.\r\n readonly objStorageList = signal<ObjectStorage[]>([]);\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string): void {\r\n this.handleInitAllData(value);\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n\r\n // Xử lý init các data cần thiết: objStorage, myFile, fileList, lưu giữ first value.\r\n // value sẽ là 1 string json mảng các objStorage.\r\n private handleInitAllData(value: string): void {\r\n // Reset khi đổi mode, hoặc model, hoặc fields.\r\n this.objStorageList.set([]);\r\n this.avatarUrl.set(null);\r\n\r\n if (isValidJSON(value)) {\r\n const objStorageList = JSON.parse(value) as ObjectStorage[];\r\n this.objStorageList.set(objStorageList);\r\n this.avatarUrl.set(\r\n this.formConfigService.getViewFileUrl(\r\n objStorageList[0]?.name ?? \"\",\r\n false,\r\n ),\r\n );\r\n }\r\n }\r\n\r\n beforeUpload = (\r\n file: NzUploadFile,\r\n fileList: NzUploadFile[],\r\n ): boolean | Observable<boolean> => {\r\n // const originFile = file?.originFileObj as unknown as File; // có thể ở version mới nhất đã fix lỗi NzUploadFile nhưng trả về File của tham số file.\r\n // Xử lý gán vào CVA để tiến hành validation theo các props đã truyền vào.\r\n const originFile = file as unknown as File;\r\n this.propagateValue(originFile);\r\n\r\n const { maxSizeInMB, acceptedMimeTypes } = this.field();\r\n const fileSizeInMB = formatFileSize(file.size!, FileSizeTypeEnum.MB);\r\n const fileType = file.type;\r\n if (fileSizeInMB > maxSizeInMB || !acceptedMimeTypes.includes(fileType!)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n customRequest = (item: NzUploadXHRArgs): Subscription => {\r\n // const originFile = nzUploadFile?.originFileObj;\r\n const originFile = item.file as unknown as File;\r\n\r\n // Nếu validation không thỏa, dừng tại đây.\r\n if (this.control?.invalid) {\r\n return of(null).subscribe(); // fake subscription.\r\n }\r\n\r\n // Validation đã thỏa, tiến hành upload file.\r\n return this.uploadFile(originFile);\r\n };\r\n\r\n private uploadFile(file: File) {\r\n this.uploading.set(true);\r\n const { uploadTemp } = this.field();\r\n const newFileName = this.formConfigService.generateRandomFileName(\r\n file.name,\r\n \"avatar\",\r\n );\r\n const renamedFile = new File([file], newFileName, { type: file.type });\r\n\r\n const formData = new FormData();\r\n formData.append(\"File\", renamedFile);\r\n if (uploadTemp) formData.append(\"isTemp\", \"true\");\r\n\r\n return this.fileService\r\n .uploadFile(renamedFile, formData, {\r\n uploadUrl: this.field().apiFileConfig.uploadUrl,\r\n })\r\n .pipe(\r\n this.takeUntilDestroy(),\r\n finalize(() => this.uploading.set(false)),\r\n )\r\n .subscribe({\r\n next: (res) => {\r\n const { code, data, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.set([data]);\r\n\r\n this.avatarUrl.set(\r\n this.formConfigService.getViewFileUrl(data?.name ?? \"\", true),\r\n );\r\n\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: () => {\r\n console.error(UPLOAD_FILE_ERROR);\r\n },\r\n });\r\n }\r\n\r\n deleteObjStorage(id: string) {\r\n return this.fileService\r\n .deleteObjStorage(id, {\r\n deleteUrl: this.field().apiFileConfig.deleteUrl,\r\n })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: (res) => {\r\n const { code, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.set([]);\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: (err: Error) => {\r\n console.error(DELETE_FILE_ERROR);\r\n // Tạm do api xóa có vấn đề\r\n this.objStorageList.set([]);\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n },\r\n });\r\n }\r\n}\r\n","<nz-upload\r\n [nzDisabled]=\"disabledSignal() || isView()\"\r\n [nzShowUploadList]=\"false\"\r\n [nzMultiple]=\"false\"\r\n [nzBeforeUpload]=\"beforeUpload\"\r\n [nzCustomRequest]=\"customRequest\"\r\n>\r\n <ng-container *ngTemplateOutlet=\"renderAvatarTpl\"></ng-container>\r\n</nz-upload>\r\n\r\n<!-- Template custom hiển thị avatar -->\r\n<ng-template #renderAvatarTpl>\r\n <div\r\n class=\"avatar-wrapper\"\r\n [ngStyle]=\"{ width: size + 'px', height: size + 'px' }\"\r\n >\r\n @if (uploading()) {\r\n <span\r\n nz-icon\r\n nzType=\"loading\"\r\n nzTheme=\"outline\"\r\n class=\"upload-icon\"\r\n ></span>\r\n } @else if (!avatarUrl() && isAddOrEdit()) {\r\n <span nz-icon nzType=\"plus\" nzTheme=\"outline\" class=\"upload-icon\"></span>\r\n } @else if (avatarUrl()) {\r\n <img [src]=\"avatarUrl()\" alt=\"\" class=\"avatar-img\" />\r\n }\r\n </div>\r\n</ng-template>\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n forwardRef,\r\n inject,\r\n signal,\r\n untracked,\r\n} from \"@angular/core\";\r\nimport { CORE_MODULES } from \"../../../../consts/common\";\r\nimport { BaseValueAccessor } from \"../../../../base/base-value-accessor\";\r\nimport {\r\n NzUploadFile,\r\n NzUploadModule,\r\n NzUploadXHRArgs,\r\n} from \"ng-zorro-antd/upload\";\r\nimport { MultiFileUploadField } from \"../../../../models/fields/upload/multi-file-upload-field.model\";\r\nimport { FieldTypeEnum } from \"../../../../enums/fields\";\r\nimport { isValidJSON } from \"../../../../utils/common\";\r\nimport { MyUploadFile } from \"../../../../models/common/common.model\";\r\nimport { ObjectStorage } from \"../../../../models/common\";\r\nimport { FileService } from \"../../../../services/file.service\";\r\nimport { Observable, of, Subscription } from \"rxjs\";\r\nimport { NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\nimport { ControlTypeEnum } from \"../../../../enums/controls\";\r\nimport { formatFileSize, getExtensions } from \"../../../../utils/file\";\r\nimport { FileSizeTypeEnum } from \"../../../../enums/common\";\r\nimport { FormConfigService } from \"../../../../services/form-config.service\";\r\nimport { NzIconModule } from \"ng-zorro-antd/icon\";\r\nimport { NzButtonModule } from \"ng-zorro-antd/button\";\r\nimport { NzMessageService } from \"ng-zorro-antd/message\";\r\nimport { NzNotificationService } from \"ng-zorro-antd/notification\";\r\n\r\nconst ZORRO_MODULES = [NzUploadModule, NzIconModule, NzButtonModule];\r\n\r\n@Component({\r\n selector: \"app-multi-file-upload\",\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...ZORRO_MODULES],\r\n templateUrl: \"./multi-file-upload.component.html\",\r\n styleUrl: \"./multi-file-upload.component.scss\",\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MultiFileUploadComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class MultiFileUploadComponent extends BaseValueAccessor<\r\n string | File | NzUploadFile\r\n> {\r\n // Cast lại đúng instance là MultiFileUploadFile.\r\n readonly field = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof MultiFileUploadField) ||\r\n (base.type !== FieldTypeEnum.MultiFileUpload &&\r\n base.controlType !== ControlTypeEnum.Upload)\r\n ) {\r\n throw new Error(\"Expected MultiFileUploadField\");\r\n }\r\n return base;\r\n });\r\n\r\n // Mảng lưu trữ objectStorage liên quan đến tập tin.\r\n objStorageList = signal<ObjectStorage[]>([]);\r\n\r\n // Mảng đại diện các images.\r\n allFiles = signal<MyUploadFile[]>([]);\r\n\r\n // Text hướng dẫn các loại extension được upload.\r\n readonly fileExtensionGuide = computed(() => {\r\n if (!this.isAddOrEdit()) return \"\";\r\n const { acceptedMimeTypes } = this.field();\r\n return `Hỗ trợ định dạng ${getExtensions(acceptedMimeTypes).join(\", \")}`;\r\n });\r\n\r\n // Đếm số file đã pass beforeUpload nhưng chưa upload xong (đang trong hàng chờ customRequest/uploadFile).\r\n // Dùng để tính toán count chính xác khi user chọn nhiều file cùng lúc.\r\n pendingCount = signal<number>(0);\r\n\r\n // Buffer chứa các file đang chờ xử lý trong một batch (một lần chọn file từ dialog).\r\n private _batchBuffer: Array<{\r\n file: NzUploadFile;\r\n resolve: (pass: boolean) => void;\r\n }> = [];\r\n\r\n // Timer dùng để phát hiện kết thúc một batch (setTimeout(0)).\r\n private _batchTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n private fileService = inject(FileService);\r\n private nzMessage = inject(NzMessageService);\r\n private nzNotification = inject(NzNotificationService);\r\n private formConfigService = inject(FormConfigService);\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string): void {\r\n this.handleInitAllData(value);\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n\r\n // Xử lý init các data cần thiết: objStorageList, allFiles, fileList, lưu giữ first value.\r\n // value sẽ là 1 string json mảng các objStorage.\r\n private handleInitAllData(value: string): void {\r\n // Reset khi đổi mode, hoặc model, hoặc fields.\r\n this.objStorageList.set([]);\r\n this.allFiles.set([]);\r\n\r\n if (isValidJSON(value)) {\r\n // Khởi tạo danh sách ObjectStorage từ data json.\r\n const objStorageList = JSON.parse(value) as ObjectStorage[];\r\n this.objStorageList.set(objStorageList);\r\n\r\n // Khởi tạo danh sách MyUploadFile từ data json.\r\n // File từ server luôn ở trạng thái success.\r\n const myUploadFiles = objStorageList.map(\r\n (objStorage) =>\r\n ({\r\n objStorage,\r\n isTemp: false,\r\n previewUrl: this.formConfigService.getViewFileUrl(\r\n objStorage.name ?? \"\",\r\n false,\r\n ),\r\n uploadStatus: \"success\",\r\n }) as MyUploadFile,\r\n );\r\n this.allFiles.set(myUploadFiles);\r\n }\r\n }\r\n\r\n /**\r\n * Xử lý trước khi upload — trả về Observable<boolean> để hỗ trợ batch detection.\r\n *\r\n * Cơ chế batch detection:\r\n * nz-upload gọi beforeUpload() từng file một (đồng bộ) trong cùng 1 JS tick khi user\r\n * chọn nhiều file. Mỗi lần gọi, file được đẩy vào _batchBuffer. Sau khi tất cả các\r\n * lần gọi đồng bộ kết thúc, setTimeout(0) kích hoạt _processBatch() để xử lý toàn bộ\r\n * batch một lần, cho phép kiểm tra tổng số lượng chính xác trước khi upload.\r\n */\r\n beforeUpload = (file: NzUploadFile): Observable<boolean> => {\r\n return new Observable<boolean>((subscriber) => {\r\n // Đẩy file vào buffer với hàm resolve tương ứng.\r\n this._batchBuffer.push({\r\n file,\r\n resolve: (pass: boolean) => {\r\n subscriber.next(pass);\r\n subscriber.complete();\r\n },\r\n });\r\n\r\n // Reset timer mỗi lần có file mới vào buffer.\r\n // Khi tất cả beforeUpload synchronous calls kết thúc, timer sẽ fire và gọi _processBatch().\r\n if (this._batchTimer !== null) clearTimeout(this._batchTimer);\r\n this._batchTimer = setTimeout(() => this._processBatch(), 0);\r\n });\r\n };\r\n\r\n /**\r\n * Xử lý toàn bộ batch file sau khi tất cả beforeUpload calls trong cùng 1 tick đã hoàn tất.\r\n *\r\n * Logic:\r\n * 1. Nếu tổng (file hiện tại + pending + batch) vượt maxFileCount → reject TOÀN BỘ batch.\r\n * 2. Validate từng file trong batch:\r\n * - File thỏa (MIME + size) → pendingCount++, resolve(true) → cho phép upload.\r\n * - File không thỏa → hiển thị NzMessage lỗi, resolve(false) → bỏ qua.\r\n */\r\n private _processBatch(): void {\r\n const batch = [...this._batchBuffer];\r\n this._batchBuffer = [];\r\n this._batchTimer = null;\r\n\r\n const { maxFileCount, maxSizeInMB, acceptedMimeTypes } = this.field();\r\n\r\n // Số file hiện tại: đã upload xong + đang trong hàng chờ upload.\r\n const currentCount = this.allFiles().length + this.pendingCount();\r\n\r\n // ── CHECK 1: Tổng batch vượt maxFileCount → reject TOÀN BỘ batch ──\r\n if (currentCount + batch.length > maxFileCount) {\r\n this.nzNotification.warning(\r\n \"Cảnh báo\",\r\n `Không thể tải lên: số lượng file tải lên vượt quá giới hạn cho phép. Tối đa ${maxFileCount} tập tin.`,\r\n { nzDuration: 4500 },\r\n );\r\n batch.forEach(({ resolve }) => resolve(false));\r\n return;\r\n }\r\n\r\n // ── CHECK 2: Validate từng file — upload file thỏa, báo lỗi file không thỏa ──\r\n for (const { file, resolve } of batch) {\r\n const originFile = file as unknown as File;\r\n const fileSizeInMB = formatFileSize(file.size!, FileSizeTypeEnum.MB);\r\n const fileType = file.type ?? \"\";\r\n\r\n const isSizeOk = fileSizeInMB <= maxSizeInMB;\r\n const isMimeOk = acceptedMimeTypes.includes(fileType);\r\n\r\n if (!isSizeOk || !isMimeOk) {\r\n // Xây dựng thông báo lỗi chi tiết cho từng file không thỏa.\r\n const reasons: string[] = [];\r\n if (!isMimeOk) reasons.push(`định dạng không hợp lệ`);\r\n if (!isSizeOk) reasons.push(`kích thước vượt ${maxSizeInMB}MB`);\r\n\r\n this.nzMessage.error(\r\n `\"${file.name}\" không được tải lên: ${reasons.join(\", \")}.`,\r\n );\r\n\r\n // Propagate để CVA/validator hiển thị trạng thái lỗi trên control.\r\n this.propagateValue(originFile);\r\n resolve(false);\r\n continue;\r\n }\r\n\r\n // File hợp lệ: thêm optimistic entry vào allFiles với trạng thái loading ngay lập tức.\r\n // Dùng file.uid (do nz-upload tự tạo, duy nhất cho mỗi NzUploadFile) làm key để track và update sau này.\r\n const uid = file.uid;\r\n this.allFiles.update((curr) => [\r\n ...curr,\r\n {\r\n uid,\r\n objStorage: { id: uid, name: originFile.name }, // placeholder, sẽ được thay bằng data thật sau khi upload\r\n isTemp: true,\r\n previewUrl: \"\",\r\n uploadStatus: \"loading\",\r\n } as MyUploadFile,\r\n ]);\r\n\r\n // Propagate để trigger validator, tăng pendingCount, cho phép upload.\r\n this.propagateValue(originFile);\r\n this.pendingCount.update((c) => c + 1);\r\n resolve(true);\r\n }\r\n }\r\n\r\n customRequest = (item: NzUploadXHRArgs): Subscription => {\r\n // const originFile = nzUploadFile?.originFileObj;\r\n const uid = item.file.uid; // Stable key để map với optimistic entry trong allFiles.\r\n const originFile = item.file as unknown as File;\r\n\r\n // Nếu validation không thỏa, dừng tại đây và xóa optimistic entry khỏi list.\r\n if (this.control?.invalid) {\r\n this.pendingCount.update((c) => Math.max(0, c - 1));\r\n this.allFiles.update((curr) => curr.filter((f) => f.uid !== uid));\r\n return of(null).subscribe(); // fake subscription.\r\n }\r\n\r\n // Validation đã thỏa, tiến hành upload file.\r\n return this.uploadFile(originFile, uid);\r\n };\r\n\r\n private uploadFile(file: File, uid: string) {\r\n const { apiFileConfig, uploadTemp } = this.field();\r\n const newFileName = this.formConfigService.generateRandomFileName(\r\n file.name,\r\n \"file\",\r\n );\r\n const renamedFile = new File([file], newFileName, { type: file.type });\r\n\r\n const mimeCfg = apiFileConfig.perMimeTypeConfig?.[file.type]; // Lấy mimeTypes file upload.\r\n const uploadUrl = mimeCfg?.uploadUrl ?? apiFileConfig.uploadUrl; // Nếu có config upload riêng cho mimeTypes đang kiểm tra.\r\n const formData = mimeCfg?.buildFormData // Nếu có hàm custon buildFormData.\r\n ? mimeCfg.buildFormData(file, {})\r\n : (() => {\r\n // Mặc định\r\n const fd = new FormData();\r\n fd.append(\"File\", renamedFile);\r\n // fd.append('isTemp', 'true');\r\n return fd;\r\n })();\r\n\r\n if (uploadTemp) formData.append(\"isTemp\", \"true\");\r\n\r\n return this.fileService\r\n .uploadFile(renamedFile, formData, { uploadUrl })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: (res) => {\r\n // Giảm pending dù thành công hay thất bại.\r\n this.pendingCount.update((c) => Math.max(0, c - 1));\r\n\r\n const { code, data, message } = res;\r\n if (code === 0) {\r\n // Cập nhật objStorageList với data thật từ server.\r\n this.objStorageList.update((curr) => [...curr, data]);\r\n\r\n // Thay thế optimistic entry (uid) bằng data thật, chuyển sang trạng thái success.\r\n this.allFiles.update((curr) =>\r\n curr.map((f) =>\r\n f.uid === uid\r\n ? ({\r\n ...f,\r\n objStorage: data,\r\n previewUrl: this.formConfigService.getViewFileUrl(\r\n data.name ?? \"\",\r\n true,\r\n ),\r\n uploadStatus: \"success\",\r\n } as MyUploadFile)\r\n : f,\r\n ),\r\n );\r\n\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n // Đồng bộ control value → validators (required) nhận biết có file thành công.\r\n this._syncControlValue();\r\n } else {\r\n // Cập nhật optimistic entry sang trạng thái error.\r\n this.allFiles.update((curr) =>\r\n curr.map((f) =>\r\n f.uid === uid\r\n ? ({ ...f, uploadStatus: \"error\" } as MyUploadFile)\r\n : f,\r\n ),\r\n );\r\n console.error(message);\r\n // Đồng bộ control value → nếu tất cả file đều fail, objStorageList rỗng → required kích hoạt.\r\n this._syncControlValue();\r\n }\r\n },\r\n error: () => {\r\n // Giảm pending khi upload thất bại.\r\n this.pendingCount.update((c) => Math.max(0, c - 1));\r\n // Cập nhật optimistic entry sang trạng thái error.\r\n this.allFiles.update((curr) =>\r\n curr.map((f) =>\r\n f.uid === uid\r\n ? ({ ...f, uploadStatus: \"error\" } as MyUploadFile)\r\n : f,\r\n ),\r\n );\r\n console.error(\"Lỗi trong quá trình tải tập đến máy chủ!!\");\r\n // Đồng bộ control value → nếu tất cả file đều fail → required kích hoạt.\r\n this._syncControlValue();\r\n },\r\n });\r\n }\r\n\r\n handleDelete(file: MyUploadFile): void {\r\n const { objStorage, uploadStatus } = file;\r\n const { uploadTemp } = this.field();\r\n\r\n // Loại bỏ và cập nhật danh sách ObjectStorage.\r\n const newObjStorageList = this.objStorageList().filter(\r\n (item) => item.id !== objStorage?.id,\r\n );\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n // Loại bỏ và cập nhật danh sách MyUploadFile.\r\n const newAllFiles = this.allFiles().filter(\r\n (item) => item.objStorage?.id !== objStorage?.id,\r\n );\r\n this.allFiles.set(newAllFiles);\r\n\r\n // File ở trạng thái error: upload chưa thành công, không cần gọi API xoá trên server.\r\n if (uploadStatus === \"error\") {\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n // Đồng bộ control value → nếu xóa hết file error còn lại → required kích hoạt.\r\n this._syncControlValue();\r\n return;\r\n }\r\n\r\n if (uploadTemp) {\r\n this.deleteObjStorage(objStorage.id || \"\");\r\n return;\r\n }\r\n\r\n // Cập nhật đầu ra cho form.\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n // Đồng bộ control value → nếu xóa hết file → required kích hoạt.\r\n this._syncControlValue();\r\n }\r\n\r\n deleteObjStorage(id: string) {\r\n return this.fileService\r\n .deleteObjStorage(id, {\r\n deleteUrl: this.field().apiFileConfig.deleteUrl,\r\n })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: (res) => {\r\n const { code, message } = res;\r\n if (code === 0) {\r\n const newObjStorageList = this.objStorageList().filter(\r\n (item) => item.id !== id,\r\n );\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n // Đồng bộ control value sau khi server xác nhận xóa.\r\n this._syncControlValue();\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: () => {\r\n console.error(\"Lỗi trong quá trình xóa tập tin khỏi máy chủ!!\");\r\n // Fake vì hiện api xóa đang có vấn đề.\r\n const newObjStorageList = this.objStorageList().filter(\r\n (item) => item.id !== id,\r\n );\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n // Đồng bộ control value (fake delete thành công).\r\n this._syncControlValue();\r\n // Fake vì hiện api xóa đang có vấn đề.\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Xử lý click vào file item:\r\n * - Không làm gì nếu file đang loading hoặc ở trạng thái error.\r\n * - Gọi fileClick để xem file nếu đã upload thành công.\r\n */\r\n onFileItemClick(file: MyUploadFile): void {\r\n if (file.uploadStatus === \"loading\" || file.uploadStatus === \"error\")\r\n return;\r\n this.fileService.onFileClick(file.objStorage);\r\n }\r\n\r\n fileClick(objStorage: ObjectStorage): void {\r\n this.fileService.onFileClick(objStorage);\r\n }\r\n\r\n /**\r\n * Hủy toàn bộ batch đang chờ xử lý:\r\n * - Clear timer batch detection.\r\n * - Reject tất cả file trong buffer (resolve false).\r\n * - Reset pendingCount về 0.\r\n * Gọi khi form bị reset từ bên ngoài.\r\n */\r\n private _clearBatch(): void {\r\n if (this._batchTimer !== null) {\r\n clearTimeout(this._batchTimer);\r\n this._batchTimer = null;\r\n }\r\n this._batchBuffer.forEach(({ resolve }) => resolve(false));\r\n this._batchBuffer = [];\r\n this.pendingCount.set(0);\r\n }\r\n\r\n /**\r\n * Đồng bộ control value với trạng thái thực tế của danh sách file đã upload thành công.\r\n *\r\n * Gọi sau mỗi thay đổi về danh sách file (upload xong, xóa file) để đảm bảo:\r\n * - Không có file nào thành công → propagateValue('') → Validators.required kích hoạt.\r\n * - Có ít nhất 1 file thành công → propagateValue(JSON string) → validators pass.\r\n *\r\n * Validators hiện tại tương thích:\r\n * - acceptedMimeTypesValidator: bỏ qua nếu value falsy; parse JSON nếu là string.\r\n * - maxFileSizeInMBValidator: bỏ qua nếu value.size undefined (JSON string).\r\n */\r\n private _syncControlValue(): void {\r\n const list = this.objStorageList();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n this.propagateValue((list.length > 0 ? JSON.stringify(list) : \"\") as any);\r\n }\r\n}\r\n","@if (isAddOrEdit()) {\r\n <nz-upload\r\n [nzShowUploadList]=\"false\"\r\n [nzMultiple]=\"true\"\r\n [nzBeforeUpload]=\"beforeUpload\"\r\n [nzCustomRequest]=\"customRequest\"\r\n >\r\n <button nz-button class=\"btn-upload\" nzType=\"primary\" nzSize=\"small\">\r\n <nz-icon nzType=\"upload\" nzTheme=\"outline\" />\r\n <span class=\"font-size-12\">Tải lên</span>\r\n </button>\r\n\r\n <span class=\"font-size-12\"\r\n >( Tối đa {{ field().maxFileCount }} tập tin )</span\r\n >\r\n\r\n @if (field().showAcceptedExtensionGuide) {\r\n <div class=\"file-extension-guide\">{{ fileExtensionGuide() }}</div>\r\n }\r\n </nz-upload>\r\n}\r\n\r\n<!-- Custom hiển thị danh sách tập tin -->\r\n@if (allFiles().length > 0) {\r\n <ng-container *ngTemplateOutlet=\"renderFileTpl\"></ng-container>\r\n} @else {\r\n @if (isView()) {\r\n <span class=\"no-text-info\">Không có thông tin</span>\r\n }\r\n}\r\n\r\n<!-- Template custom hiển thị danh sách tập tin -->\r\n<ng-template #renderFileTpl>\r\n <ul class=\"custom-upload-list\">\r\n @for (file of allFiles(); track file.objStorage?.id) {\r\n <li\r\n class=\"upload-item\"\r\n [class.is-loading]=\"file.uploadStatus === 'loading'\"\r\n [class.is-error]=\"file.uploadStatus === 'error'\"\r\n (click)=\"onFileItemClick(file)\"\r\n >\r\n <!-- Icon trạng thái bên trái -->\r\n @switch (file.uploadStatus) {\r\n @case (\"loading\") {\r\n <span\r\n nz-icon\r\n nzType=\"loading\"\r\n nzTheme=\"outline\"\r\n class=\"status-icon loading-icon\"\r\n ></span>\r\n }\r\n @case (\"error\") {\r\n <span\r\n nz-icon\r\n nzType=\"close-circle\"\r\n nzTheme=\"fill\"\r\n class=\"status-icon error-icon\"\r\n ></span>\r\n }\r\n @default {\r\n <span\r\n nz-icon\r\n nzType=\"paper-clip\"\r\n nzTheme=\"outline\"\r\n class=\"paper-clip-icon\"\r\n ></span>\r\n }\r\n }\r\n\r\n <span class=\"file-name\" [title]=\"file.objStorage.name ?? ''\">{{\r\n file.objStorage.name\r\n }}</span>\r\n\r\n @if (isAddOrEdit() && file.uploadStatus !== \"loading\") {\r\n <span\r\n nz-icon\r\n nzType=\"delete\"\r\n nzTheme=\"outline\"\r\n title=\"Xóa\"\r\n class=\"delete-icon\"\r\n (click)=\"handleDelete(file); $event.stopPropagation()\"\r\n ></span>\r\n }\r\n\r\n @if (\r\n !isAddOrEdit() &&\r\n file.uploadStatus !== \"error\" &&\r\n file.uploadStatus !== \"loading\"\r\n ) {\r\n <span\r\n nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n class=\"view-icon\"\r\n title=\"Xem file\"\r\n ></span>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n</ng-template>\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n forwardRef,\r\n inject,\r\n signal,\r\n} from \"@angular/core\";\r\nimport { CORE_MODULES } from \"../../../../consts/common\";\r\nimport { BaseValueAccessor } from \"../../../../base/base-value-accessor\";\r\nimport {\r\n NzUploadFile,\r\n NzUploadModule,\r\n NzUploadXHRArgs,\r\n} from \"ng-zorro-antd/upload\";\r\nimport { MultiImageUploadField } from \"../../../../models/fields/upload/multi-image-upload-field.model\";\r\nimport { FieldTypeEnum } from \"../../../../enums/fields\";\r\nimport { isValidJSON } from \"../../../../utils/common\";\r\nimport { MyUploadFile } from \"../../../../models/common/common.model\";\r\nimport { ObjectStorage } from \"../../../../models/common\";\r\nimport { FileService } from \"../../../../services/file.service\";\r\nimport { finalize, Observable, of, Subscription } from \"rxjs\";\r\nimport { NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\nimport { ControlTypeEnum } from \"../../../../enums/controls\";\r\nimport { formatFileSize } from \"../../../../utils/file\";\r\nimport { FileSizeTypeEnum } from \"../../../../enums/common\";\r\nimport { FormConfigService } from \"../../../../services/form-config.service\";\r\nimport { NzImageModule } from \"ng-zorro-antd/image\";\r\nimport { NzIconModule } from \"ng-zorro-antd/icon\";\r\nimport { NzButtonModule } from \"ng-zorro-antd/button\";\r\nimport { NzNotificationService } from \"ng-zorro-antd/notification\";\r\n\r\nconst ZORRO_MODULES = [\r\n NzUploadModule,\r\n NzIconModule,\r\n NzButtonModule,\r\n NzImageModule,\r\n];\r\n\r\n@Component({\r\n selector: \"app-multi-image-upload\",\r\n standalone: true,\r\n imports: [...CORE_MODULES, ...ZORRO_MODULES],\r\n templateUrl: \"./multi-image-upload.component.html\",\r\n styleUrl: \"./multi-image-upload.component.less\",\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MultiImageUploadComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class MultiImageUploadComponent extends BaseValueAccessor<\r\n string | File | NzUploadFile\r\n> {\r\n // Cast lại đúng instance là MultiImageUploadField.\r\n readonly field = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof MultiImageUploadField) ||\r\n (base.type !== FieldTypeEnum.MultiImageUpload &&\r\n base.controlType !== ControlTypeEnum.Upload)\r\n ) {\r\n throw new Error(\"Expected MultiImageUploadField\");\r\n }\r\n return base;\r\n });\r\n\r\n // Mảng lưu trữ objectStorage liên quan đến hình ảnh.\r\n readonly objStorageList = signal<ObjectStorage[]>([]);\r\n\r\n // Mảng đại diện các images.\r\n readonly allFiles = signal<MyUploadFile[]>([]);\r\n readonly uploading = signal(false);\r\n\r\n private fileService = inject(FileService);\r\n private nzNotification = inject(NzNotificationService);\r\n private formConfigService = inject(FormConfigService);\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string): void {\r\n this.handleInitAllData(value);\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n\r\n // Xử lý init các data cần thiết: objStorageList, allFiles, fileList, lưu giữ first value.\r\n // value sẽ là 1 string json mảng các objStorage.\r\n private handleInitAllData(value: string): void {\r\n // Reset khi đổi mode, hoặc model, hoặc fields.\r\n this.objStorageList.set([]);\r\n this.allFiles.set([]);\r\n\r\n if (isValidJSON(value)) {\r\n // Khởi tạo danh sách ObjectStorage từ data json.\r\n const objStorageList = JSON.parse(value) as ObjectStorage[];\r\n this.objStorageList.set(objStorageList);\r\n\r\n // Khởi tạo danh sách MyUploadFile từ data json.\r\n const myUploadFiles = objStorageList.map(\r\n (objStorage) =>\r\n ({\r\n objStorage,\r\n isTemp: false,\r\n previewUrl: this.formConfigService.getViewFileUrl(\r\n objStorage.name ?? \"\",\r\n false,\r\n ),\r\n }) as MyUploadFile,\r\n );\r\n this.allFiles.set(myUploadFiles);\r\n }\r\n }\r\n\r\n // Xử lý trước khi upload.\r\n beforeUpload = (file: NzUploadFile): boolean | Observable<boolean> => {\r\n // const originFile = file?.originFileObj as unknown as File; // có thể ở version mới nhất đã fix lỗi NzUploadFile nhưng trả về File của tham số file.\r\n // Xử lý gán vào CVA để tiến hành validation theo các props đã truyền vào.\r\n const originFile = file as unknown as File;\r\n this.propagateValue(originFile);\r\n\r\n const { maxFileCount, maxSizeInMB, acceptedMimeTypes } = this.field();\r\n // Kiểm tra số lượng tối đa hình ảnh có thể tải lên.\r\n if (this.allFiles().length + 1 > maxFileCount) {\r\n this.nzNotification.warning(\r\n \"Cảnh báo\",\r\n `Chỉ được phép tải lên tối đa ${maxFileCount} hình ảnh`,\r\n { nzDuration: 4500 },\r\n );\r\n return false;\r\n }\r\n\r\n const fileSizeInMB = formatFileSize(file.size!, FileSizeTypeEnum.MB);\r\n const fileType = file.type;\r\n if (fileSizeInMB > maxSizeInMB || !acceptedMimeTypes.includes(fileType!)) {\r\n return false;\r\n }\r\n\r\n // Luôn trả về true vì lúc này chưa bắt kịp control là valid hay invalid.\r\n return true;\r\n };\r\n\r\n customRequest = (item: NzUploadXHRArgs): Subscription => {\r\n // const originFile = nzUploadFile?.originFileObj;\r\n const originFile = item.file as unknown as File;\r\n\r\n // Nếu validation không thỏa, dừng tại đây.\r\n if (this.control?.invalid) {\r\n return of(null).subscribe(); // fake subscription.\r\n }\r\n\r\n // Validation đã thỏa, tiến hành upload file.\r\n return this.uploadFile(originFile);\r\n };\r\n\r\n private uploadFile(file: File) {\r\n this.uploading.set(true);\r\n const { apiFileConfig, uploadTemp } = this.field();\r\n const newFileName = this.formConfigService.generateRandomFileName(\r\n file.name,\r\n \"file\",\r\n );\r\n const renamedFile = new File([file], newFileName, { type: file.type });\r\n\r\n const mimeCfg = apiFileConfig.perMimeTypeConfig?.[file.type]; // Lấy mimeTypes file upload.\r\n const uploadUrl = mimeCfg?.uploadUrl ?? apiFileConfig.uploadUrl; // Nếu có config upload riêng cho mimeTypes đang kiểm tra.\r\n const formData = mimeCfg?.buildFormData // Nếu có hàm custon buildFormData.\r\n ? mimeCfg.buildFormData(file, {})\r\n : (() => {\r\n // Mặc định\r\n const fd = new FormData();\r\n fd.append(\"File\", renamedFile);\r\n // fd.append('isTemp', 'true');\r\n return fd;\r\n })();\r\n\r\n if (uploadTemp) formData.append(\"isTemp\", \"true\");\r\n\r\n return this.fileService\r\n .uploadFile(renamedFile, formData, { uploadUrl })\r\n .pipe(\r\n this.takeUntilDestroy(),\r\n finalize(() => this.uploading.set(false)),\r\n )\r\n .subscribe({\r\n next: (res) => {\r\n const { code, data, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.update((curr) => [...curr, data]);\r\n\r\n this.allFiles.update((curr) => [\r\n ...curr,\r\n {\r\n objStorage: data,\r\n isTemp: true,\r\n previewUrl: this.formConfigService.getViewFileUrl(\r\n data.name ?? \"\",\r\n true,\r\n ),\r\n } as MyUploadFile,\r\n ]);\r\n\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: (err: Error) => {\r\n console.error(\"Lỗi trong quá trình tải hình ảnh đến máy chủ!!\");\r\n },\r\n });\r\n }\r\n\r\n handleDelete(file: MyUploadFile): void {\r\n const { objStorage } = file;\r\n\r\n // Loại bỏ và cập nhật danh sách ObjectStorage.\r\n const newObjStorageList = this.objStorageList().filter(\r\n (item) => item.id !== objStorage?.id,\r\n );\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n // Loại bỏ và cập nhật danh sách MyUploadFile.\r\n const newAllFiles = this.allFiles().filter(\r\n (item) => item.objStorage?.id !== objStorage?.id,\r\n );\r\n this.allFiles.set(newAllFiles);\r\n\r\n // Cập nhật đầu ra cho form.\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n }\r\n\r\n deleteObjStorage(id: string) {\r\n return this.fileService\r\n .deleteObjStorage(id, {\r\n deleteUrl: this.field().apiFileConfig.deleteUrl,\r\n })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: (res) => {\r\n const { code, message } = res;\r\n if (code === 0) {\r\n const newObjStorageList = this.objStorageList().filter(\r\n (item) => item.id !== id,\r\n );\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: (err: Error) => {\r\n console.error(\"Lỗi trong quá trình xóa tập tin khỏi máy chủ!!\");\r\n // Fake vì hiện api xóa đang có vấn đề.\r\n const newObjStorageList = this.objStorageList().filter(\r\n (item) => item.id !== id,\r\n );\r\n this.objStorageList.set(newObjStorageList);\r\n\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n // Fake vì hiện api xóa đang có vấn đề.\r\n },\r\n });\r\n }\r\n\r\n protected handlePreview(file: MyUploadFile): void {\r\n const imgRef = document.getElementById(file.objStorage.id);\r\n if (imgRef) imgRef.click();\r\n }\r\n}\r\n","@if (isAddOrEdit()) {\r\n <div class=\"upload\">\r\n <nz-upload\r\n [nzDisabled]=\"\r\n allFiles().length >= field().maxFileCount ||\r\n disabledSignal() ||\r\n uploading()\r\n \"\r\n [nzShowUploadList]=\"false\"\r\n [nzMultiple]=\"false\"\r\n [nzBeforeUpload]=\"beforeUpload\"\r\n [nzCustomRequest]=\"customRequest\"\r\n >\r\n <button nz-button class=\"btn-upload\" [nzLoading]=\"uploading()\">\r\n Tải lên\r\n @if (!uploading()) {\r\n <nz-icon nzType=\"upload\" nzTheme=\"outline\" />\r\n }\r\n </button>\r\n\r\n <span class=\"ms-2 text-muted fs-12\">\r\n (Đã tải lên {{ allFiles().length }}/{{ field().maxFileCount }}\r\n hình ảnh)\r\n </span>\r\n </nz-upload>\r\n </div>\r\n}\r\n\r\n<!-- Custom hiển thị danh sách hình ảnh -->\r\n@if (allFiles().length > 0) {\r\n <ng-container *ngTemplateOutlet=\"imageGroupTpl\"></ng-container>\r\n}\r\n\r\n<!-- Template custom hiển thị danh sách hình ảnh -->\r\n<ng-template #imageGroupTpl>\r\n <nz-image-group>\r\n <div class=\"image-list\">\r\n @for (file of allFiles(); track file.objStorage?.id; let i = $index) {\r\n <div\r\n class=\"image-card-container\"\r\n [ngStyle]=\"{\r\n width: field().imageCardWidth,\r\n height: field().imageCardHeight,\r\n }\"\r\n >\r\n <div class=\"image-item\">\r\n <div class=\"image-item-info\">\r\n <img\r\n [id]=\"file.objStorage.id\"\r\n nz-image\r\n nzSrc=\"{{ file.previewUrl }}\"\r\n alt=\"{{ file.objStorage.originalName }}\"\r\n />\r\n </div>\r\n\r\n <div class=\"image-item-actions\">\r\n <button\r\n nz-button\r\n nzType=\"text\"\r\n nzSize=\"small\"\r\n (click)=\"handlePreview(file)\"\r\n >\r\n <nz-icon nzType=\"eye\" nzTheme=\"outline\" />\r\n </button>\r\n\r\n @if (isAddOrEdit()) {\r\n <button\r\n nz-button\r\n nzType=\"text\"\r\n nzSize=\"small\"\r\n (click)=\"handleDelete(file)\"\r\n >\r\n <nz-icon nzType=\"delete\" nzTheme=\"outline\" />\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </nz-image-group>\r\n</ng-template>\r\n","import { Component, computed, forwardRef, inject, signal } from \"@angular/core\";\r\nimport {\r\n DELETE_FILE_ERROR,\r\n NO_FILE_NAME,\r\n NO_INFO_TEXT,\r\n UPLOAD_FILE_ERROR,\r\n UPLOAD_FILE_TEXT,\r\n} from \"../../../../consts/common\";\r\nimport { BaseValueAccessor } from \"../../../../base/base-value-accessor\";\r\nimport { SingleFileUploadField } from \"../../../../models/fields/upload/single-file-upload-field.model\";\r\nimport { NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\nimport {\r\n NzUploadFile,\r\n NzUploadModule,\r\n NzUploadXHRArgs,\r\n} from \"ng-zorro-antd/upload\";\r\nimport { finalize, Observable, of, Subscription } from \"rxjs\";\r\nimport { FileService } from \"../../../../services/file.service\";\r\nimport { ObjectStorage } from \"../../../../models/common/object-storage.model\";\r\nimport { FieldTypeEnum } from \"../../../../enums/fields\";\r\nimport { MyUploadFile } from \"../../../../models/common/common.model\";\r\nimport { formatFileSize, getExtensions } from \"../../../../utils/file\";\r\nimport { isValidJSON } from \"../../../../utils/common\";\r\nimport { ControlTypeEnum } from \"../../../../enums/controls\";\r\nimport { FileSizeTypeEnum } from \"../../../../enums/common\";\r\nimport { FormUtils } from \"../../../../services/form-utils\";\r\nimport { FormConfigService } from \"../../../../services/form-config.service\";\r\nimport { NzIconModule } from \"ng-zorro-antd/icon\";\r\nimport { NzInputModule } from \"ng-zorro-antd/input\";\r\nimport { NzButtonModule } from \"ng-zorro-antd/button\";\r\nimport { SuffixComponent } from \"../../components/suffix/suffix.component\";\r\nimport { NzSpinModule } from \"ng-zorro-antd/spin\";\r\nimport { NzNotificationService } from \"ng-zorro-antd/notification\";\r\nimport { CommonModule } from \"@angular/common\";\r\n\r\nconst modules = [CommonModule];\r\nconst zorroModules = [\r\n NzUploadModule,\r\n NzIconModule,\r\n NzInputModule,\r\n NzButtonModule,\r\n NzSpinModule,\r\n];\r\nconst components = [SuffixComponent];\r\n\r\n@Component({\r\n selector: \"app-single-file-upload\",\r\n standalone: true,\r\n imports: [...modules, ...zorroModules, ...components],\r\n templateUrl: \"./single-file-upload.component.html\",\r\n styleUrls: [\"./single-file-upload.component.scss\"],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SingleFileUploadComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SingleFileUploadComponent extends BaseValueAccessor<\r\n string | File | NzUploadFile\r\n> {\r\n readonly field = computed(() => {\r\n const base = this.fieldInput();\r\n if (\r\n !(base instanceof SingleFileUploadField) ||\r\n (base.type !== FieldTypeEnum.SingleFileUpload &&\r\n base.controlType !== ControlTypeEnum.Upload)\r\n ) {\r\n throw new Error(\"Expected SingleFileUploadField\");\r\n }\r\n return base;\r\n });\r\n\r\n // Inject services\r\n private readonly fileService = inject(FileService);\r\n private readonly nzNotification = inject(NzNotificationService);\r\n private readonly formConfigService = inject(FormConfigService);\r\n\r\n // Mảng lưu trữ objectStorage liên quan đến tập tin.\r\n readonly objStorageList = signal<ObjectStorage[]>([]);\r\n\r\n // Mảng đại diện các files.\r\n readonly allFiles = signal<MyUploadFile[]>([]);\r\n\r\n // Text hướng dẫn các loại extension được upload.\r\n readonly fileExtensionGuide = computed(() => {\r\n if (!this.isAddOrEdit()) return \"\";\r\n const { acceptedMimeTypes } = this.field();\r\n return `Hỗ trợ định dạng ${getExtensions(acceptedMimeTypes).join(\", \")}`;\r\n });\r\n\r\n readonly viewDisplayValue = computed(() => {\r\n // 1. Nếu không phải View thì không cần quan tâm text này\r\n if (!this.isView()) return \"\";\r\n\r\n if (this.allFiles().length === 0) return NO_INFO_TEXT;\r\n\r\n const { objStorage } = this.allFiles()[0];\r\n const { nameAlias, name } = objStorage;\r\n if (!nameAlias && !name) return NO_INFO_TEXT;\r\n\r\n return nameAlias ?? name;\r\n });\r\n\r\n readonly addEditDisplayValue = computed(() => {\r\n if (!this.isAddOrEdit()) return \"\";\r\n\r\n if (this.allFiles().length === 0) return UPLOAD_FILE_TEXT;\r\n\r\n const { objStorage } = this.allFiles()[0];\r\n const { nameAlias, name } = objStorage;\r\n if (!nameAlias && !name) return NO_FILE_NAME;\r\n\r\n return nameAlias ?? name;\r\n });\r\n\r\n readonly uploading = signal(false);\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.\r\n protected override writeValueToView(value: string): void {\r\n this.handleInitAllData(value);\r\n\r\n if (!this.isAddOrEdit()) return;\r\n\r\n // Gán data vào đầu ra của form.\r\n this.patchFormData(this.fieldKey(), value);\r\n }\r\n\r\n // Xử lý init các data cần thiết: objStorage, myFile, fileList, lưu giữ first value.\r\n // value sẽ là 1 string json mảng các objStorage.\r\n private handleInitAllData(value: string): void {\r\n // Reset khi đổi mode, hoặc model, hoặc fields.\r\n this.objStorageList.set([]);\r\n this.allFiles.set([]);\r\n\r\n if (isValidJSON(value)) {\r\n const objStorageList = JSON.parse(value) as ObjectStorage[];\r\n this.objStorageList.set(objStorageList);\r\n\r\n // Khởi tạo danh sách MyUploadFile từ data json.\r\n const myUploadFiles = objStorageList.map(\r\n (objStorage) =>\r\n ({\r\n objStorage,\r\n isTemp: false,\r\n previewUrl: `${this.formConfigService.getStorageUrl()}${objStorage.bucket}/${objStorage.path}`,\r\n }) as MyUploadFile,\r\n );\r\n this.allFiles.set(myUploadFiles);\r\n } else {\r\n if (value) {\r\n this.allFiles.set([\r\n {\r\n isTemp: false,\r\n objStorage: { id: \"\", name: value },\r\n previewUrl: \"\",\r\n } as MyUploadFile,\r\n ]);\r\n }\r\n }\r\n }\r\n\r\n beforeUpload = (\r\n file: NzUploadFile,\r\n fileList: NzUploadFile[],\r\n ): boolean | Observable<boolean> => {\r\n // const originFile = file?.originFileObj as unknown as File; // có thể ở version mới nhất đã fix lỗi NzUploadFile nhưng trả về File của tham số file.\r\n // Xử lý gán vào CVA để tiến hành validation theo các props đã truyền vào.\r\n const originFile = file as unknown as File;\r\n this.propagateValue(originFile);\r\n\r\n const { maxSizeInMB, acceptedMimeTypes } = this.field();\r\n const fileSizeInMB = formatFileSize(file.size!, FileSizeTypeEnum.MB);\r\n const fileType = file.type;\r\n if (fileSizeInMB > maxSizeInMB || !acceptedMimeTypes.includes(fileType!)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n customRequest = (item: NzUploadXHRArgs): Subscription => {\r\n // const originFile = nzUploadFile?.originFileObj;\r\n const originFile = item.file as unknown as File;\r\n\r\n // Nếu validation không thỏa, dừng tại đây.\r\n if (this.control?.invalid) {\r\n return of(null).subscribe(); // fake subscription.\r\n }\r\n\r\n // Validation đã thỏa, tiến hành upload file.\r\n return this.uploadFile(originFile);\r\n };\r\n\r\n private uploadFile(file: File) {\r\n this.uploading.set(true);\r\n const { apiFileConfig, uploadTemp } = this.field();\r\n const newFileName = FormUtils.randomFileName(file.name);\r\n\r\n const mimeCfg = apiFileConfig.perMimeTypeConfig?.[file.type]; // Lấy mimeTypes file upload.\r\n const uploadUrl = mimeCfg?.uploadUrl ?? apiFileConfig.uploadUrl; // Nếu có config upload riêng cho mimeTypes đang kiểm tra.\r\n const formData = mimeCfg?.buildFormData // Nếu có hàm custon buildFormData.\r\n ? mimeCfg.buildFormData(file, {\r\n fileName: newFileName,\r\n })\r\n : (() => {\r\n // Mặc định\r\n const fd = new FormData();\r\n fd.append(\"File\", file, newFileName);\r\n if (apiFileConfig.uploadByPath && apiFileConfig.uploadPath) {\r\n fd.append(\"path\", apiFileConfig.uploadPath);\r\n }\r\n\r\n if (apiFileConfig.isOriginName) {\r\n fd.append(\"nameAlias\", file.name);\r\n }\r\n // fd.append('isTemp', 'true');\r\n return fd;\r\n })();\r\n\r\n if (uploadTemp) formData.append(\"isTemp\", \"true\");\r\n\r\n return this.fileService\r\n .uploadFile(file, formData, { uploadUrl })\r\n .pipe(\r\n this.takeUntilDestroy(),\r\n finalize(() => this.uploading.set(false)),\r\n )\r\n .subscribe({\r\n next: (res) => {\r\n const { code, data, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.set([data]);\r\n\r\n this.allFiles.set([\r\n {\r\n objStorage: data,\r\n isTemp: true,\r\n previewUrl: uploadTemp\r\n ? this.formConfigService.getViewFileUrl(data.name ?? \"\", true)\r\n : `${this.formConfigService.getStorageUrl()}${data.bucket}/${data.path}`,\r\n } as MyUploadFile,\r\n ]);\r\n\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: () => {\r\n console.error(UPLOAD_FILE_ERROR);\r\n },\r\n });\r\n }\r\n\r\n handleDelete(file: MyUploadFile): void {\r\n const { objStorage } = file;\r\n const { uploadTemp } = this.field();\r\n\r\n this.objStorageList.set([]);\r\n\r\n // Loại bỏ và cập nhật danh sách MyUploadFile.\r\n const newAllFiles = this.allFiles().filter(\r\n (item) => item.objStorage?.id !== objStorage?.id,\r\n );\r\n this.allFiles.set(newAllFiles);\r\n\r\n if (!uploadTemp) {\r\n this.deleteObjStorage(objStorage.id || \"\");\r\n return;\r\n }\r\n this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));\r\n\r\n return;\r\n }\r\n\r\n deleteObjStorage(id: string) {\r\n return this.fileService\r\n .deleteObjStorage(id, {\r\n deleteUrl: this.field().apiFileConfig.deleteUrl,\r\n })\r\n .pipe(this.takeUntilDestroy())\r\n .subscribe({\r\n next: (res) => {\r\n const { code, message } = res;\r\n if (code === 0) {\r\n this.objStorageList.set([]);\r\n\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n } else {\r\n console.error(message);\r\n }\r\n },\r\n error: () => {\r\n console.error(DELETE_FILE_ERROR);\r\n // Tạm do api xóa có vấn đề\r\n this.objStorageList.set([]);\r\n\r\n this.patchFormData(\r\n this.fieldKey(),\r\n JSON.stringify(this.objStorageList()),\r\n );\r\n },\r\n });\r\n }\r\n}\r\n","<div class=\"d-flex\">\r\n @if (modeSignal() === formModeEnum.View) {\r\n @if (viewMode() === viewModeEnum.form) {\r\n <input nz-input [value]=\"viewDisplayValue()\" class=\"modeView\" />\r\n }\r\n @if (viewMode() === viewModeEnum.text) {\r\n <span class=\"modeView\">{{ viewDisplayValue() }}</span>\r\n }\r\n }\r\n @if (isAddOrEdit()) {\r\n <div class=\"flex w-100\">\r\n <nz-input-group\r\n [nzSuffix]=\"\r\n uploading() || (allFiles().length > 0 && isAddOrEdit())\r\n ? actionIcon\r\n : undefined\r\n \"\r\n class=\"flex-1\"\r\n >\r\n <input\r\n nz-input\r\n [value]=\"\r\n uploading() ? 'Đang tải lên tập tin...' : addEditDisplayValue()\r\n \"\r\n class=\"no-events\"\r\n />\r\n </nz-input-group>\r\n\r\n <nz-upload\r\n [nzShowUploadList]=\"false\"\r\n [nzMultiple]=\"false\"\r\n [nzBeforeUpload]=\"beforeUpload\"\r\n [nzCustomRequest]=\"customRequest\"\r\n >\r\n <button\r\n nz-button\r\n class=\"btn-upload h-100 text-white\"\r\n [disabled]=\"uploading()\"\r\n >\r\n <span class=\"fs-12\">Tải lên</span>\r\n <nz-icon nzType=\"upload\" nzTheme=\"outline\" />\r\n </button>\r\n </nz-upload>\r\n </div>\r\n }\r\n\r\n @if (field().suffixes.length > 0) {\r\n @for (suffix of field().suffixes; track $index) {\r\n @if (suffix.visibleOn?.includes(this.modeSignal())) {\r\n <app-suffix [suffixConfig]=\"suffix\" [formId]=\"formId\"> </app-suffix>\r\n }\r\n }\r\n }\r\n</div>\r\n\r\n<ng-template #actionIcon>\r\n @if (uploading()) {\r\n <span\r\n nz-icon\r\n nzType=\"loading\"\r\n nzTheme=\"outline\"\r\n class=\"text-primary\"\r\n ></span>\r\n } @else if (allFiles().length > 0 && isAddOrEdit()) {\r\n <span\r\n title=\"Xóa\"\r\n class=\"mdi mdi-delete pointer text-danger\"\r\n (click)=\"handleDelete(allFiles()[0])\"\r\n ></span>\r\n }\r\n</ng-template>\r\n\r\n@if (field().showAcceptedExtensionGuide && fileExtensionGuide()) {\r\n <div class=\"file-extension-guide\">{{ fileExtensionGuide() }}</div>\r\n}\r\n\r\n<!-- Custom hiển thị danh sách tập tin -->\r\n<!-- @if (allFiles().length > 0) { -->\r\n<!-- <ng-container *ngTemplateOutlet=\"renderFileTpl\"></ng-container> -->\r\n<!-- } -->\r\n\r\n<!-- Template custom hiển thị danh sách tập tin -->\r\n<!-- <ng-template #renderFileTpl>\r\n <ul class=\"custom-upload-list\">\r\n @for (file of allFiles() | slice: 0 : 1; track file.objStorage?.id) {\r\n <li class=\"upload-item\">\r\n <span nz-icon nzType=\"paper-clip\" nzTheme=\"outline\" class=\"paper-clip-icon\"></span>\r\n\r\n <span class=\"filename\">{{ file.objStorage.name }}</span>\r\n\r\n @if (isAddOrEdit()) {\r\n <span\r\n nz-icon\r\n nzType=\"delete\"\r\n nzTheme=\"outline\"\r\n title=\"Xóa\"\r\n class=\"delete-icon\"\r\n (click)=\"handleDelete(file)\"\r\n ></span>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n</ng-template> -->\r\n","import { DatePickerComponent } from \"./fields/date/date-picker/date-picker.component\";\r\nimport { DateRangeComponent } from \"./fields/date/date-range/date-range.component\";\r\nimport { InputFormattedComponent } from \"./fields/input/input-formatted/input-formatted.component\";\r\nimport { InputPasswordComponent } from \"./fields/input/input-password/input-password.component\";\r\nimport { InputTextComponent } from \"./fields/input/input-text/input-text.component\";\r\nimport { MultiSelectComponent } from \"./fields/select/multi-select/multi-select.component\";\r\nimport { SingleSelectComponent } from \"./fields/select/single-select/single-select.component\";\r\nimport { TreeSelectComponent } from \"./fields/select/tree-select/tree-select.component\";\r\nimport { TextareaComponent } from \"./fields/textarea/textarea.component\";\r\nimport { AvatarUploadComponent } from \"./fields/upload/avatar-upload/avatar-upload.component\";\r\nimport { MultiFileUploadComponent } from \"./fields/upload/multi-file-upload/multi-file-upload.component\";\r\nimport { MultiImageUploadComponent } from \"./fields/upload/multi-image-upload/multi-image-upload.component\";\r\nimport { SingleFileUploadComponent } from \"./fields/upload/single-file-upload/single-file-upload.component\";\r\n\r\n// Các field component đại diện cho giao diện của từng control.\r\nexport const FIELD_COMPONENTS = [\r\n InputTextComponent,\r\n InputPasswordComponent,\r\n InputFormattedComponent,\r\n\r\n SingleSelectComponent,\r\n MultiSelectComponent,\r\n TreeSelectComponent,\r\n\r\n TextareaComponent,\r\n\r\n DatePickerComponent,\r\n DateRangeComponent,\r\n\r\n SingleFileUploadComponent,\r\n MultiFileUploadComponent,\r\n MultiImageUploadComponent,\r\n AvatarUploadComponent,\r\n];\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { BaseField } from '../models/fields/field.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ValidationService {\r\n constructor() {}\r\n\r\n getFirstError(control: AbstractControl, field: BaseField<any>, fields: BaseField<any>[]): string {\r\n // if (field.key === 'reminder') console.log(\"control?.errors\", field.key, control?.errors);\r\n if (!control?.errors || !field) return '';\r\n\r\n const errorKey = Object.keys(control.errors)?.[0] || '';\r\n const errorValue = control.errors?.[errorKey];\r\n\r\n return this.getErrorMessage(errorKey, errorValue, field, fields);\r\n }\r\n\r\n private getErrorMessage(\r\n errorKey: string,\r\n errorValue: any,\r\n field: BaseField<any>,\r\n allFields: BaseField<any>[],\r\n ): string {\r\n let finalErrorMessage = '';\r\n\r\n const customMessage = field.errorMessages?.[errorKey];\r\n if (customMessage) return customMessage;\r\n\r\n // 2. Nếu field có hàm getErrorMessage riêng.\r\n const defaultErrorMessage = field.getErrorMessage(errorKey, errorValue, allFields);\r\n if (defaultErrorMessage) return defaultErrorMessage;\r\n\r\n return `Chưa cấu hình message lỗi cho trường ${field.key}`;\r\n }\r\n}\r\n","import { Component, input } from \"@angular/core\";\r\nimport { BaseField } from \"../../models/fields/field.model\";\r\nimport { AbstractControl, Validators } from \"@angular/forms\";\r\nimport { NzDropDownModule } from \"ng-zorro-antd/dropdown\";\r\nimport { NzIconModule } from \"ng-zorro-antd/icon\";\r\nimport { NzSwitchModule } from \"ng-zorro-antd/switch\";\r\nimport { FormsModule } from \"@angular/forms\";\r\n\r\n@Component({\r\n selector: \"app-field-user-config\",\r\n standalone: true,\r\n imports: [NzDropDownModule, NzIconModule, NzSwitchModule, FormsModule],\r\n templateUrl: \"./field-user-config.component.html\",\r\n styleUrls: [\"./field-user-config.component.scss\"],\r\n})\r\nexport class FieldUserConfigComponent {\r\n readonly field = input.required<BaseField<any>>();\r\n readonly control = input.required<AbstractControl>();\r\n\r\n onToggleUserRequired(isRequired: boolean): void {\r\n this.field().required = isRequired;\r\n const ctrl = this.control();\r\n\r\n if (isRequired) {\r\n ctrl.addValidators(Validators.required);\r\n } else {\r\n ctrl.removeValidators(Validators.required);\r\n }\r\n\r\n // Cập nhật lại trạng thái validation ngay lập tức\r\n ctrl.updateValueAndValidity();\r\n }\r\n}\r\n","<!-- Cấu hình (Dropdown & Menu) chỉ hiện khi có bất kỳ config nào -->\r\n@if (field().userConfigs) {\r\n <!-- Trigger Nút Cấu hình -->\r\n <a\r\n nz-dropdown\r\n [nzDropdownMenu]=\"configMenu\"\r\n nzTrigger=\"click\"\r\n [nzClickHide]=\"false\"\r\n [title]=\"'Cấu hình'\"\r\n nzPlacement=\"bottomRight\"\r\n >\r\n <span\r\n nz-icon\r\n nzType=\"setting\"\r\n nzTheme=\"outline\"\r\n class=\"config-trigger-icon\"\r\n ></span>\r\n </a>\r\n\r\n <!-- Menu Cấu hình -->\r\n <nz-dropdown-menu #configMenu=\"nzDropdownMenu\">\r\n <ul nz-menu>\r\n @if (field().userConfigs?.allowOverrideRequired) {\r\n <li nz-menu-item nzDisableItemHover class=\"config-menu-item\">\r\n <div class=\"config-item-content\">\r\n <span class=\"config-item-label\">Bắt buộc nhập</span>\r\n <nz-switch\r\n nzSize=\"small\"\r\n [ngModel]=\"field().required\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"onToggleUserRequired($event)\"\r\n ></nz-switch>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </nz-dropdown-menu>\r\n}\r\n","import { Component, inject, input } from \"@angular/core\";\r\nimport { BaseField } from \"../../models/fields/field.model\";\r\nimport {\r\n AbstractControl,\r\n FormGroup,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n} from \"@angular/forms\";\r\nimport { FormMode } from \"../../models/form\";\r\nimport { FORM_MODULES } from \"../../consts/common\";\r\nimport { FIELD_COMPONENTS } from \"../component\";\r\nimport { NzFormModule } from \"ng-zorro-antd/form\";\r\nimport { FieldTypeEnum } from \"../../enums/fields\";\r\nimport { FormModeEnum } from \"../../enums/form\";\r\nimport { ValidationService } from \"../../services/validation.service\";\r\nimport { NzGridModule } from \"ng-zorro-antd/grid\";\r\nimport { FieldUserConfigComponent } from \"../field-user-config/field-user-config.component\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { NzDropDownModule } from \"ng-zorro-antd/dropdown\";\r\nimport { NzIconModule } from \"ng-zorro-antd/icon\";\r\nimport { NzSwitchModule } from \"ng-zorro-antd/switch\";\r\nimport { NzFlexModule } from \"ng-zorro-antd/flex\";\r\n\r\nconst modules = [CommonModule, FormsModule, ReactiveFormsModule];\r\nconst zorroModules = [\r\n NzFormModule,\r\n NzGridModule,\r\n NzDropDownModule,\r\n NzIconModule,\r\n NzSwitchModule,\r\n NzFlexModule,\r\n];\r\nconst components = [...FIELD_COMPONENTS, FieldUserConfigComponent];\r\n\r\n@Component({\r\n selector: \"app-dynamic-field\",\r\n standalone: true,\r\n imports: [...modules, ...zorroModules, ...components],\r\n templateUrl: \"./dynamic-field.component.html\",\r\n styleUrls: [\"./dynamic-field.component.scss\"],\r\n})\r\nexport class DynamicFieldComponent {\r\n readonly field = input.required<BaseField<any>>();\r\n readonly fields = input.required<BaseField<any>[]>();\r\n readonly mode = input.required<FormMode>();\r\n readonly control = input.required<AbstractControl>();\r\n readonly formGroup = input.required<FormGroup>();\r\n readonly formId = input.required<string>();\r\n\r\n fieldTypeEnum = FieldTypeEnum;\r\n formModeEnum = FormModeEnum;\r\n\r\n private validationService = inject(ValidationService);\r\n\r\n /**\r\n * Lấy thông báo lỗi đầu tiên của trường đang thao tác dựa trên control và field.\r\n */\r\n protected getErrorMessage(): string {\r\n return (\r\n this.validationService.getFirstError(\r\n this.control(),\r\n this.field(),\r\n this.fields(),\r\n ) ?? \"\"\r\n );\r\n }\r\n}\r\n","<div [formGroup]=\"formGroup()\">\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzXXl]=\"field().labelGrid.xxl ?? null\"\r\n [nzXl]=\"field().labelGrid.xl ?? null\"\r\n [nzLg]=\"field().labelGrid.lg ?? null\"\r\n [nzMd]=\"field().labelGrid.md ?? null\"\r\n [nzSm]=\"field().labelGrid.sm ?? null\"\r\n [nzXs]=\"field().labelGrid.xs ?? null\"\r\n [nzLabelAlign]=\"field().labelAlign\"\r\n >\r\n @if (field().required) {\r\n <span class=\"required\">*</span>\r\n }\r\n <span class=\"form-label\">\r\n {{ field().label }}\r\n @if (field().sublabel) {\r\n <span class=\"sub-label mb-sm\">{{ field().sublabel }}</span>\r\n }\r\n </span>\r\n </nz-form-label>\r\n\r\n <nz-form-control\r\n [nzXXl]=\"field().controlGrid.xxl ?? null\"\r\n [nzXl]=\"field().controlGrid.xl ?? null\"\r\n [nzLg]=\"field().controlGrid.lg ?? null\"\r\n [nzMd]=\"field().controlGrid.md ?? null\"\r\n [nzSm]=\"field().controlGrid.sm ?? null\"\r\n [nzXs]=\"field().controlGrid.xs ?? null\"\r\n [nzErrorTip]=\"getErrorMessage()\"\r\n >\r\n <div nz-flex [nzAlign]=\"'flex-start'\" [nzGap]=\"8\" class=\"w-100\">\r\n <div class=\"flex-1 min-w-0\">\r\n @switch (field().type) {\r\n <!-- Input text -->\r\n @case (fieldTypeEnum.InputText) {\r\n <app-input-text\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-input-text>\r\n }\r\n\r\n <!-- Input password -->\r\n @case (fieldTypeEnum.InputPassword) {\r\n @if (mode() === formModeEnum.Add) {\r\n <app-input-password\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-input-password>\r\n }\r\n }\r\n\r\n <!-- Input formatted -->\r\n @case (fieldTypeEnum.InputFormatted) {\r\n <app-input-formatted\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-input-formatted>\r\n }\r\n\r\n <!-- Textarea -->\r\n @case (fieldTypeEnum.Textarea) {\r\n <app-textarea\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-textarea>\r\n }\r\n\r\n <!-- Single select -->\r\n @case (fieldTypeEnum.SingleSelect) {\r\n <app-single-select\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-single-select>\r\n }\r\n\r\n <!-- Multi select -->\r\n @case (fieldTypeEnum.MultiSelect) {\r\n <app-multi-select\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-multi-select>\r\n }\r\n\r\n @case (fieldTypeEnum.TreeSelect) {\r\n <app-tree-select\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-tree-select>\r\n }\r\n\r\n <!-- Date Picker -->\r\n @case (fieldTypeEnum.DatePicker) {\r\n <app-date-picker\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-date-picker>\r\n }\r\n\r\n <!-- Date Range -->\r\n @case (fieldTypeEnum.DateRange) {\r\n <app-date-range\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-date-range>\r\n }\r\n\r\n <!-- Single File Upload -->\r\n @case (fieldTypeEnum.SingleFileUpload) {\r\n <app-single-file-upload\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-single-file-upload>\r\n }\r\n\r\n <!-- Multi File Upload -->\r\n @case (fieldTypeEnum.MultiFileUpload) {\r\n <app-multi-file-upload\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-multi-file-upload>\r\n }\r\n\r\n <!-- Multi File Upload -->\r\n @case (fieldTypeEnum.MultiImageUpload) {\r\n <app-multi-image-upload\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-multi-image-upload>\r\n }\r\n\r\n <!-- Avatar -->\r\n @case (fieldTypeEnum.AvatarUpload) {\r\n <app-avatar-upload\r\n [formControlName]=\"field().key\"\r\n [fieldInput]=\"field()\"\r\n [modeSignal]=\"mode()\"\r\n [control]=\"control()\"\r\n [formId]=\"formId()\"\r\n ></app-avatar-upload>\r\n }\r\n\r\n <!-- Radio -->\r\n @case (fieldTypeEnum.Radio) {\r\n <span>Radio</span>\r\n }\r\n\r\n <!-- Checkbox -->\r\n @case (fieldTypeEnum.Checkbox) {\r\n <span>Checkbox</span>\r\n }\r\n\r\n <!-- Radio -->\r\n @case (fieldTypeEnum.Radio) {\r\n <span>Radio</span>\r\n }\r\n\r\n <!-- Switch -->\r\n @case (fieldTypeEnum.Switch) {\r\n <span>Switch</span>\r\n }\r\n\r\n <!-- Autocomplete -->\r\n @case (fieldTypeEnum.Autocomplete) {\r\n <span>Autocomplete</span>\r\n }\r\n }\r\n </div>\r\n\r\n <!-- Tách phần cấu hình ra Component riêng -->\r\n @if (mode() !== formModeEnum.View) {\r\n <div class=\"field-user-config-ctn\">\r\n <app-field-user-config\r\n [field]=\"field()\"\r\n [control]=\"control()\"\r\n ></app-field-user-config>\r\n </div>\r\n }\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n</div>\r\n","import { BaseField } from \"./shared/models/fields/field.model\";\r\nimport {\r\n Component,\r\n computed,\r\n effect,\r\n EventEmitter,\r\n inject,\r\n input,\r\n Input,\r\n output,\r\n Output,\r\n signal,\r\n untracked,\r\n} from \"@angular/core\";\r\nimport { AbstractControl, FormGroup } from \"@angular/forms\";\r\nimport { buildForm } from \"./shared/utils/dynamic-form/dynamic-form\";\r\nimport { FieldTypeEnum } from \"./shared/enums/fields\";\r\nimport { NzFormModule } from \"ng-zorro-antd/form\";\r\nimport { FormModeEnum } from \"./shared/enums/form\";\r\nimport { FormMode } from \"./shared/models/form\";\r\nimport { DynamicFormService } from \"./shared/services/dynamic-form.service\";\r\n\r\nimport { FORM_MODULES } from \"./shared/consts/common\";\r\nimport { InputPasswordField } from \"./shared/models/fields/input\";\r\nimport { clone, isEqual } from \"lodash-es\";\r\nimport {\r\n FieldGroup,\r\n GroupedFields,\r\n} from \"./shared/models/fields/field-group.model\";\r\nimport { buildGroupedFields } from \"./shared/utils/fields\";\r\nimport { DynamicFieldComponent } from \"./shared/components/dynamic-field/dynamic-field.component\";\r\nimport { debounceTime, distinctUntilChanged, Subject, takeUntil } from \"rxjs\";\r\n\r\nimport { NzGridModule } from \"ng-zorro-antd/grid\";\r\nimport { NzCollapseModule } from \"ng-zorro-antd/collapse\";\r\nimport { FormDataService } from \"./shared/services/form-data.service\";\r\n\r\nconst ZORRO_MODULES = [NzFormModule, NzGridModule, NzCollapseModule];\r\nconst COMPONENTS = [DynamicFieldComponent];\r\n\r\n@Component({\r\n selector: \"app-dynamic-forms\",\r\n standalone: true,\r\n imports: [...FORM_MODULES, ...ZORRO_MODULES, ...COMPONENTS],\r\n templateUrl: \"./dynamic-form.component.html\",\r\n styleUrls: [\"./dynamic-form.component.scss\"],\r\n})\r\nexport class DynamicFormComponent {\r\n // Id phân biệt form.\r\n @Input() formId!: string;\r\n\r\n // ===================== NGOÀI LUỒNG LOGIC ======================== //\r\n // Debounce time for form value changes (ms)\r\n // Default: 300ms\r\n // Thời gian trễ cho sự thay đổi giá trị của form (ms)\r\n @Input() valueChangesDebounceTime = 300;\r\n\r\n // Emit form value changes\r\n @Output() readonly formValueChanges = new EventEmitter<\r\n Record<string, unknown>\r\n >();\r\n\r\n // Subject for cleanup subscriptions\r\n private readonly destroy$ = new Subject<void>();\r\n // ====================================================== //\r\n\r\n // Input.\r\n // Mảng fields mới.\r\n readonly fields = input.required<BaseField<any>[]>();\r\n // Signal model data.\r\n readonly model = input<Record<string, any>>({});\r\n // Signal form mode.\r\n readonly mode = input<FormMode>(FormModeEnum.Add);\r\n // Input signal groupFields.\r\n readonly fieldGroups = input<FieldGroup[]>([]);\r\n\r\n // Cho phép show nhưng field không thuộc group nào\r\n readonly displayNonGroupedFields = input(true);\r\n\r\n // Output.\r\n readonly formSubmit = output<Record<string, unknown>>();\r\n readonly formInvalid = output<BaseField<any>[]>();\r\n\r\n // Mảng field cũ.\r\n protected readonly oldFields = signal<BaseField<any>[]>([]);\r\n\r\n // Check mode là add hay edit.\r\n readonly isAddOrEdit = computed(() =>\r\n [FormModeEnum.Add, FormModeEnum.Edit].includes(this.mode() as FormModeEnum),\r\n );\r\n\r\n // FormState check sự thay đổi giữa mode, newFields, model chỉ chạy 1 lần dù 3 cái đều đổi.\r\n readonly formState = computed(() => ({\r\n mode: this.mode(),\r\n newFields: this.fields(),\r\n model: this.model(),\r\n }));\r\n\r\n // Computed chạy lại khi fields hoặc groupFields thay đổi.\r\n groupedFields = computed<GroupedFields>(() => {\r\n const groups = this.fieldGroups();\r\n const groupedFields = buildGroupedFields(this.oldFields(), groups);\r\n return groupedFields;\r\n });\r\n\r\n protected readonly formModeEnum = FormModeEnum;\r\n protected readonly fieldTypeEnum = FieldTypeEnum;\r\n\r\n // Kiểm tra có cần ẩn field không?\r\n isHiddenField = (field: BaseField<any>): boolean => {\r\n const { isHidden } = field;\r\n if (isHidden) return true;\r\n if (field instanceof InputPasswordField) {\r\n if (\r\n this.mode() === FormModeEnum.Edit ||\r\n this.mode() === FormModeEnum.View\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n // Form group cho reactive form.\r\n formGroup!: FormGroup;\r\n\r\n readonly formDataService = inject(FormDataService);\r\n constructor(private dFormService: DynamicFormService) {\r\n // Trigger form từ submit bên ngoài.\r\n effect(() => {\r\n this.dFormService.submitTrigger();\r\n if (untracked(() => this.isAddOrEdit())) {\r\n const submit = this.dFormService.submitTrigger();\r\n\r\n if (submit?.formId === this.formId) {\r\n this.handleSubmit();\r\n this.dFormService.triggerSubmit(null);\r\n }\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup subscriptions\r\n // Dọn dẹp các subscription\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n // Loại bỏ output data khi dynamic form destroy component.\r\n this.formDataService.clear(this.formId);\r\n }\r\n\r\n // Đồng bộ fields sang dynamic-form service mỗi lần fields signal change.\r\n syncFieldsEffect = effect(() => {\r\n this.dFormService.setFields(this.fields());\r\n this.formDataService.clear(this.formId);\r\n });\r\n\r\n /**\r\n * Effect tạo FormGroup.\r\n */\r\n createFormGroupEffect = effect(() => {\r\n const { mode, newFields, model } = this.formState();\r\n this.oldFields.set(newFields);\r\n const computedFields = clone(newFields);\r\n this.formGroup = buildForm(computedFields, mode, model);\r\n this.dFormService.setFormGroup(this.formGroup);\r\n });\r\n\r\n /**\r\n * Subscribe to form value changes\r\n * Subscribe lắng nghe sự thay đổi giá trị của form\r\n */\r\n private subscribeToFormValueChanges(): void {\r\n if (!this.formGroup) return;\r\n\r\n // Unsubscribe previous subscription if exists\r\n this.destroy$.next();\r\n\r\n this.formGroup.valueChanges\r\n .pipe(\r\n debounceTime(this.valueChangesDebounceTime),\r\n distinctUntilChanged((prev, curr) => isEqual(prev, curr)),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe((formValue) => {\r\n // console.log('Form value changed:', formValue);\r\n this.formValueChanges.emit(formValue);\r\n });\r\n }\r\n\r\n /**\r\n * Xử lý submit form và output ra ngoài.\r\n */\r\n private handleSubmit() {\r\n const form = this.formGroup;\r\n const invalidFields: Array<BaseField<any>> = [];\r\n\r\n // Xử lý trường hợp form chưa thỏa mãn validation.\r\n if (form.invalid) {\r\n const controls = form.controls;\r\n for (const name in controls) {\r\n if (controls[name].invalid) {\r\n this.markControlForValidation(controls[name]);\r\n const field = this.fields().find((field) => field.key === name);\r\n if (field) invalidFields.push(field);\r\n }\r\n }\r\n this.formInvalid.emit(invalidFields);\r\n return;\r\n }\r\n\r\n const formData = untracked(() => this.formDataService.get(this.formId));\r\n this.formSubmit.emit(formData ?? {});\r\n }\r\n\r\n /**\r\n * Kích submit form ảo khi nhấn nút submit.\r\n */\r\n private markControlForValidation(control: AbstractControl) {\r\n control.markAllAsTouched();\r\n control.markAsDirty();\r\n control.updateValueAndValidity({ onlySelf: true, emitEvent: true });\r\n }\r\n\r\n /**\r\n * TrackBy function for ngFor to optimize rendering.\r\n */\r\n protected trackByField(index: number, field: BaseField<any>): string {\r\n return field.key || `field-${index}`;\r\n }\r\n\r\n readonly collapseCustomStyle = {\r\n background: \"#fff\",\r\n border: \"0px\",\r\n };\r\n}\r\n","@if (formGroup) {\r\n <form [formGroup]=\"formGroup\">\r\n @if (oldFields().length > 0) {\r\n <!-- 1. Nếu không có groups thì render từ fields -->\r\n @if (!fieldGroups() || fieldGroups().length === 0) {\r\n <div nz-row [nzGutter]=\"[12, 0]\">\r\n @for (field of oldFields(); track field?.id) {\r\n @if (!isHiddenField(field)) {\r\n <div\r\n nz-col\r\n [nzXXl]=\"field?.grid?.xxl ?? null\"\r\n [nzXl]=\"field?.grid?.xl ?? null\"\r\n [nzLg]=\"field?.grid?.lg ?? null\"\r\n [nzMd]=\"field?.grid?.md ?? null\"\r\n [nzSm]=\"field?.grid?.sm ?? null\"\r\n [nzXs]=\"field?.grid?.xs ?? null\"\r\n [nzFlex]=\"\r\n !field?.grid?.xs &&\r\n !field?.grid?.sm &&\r\n !field?.grid?.md &&\r\n !field?.grid?.lg &&\r\n !field?.grid?.xl &&\r\n !field?.grid?.xxl\r\n ? '1 0 0'\r\n : null\r\n \"\r\n class=\"field\"\r\n >\r\n <app-dynamic-field\r\n [field]=\"field\"\r\n [fields]=\"oldFields()\"\r\n [mode]=\"mode()\"\r\n [control]=\"formGroup.get(field.key)!\"\r\n [formGroup]=\"formGroup\"\r\n [formId]=\"formId\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n <!-- 2. Nếu có groups thì render từ groupedFields -->\r\n @if (fieldGroups() && fieldGroups().length > 0) {\r\n <!-- Các field noGroup -->\r\n @if (groupedFields().noGroup.length > 0 && displayNonGroupedFields()) {\r\n <div nz-row [nzGutter]=\"24\">\r\n @for (field of groupedFields().noGroup; track field?.id) {\r\n @if (!isHiddenField(field)) {\r\n <div\r\n nz-col\r\n [nzXXl]=\"field?.grid?.xxl ?? null\"\r\n [nzXl]=\"field?.grid?.xl ?? null\"\r\n [nzLg]=\"field?.grid?.lg ?? null\"\r\n [nzMd]=\"field?.grid?.md ?? null\"\r\n [nzSm]=\"field?.grid?.sm ?? null\"\r\n [nzXs]=\"field?.grid?.xs ?? null\"\r\n class=\"field\"\r\n >\r\n <app-dynamic-field\r\n [field]=\"field\"\r\n [fields]=\"oldFields()\"\r\n [mode]=\"mode()\"\r\n [control]=\"formGroup.get(field.key)!\"\r\n [formGroup]=\"formGroup\"\r\n [formId]=\"formId\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Group các field -->\r\n @if (groupedFields().grouped.length > 0) {\r\n <nz-collapse [nzBordered]=\"false\">\r\n @for (\r\n groupField of groupedFields().grouped;\r\n track groupField.group.code\r\n ) {\r\n <nz-collapse-panel\r\n [nzHeader]=\"groupField.group.template ?? groupField.group.label\"\r\n [nzActive]=\"groupField.group.isActive\"\r\n [nzShowArrow]=\"groupField.group.showArrow\"\r\n [nzDisabled]=\"groupField.group.disabled\"\r\n [style]=\"collapseCustomStyle\"\r\n class=\"mt-sm\"\r\n >\r\n <div nz-row [nzGutter]=\"24\">\r\n @for (field of groupField.fields; track field?.id) {\r\n @if (!isHiddenField(field)) {\r\n <div\r\n nz-col\r\n [nzXXl]=\"field?.grid?.xxl ?? null\"\r\n [nzXl]=\"field?.grid?.xl ?? null\"\r\n [nzLg]=\"field?.grid?.lg ?? null\"\r\n [nzMd]=\"field?.grid?.md ?? null\"\r\n [nzSm]=\"field?.grid?.sm ?? null\"\r\n [nzXs]=\"field?.grid?.xs ?? null\"\r\n class=\"field\"\r\n >\r\n <app-dynamic-field\r\n [field]=\"field\"\r\n [fields]=\"oldFields()\"\r\n [mode]=\"mode()\"\r\n [control]=\"formGroup.get(field.key)!\"\r\n [formGroup]=\"formGroup\"\r\n [formId]=\"formId\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </nz-collapse-panel>\r\n }\r\n </nz-collapse>\r\n }\r\n }\r\n }\r\n </form>\r\n}\r\n","export enum TableCellTypeEnum {\r\n ACTION = 'action',\r\n CHECK = 'check',\r\n SUBTEXT = 'subtext',\r\n IMAGE = 'image',\r\n BADGE = 'badge',\r\n INDEX = 'index',\r\n TEXT = 'text',\r\n ICON_TEXT = 'icon-text',\r\n SWAP_FUNC = 'swap',\r\n EMPTY = 'empty',\r\n}\r\n\r\nexport interface RawColumn {\r\n [key: string]: any;\r\n}\r\n","import { FormControl, ValidatorFn } from '@angular/forms';\r\nimport {\r\n DEFAULT_BIND_LABEL,\r\n DEFAULT_BIND_VALUE,\r\n SELECT_FIELD_TYPES,\r\n} from '../../../consts/fields/select-field.const';\r\nimport { BaseField } from '../field.model';\r\nimport { ApiConfig, FieldDependency } from '../../common';\r\nimport { SelectOutputValueType } from '../../common/output-value-type.model';\r\nimport { SelectOutputValueTypeEnum } from '../../../enums/common';\r\nimport { ControlTypeEnum } from '../../../enums/controls';\r\nimport { FieldTypeEnum } from '../../../enums/fields';\r\nimport { RADIO_FIELD_TYPES } from '../../../consts/fields/radio-field.const';\r\n\r\nexport type RadioFieldType = (typeof RADIO_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Interface base chung cho Các dạng Radio.\r\n */\r\nexport abstract class RadioBaseField<K, TOptions = Record<string, unknown>> extends BaseField<K> {\r\n // Key lấy ra nhãn hiển thị ở options.\r\n bindLabel!: string;\r\n\r\n // Key lấy ra giá trị ngầm ở options.\r\n bindValue!: string;\r\n\r\n // Mảng options cho việc lựa chọn được truyền tĩnh từ config.\r\n options?: TOptions[];\r\n\r\n // Cấu hình api nếu danh sách select dựa vào việc gọi api GET. Ưu tiên hơn options tĩnh truyền vào từ config.\r\n apiConfig?: ApiConfig;\r\n\r\n // Phụ thuộc vào một giá trị từ bất kỳ dạng field nào khác: Select, Input,...\r\n dependsOn?: FieldDependency[];\r\n\r\n // Biến đổi hiển thị option label từ option của options.\r\n transformLabel?: (option: TOptions) => string;\r\n\r\n /**\r\n * Props validation chung cho các dạng Radio.\r\n */\r\n // ................. Chưa có .................\r\n\r\n constructor(init: Partial<RadioBaseField<K, TOptions>>) {\r\n super(init);\r\n\r\n /**\r\n * Gán giá trị cho các props cần giá trị mặc định ở Radio.\r\n */\r\n this.controlType = ControlTypeEnum.Radio;\r\n this.bindLabel = DEFAULT_BIND_LABEL;\r\n this.bindValue = DEFAULT_BIND_VALUE;\r\n this.dependsOn = [];\r\n\r\n Object.assign(this, init);\r\n }\r\n\r\n // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi Reactive form của angular cho Radio.\r\n protected getCommonSelectValidators(): ValidatorFn[] {\r\n const validators = this.getCommonValidators();\r\n return validators;\r\n }\r\n\r\n // Mảng ValidatorFn các custom validation có thể dùng cho Radio.\r\n protected getCustomSelectValidators(): ValidatorFn[] {\r\n const validators = this.getCustomValidators();\r\n return validators;\r\n }\r\n\r\n // Tạo Form Control cho Input Field.\r\n override toFormControl(): FormControl {\r\n const commonValidators = this.getCommonSelectValidators();\r\n const customValidators = this.getCustomSelectValidators();\r\n return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);\r\n }\r\n\r\n abstract override getDefaultValue(): K;\r\n\r\n abstract override toFormValue(modelValue: K): K;\r\n\r\n override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {\r\n return super.getErrorMessage(errorKey, errorValue, allFields);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of dynamic-form\r\n */\r\n\r\n// ==========================================\r\n// 0. BASE FIELD MODELS (export truoc de tranh loi circular dependency)\r\n// ==========================================\r\nexport * from \"./lib/shared/models/fields/field.model\";\r\nexport * from \"./lib/shared/models/fields/field-grid.model\";\r\nexport * from \"./lib/shared/models/fields/field-group.model\";\r\nexport * from \"./lib/shared/models/fields/index\";\r\n\r\n// ==========================================\r\n// 1. MODULE & COMPONENT & SERVICE CHINH\r\n// ==========================================\r\nexport * from \"./lib/dynamic-form.component\";\r\n\r\n// ==========================================\r\n// 2. CONFIGURATION & DI TOKENS\r\n// ==========================================\r\nexport * from \"./lib/shared/config/dynamic-form.config\";\r\nexport * from \"./lib/shared/services/form-config.service\";\r\nexport * from \"./lib/shared/services/dynamic-form.service\";\r\nexport * from \"./lib/shared/services/form-data.service\";\r\nexport * from \"./lib/shared/services/suffix.service\";\r\nexport * from \"./lib/shared/services/file.service\";\r\nexport * from \"./lib/shared/consts/common/file.const\";\r\n\r\n// ==========================================\r\n// 3. ENUMS\r\n// ==========================================\r\nexport * from \"./lib/shared/enums/controls/index\";\r\nexport * from \"./lib/shared/enums/fields/index\";\r\nexport * from \"./lib/shared/enums/validators/index\";\r\nexport * from \"./lib/shared/enums/common/index\";\r\nexport * from \"./lib/shared/enums/form/index\";\r\nexport * from \"./lib/shared/enums/form/dynamic-form.enum\";\r\n\r\n// ==========================================\r\n// 4. COMMON MODELS\r\n// ==========================================\r\nexport * from \"./lib/shared/models/common/index\";\r\nexport * from \"./lib/shared/models/common/table-models\";\r\n\r\n// ==========================================\r\n// 5. CAC CLASS CAU HINH CU THE CHO TUNG LOAI DIEU KHIEN\r\n// ==========================================\r\n\r\n// Input Fields\r\nexport * from \"./lib/shared/models/fields/input/index\";\r\nexport * from \"./lib/shared/models/fields/input/input-formatted-field.model\";\r\n\r\n// Textarea Fields\r\nexport * from \"./lib/shared/models/fields/textarea/textarea-field.model\";\r\n\r\n// Date Fields\r\nexport * from \"./lib/shared/models/fields/date/index\";\r\n\r\n// Select Fields\r\nexport * from \"./lib/shared/models/fields/select/select-base-field.model\";\r\nexport * from \"./lib/shared/models/fields/select/single-select-field.model\";\r\nexport * from \"./lib/shared/models/fields/select/multi-select-field.model\";\r\n// export * from \"./lib/shared/models/fields/select/tree-select-field.model\";\r\n\r\n// Upload Fields\r\nexport * from \"./lib/shared/models/fields/upload/index\";\r\n\r\n// Radio & Checkbox\r\nexport * from \"./lib/shared/models/fields/radio/radio-base-field.model\";\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["ZORRO_MODULES","i3","i1","i5","zorroModules","i2","COMPONENTS","i4","modules","components","i5.InputTextComponent","i6.InputPasswordComponent","i7.InputFormattedComponent","i8.SingleSelectComponent","i9.MultiSelectComponent","i10.TreeSelectComponent","i11.TextareaComponent","i12.DatePickerComponent","i13.DateRangeComponent","i14.SingleFileUploadComponent","i15.MultiFileUploadComponent","i16.MultiImageUploadComponent","i17.AvatarUploadComponent","i1.DynamicFormService"],"mappings":"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"}