@ldquocc/dynamic-form 0.0.8 → 0.0.9

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/ng-package.json +15 -0
  2. package/package.json +20 -31
  3. package/src/lib/dynamic-form.component.html +121 -0
  4. package/src/lib/dynamic-form.component.scss +7 -0
  5. package/src/lib/dynamic-form.component.spec.ts +21 -0
  6. package/src/lib/dynamic-form.component.ts +237 -0
  7. package/src/lib/dynamic-form.service.spec.ts +16 -0
  8. package/src/lib/dynamic-form.service.ts +9 -0
  9. package/src/lib/shared/base/base-select.component.ts +183 -0
  10. package/src/lib/shared/base/base-value-accessor.ts +192 -0
  11. package/{lib/shared/components/component.d.ts → src/lib/shared/components/component.ts} +34 -14
  12. package/src/lib/shared/components/d-form-testing/d-form-testing.component.html +197 -0
  13. package/src/lib/shared/components/d-form-testing/d-form-testing.component.less +12 -0
  14. package/src/lib/shared/components/d-form-testing/d-form-testing.component.spec.ts +22 -0
  15. package/src/lib/shared/components/d-form-testing/d-form-testing.component.ts +197 -0
  16. package/src/lib/shared/components/dynamic-field/dynamic-field.component.html +218 -0
  17. package/src/lib/shared/components/dynamic-field/dynamic-field.component.scss +28 -0
  18. package/src/lib/shared/components/dynamic-field/dynamic-field.component.spec.ts +21 -0
  19. package/src/lib/shared/components/dynamic-field/dynamic-field.component.ts +67 -0
  20. package/src/lib/shared/components/field-user-config/field-user-config.component.html +38 -0
  21. package/src/lib/shared/components/field-user-config/field-user-config.component.scss +29 -0
  22. package/src/lib/shared/components/field-user-config/field-user-config.component.ts +33 -0
  23. package/src/lib/shared/components/fields/components/suffix/suffix.component.html +42 -0
  24. package/src/lib/shared/components/fields/components/suffix/suffix.component.scss +3 -0
  25. package/src/lib/shared/components/fields/components/suffix/suffix.component.spec.ts +22 -0
  26. package/src/lib/shared/components/fields/components/suffix/suffix.component.ts +32 -0
  27. package/src/lib/shared/components/fields/date/date-picker/date-picker.component.html +20 -0
  28. package/src/lib/shared/components/fields/date/date-picker/date-picker.component.scss +5 -0
  29. package/src/lib/shared/components/fields/date/date-picker/date-picker.component.spec.ts +21 -0
  30. package/src/lib/shared/components/fields/date/date-picker/date-picker.component.ts +148 -0
  31. package/src/lib/shared/components/fields/date/date-range/date-range.component.html +33 -0
  32. package/src/lib/shared/components/fields/date/date-range/date-range.component.scss +22 -0
  33. package/src/lib/shared/components/fields/date/date-range/date-range.component.spec.ts +21 -0
  34. package/src/lib/shared/components/fields/date/date-range/date-range.component.ts +133 -0
  35. package/src/lib/shared/components/fields/input/input-formatted/input-formatted.component.html +31 -0
  36. package/src/lib/shared/components/fields/input/input-formatted/input-formatted.component.scss +3 -0
  37. package/src/lib/shared/components/fields/input/input-formatted/input-formatted.component.spec.ts +21 -0
  38. package/src/lib/shared/components/fields/input/input-formatted/input-formatted.component.ts +148 -0
  39. package/src/lib/shared/components/fields/input/input-password/input-password.component.html +18 -0
  40. package/src/lib/shared/components/fields/input/input-password/input-password.component.scss +0 -0
  41. package/src/lib/shared/components/fields/input/input-password/input-password.component.spec.ts +21 -0
  42. package/src/lib/shared/components/fields/input/input-password/input-password.component.ts +56 -0
  43. package/src/lib/shared/components/fields/input/input-text/input-text.component.html +73 -0
  44. package/src/lib/shared/components/fields/input/input-text/input-text.component.scss +0 -0
  45. package/src/lib/shared/components/fields/input/input-text/input-text.component.spec.ts +21 -0
  46. package/src/lib/shared/components/fields/input/input-text/input-text.component.ts +98 -0
  47. package/src/lib/shared/components/fields/select/multi-select/multi-select.component.html +73 -0
  48. package/src/lib/shared/components/fields/select/multi-select/multi-select.component.scss +21 -0
  49. package/src/lib/shared/components/fields/select/multi-select/multi-select.component.spec.ts +21 -0
  50. package/src/lib/shared/components/fields/select/multi-select/multi-select.component.ts +212 -0
  51. package/src/lib/shared/components/fields/select/single-select/single-select.component.html +55 -0
  52. package/src/lib/shared/components/fields/select/single-select/single-select.component.scss +1 -0
  53. package/src/lib/shared/components/fields/select/single-select/single-select.component.spec.ts +21 -0
  54. package/src/lib/shared/components/fields/select/single-select/single-select.component.ts +217 -0
  55. package/src/lib/shared/components/fields/select/single-select/sl.component.old.txt +337 -0
  56. package/src/lib/shared/components/fields/select/single-select/sl.component.old2.txt +340 -0
  57. package/src/lib/shared/components/fields/select/tree-select/tree-select.component.html +38 -0
  58. package/src/lib/shared/components/fields/select/tree-select/tree-select.component.scss +1 -0
  59. package/src/lib/shared/components/fields/select/tree-select/tree-select.component.spec.ts +21 -0
  60. package/src/lib/shared/components/fields/select/tree-select/tree-select.component.ts +401 -0
  61. package/src/lib/shared/components/fields/textarea/textarea.component.html +29 -0
  62. package/src/lib/shared/components/fields/textarea/textarea.component.scss +17 -0
  63. package/src/lib/shared/components/fields/textarea/textarea.component.spec.ts +21 -0
  64. package/src/lib/shared/components/fields/textarea/textarea.component.ts +76 -0
  65. package/src/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.html +30 -0
  66. package/src/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.scss +22 -0
  67. package/src/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.spec.ts +22 -0
  68. package/src/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.ts +217 -0
  69. package/src/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.html +101 -0
  70. package/src/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.scss +117 -0
  71. package/src/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.spec.ts +22 -0
  72. package/src/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.ts +480 -0
  73. package/src/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.html +82 -0
  74. package/src/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.less +80 -0
  75. package/src/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.spec.ts +22 -0
  76. package/src/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.ts +288 -0
  77. package/src/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.html +104 -0
  78. package/src/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.scss +37 -0
  79. package/src/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.spec.ts +21 -0
  80. package/src/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.ts +317 -0
  81. package/src/lib/shared/config/dynamic-form.config.ts +11 -0
  82. package/src/lib/shared/consts/common/common.const.ts +5 -0
  83. package/src/lib/shared/consts/common/field-dependency.const.ts +1 -0
  84. package/src/lib/shared/consts/common/file.const.ts +130 -0
  85. package/{lib/shared/consts/common/index.d.ts → src/lib/shared/consts/common/index.ts} +4 -4
  86. package/src/lib/shared/consts/common/sample-test.const.ts +1648 -0
  87. package/src/lib/shared/consts/common/standalone-import.const.ts +51 -0
  88. package/src/lib/shared/consts/controls/control.const.ts +11 -0
  89. package/{lib/shared/consts/controls/index.d.ts → src/lib/shared/consts/controls/index.ts} +1 -1
  90. package/src/lib/shared/consts/fields/date-field.const.ts +12 -0
  91. package/src/lib/shared/consts/fields/field.const.ts +23 -0
  92. package/{lib/shared/consts/fields/index.d.ts → src/lib/shared/consts/fields/index.ts} +5 -5
  93. package/src/lib/shared/consts/fields/input-field.const.ts +4 -0
  94. package/src/lib/shared/consts/fields/input-formatted-field.const.ts +35 -0
  95. package/src/lib/shared/consts/fields/radio-field.const.ts +31 -0
  96. package/src/lib/shared/consts/fields/select-field.const.ts +7 -0
  97. package/src/lib/shared/consts/fields/upload-field.const.ts +1 -0
  98. package/src/lib/shared/consts/validators/index.ts +0 -0
  99. package/src/lib/shared/consts/validators/pattern.const.ts +117 -0
  100. package/src/lib/shared/enums/common/component-ui.enum.ts +8 -0
  101. package/src/lib/shared/enums/common/field-dependency.enum.ts +10 -0
  102. package/src/lib/shared/enums/common/file-size-type.enum.ts +6 -0
  103. package/{lib/shared/enums/common/index.d.ts → src/lib/shared/enums/common/index.ts} +4 -4
  104. package/src/lib/shared/enums/common/output-value-type.enum.ts +22 -0
  105. package/src/lib/shared/enums/common/view-mode.enum.ts +4 -0
  106. package/src/lib/shared/enums/controls/control.enum.ts +12 -0
  107. package/{lib/shared/enums/controls/index.d.ts → src/lib/shared/enums/controls/index.ts} +1 -1
  108. package/src/lib/shared/enums/fields/date-field.enum.ts +4 -0
  109. package/src/lib/shared/enums/fields/field.enum.ts +21 -0
  110. package/{lib/shared/enums/fields/index.d.ts → src/lib/shared/enums/fields/index.ts} +6 -6
  111. package/src/lib/shared/enums/fields/input-field.enum.ts +6 -0
  112. package/src/lib/shared/enums/fields/input-formatted-field.enum.ts +6 -0
  113. package/src/lib/shared/enums/fields/select-field.enum.ts +4 -0
  114. package/src/lib/shared/enums/fields/upload-field.enum.ts +5 -0
  115. package/src/lib/shared/enums/form/dynamic-form.enum.ts +6 -0
  116. package/{lib/shared/enums/form/index.d.ts → src/lib/shared/enums/form/index.ts} +1 -1
  117. package/{lib/shared/enums/validators/index.d.ts → src/lib/shared/enums/validators/index.ts} +2 -2
  118. package/src/lib/shared/enums/validators/regex.enum.ts +47 -0
  119. package/src/lib/shared/enums/validators/validators.enum.ts +17 -0
  120. package/src/lib/shared/factories/auto-numeric-options.factory.ts +14 -0
  121. package/src/lib/shared/models/common/api-config.model.ts +7 -0
  122. package/src/lib/shared/models/common/api-response.model.ts +20 -0
  123. package/src/lib/shared/models/common/common.model.ts +39 -0
  124. package/src/lib/shared/models/common/field-dependency.model.ts +27 -0
  125. package/src/lib/shared/models/common/file-config.model.ts +22 -0
  126. package/{lib/shared/models/common/index.d.ts → src/lib/shared/models/common/index.ts} +7 -7
  127. package/src/lib/shared/models/common/obj-field.model.ts +68 -0
  128. package/src/lib/shared/models/common/object-storage.model.ts +15 -0
  129. package/{lib/shared/models/common/output-value-type.model.d.ts → src/lib/shared/models/common/output-value-type.model.ts} +4 -4
  130. package/src/lib/shared/models/common/table-models.ts +16 -0
  131. package/{lib/shared/models/common/view-mode.model.d.ts → src/lib/shared/models/common/view-mode.model.ts} +1 -1
  132. package/{lib/shared/models/controls/control.model.d.ts → src/lib/shared/models/controls/control.model.ts} +3 -2
  133. package/{lib/shared/models/controls/index.d.ts → src/lib/shared/models/controls/index.ts} +1 -1
  134. package/src/lib/shared/models/fields/date/base-date-field.model.ts +52 -0
  135. package/src/lib/shared/models/fields/date/date-picker-field.model.ts +43 -0
  136. package/src/lib/shared/models/fields/date/date-range-field.model.ts +52 -0
  137. package/{lib/shared/models/fields/date/index.d.ts → src/lib/shared/models/fields/date/index.ts} +3 -3
  138. package/src/lib/shared/models/fields/field-grid.model.ts +10 -0
  139. package/src/lib/shared/models/fields/field-group.model.ts +50 -0
  140. package/src/lib/shared/models/fields/field-user-config.model.ts +8 -0
  141. package/src/lib/shared/models/fields/field.model.ts +184 -0
  142. package/{lib/shared/models/fields/index.d.ts → src/lib/shared/models/fields/index.ts} +2 -2
  143. package/{lib/shared/models/fields/input/index.d.ts → src/lib/shared/models/fields/input/index.ts} +4 -4
  144. package/src/lib/shared/models/fields/input/input-field.model.ts +111 -0
  145. package/src/lib/shared/models/fields/input/input-formatted-field.model.ts +38 -0
  146. package/src/lib/shared/models/fields/input/input-password-field.model.ts +38 -0
  147. package/src/lib/shared/models/fields/input/input-text-field.model.ts +26 -0
  148. package/src/lib/shared/models/fields/radio/index.ts +0 -0
  149. package/src/lib/shared/models/fields/radio/radio-base-field.model.ts +84 -0
  150. package/src/lib/shared/models/fields/select/index.ts +0 -0
  151. package/src/lib/shared/models/fields/select/multi-select-field.model.ts +46 -0
  152. package/src/lib/shared/models/fields/select/select-base-field.model.ts +125 -0
  153. package/src/lib/shared/models/fields/select/single-select-field.model.ts +43 -0
  154. package/src/lib/shared/models/fields/select/tree-select-field.model.ts +44 -0
  155. package/src/lib/shared/models/fields/textarea/index.ts +0 -0
  156. package/src/lib/shared/models/fields/textarea/textarea-field.model.ts +97 -0
  157. package/src/lib/shared/models/fields/upload/avatar-upload-field.model.ts +33 -0
  158. package/src/lib/shared/models/fields/upload/base-upload-field.model.ts +105 -0
  159. package/{lib/shared/models/fields/upload/index.d.ts → src/lib/shared/models/fields/upload/index.ts} +5 -5
  160. package/src/lib/shared/models/fields/upload/multi-file-upload-field.model.ts +34 -0
  161. package/src/lib/shared/models/fields/upload/multi-image-upload-field.model.ts +42 -0
  162. package/src/lib/shared/models/fields/upload/single-file-upload-field.model.ts +33 -0
  163. package/{lib/shared/models/form/dynamic-form.model.d.ts → src/lib/shared/models/form/dynamic-form.model.ts} +1 -1
  164. package/{lib/shared/models/form/index.d.ts → src/lib/shared/models/form/index.ts} +1 -1
  165. package/src/lib/shared/models/validations/index.ts +1 -0
  166. package/src/lib/shared/models/validations/validations.model.ts +14 -0
  167. package/src/lib/shared/services/dynamic-form.service.spec.ts +16 -0
  168. package/src/lib/shared/services/dynamic-form.service.ts +251 -0
  169. package/src/lib/shared/services/field.service.spec.ts +16 -0
  170. package/src/lib/shared/services/field.service.ts +152 -0
  171. package/src/lib/shared/services/file.service.spec.ts +16 -0
  172. package/src/lib/shared/services/file.service.ts +53 -0
  173. package/src/lib/shared/services/form-config.service.ts +53 -0
  174. package/src/lib/shared/services/form-data.service.spec.ts +16 -0
  175. package/src/lib/shared/services/form-data.service.ts +114 -0
  176. package/src/lib/shared/services/form-utils.ts +52 -0
  177. package/src/lib/shared/services/suffix.service.spec.ts +16 -0
  178. package/src/lib/shared/services/suffix.service.ts +16 -0
  179. package/src/lib/shared/services/validation.service.spec.ts +16 -0
  180. package/src/lib/shared/services/validation.service.ts +38 -0
  181. package/src/lib/shared/utils/common/common.utils.ts +52 -0
  182. package/{lib/shared/utils/common/index.d.ts → src/lib/shared/utils/common/index.ts} +1 -1
  183. package/src/lib/shared/utils/date/date.utils.ts +129 -0
  184. package/{lib/shared/utils/date/index.d.ts → src/lib/shared/utils/date/index.ts} +1 -1
  185. package/src/lib/shared/utils/dynamic-field/dynamic-field.ts +0 -0
  186. package/src/lib/shared/utils/dynamic-field/index.ts +0 -0
  187. package/src/lib/shared/utils/dynamic-form/dynamic-form.ts +114 -0
  188. package/src/lib/shared/utils/dynamic-form/index.ts +0 -0
  189. package/src/lib/shared/utils/fields/fields.ts +78 -0
  190. package/{lib/shared/utils/fields/index.d.ts → src/lib/shared/utils/fields/index.ts} +1 -1
  191. package/src/lib/shared/utils/file/file.utils.ts +37 -0
  192. package/{lib/shared/utils/file/index.d.ts → src/lib/shared/utils/file/index.ts} +1 -1
  193. package/src/lib/shared/utils/validators/custom-validators.ts +158 -0
  194. package/src/lib/shared/utils/validators/default-error-message.ts +42 -0
  195. package/{lib/shared/utils/validators/index.d.ts → src/lib/shared/utils/validators/index.ts} +3 -3
  196. package/src/lib/shared/utils/validators/pattern.ts +26 -0
  197. package/{public-api.d.ts → src/public-api.ts} +68 -28
  198. package/tsconfig.lib.json +15 -0
  199. package/tsconfig.lib.prod.json +11 -0
  200. package/tsconfig.spec.json +15 -0
  201. package/fesm2022/ldquocc-dynamic-form.mjs +0 -4938
  202. package/fesm2022/ldquocc-dynamic-form.mjs.map +0 -1
  203. package/index.d.ts +0 -5
  204. package/lib/dynamic-form.component.d.ts +0 -67
  205. package/lib/shared/base/base-select.component.d.ts +0 -19
  206. package/lib/shared/base/base-value-accessor.d.ts +0 -69
  207. package/lib/shared/components/dynamic-field/dynamic-field.component.d.ts +0 -23
  208. package/lib/shared/components/field-user-config/field-user-config.component.d.ts +0 -10
  209. package/lib/shared/components/fields/components/suffix/suffix.component.d.ts +0 -12
  210. package/lib/shared/components/fields/date/date-picker/date-picker.component.d.ts +0 -17
  211. package/lib/shared/components/fields/date/date-range/date-range.component.d.ts +0 -17
  212. package/lib/shared/components/fields/input/input-formatted/input-formatted.component.d.ts +0 -20
  213. package/lib/shared/components/fields/input/input-password/input-password.component.d.ts +0 -12
  214. package/lib/shared/components/fields/input/input-text/input-text.component.d.ts +0 -14
  215. package/lib/shared/components/fields/select/multi-select/multi-select.component.d.ts +0 -21
  216. package/lib/shared/components/fields/select/single-select/single-select.component.d.ts +0 -21
  217. package/lib/shared/components/fields/select/tree-select/tree-select.component.d.ts +0 -28
  218. package/lib/shared/components/fields/textarea/textarea.component.d.ts +0 -14
  219. package/lib/shared/components/fields/upload/avatar-upload/avatar-upload.component.d.ts +0 -25
  220. package/lib/shared/components/fields/upload/multi-file-upload/multi-file-upload.component.d.ts +0 -76
  221. package/lib/shared/components/fields/upload/multi-image-upload/multi-image-upload.component.d.ts +0 -27
  222. package/lib/shared/components/fields/upload/single-file-upload/single-file-upload.component.d.ts +0 -29
  223. package/lib/shared/config/dynamic-form.config.d.ts +0 -9
  224. package/lib/shared/consts/common/common.const.d.ts +0 -5
  225. package/lib/shared/consts/common/field-dependency.const.d.ts +0 -1
  226. package/lib/shared/consts/common/file.const.d.ts +0 -148
  227. package/lib/shared/consts/common/standalone-import.const.d.ts +0 -7
  228. package/lib/shared/consts/controls/control.const.d.ts +0 -1
  229. package/lib/shared/consts/fields/date-field.const.d.ts +0 -7
  230. package/lib/shared/consts/fields/field.const.d.ts +0 -4
  231. package/lib/shared/consts/fields/input-field.const.d.ts +0 -4
  232. package/lib/shared/consts/fields/input-formatted-field.const.d.ts +0 -4
  233. package/lib/shared/consts/fields/radio-field.const.d.ts +0 -10
  234. package/lib/shared/consts/fields/select-field.const.d.ts +0 -6
  235. package/lib/shared/consts/fields/upload-field.const.d.ts +0 -1
  236. package/lib/shared/consts/validators/pattern.const.d.ts +0 -2
  237. package/lib/shared/enums/common/field-dependency.enum.d.ts +0 -9
  238. package/lib/shared/enums/common/file-size-type.enum.d.ts +0 -6
  239. package/lib/shared/enums/common/output-value-type.enum.d.ts +0 -19
  240. package/lib/shared/enums/common/view-mode.enum.d.ts +0 -4
  241. package/lib/shared/enums/controls/control.enum.d.ts +0 -11
  242. package/lib/shared/enums/fields/date-field.enum.d.ts +0 -4
  243. package/lib/shared/enums/fields/field.enum.d.ts +0 -20
  244. package/lib/shared/enums/fields/input-field.enum.d.ts +0 -6
  245. package/lib/shared/enums/fields/input-formatted-field.enum.d.ts +0 -6
  246. package/lib/shared/enums/fields/select-field.enum.d.ts +0 -4
  247. package/lib/shared/enums/fields/upload-field.enum.d.ts +0 -5
  248. package/lib/shared/enums/form/dynamic-form.enum.d.ts +0 -6
  249. package/lib/shared/enums/validators/regex.enum.d.ts +0 -38
  250. package/lib/shared/enums/validators/validators.enum.d.ts +0 -14
  251. package/lib/shared/factories/auto-numeric-options.factory.d.ts +0 -5
  252. package/lib/shared/models/common/api-config.model.d.ts +0 -4
  253. package/lib/shared/models/common/api-response.model.d.ts +0 -19
  254. package/lib/shared/models/common/common.model.d.ts +0 -29
  255. package/lib/shared/models/common/field-dependency.model.d.ts +0 -16
  256. package/lib/shared/models/common/file-config.model.d.ts +0 -11
  257. package/lib/shared/models/common/obj-field.model.d.ts +0 -59
  258. package/lib/shared/models/common/object-storage.model.d.ts +0 -15
  259. package/lib/shared/models/common/table-models.d.ts +0 -15
  260. package/lib/shared/models/fields/date/base-date-field.model.d.ts +0 -19
  261. package/lib/shared/models/fields/date/date-picker-field.model.d.ts +0 -12
  262. package/lib/shared/models/fields/date/date-range-field.model.d.ts +0 -12
  263. package/lib/shared/models/fields/field-grid.model.d.ts +0 -9
  264. package/lib/shared/models/fields/field-group.model.d.ts +0 -21
  265. package/lib/shared/models/fields/field-user-config.model.d.ts +0 -3
  266. package/lib/shared/models/fields/field.model.d.ts +0 -57
  267. package/lib/shared/models/fields/input/input-field.model.d.ts +0 -31
  268. package/lib/shared/models/fields/input/input-formatted-field.model.d.ts +0 -13
  269. package/lib/shared/models/fields/input/input-password-field.model.d.ts +0 -11
  270. package/lib/shared/models/fields/input/input-text-field.model.d.ts +0 -9
  271. package/lib/shared/models/fields/radio/radio-base-field.model.d.ts +0 -26
  272. package/lib/shared/models/fields/select/multi-select-field.model.d.ts +0 -11
  273. package/lib/shared/models/fields/select/select-base-field.model.d.ts +0 -40
  274. package/lib/shared/models/fields/select/single-select-field.model.d.ts +0 -9
  275. package/lib/shared/models/fields/select/tree-select-field.model.d.ts +0 -10
  276. package/lib/shared/models/fields/textarea/textarea-field.model.d.ts +0 -20
  277. package/lib/shared/models/fields/upload/avatar-upload-field.model.d.ts +0 -9
  278. package/lib/shared/models/fields/upload/base-upload-field.model.d.ts +0 -25
  279. package/lib/shared/models/fields/upload/multi-file-upload-field.model.d.ts +0 -10
  280. package/lib/shared/models/fields/upload/multi-image-upload-field.model.d.ts +0 -12
  281. package/lib/shared/models/fields/upload/single-file-upload-field.model.d.ts +0 -11
  282. package/lib/shared/services/dynamic-form.service.d.ts +0 -48
  283. package/lib/shared/services/field.service.d.ts +0 -41
  284. package/lib/shared/services/file.service.d.ts +0 -20
  285. package/lib/shared/services/form-config.service.d.ts +0 -10
  286. package/lib/shared/services/form-data.service.d.ts +0 -53
  287. package/lib/shared/services/form-utils.d.ts +0 -5
  288. package/lib/shared/services/suffix.service.d.ts +0 -12
  289. package/lib/shared/services/validation.service.d.ts +0 -10
  290. package/lib/shared/utils/common/common.utils.d.ts +0 -7
  291. package/lib/shared/utils/date/date.utils.d.ts +0 -6
  292. package/lib/shared/utils/dynamic-form/dynamic-form.d.ts +0 -11
  293. package/lib/shared/utils/fields/fields.d.ts +0 -20
  294. package/lib/shared/utils/file/file.utils.d.ts +0 -4
  295. package/lib/shared/utils/validators/custom-validators.d.ts +0 -11
  296. package/lib/shared/utils/validators/default-error-message.d.ts +0 -6
  297. package/lib/shared/utils/validators/pattern.d.ts +0 -4
  298. /package/{styles → src/lib/shared/styles}/_common-form.scss +0 -0
@@ -0,0 +1,288 @@
1
+ import {
2
+ Component,
3
+ computed,
4
+ effect,
5
+ forwardRef,
6
+ inject,
7
+ signal,
8
+ } from "@angular/core";
9
+ import { CORE_MODULES } from "../../../../consts/common";
10
+ import { BaseValueAccessor } from "../../../../base/base-value-accessor";
11
+ import {
12
+ NzUploadFile,
13
+ NzUploadModule,
14
+ NzUploadXHRArgs,
15
+ } from "ng-zorro-antd/upload";
16
+ import { MultiImageUploadField } from "../../../../models/fields/upload/multi-image-upload-field.model";
17
+ import { FieldTypeEnum } from "../../../../enums/fields";
18
+ import { isValidJSON } from "../../../../utils/common";
19
+ import { MyUploadFile } from "../../../../models/common/common.model";
20
+ import { ObjectStorage } from "../../../../models/common";
21
+ import { FileService } from "../../../../services/file.service";
22
+ import { finalize, Observable, of, Subscription } from "rxjs";
23
+ import { NG_VALUE_ACCESSOR } from "@angular/forms";
24
+ import { ControlTypeEnum } from "../../../../enums/controls";
25
+ import { formatFileSize } from "../../../../utils/file";
26
+ import { FileSizeTypeEnum } from "../../../../enums/common";
27
+ import { FormConfigService } from "../../../../services/form-config.service";
28
+ import { NzImageModule } from "ng-zorro-antd/image";
29
+ import { NzIconModule } from "ng-zorro-antd/icon";
30
+ import { NzButtonModule } from "ng-zorro-antd/button";
31
+ import { NzNotificationService } from "ng-zorro-antd/notification";
32
+
33
+ const ZORRO_MODULES = [
34
+ NzUploadModule,
35
+ NzIconModule,
36
+ NzButtonModule,
37
+ NzImageModule,
38
+ ];
39
+
40
+ @Component({
41
+ selector: "app-multi-image-upload",
42
+ standalone: true,
43
+ imports: [...CORE_MODULES, ...ZORRO_MODULES],
44
+ templateUrl: "./multi-image-upload.component.html",
45
+ styleUrl: "./multi-image-upload.component.less",
46
+ providers: [
47
+ {
48
+ provide: NG_VALUE_ACCESSOR,
49
+ useExisting: forwardRef(() => MultiImageUploadComponent),
50
+ multi: true,
51
+ },
52
+ ],
53
+ })
54
+ export class MultiImageUploadComponent extends BaseValueAccessor<
55
+ string | File | NzUploadFile
56
+ > {
57
+ // Cast lại đúng instance là MultiImageUploadField.
58
+ readonly field = computed(() => {
59
+ const base = this.fieldInput();
60
+ if (
61
+ !(base instanceof MultiImageUploadField) ||
62
+ (base.type !== FieldTypeEnum.MultiImageUpload &&
63
+ base.controlType !== ControlTypeEnum.Upload)
64
+ ) {
65
+ throw new Error("Expected MultiImageUploadField");
66
+ }
67
+ return base;
68
+ });
69
+
70
+ // Mảng lưu trữ objectStorage liên quan đến hình ảnh.
71
+ readonly objStorageList = signal<ObjectStorage[]>([]);
72
+
73
+ // Mảng đại diện các images.
74
+ readonly allFiles = signal<MyUploadFile[]>([]);
75
+ readonly uploading = signal(false);
76
+
77
+ private fileService = inject(FileService);
78
+ private nzNotification = inject(NzNotificationService);
79
+ private formConfigService = inject(FormConfigService);
80
+
81
+ constructor() {
82
+ super();
83
+ }
84
+
85
+ // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.
86
+ protected override writeValueToView(value: string): void {
87
+ this.handleInitAllData(value);
88
+
89
+ if (!this.isAddOrEdit()) return;
90
+
91
+ // Gán data vào đầu ra của form.
92
+ this.patchFormData(this.fieldKey(), value);
93
+ }
94
+
95
+ // Xử lý init các data cần thiết: objStorageList, allFiles, fileList, lưu giữ first value.
96
+ // value sẽ là 1 string json mảng các objStorage.
97
+ private handleInitAllData(value: string): void {
98
+ // Reset khi đổi mode, hoặc model, hoặc fields.
99
+ this.objStorageList.set([]);
100
+ this.allFiles.set([]);
101
+
102
+ if (isValidJSON(value)) {
103
+ // Khởi tạo danh sách ObjectStorage từ data json.
104
+ const objStorageList = JSON.parse(value) as ObjectStorage[];
105
+ this.objStorageList.set(objStorageList);
106
+
107
+ // Khởi tạo danh sách MyUploadFile từ data json.
108
+ const myUploadFiles = objStorageList.map(
109
+ (objStorage) =>
110
+ ({
111
+ objStorage,
112
+ isTemp: false,
113
+ previewUrl: this.formConfigService.getViewFileUrl(
114
+ objStorage.name ?? "",
115
+ false,
116
+ ),
117
+ }) as MyUploadFile,
118
+ );
119
+ this.allFiles.set(myUploadFiles);
120
+ }
121
+ }
122
+
123
+ // Xử lý trước khi upload.
124
+ beforeUpload = (file: NzUploadFile): boolean | Observable<boolean> => {
125
+ // 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.
126
+ // Xử lý gán vào CVA để tiến hành validation theo các props đã truyền vào.
127
+ const originFile = file as unknown as File;
128
+ this.propagateValue(originFile);
129
+
130
+ const { maxFileCount, maxSizeInMB, acceptedMimeTypes } = this.field();
131
+ // Kiểm tra số lượng tối đa hình ảnh có thể tải lên.
132
+ if (this.allFiles().length + 1 > maxFileCount) {
133
+ this.nzNotification.warning(
134
+ "Cảnh báo",
135
+ `Chỉ được phép tải lên tối đa ${maxFileCount} hình ảnh`,
136
+ { nzDuration: 4500 },
137
+ );
138
+ return false;
139
+ }
140
+
141
+ const fileSizeInMB = formatFileSize(file.size!, FileSizeTypeEnum.MB);
142
+ const fileType = file.type;
143
+ if (fileSizeInMB > maxSizeInMB || !acceptedMimeTypes.includes(fileType!)) {
144
+ return false;
145
+ }
146
+
147
+ // Luôn trả về true vì lúc này chưa bắt kịp control là valid hay invalid.
148
+ return true;
149
+ };
150
+
151
+ customRequest = (item: NzUploadXHRArgs): Subscription => {
152
+ // const originFile = nzUploadFile?.originFileObj;
153
+ const originFile = item.file as unknown as File;
154
+
155
+ // Nếu validation không thỏa, dừng tại đây.
156
+ if (this.control?.invalid) {
157
+ return of(null).subscribe(); // fake subscription.
158
+ }
159
+
160
+ // Validation đã thỏa, tiến hành upload file.
161
+ return this.uploadFile(originFile);
162
+ };
163
+
164
+ private uploadFile(file: File) {
165
+ this.uploading.set(true);
166
+ const { apiFileConfig, uploadTemp } = this.field();
167
+ const newFileName = this.formConfigService.generateRandomFileName(
168
+ file.name,
169
+ "file",
170
+ );
171
+ const renamedFile = new File([file], newFileName, { type: file.type });
172
+
173
+ const mimeCfg = apiFileConfig.perMimeTypeConfig?.[file.type]; // Lấy mimeTypes file upload.
174
+ const uploadUrl = mimeCfg?.uploadUrl ?? apiFileConfig.uploadUrl; // Nếu có config upload riêng cho mimeTypes đang kiểm tra.
175
+ const formData = mimeCfg?.buildFormData // Nếu có hàm custon buildFormData.
176
+ ? mimeCfg.buildFormData(file, {})
177
+ : (() => {
178
+ // Mặc định
179
+ const fd = new FormData();
180
+ fd.append("File", renamedFile);
181
+ // fd.append('isTemp', 'true');
182
+ return fd;
183
+ })();
184
+
185
+ if (uploadTemp) formData.append("isTemp", "true");
186
+
187
+ return this.fileService
188
+ .uploadFile(renamedFile, formData, { uploadUrl })
189
+ .pipe(
190
+ this.takeUntilDestroy(),
191
+ finalize(() => this.uploading.set(false)),
192
+ )
193
+ .subscribe({
194
+ next: (res) => {
195
+ const { code, data, message } = res;
196
+ if (code === 0) {
197
+ this.objStorageList.update((curr) => [...curr, data]);
198
+
199
+ this.allFiles.update((curr) => [
200
+ ...curr,
201
+ {
202
+ objStorage: data,
203
+ isTemp: true,
204
+ previewUrl: this.formConfigService.getViewFileUrl(
205
+ data.name ?? "",
206
+ true,
207
+ ),
208
+ } as MyUploadFile,
209
+ ]);
210
+
211
+ this.patchFormData(
212
+ this.fieldKey(),
213
+ JSON.stringify(this.objStorageList()),
214
+ );
215
+ } else {
216
+ console.error(message);
217
+ }
218
+ },
219
+ error: (err: Error) => {
220
+ console.error("Lỗi trong quá trình tải hình ảnh đến máy chủ!!");
221
+ },
222
+ });
223
+ }
224
+
225
+ handleDelete(file: MyUploadFile): void {
226
+ const { objStorage } = file;
227
+
228
+ // Loại bỏ và cập nhật danh sách ObjectStorage.
229
+ const newObjStorageList = this.objStorageList().filter(
230
+ (item) => item.id !== objStorage?.id,
231
+ );
232
+ this.objStorageList.set(newObjStorageList);
233
+
234
+ // Loại bỏ và cập nhật danh sách MyUploadFile.
235
+ const newAllFiles = this.allFiles().filter(
236
+ (item) => item.objStorage?.id !== objStorage?.id,
237
+ );
238
+ this.allFiles.set(newAllFiles);
239
+
240
+ // Cập nhật đầu ra cho form.
241
+ this.patchFormData(this.fieldKey(), JSON.stringify(this.objStorageList()));
242
+ }
243
+
244
+ deleteObjStorage(id: string) {
245
+ return this.fileService
246
+ .deleteObjStorage(id, {
247
+ deleteUrl: this.field().apiFileConfig.deleteUrl,
248
+ })
249
+ .pipe(this.takeUntilDestroy())
250
+ .subscribe({
251
+ next: (res) => {
252
+ const { code, message } = res;
253
+ if (code === 0) {
254
+ const newObjStorageList = this.objStorageList().filter(
255
+ (item) => item.id !== id,
256
+ );
257
+ this.objStorageList.set(newObjStorageList);
258
+
259
+ this.patchFormData(
260
+ this.fieldKey(),
261
+ JSON.stringify(this.objStorageList()),
262
+ );
263
+ } else {
264
+ console.error(message);
265
+ }
266
+ },
267
+ error: (err: Error) => {
268
+ console.error("Lỗi trong quá trình xóa tập tin khỏi máy chủ!!");
269
+ // Fake vì hiện api xóa đang có vấn đề.
270
+ const newObjStorageList = this.objStorageList().filter(
271
+ (item) => item.id !== id,
272
+ );
273
+ this.objStorageList.set(newObjStorageList);
274
+
275
+ this.patchFormData(
276
+ this.fieldKey(),
277
+ JSON.stringify(this.objStorageList()),
278
+ );
279
+ // Fake vì hiện api xóa đang có vấn đề.
280
+ },
281
+ });
282
+ }
283
+
284
+ protected handlePreview(file: MyUploadFile): void {
285
+ const imgRef = document.getElementById(file.objStorage.id);
286
+ if (imgRef) imgRef.click();
287
+ }
288
+ }
@@ -0,0 +1,104 @@
1
+ <div class="d-flex">
2
+ @if (modeSignal() === formModeEnum.View) {
3
+ @if (viewMode() === viewModeEnum.form) {
4
+ <input nz-input [value]="viewDisplayValue()" class="modeView" />
5
+ }
6
+ @if (viewMode() === viewModeEnum.text) {
7
+ <span class="modeView">{{ viewDisplayValue() }}</span>
8
+ }
9
+ }
10
+ @if (isAddOrEdit()) {
11
+ <div class="flex w-100">
12
+ <nz-input-group
13
+ [nzSuffix]="
14
+ uploading() || (allFiles().length > 0 && isAddOrEdit())
15
+ ? actionIcon
16
+ : undefined
17
+ "
18
+ class="flex-1"
19
+ >
20
+ <input
21
+ nz-input
22
+ [value]="
23
+ uploading() ? 'Đang tải lên tập tin...' : addEditDisplayValue()
24
+ "
25
+ class="no-events"
26
+ />
27
+ </nz-input-group>
28
+
29
+ <nz-upload
30
+ [nzShowUploadList]="false"
31
+ [nzMultiple]="false"
32
+ [nzBeforeUpload]="beforeUpload"
33
+ [nzCustomRequest]="customRequest"
34
+ >
35
+ <button
36
+ nz-button
37
+ class="btn-upload h-100 text-white"
38
+ [disabled]="uploading()"
39
+ >
40
+ <span class="fs-12">Tải lên</span>
41
+ <nz-icon nzType="upload" nzTheme="outline" />
42
+ </button>
43
+ </nz-upload>
44
+ </div>
45
+ }
46
+
47
+ @if (field().suffixes.length > 0) {
48
+ @for (suffix of field().suffixes; track $index) {
49
+ @if (suffix.visibleOn?.includes(this.modeSignal())) {
50
+ <app-suffix [suffixConfig]="suffix" [formId]="formId"> </app-suffix>
51
+ }
52
+ }
53
+ }
54
+ </div>
55
+
56
+ <ng-template #actionIcon>
57
+ @if (uploading()) {
58
+ <span
59
+ nz-icon
60
+ nzType="loading"
61
+ nzTheme="outline"
62
+ class="text-primary"
63
+ ></span>
64
+ } @else if (allFiles().length > 0 && isAddOrEdit()) {
65
+ <span
66
+ title="Xóa"
67
+ class="mdi mdi-delete pointer text-danger"
68
+ (click)="handleDelete(allFiles()[0])"
69
+ ></span>
70
+ }
71
+ </ng-template>
72
+
73
+ @if (field().showAcceptedExtensionGuide && fileExtensionGuide()) {
74
+ <div class="file-extension-guide">{{ fileExtensionGuide() }}</div>
75
+ }
76
+
77
+ <!-- Custom hiển thị danh sách tập tin -->
78
+ <!-- @if (allFiles().length > 0) { -->
79
+ <!-- <ng-container *ngTemplateOutlet="renderFileTpl"></ng-container> -->
80
+ <!-- } -->
81
+
82
+ <!-- Template custom hiển thị danh sách tập tin -->
83
+ <!-- <ng-template #renderFileTpl>
84
+ <ul class="custom-upload-list">
85
+ @for (file of allFiles() | slice: 0 : 1; track file.objStorage?.id) {
86
+ <li class="upload-item">
87
+ <span nz-icon nzType="paper-clip" nzTheme="outline" class="paper-clip-icon"></span>
88
+
89
+ <span class="filename">{{ file.objStorage.name }}</span>
90
+
91
+ @if (isAddOrEdit()) {
92
+ <span
93
+ nz-icon
94
+ nzType="delete"
95
+ nzTheme="outline"
96
+ title="Xóa"
97
+ class="delete-icon"
98
+ (click)="handleDelete(file)"
99
+ ></span>
100
+ }
101
+ </li>
102
+ }
103
+ </ul>
104
+ </ng-template> -->
@@ -0,0 +1,37 @@
1
+ .file-extension-guide {
2
+ font-size: 11px;
3
+ margin-top: 8px;
4
+ font-style: italic;
5
+ color: #0f766e;
6
+ }
7
+
8
+ .custom-upload-list {
9
+ margin-top: 0.625rem;
10
+ list-style-type: none;
11
+ padding-inline-start: 10px;
12
+
13
+ .paper-clip-icon {
14
+ margin-right: 0.5rem;
15
+ }
16
+
17
+ .delete-icon {
18
+ color: red;
19
+ cursor: pointer;
20
+ margin-left: 0.5rem;
21
+ }
22
+ }
23
+
24
+ .file-name:hover {
25
+ text-decoration: underline;
26
+ color: #0a4c9f;
27
+ cursor: pointer;
28
+ }
29
+
30
+ .btn-upload {
31
+ background-color: #2666ab;
32
+ }
33
+
34
+ .no-events {
35
+ pointer-events: none;
36
+ color: #cdbfbf;
37
+ }
@@ -0,0 +1,21 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { SingleFileUploadComponent } from './single-file-upload.component';
4
+
5
+ describe('SingleFileUploadComponent', () => {
6
+ let component: SingleFileUploadComponent;
7
+ let fixture: ComponentFixture<SingleFileUploadComponent>;
8
+
9
+ beforeEach(() => {
10
+ TestBed.configureTestingModule({
11
+ imports: [SingleFileUploadComponent],
12
+ });
13
+ fixture = TestBed.createComponent(SingleFileUploadComponent);
14
+ component = fixture.componentInstance;
15
+ fixture.detectChanges();
16
+ });
17
+
18
+ it('should create', () => {
19
+ expect(component).toBeTruthy();
20
+ });
21
+ });