@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,218 @@
1
+ <div [formGroup]="formGroup()">
2
+ <nz-form-item>
3
+ <nz-form-label
4
+ [nzXXl]="field().labelGrid.xxl ?? null"
5
+ [nzXl]="field().labelGrid.xl ?? null"
6
+ [nzLg]="field().labelGrid.lg ?? null"
7
+ [nzMd]="field().labelGrid.md ?? null"
8
+ [nzSm]="field().labelGrid.sm ?? null"
9
+ [nzXs]="field().labelGrid.xs ?? null"
10
+ [nzLabelAlign]="field().labelAlign"
11
+ >
12
+ @if (field().required) {
13
+ <span class="required">*</span>
14
+ }
15
+ <span class="form-label">
16
+ {{ field().label }}
17
+ @if (field().sublabel) {
18
+ <span class="sub-label mb-sm">{{ field().sublabel }}</span>
19
+ }
20
+ </span>
21
+ </nz-form-label>
22
+
23
+ <nz-form-control
24
+ [nzXXl]="field().controlGrid.xxl ?? null"
25
+ [nzXl]="field().controlGrid.xl ?? null"
26
+ [nzLg]="field().controlGrid.lg ?? null"
27
+ [nzMd]="field().controlGrid.md ?? null"
28
+ [nzSm]="field().controlGrid.sm ?? null"
29
+ [nzXs]="field().controlGrid.xs ?? null"
30
+ [nzErrorTip]="getErrorMessage()"
31
+ >
32
+ <div nz-flex [nzAlign]="'flex-start'" [nzGap]="8" class="w-100">
33
+ <div class="flex-1 min-w-0">
34
+ @switch (field().type) {
35
+ <!-- Input text -->
36
+ @case (fieldTypeEnum.InputText) {
37
+ <app-input-text
38
+ [formControlName]="field().key"
39
+ [fieldInput]="field()"
40
+ [modeSignal]="mode()"
41
+ [control]="control()"
42
+ [formId]="formId()"
43
+ ></app-input-text>
44
+ }
45
+
46
+ <!-- Input password -->
47
+ @case (fieldTypeEnum.InputPassword) {
48
+ @if (mode() === formModeEnum.Add) {
49
+ <app-input-password
50
+ [formControlName]="field().key"
51
+ [fieldInput]="field()"
52
+ [modeSignal]="mode()"
53
+ [control]="control()"
54
+ [formId]="formId()"
55
+ ></app-input-password>
56
+ }
57
+ }
58
+
59
+ <!-- Input formatted -->
60
+ @case (fieldTypeEnum.InputFormatted) {
61
+ <app-input-formatted
62
+ [formControlName]="field().key"
63
+ [fieldInput]="field()"
64
+ [modeSignal]="mode()"
65
+ [control]="control()"
66
+ [formId]="formId()"
67
+ ></app-input-formatted>
68
+ }
69
+
70
+ <!-- Textarea -->
71
+ @case (fieldTypeEnum.Textarea) {
72
+ <app-textarea
73
+ [formControlName]="field().key"
74
+ [fieldInput]="field()"
75
+ [modeSignal]="mode()"
76
+ [control]="control()"
77
+ [formId]="formId()"
78
+ ></app-textarea>
79
+ }
80
+
81
+ <!-- Single select -->
82
+ @case (fieldTypeEnum.SingleSelect) {
83
+ <app-single-select
84
+ [formControlName]="field().key"
85
+ [fieldInput]="field()"
86
+ [modeSignal]="mode()"
87
+ [control]="control()"
88
+ [formId]="formId()"
89
+ ></app-single-select>
90
+ }
91
+
92
+ <!-- Multi select -->
93
+ @case (fieldTypeEnum.MultiSelect) {
94
+ <app-multi-select
95
+ [formControlName]="field().key"
96
+ [fieldInput]="field()"
97
+ [modeSignal]="mode()"
98
+ [control]="control()"
99
+ [formId]="formId()"
100
+ ></app-multi-select>
101
+ }
102
+
103
+ @case (fieldTypeEnum.TreeSelect) {
104
+ <app-tree-select
105
+ [formControlName]="field().key"
106
+ [fieldInput]="field()"
107
+ [modeSignal]="mode()"
108
+ [control]="control()"
109
+ [formId]="formId()"
110
+ ></app-tree-select>
111
+ }
112
+
113
+ <!-- Date Picker -->
114
+ @case (fieldTypeEnum.DatePicker) {
115
+ <app-date-picker
116
+ [formControlName]="field().key"
117
+ [fieldInput]="field()"
118
+ [modeSignal]="mode()"
119
+ [control]="control()"
120
+ [formId]="formId()"
121
+ ></app-date-picker>
122
+ }
123
+
124
+ <!-- Date Range -->
125
+ @case (fieldTypeEnum.DateRange) {
126
+ <app-date-range
127
+ [formControlName]="field().key"
128
+ [fieldInput]="field()"
129
+ [modeSignal]="mode()"
130
+ [control]="control()"
131
+ [formId]="formId()"
132
+ ></app-date-range>
133
+ }
134
+
135
+ <!-- Single File Upload -->
136
+ @case (fieldTypeEnum.SingleFileUpload) {
137
+ <app-single-file-upload
138
+ [formControlName]="field().key"
139
+ [fieldInput]="field()"
140
+ [modeSignal]="mode()"
141
+ [control]="control()"
142
+ [formId]="formId()"
143
+ ></app-single-file-upload>
144
+ }
145
+
146
+ <!-- Multi File Upload -->
147
+ @case (fieldTypeEnum.MultiFileUpload) {
148
+ <app-multi-file-upload
149
+ [formControlName]="field().key"
150
+ [fieldInput]="field()"
151
+ [modeSignal]="mode()"
152
+ [control]="control()"
153
+ [formId]="formId()"
154
+ ></app-multi-file-upload>
155
+ }
156
+
157
+ <!-- Multi File Upload -->
158
+ @case (fieldTypeEnum.MultiImageUpload) {
159
+ <app-multi-image-upload
160
+ [formControlName]="field().key"
161
+ [fieldInput]="field()"
162
+ [modeSignal]="mode()"
163
+ [control]="control()"
164
+ [formId]="formId()"
165
+ ></app-multi-image-upload>
166
+ }
167
+
168
+ <!-- Avatar -->
169
+ @case (fieldTypeEnum.AvatarUpload) {
170
+ <app-avatar-upload
171
+ [formControlName]="field().key"
172
+ [fieldInput]="field()"
173
+ [modeSignal]="mode()"
174
+ [control]="control()"
175
+ [formId]="formId()"
176
+ ></app-avatar-upload>
177
+ }
178
+
179
+ <!-- Radio -->
180
+ @case (fieldTypeEnum.Radio) {
181
+ <span>Radio</span>
182
+ }
183
+
184
+ <!-- Checkbox -->
185
+ @case (fieldTypeEnum.Checkbox) {
186
+ <span>Checkbox</span>
187
+ }
188
+
189
+ <!-- Radio -->
190
+ @case (fieldTypeEnum.Radio) {
191
+ <span>Radio</span>
192
+ }
193
+
194
+ <!-- Switch -->
195
+ @case (fieldTypeEnum.Switch) {
196
+ <span>Switch</span>
197
+ }
198
+
199
+ <!-- Autocomplete -->
200
+ @case (fieldTypeEnum.Autocomplete) {
201
+ <span>Autocomplete</span>
202
+ }
203
+ }
204
+ </div>
205
+
206
+ <!-- Tách phần cấu hình ra Component riêng -->
207
+ @if (mode() !== formModeEnum.View) {
208
+ <div class="field-user-config-ctn">
209
+ <app-field-user-config
210
+ [field]="field()"
211
+ [control]="control()"
212
+ ></app-field-user-config>
213
+ </div>
214
+ }
215
+ </div>
216
+ </nz-form-control>
217
+ </nz-form-item>
218
+ </div>
@@ -0,0 +1,28 @@
1
+ .required {
2
+ color: red;
3
+ font-weight: bold;
4
+ margin-right: 4px;
5
+ }
6
+
7
+ .form-label {
8
+ white-space: normal !important;
9
+ word-break: break-word;
10
+ font-weight: 500;
11
+ font-size: 12px;
12
+ }
13
+
14
+ .sub-label {
15
+ white-space: normal !important;
16
+ word-break: break-word;
17
+ font-size: 11px;
18
+ font-style: italic;
19
+ }
20
+ :host ::ng-deep {
21
+ .ant-form-item {
22
+ align-items: center;
23
+ }
24
+
25
+ .ant-form-item-label > label {
26
+ display: inline-block !important;
27
+ }
28
+ }
@@ -0,0 +1,21 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { DynamicFieldComponent } from './dynamic-field.component';
4
+
5
+ describe('DynamicFieldComponent', () => {
6
+ let component: DynamicFieldComponent;
7
+ let fixture: ComponentFixture<DynamicFieldComponent>;
8
+
9
+ beforeEach(() => {
10
+ TestBed.configureTestingModule({
11
+ imports: [DynamicFieldComponent],
12
+ });
13
+ fixture = TestBed.createComponent(DynamicFieldComponent);
14
+ component = fixture.componentInstance;
15
+ fixture.detectChanges();
16
+ });
17
+
18
+ it('should create', () => {
19
+ expect(component).toBeTruthy();
20
+ });
21
+ });
@@ -0,0 +1,67 @@
1
+ import { Component, inject, input } from "@angular/core";
2
+ import { BaseField } from "../../models/fields/field.model";
3
+ import {
4
+ AbstractControl,
5
+ FormGroup,
6
+ FormsModule,
7
+ ReactiveFormsModule,
8
+ } from "@angular/forms";
9
+ import { FormMode } from "../../models/form";
10
+ import { FORM_MODULES } from "../../consts/common";
11
+ import { FIELD_COMPONENTS } from "../component";
12
+ import { NzFormModule } from "ng-zorro-antd/form";
13
+ import { FieldTypeEnum } from "../../enums/fields";
14
+ import { FormModeEnum } from "../../enums/form";
15
+ import { ValidationService } from "../../services/validation.service";
16
+ import { NzGridModule } from "ng-zorro-antd/grid";
17
+ import { FieldUserConfigComponent } from "../field-user-config/field-user-config.component";
18
+ import { CommonModule } from "@angular/common";
19
+ import { NzDropDownModule } from "ng-zorro-antd/dropdown";
20
+ import { NzIconModule } from "ng-zorro-antd/icon";
21
+ import { NzSwitchModule } from "ng-zorro-antd/switch";
22
+ import { NzFlexModule } from "ng-zorro-antd/flex";
23
+
24
+ const modules = [CommonModule, FormsModule, ReactiveFormsModule];
25
+ const zorroModules = [
26
+ NzFormModule,
27
+ NzGridModule,
28
+ NzDropDownModule,
29
+ NzIconModule,
30
+ NzSwitchModule,
31
+ NzFlexModule,
32
+ ];
33
+ const components = [...FIELD_COMPONENTS, FieldUserConfigComponent];
34
+
35
+ @Component({
36
+ selector: "app-dynamic-field",
37
+ standalone: true,
38
+ imports: [...modules, ...zorroModules, ...components],
39
+ templateUrl: "./dynamic-field.component.html",
40
+ styleUrls: ["./dynamic-field.component.scss"],
41
+ })
42
+ export class DynamicFieldComponent {
43
+ readonly field = input.required<BaseField<any>>();
44
+ readonly fields = input.required<BaseField<any>[]>();
45
+ readonly mode = input.required<FormMode>();
46
+ readonly control = input.required<AbstractControl>();
47
+ readonly formGroup = input.required<FormGroup>();
48
+ readonly formId = input.required<string>();
49
+
50
+ fieldTypeEnum = FieldTypeEnum;
51
+ formModeEnum = FormModeEnum;
52
+
53
+ private validationService = inject(ValidationService);
54
+
55
+ /**
56
+ * 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.
57
+ */
58
+ protected getErrorMessage(): string {
59
+ return (
60
+ this.validationService.getFirstError(
61
+ this.control(),
62
+ this.field(),
63
+ this.fields(),
64
+ ) ?? ""
65
+ );
66
+ }
67
+ }
@@ -0,0 +1,38 @@
1
+ <!-- Cấu hình (Dropdown & Menu) chỉ hiện khi có bất kỳ config nào -->
2
+ @if (field().userConfigs) {
3
+ <!-- Trigger Nút Cấu hình -->
4
+ <a
5
+ nz-dropdown
6
+ [nzDropdownMenu]="configMenu"
7
+ nzTrigger="click"
8
+ [nzClickHide]="false"
9
+ [title]="'Cấu hình'"
10
+ nzPlacement="bottomRight"
11
+ >
12
+ <span
13
+ nz-icon
14
+ nzType="setting"
15
+ nzTheme="outline"
16
+ class="config-trigger-icon"
17
+ ></span>
18
+ </a>
19
+
20
+ <!-- Menu Cấu hình -->
21
+ <nz-dropdown-menu #configMenu="nzDropdownMenu">
22
+ <ul nz-menu>
23
+ @if (field().userConfigs?.allowOverrideRequired) {
24
+ <li nz-menu-item nzDisableItemHover class="config-menu-item">
25
+ <div class="config-item-content">
26
+ <span class="config-item-label">Bắt buộc nhập</span>
27
+ <nz-switch
28
+ nzSize="small"
29
+ [ngModel]="field().required"
30
+ [ngModelOptions]="{ standalone: true }"
31
+ (ngModelChange)="onToggleUserRequired($event)"
32
+ ></nz-switch>
33
+ </div>
34
+ </li>
35
+ }
36
+ </ul>
37
+ </nz-dropdown-menu>
38
+ }
@@ -0,0 +1,29 @@
1
+ .config-trigger-icon {
2
+ color: #bfbfbf;
3
+ cursor: pointer;
4
+ font-size: 16px;
5
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
6
+ display: inline-block;
7
+
8
+ &:hover {
9
+ color: #1890ff; /* Màu xanh Ant Design */
10
+ transform: rotate(90deg) scale(1.1);
11
+ }
12
+ }
13
+
14
+ .config-menu-item {
15
+ padding: 8px 12px;
16
+ cursor: default;
17
+ }
18
+
19
+ .config-item-content {
20
+ display: flex;
21
+ justify-content: space-between;
22
+ align-items: center;
23
+ gap: 16px;
24
+ min-width: 130px;
25
+ }
26
+
27
+ .config-item-label {
28
+ font-size: 13px;
29
+ }
@@ -0,0 +1,33 @@
1
+ import { Component, input } from "@angular/core";
2
+ import { BaseField } from "../../models/fields/field.model";
3
+ import { AbstractControl, Validators } from "@angular/forms";
4
+ import { NzDropDownModule } from "ng-zorro-antd/dropdown";
5
+ import { NzIconModule } from "ng-zorro-antd/icon";
6
+ import { NzSwitchModule } from "ng-zorro-antd/switch";
7
+ import { FormsModule } from "@angular/forms";
8
+
9
+ @Component({
10
+ selector: "app-field-user-config",
11
+ standalone: true,
12
+ imports: [NzDropDownModule, NzIconModule, NzSwitchModule, FormsModule],
13
+ templateUrl: "./field-user-config.component.html",
14
+ styleUrls: ["./field-user-config.component.scss"],
15
+ })
16
+ export class FieldUserConfigComponent {
17
+ readonly field = input.required<BaseField<any>>();
18
+ readonly control = input.required<AbstractControl>();
19
+
20
+ onToggleUserRequired(isRequired: boolean): void {
21
+ this.field().required = isRequired;
22
+ const ctrl = this.control();
23
+
24
+ if (isRequired) {
25
+ ctrl.addValidators(Validators.required);
26
+ } else {
27
+ ctrl.removeValidators(Validators.required);
28
+ }
29
+
30
+ // Cập nhật lại trạng thái validation ngay lập tức
31
+ ctrl.updateValueAndValidity();
32
+ }
33
+ }
@@ -0,0 +1,42 @@
1
+ <button
2
+ nz-button
3
+ nzType="primary"
4
+ nzSize="small"
5
+ [title]="suffixConfig.description"
6
+ class="h-100 suffix-btn font-size-12"
7
+ [ngClass]="suffixConfig.class ?? ''"
8
+ (click)="handleSuffix()"
9
+ >
10
+ @if (suffixConfig.icon) {
11
+ <span class="icon">
12
+ <!-- Nếu là icon Zorro -->
13
+ @if (suffixConfig.icon.type === 'zorro') {
14
+ <span
15
+ nz-icon
16
+ [nzType]="suffixConfig.icon.value"
17
+ nzTheme="outline"
18
+ [ngClass]="suffixConfig.icon.class ?? ''"
19
+ >
20
+ </span>
21
+ }
22
+
23
+ <!-- Nếu là Boxicons -->
24
+ @if (suffixConfig.icon.type === 'mdi') {
25
+ <span [class]="'mdi ' + suffixConfig.icon.value" [ngClass]="suffixConfig.icon.class ?? ''">
26
+ </span>
27
+ }
28
+ </span>
29
+ }
30
+
31
+ @if (suffixConfig.label) {
32
+ <span class="label">
33
+ {{ suffixConfig.label }}
34
+ </span>
35
+ }
36
+
37
+ @if (!suffixConfig.icon && !suffixConfig.label) {
38
+ <span class="label">
39
+ {{ defaultText }}
40
+ </span>
41
+ }
42
+ </button>
@@ -0,0 +1,3 @@
1
+ .suffix-btn {
2
+ margin-left: 0.5rem;
3
+ }
@@ -0,0 +1,22 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { SuffixComponent } from './suffix.component';
4
+
5
+ describe('SuffixComponent', () => {
6
+ let component: SuffixComponent;
7
+ let fixture: ComponentFixture<SuffixComponent>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ imports: [SuffixComponent],
12
+ }).compileComponents();
13
+
14
+ fixture = TestBed.createComponent(SuffixComponent);
15
+ component = fixture.componentInstance;
16
+ fixture.detectChanges();
17
+ });
18
+
19
+ it('should create', () => {
20
+ expect(component).toBeTruthy();
21
+ });
22
+ });
@@ -0,0 +1,32 @@
1
+ import { Component, inject, Input } from '@angular/core';
2
+ import { Suffix } from '../../../../models/common/common.model';
3
+ import { CORE_MODULES } from '../../../../consts/common';
4
+ import { SuffixService } from '../../../../services/suffix.service';
5
+ import { NzButtonModule } from 'ng-zorro-antd/button';
6
+ import { NzIconModule } from 'ng-zorro-antd/icon';
7
+
8
+ const ZORRO_MODULES = [NzButtonModule, NzIconModule];
9
+
10
+ @Component({
11
+ selector: 'app-suffix',
12
+ standalone: true,
13
+ imports: [...CORE_MODULES, ...ZORRO_MODULES],
14
+ templateUrl: './suffix.component.html',
15
+ styleUrl: './suffix.component.scss',
16
+ })
17
+ export class SuffixComponent {
18
+ @Input() suffixConfig!: Suffix;
19
+ @Input() formId = '';
20
+
21
+ protected defaultText = '';
22
+
23
+ private suffixService = inject(SuffixService);
24
+
25
+ ngOnInit(): void {
26
+ this.defaultText = `Suffix ${this.suffixConfig.key}`;
27
+ }
28
+
29
+ handleSuffix(): void {
30
+ this.suffixService.onSuffixClick(this.suffixConfig.key, this.formId);
31
+ }
32
+ }
@@ -0,0 +1,20 @@
1
+ @if (modeSignal() === formModeEnum.View) {
2
+ <input
3
+ nz-input
4
+ [value]="viewDisplayValue()"
5
+ [disabled]="true"
6
+ class="modeView"
7
+ />
8
+ } @else {
9
+ <nz-date-picker
10
+ [id]="fieldKey()"
11
+ [class]="'w-100'"
12
+ [nzDisabled]="disabledSignal()"
13
+ [nzPlaceHolder]="displayPlaceholder()"
14
+ [nzFormat]="format()"
15
+ [nzDisabledDate]="disabledDate()"
16
+ [ngModel]="valueSignal()"
17
+ (ngModelChange)="handleChangeDate($event)"
18
+ >
19
+ </nz-date-picker>
20
+ }
@@ -0,0 +1,5 @@
1
+ :host ::ng-deep {
2
+ .ant-input[disabled] {
3
+ background-color: #fff;
4
+ }
5
+ }
@@ -0,0 +1,21 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { DatePickerComponent } from './date-picker.component';
4
+
5
+ describe('DatePickerComponent', () => {
6
+ let component: DatePickerComponent;
7
+ let fixture: ComponentFixture<DatePickerComponent>;
8
+
9
+ beforeEach(() => {
10
+ TestBed.configureTestingModule({
11
+ imports: [DatePickerComponent],
12
+ });
13
+ fixture = TestBed.createComponent(DatePickerComponent);
14
+ component = fixture.componentInstance;
15
+ fixture.detectChanges();
16
+ });
17
+
18
+ it('should create', () => {
19
+ expect(component).toBeTruthy();
20
+ });
21
+ });