@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,217 @@
1
+ import {
2
+ Component,
3
+ computed,
4
+ forwardRef,
5
+ Input,
6
+ untracked,
7
+ } from "@angular/core";
8
+ import {
9
+ FormsModule,
10
+ NG_VALUE_ACCESSOR,
11
+ ReactiveFormsModule,
12
+ } from "@angular/forms";
13
+ import { BaseSelectComponent } from "../../../../base/base-select.component";
14
+ import { SingleSelectField } from "../../../../models/fields/select/single-select-field.model";
15
+ import { createSingleSelectPlaceholder } from "../../../../utils/dynamic-form/dynamic-form";
16
+ import { NO_INFO_TEXT } from "../../../../consts/common/common.const";
17
+ import { SelectOutputValueTypeEnum } from "../../../../enums/common";
18
+ import { ApiResponse } from "../../../../models/common/api-response.model";
19
+ import {
20
+ FieldDependency,
21
+ FieldDependencyType,
22
+ } from "../../../../models/common/field-dependency.model";
23
+ import { FieldTypeEnum } from "../../../../enums/fields";
24
+ import { ControlTypeEnum } from "../../../../enums/controls";
25
+ import { SuffixComponent } from "../../components/suffix/suffix.component";
26
+ import { NzSelectModule } from "ng-zorro-antd/select";
27
+ import { NzSpinModule } from "ng-zorro-antd/spin";
28
+ import { NzInputModule } from "ng-zorro-antd/input";
29
+ import { CommonModule } from "@angular/common";
30
+
31
+ const modules = [CommonModule, FormsModule, ReactiveFormsModule];
32
+ const zorroModules = [NzSelectModule, NzSpinModule, NzInputModule];
33
+ const components = [SuffixComponent];
34
+
35
+ @Component({
36
+ selector: "app-single-select",
37
+ standalone: true,
38
+ imports: [...modules, ...zorroModules, ...components],
39
+ templateUrl: "./single-select.component.html",
40
+ styleUrls: ["./single-select.component.scss"],
41
+ providers: [
42
+ {
43
+ provide: NG_VALUE_ACCESSOR,
44
+ useExisting: forwardRef(() => SingleSelectComponent),
45
+ multi: true,
46
+ },
47
+ ],
48
+ })
49
+ export class SingleSelectComponent extends BaseSelectComponent<
50
+ string | Record<string, unknown>
51
+ > {
52
+ @Input() isCustomInputText!: boolean;
53
+ readonly field = computed(() => {
54
+ const base = this.fieldInput();
55
+ if (
56
+ !(base instanceof SingleSelectField) ||
57
+ (base.type !== FieldTypeEnum.SingleSelect &&
58
+ base.controlType !== ControlTypeEnum.Select)
59
+ ) {
60
+ throw new Error("Expected SingleSelectField");
61
+ }
62
+ return base;
63
+ });
64
+
65
+ // Giá trị dùng hiển thị ở chế độ View.
66
+ readonly viewDisplayValue = computed(() => {
67
+ if (!this.isView()) return "";
68
+ return this.getDisplayValue(
69
+ (this.field().modelValue as any) || this.valueSignal(),
70
+ );
71
+ });
72
+
73
+ constructor() {
74
+ super();
75
+ }
76
+
77
+ protected override onApiOptionsLoaded(): void {
78
+ const field = this.field();
79
+ if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {
80
+ const newOutputValue =
81
+ this.value && this.getValueByOutputAs(this.value as string);
82
+ this.patchFormData(this.fieldKey(), newOutputValue);
83
+ }
84
+ }
85
+
86
+ // Xử lý tạo placeholder text tự động nếu chưa truyền placeholder vào config của field
87
+ override resolvePlaceholderText(): string {
88
+ return createSingleSelectPlaceholder(this.field());
89
+ }
90
+
91
+ // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.
92
+ protected override writeValueToView(value: string | null): void {
93
+ if (!this.isAddOrEdit()) return;
94
+
95
+ // Bắn giá trị mới vào BehaviorSubject của FieldService.
96
+ // Việc này báo cho các component Con biết Parent vừa thay đổi data.
97
+ // 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.
98
+ this.fieldService.emitDependValueChange(this.fieldKey(), value ?? "");
99
+
100
+ // Gán data vào đầu ra của form.
101
+ const newOutputValue = value && this.getValueByOutputAs(value);
102
+ this.patchFormData(this.fieldKey(), newOutputValue);
103
+ }
104
+
105
+ // Xử lý phụ thuộc khi change value
106
+ protected override handleValueChange(value: string): void {
107
+ const { isParent } = this.field();
108
+ if (isParent) {
109
+ this.fieldService.emitDependValueChange(this.fieldKey(), value);
110
+ }
111
+
112
+ // Gán data vào đầu ra của form.
113
+ const newOutputValue = value && this.getValueByOutputAs(value);
114
+ this.patchFormData(this.fieldKey(), newOutputValue);
115
+ }
116
+
117
+ handleChangeOptions(optionValue: string): void {
118
+ const { enableFieldChange, bindValue } = untracked(() => this.field());
119
+
120
+ if (enableFieldChange) {
121
+ const option = this.options().find(
122
+ (option) => option[bindValue] === optionValue,
123
+ );
124
+ this.fieldService.onFieldChange(this.fieldKey(), option);
125
+ }
126
+
127
+ this.propagateValue(optionValue);
128
+ }
129
+
130
+ // Xử lý output value đầu ra theo outputAs mà người dùng mong muốn.
131
+ private getValueByOutputAs(
132
+ singleValue: string,
133
+ ): string | Record<string, unknown> {
134
+ const { outputAs, bindValue, bindLabel, modelValue } = this.field();
135
+
136
+ if (singleValue) {
137
+ // Nếu outputAs là dạng single.
138
+ let value: string | Record<string, unknown> = singleValue;
139
+
140
+ // Nếu outputAs là dạng object.
141
+ if (outputAs === SelectOutputValueTypeEnum.Object) {
142
+ value = {
143
+ [bindValue]: singleValue,
144
+ };
145
+ }
146
+
147
+ // Nếu outputAs là dạng sourceObject.
148
+ if (outputAs === SelectOutputValueTypeEnum.SourceObject) {
149
+ value =
150
+ this.options().find((option) => option[bindValue] === singleValue) ??
151
+ (modelValue && typeof modelValue === "object"
152
+ ? modelValue
153
+ : { [bindValue]: value });
154
+ }
155
+
156
+ return value;
157
+ }
158
+ return singleValue;
159
+ }
160
+
161
+ // Làm phẳng giá trị để hiện thị ở chế độ View.
162
+ protected getDisplayValue(value: string | Record<string, unknown>): string {
163
+ if (!value) return NO_INFO_TEXT;
164
+
165
+ if (typeof value === "object") {
166
+ return this.getCustomLabel(value);
167
+ }
168
+ return value as string;
169
+ }
170
+
171
+ // Lấy value ở option tag.
172
+ protected transformOptionValue(option: Record<string, unknown>): unknown {
173
+ const field = this.field()!;
174
+
175
+ let optionValue: unknown;
176
+
177
+ optionValue = option[field.bindValue];
178
+
179
+ return optionValue;
180
+ }
181
+
182
+ // Lấy label.
183
+ protected getOptionLabel(option: Record<string, unknown>): string {
184
+ return this.getCustomLabel(option);
185
+ }
186
+
187
+ // Biến đổi label nếu có thuộc tính hàm biến đổi transformLabel.
188
+ private getCustomLabel(option: Record<string, unknown>): string {
189
+ const field = this.field();
190
+
191
+ // 1. Ưu tiên lấy bindLabel, nếu không có thì fallback sang bindValue
192
+ let rawLabel = option[field.bindLabel];
193
+ if (rawLabel === undefined || rawLabel === null || rawLabel === "") {
194
+ rawLabel = option[field.bindValue];
195
+ }
196
+
197
+ // 2. Kiểm tra nếu không tồn tại hoặc là dạng object/function (kể cả array)
198
+ if (
199
+ rawLabel === undefined ||
200
+ rawLabel === null ||
201
+ typeof rawLabel === "object" ||
202
+ typeof rawLabel === "function"
203
+ ) {
204
+ return NO_INFO_TEXT;
205
+ }
206
+
207
+ let optionLabel = String(rawLabel);
208
+
209
+ // 3. Biến đổi theo transformLabel nếu có
210
+ if (field.transformLabel) {
211
+ const tranformLabelValue = field.transformLabel(option);
212
+ if (tranformLabelValue) optionLabel = tranformLabelValue;
213
+ }
214
+
215
+ return optionLabel;
216
+ }
217
+ }
@@ -0,0 +1,337 @@
1
+ import {
2
+ Component,
3
+ computed,
4
+ effect,
5
+ forwardRef,
6
+ Input,
7
+ signal,
8
+ untracked,
9
+ } from "@angular/core";
10
+ import { NG_VALUE_ACCESSOR } from "@angular/forms";
11
+ import { BaseValueAccessor } from "../../../../base/base-value-accessor";
12
+ import { SingleSelectField } from "../../../../models/fields/select/single-select-field.model";
13
+ import {
14
+ createSelectPlaceholder,
15
+ createSingleSelectPlaceholder,
16
+ } from "../../../../utils/dynamic-form/dynamic-form";
17
+ import { FORM_MODULES } from "../../../../consts/common/standalone-import.const";
18
+ import { NO_INFO_TEXT } from "../../../../consts/common/common.const";
19
+ import { SelectOutputValueTypeEnum } from "../../../../enums/common";
20
+ import { ApiResponse } from "../../../../models/common/api-response.model";
21
+ import { FieldTypeEnum } from "../../../../enums/fields";
22
+ import { ControlTypeEnum } from "../../../../enums/controls";
23
+ import { SuffixComponent } from "../../components/suffix/suffix.component";
24
+ import { NzSelectModule } from "ng-zorro-antd/select";
25
+ import { NzSpinModule } from "ng-zorro-antd/spin";
26
+ import { NzInputModule } from "ng-zorro-antd/input";
27
+
28
+ const ZORRO_MODULES = [NzSelectModule, NzSpinModule, NzInputModule];
29
+ const COMPONENTS = [SuffixComponent];
30
+
31
+ @Component({
32
+ selector: "app-single-select",
33
+ standalone: true,
34
+ imports: [...FORM_MODULES, ...ZORRO_MODULES, ...COMPONENTS],
35
+ templateUrl: "./single-select.component.html",
36
+ styleUrls: ["./single-select.component.scss"],
37
+ providers: [
38
+ {
39
+ provide: NG_VALUE_ACCESSOR,
40
+ useExisting: forwardRef(() => SingleSelectComponent),
41
+ multi: true,
42
+ },
43
+ ],
44
+ })
45
+ export class SingleSelectComponent extends BaseValueAccessor<
46
+ string | Record<string, unknown>
47
+ > {
48
+ @Input() isCustomInputText!: boolean;
49
+ readonly field = computed(() => {
50
+ const base = this.fieldInput();
51
+ if (
52
+ !(base instanceof SingleSelectField) ||
53
+ (base.type !== FieldTypeEnum.SingleSelect &&
54
+ base.controlType !== ControlTypeEnum.Select)
55
+ ) {
56
+ throw new Error("Expected SingleSelectField");
57
+ }
58
+ return base;
59
+ });
60
+
61
+ // Giá trị dùng hiển thị ở chế độ View.
62
+ displayValue: string | number = "";
63
+
64
+ loadingSignal = signal(false);
65
+ isDisabledSignal = signal(false);
66
+ disabled = computed(() => this.loadingSignal() || this.isDisabledSignal());
67
+
68
+ options: Record<string, unknown>[] = [];
69
+ queryParams: Record<string, unknown> = {};
70
+
71
+ constructor() {
72
+ super();
73
+
74
+ effect(() => {
75
+ if (untracked(() => this.isView())) return;
76
+
77
+ const { key, dependsOn, isParent, dependType } = untracked(() =>
78
+ this.field(),
79
+ );
80
+
81
+ // Không dính dáng gì đến isParent và dependsOn.
82
+ if (!isParent && dependsOn!.length === 0) {
83
+ this.getOptions();
84
+ return;
85
+ }
86
+
87
+ const dependValuesMap = this.fieldService.getDependValuesMap();
88
+
89
+ const dependValues = dependsOn?.map((depend) => {
90
+ const dependFunc = dependValuesMap.get(depend.fieldKey);
91
+ const value =
92
+ typeof dependFunc === "function" ? dependFunc() : dependFunc;
93
+ return [depend.paramKey, value];
94
+ });
95
+
96
+ // console.log(`${key} dependValue`, dependValues);
97
+
98
+ const params = Object.fromEntries(dependValues as any);
99
+
100
+ this.queryParams = {
101
+ ...this.queryParams,
102
+ ...params,
103
+ };
104
+
105
+ // console.log(`${key} queryParams`, this.queryParams);
106
+
107
+ // Nếu tất cả các phụ thuộc có value thì mới gọi API.
108
+ const allDependHasValues = dependValues?.every(
109
+ ([fieldKey, value]) => value,
110
+ );
111
+ // console.log(`${key} allDependHasValues`, allDependHasValues);
112
+
113
+ if (allDependHasValues) {
114
+ // this.isDisabledSignal.set(false);
115
+ this.control?.enable();
116
+ this.getOptions();
117
+ } else {
118
+ // Ngược lại reset và disabled.
119
+ this.control?.reset();
120
+ // this.isDisabledSignal.set(true);
121
+ this.control?.disable();
122
+ }
123
+ });
124
+ }
125
+
126
+ // Xử lý tạo placeholder text tự động nếu chưa truyền placeholder vào config của field
127
+ override resolvePlaceholderText(): string {
128
+ return createSingleSelectPlaceholder(this.field());
129
+ }
130
+
131
+ // Chạy khi value form được gán bởi các hàm reset, patchValue, setValue.
132
+ protected override writeValueToView(value: string | null): void {
133
+ if (this.isView()) {
134
+ this.displayValue = this.getDisplayValue(
135
+ this.field().modelValue as string | Record<string, unknown>,
136
+ );
137
+ return;
138
+ }
139
+
140
+ if (!this.isAddOrEdit()) return;
141
+
142
+ this.fieldService.updateDependValuesMap(this.fieldKey(), value ?? "");
143
+ // const signal = untracked(() => this.fieldService.getDependValuesMap().get(this.fieldKey()))
144
+ // console.log("DependValuesMap SET", untracked(() => signal!()));
145
+
146
+ // Gán data vào đầu ra của form.
147
+ const newOutputValue = value && this.getValueByOutputAs(value);
148
+ this.patchFormData(this.fieldKey(), newOutputValue);
149
+ }
150
+
151
+ // Xử lý phụ thuộc khi change value
152
+ protected override handleValueChange(value: string): void {
153
+ const { isParent } = this.field();
154
+ if (isParent) {
155
+ this.fieldService.updateDependValuesMap(this.fieldKey(), value);
156
+ // const signal = untracked(() => this.fieldService.getDependValuesMap().get(this.fieldKey()))
157
+ // console.log("DependValuesMap UI", untracked(() => signal!()));
158
+ }
159
+
160
+ // Gán data vào đầu ra của form.
161
+ const newOutputValue = value && this.getValueByOutputAs(value);
162
+ this.patchFormData(this.fieldKey(), newOutputValue);
163
+ }
164
+
165
+ private createFullApiUrl(): string {
166
+ const field = untracked(() => this.field());
167
+ let fullApiUrl = field?.apiConfig?.baseUrl || "";
168
+ const params = field?.apiConfig?.params || {};
169
+ this.queryParams = {
170
+ ...this.queryParams,
171
+ ...params,
172
+ };
173
+ return fullApiUrl;
174
+ }
175
+
176
+ // Lấy danh sách options từ GET api.
177
+ private getOptions(): void {
178
+ const field = untracked(() => this.field());
179
+ const { optionsToPrepend, optionsToAppend, exceptOptions } = field;
180
+ const fullApiUrl = this.createFullApiUrl();
181
+
182
+ if (!fullApiUrl) {
183
+ this.options = field?.options ?? [];
184
+ this.options = [
185
+ ...optionsToPrepend,
186
+ ...this.options,
187
+ ...optionsToAppend,
188
+ ].filter(
189
+ (options) =>
190
+ !exceptOptions.some(
191
+ (opts) => opts[field.bindValue] === options[field.bindValue],
192
+ ),
193
+ );
194
+ return;
195
+ }
196
+
197
+ this.loadingSignal.set(true);
198
+ this.control?.disable();
199
+ this.fieldService
200
+ .getAllOptions(fullApiUrl, this.queryParams)
201
+ .pipe(this.takeUntilDestroy())
202
+ .subscribe({
203
+ next: (res: ApiResponse<Record<string, unknown>[]>) => {
204
+ this.loadingSignal.set(false);
205
+ if (!this.field().isDisabled) {
206
+ this.control?.enable();
207
+ this.control?.reset();
208
+ }
209
+
210
+ if (res?.code === 0) {
211
+ this.options = res?.data;
212
+ this.options = [
213
+ ...optionsToPrepend,
214
+ ...this.options,
215
+ ...optionsToAppend,
216
+ ].filter(
217
+ (options) =>
218
+ !exceptOptions.some(
219
+ (opts) => opts[field.bindValue] === options[field.bindValue],
220
+ ),
221
+ );
222
+
223
+ // Nếu outputAs là dạng sourceObject đồng bộ sau khi load xong list.
224
+ if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {
225
+ const newOutputValue = this.options.find(
226
+ (option) => option[field.bindValue] === this.value,
227
+ ) ?? {
228
+ [field.bindValue]: this.value,
229
+ };
230
+ this.patchFormData(this.fieldKey(), newOutputValue);
231
+ }
232
+ }
233
+ },
234
+ error: (error: Error) => {
235
+ this.loadingSignal.set(false);
236
+ if (!this.field().isDisabled) this.control?.enable();
237
+ },
238
+ });
239
+ }
240
+
241
+ handleChangeOptions(optionValue: string): void {
242
+ const { enableFieldChange, bindValue } = untracked(() => this.field());
243
+
244
+ if (enableFieldChange) {
245
+ const option = this.options.find(
246
+ (option) => option[bindValue] === optionValue,
247
+ );
248
+ this.fieldService.onFieldChange(this.fieldKey(), option);
249
+ }
250
+
251
+ this.propagateValue(optionValue);
252
+ }
253
+
254
+ // Xử lý output value đầu ra theo outputAs mà người dùng mong muốn.
255
+ private getValueByOutputAs(
256
+ singleValue: string,
257
+ ): string | Record<string, unknown> {
258
+ const field = this.field();
259
+
260
+ if (singleValue) {
261
+ // Nếu outputAs là dạng single.
262
+ let value: string | Record<string, unknown> = singleValue;
263
+
264
+ // Nếu outputAs là dạng object.
265
+ if (field.outputAs === SelectOutputValueTypeEnum.Object) {
266
+ value = {
267
+ [field.bindValue]: singleValue,
268
+ };
269
+ }
270
+
271
+ // Nếu outputAs là dạng sourceObject.
272
+ if (field.outputAs === SelectOutputValueTypeEnum.SourceObject) {
273
+ value = this.options.find(
274
+ (option) => option[field.bindValue] === singleValue,
275
+ ) ?? {
276
+ [field.bindValue]: singleValue,
277
+ };
278
+ }
279
+
280
+ return value;
281
+ }
282
+ return singleValue;
283
+ }
284
+
285
+ // Làm phẳng giá trị để hiện thị ở chế độ View.
286
+ protected getDisplayValue(value: string | Record<string, unknown>): string {
287
+ if (!value) return NO_INFO_TEXT;
288
+
289
+ if (typeof value === "object") {
290
+ return this.getCustomLabel(value);
291
+ }
292
+ return value as string;
293
+ }
294
+
295
+ // Lấy value ở option tag.
296
+ protected transformOptionValue(option: Record<string, unknown>): unknown {
297
+ const field = this.field()!;
298
+
299
+ let optionValue: unknown;
300
+
301
+ optionValue = option[field.bindValue];
302
+
303
+ return optionValue;
304
+ }
305
+
306
+ // Lấy label.
307
+ protected getOptionLabel(option: Record<string, unknown>): string {
308
+ return this.getCustomLabel(option);
309
+ }
310
+
311
+ // Biến đổi label nếu có thuộc tính hàm biến đổi transformLabel.
312
+ private getCustomLabel(option: Record<string, unknown>): string {
313
+ const field = this.field();
314
+
315
+ if (
316
+ typeof option[field.bindLabel] === "function" ||
317
+ !option[field.bindLabel]
318
+ ) {
319
+ let warnMessage =
320
+ "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";
321
+ if (!option[field.bindLabel])
322
+ warnMessage = "Không tồn tại giá trị label khi lấy theo bindLabel";
323
+ // console.warn(warnMessage);
324
+
325
+ return NO_INFO_TEXT;
326
+ }
327
+
328
+ let optionLabel = option[field.bindLabel] as string;
329
+
330
+ if (field.transformLabel) {
331
+ const tranformLabelValue = field.transformLabel(option);
332
+ if (tranformLabelValue) optionLabel = tranformLabelValue;
333
+ }
334
+
335
+ return optionLabel;
336
+ }
337
+ }