@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,33 @@
1
+ import { BaseUploadField } from './base-upload-field.model';
2
+ import { FieldTypeEnum } from '../../../enums/fields';
3
+ import { DEFAULT_ACCEPTED_IMAGE_MIME_TYPES } from '../../../consts/common';
4
+
5
+ const DEFAULT_AVATAR_UPLOAD_VALUE = '';
6
+
7
+ /**
8
+ * Interface của Avatar upload.
9
+ */
10
+ export class AvatarUploadField extends BaseUploadField<string | Record<string, unknown>> {
11
+ constructor(init: Partial<AvatarUploadField>) {
12
+ super(init);
13
+
14
+ /**
15
+ * Gán giá trị cho các props cần giá trị mặc định ở Avatar upload.
16
+ */
17
+
18
+ this.type = FieldTypeEnum.AvatarUpload;
19
+ this.value = DEFAULT_AVATAR_UPLOAD_VALUE;
20
+ this.acceptedMimeTypes = DEFAULT_ACCEPTED_IMAGE_MIME_TYPES;
21
+ this.initialValue = DEFAULT_AVATAR_UPLOAD_VALUE;
22
+
23
+ Object.assign(this, init);
24
+ }
25
+
26
+ override getDefaultValue(): string | Record<string, unknown> {
27
+ return DEFAULT_AVATAR_UPLOAD_VALUE;
28
+ }
29
+
30
+ override toFormValue(modelValue: unknown): string | Record<string, unknown> {
31
+ return String(modelValue);
32
+ }
33
+ }
@@ -0,0 +1,105 @@
1
+ import { FormControl, ValidatorFn } from '@angular/forms';
2
+ import { FieldTypeEnum } from '../../../enums/fields';
3
+ import { BaseField } from '../field.model';
4
+ import { UPLOAD_FIELD_TYPES } from '../../../consts/fields/upload-field.const';
5
+ import { ApiConfig, ApiFileConfig, UploadOutputValueType } from '../../common';
6
+ import {
7
+ acceptedMimeTypesValidator,
8
+ getDefaultAcptMimeTypesErrorMessage,
9
+ getDefaultMaxSizeInMBErrorMessage,
10
+ maxFileSizeInMBValidator,
11
+ } from '../../../utils/validators';
12
+ import { DEFAULT_ACCEPTED_MIME_TYPES } from '../../../consts/common';
13
+ import { CustomValidaterEnum } from '../../../enums/validators';
14
+ import { getExtensions } from '../../../utils/file';
15
+ import { UploadOutputValueTypeEnum } from '../../../enums/common';
16
+ import { ControlTypeEnum } from '../../../enums/controls';
17
+
18
+ export type UploadFieldType = (typeof UPLOAD_FIELD_TYPES)[number];
19
+
20
+ /**
21
+ * Interface base chung cho Các dạng Date.
22
+ */
23
+ export abstract class BaseUploadField<K> extends BaseField<K> {
24
+ // Dữ liệu sẽ gửi từ form khi submit.
25
+ outputAs!: UploadOutputValueType;
26
+
27
+ // Config api file liên quan: upload, delete.
28
+ apiFileConfig: ApiFileConfig;
29
+
30
+ // Các loại mimetypes được chấp nhận.
31
+ acceptedMimeTypes: string[];
32
+
33
+ // Kích thước tối đa của tập tin tải lên tính bằng MB.
34
+ maxSizeInMB: number;
35
+
36
+ // Hiển thị thông tin hướng dẫn các định dạng file được phép upload theo config của acceptedMimeTypes
37
+ showAcceptedExtensionGuide: boolean;
38
+
39
+ // Mở/tắt cơ chế upload tạm.
40
+ uploadTemp: boolean;
41
+
42
+ /**
43
+ * Props validation chung cho các dạng Date.
44
+ */
45
+
46
+ constructor(init: Partial<BaseUploadField<K>>) {
47
+ super(init);
48
+
49
+ /**
50
+ * Gán giá trị cho các props cần giá trị mặc định ở Date.
51
+ */
52
+ this.controlType = ControlTypeEnum.Upload;
53
+ this.outputAs = UploadOutputValueTypeEnum.Object;
54
+ this.apiFileConfig = {
55
+ uploadUrl: '',
56
+ deleteUrl: '',
57
+ };
58
+ this.acceptedMimeTypes = DEFAULT_ACCEPTED_MIME_TYPES;
59
+ this.maxSizeInMB = 25;
60
+ this.showAcceptedExtensionGuide = true;
61
+ this.uploadTemp = true;
62
+
63
+ Object.assign(this, init);
64
+ }
65
+
66
+ // Mảng ValidatorFn các validation chung được hỗ trợ sẵn bởi angular cho Input Password.
67
+ protected getCustomBaseUploadValidators(): ValidatorFn[] {
68
+ const validators = this.getCustomValidators();
69
+
70
+ // Kiểm tra xem file tải lên có type nằm trong mảng acceptedMimeTypes đã chỉ định hay không.
71
+ if (this.acceptedMimeTypes?.length > 0)
72
+ validators.push(acceptedMimeTypesValidator(this.acceptedMimeTypes));
73
+
74
+ // Kiểm tra kích thước tối đa mà file tải lên được cho phép.
75
+ validators.push(maxFileSizeInMBValidator(this.maxSizeInMB));
76
+
77
+ return validators;
78
+ }
79
+
80
+ // Tạo Form Control cho Input Field.
81
+ override toFormControl(): FormControl {
82
+ const commonValidators = this.getCommonValidators();
83
+ const customValidators = this.getCustomBaseUploadValidators();
84
+ return new FormControl(this.value ?? '', [...commonValidators, ...customValidators]);
85
+ }
86
+
87
+ abstract override getDefaultValue(): K;
88
+
89
+ abstract override toFormValue(modelValue: unknown): K;
90
+
91
+ override getErrorMessage(errorKey: string, errorValue: any, allFields: BaseField<any>[]): string {
92
+ // Lấy error message mặc định của acceptedMimeTypes.
93
+ if (errorKey === CustomValidaterEnum.AcceptedMimiTypes) {
94
+ const typeString = getExtensions(this.acceptedMimeTypes).join(', ');
95
+ return getDefaultAcptMimeTypesErrorMessage(typeString);
96
+ }
97
+
98
+ // Lấy error message mặc định của maxSizeInMB.
99
+ if (errorKey === CustomValidaterEnum.MaxSizeInMB) {
100
+ return getDefaultMaxSizeInMBErrorMessage(this.maxSizeInMB);
101
+ }
102
+
103
+ return super.getErrorMessage(errorKey, errorValue, allFields);
104
+ }
105
+ }
@@ -1,5 +1,5 @@
1
- export * from './base-upload-field.model';
2
- export * from './single-file-upload-field.model';
3
- export * from './multi-file-upload-field.model';
4
- export * from './avatar-upload-field.model';
5
- export * from './multi-image-upload-field.model';
1
+ export * from './base-upload-field.model';
2
+ export * from './single-file-upload-field.model';
3
+ export * from './multi-file-upload-field.model';
4
+ export * from './avatar-upload-field.model';
5
+ export * from './multi-image-upload-field.model';
@@ -0,0 +1,34 @@
1
+ import { BaseUploadField } from './base-upload-field.model';
2
+ import { FieldTypeEnum } from '../../../enums/fields';
3
+
4
+ const DEFAULT_MULTI_FILE_UPLOAD_VALUE = '';
5
+
6
+ /**
7
+ * Interface của Multi file upload.
8
+ */
9
+ export class MultiFileUploadField extends BaseUploadField<string | File> {
10
+ // Số lượng tập tin tối đa có thể tải lên.
11
+ maxFileCount: number;
12
+
13
+ constructor(init: Partial<MultiFileUploadField>) {
14
+ super(init);
15
+
16
+ /**
17
+ * Gán giá trị cho các props cần giá trị mặc định ở Multi file upload.
18
+ */
19
+ this.type = FieldTypeEnum.MultiFileUpload;
20
+ this.value = DEFAULT_MULTI_FILE_UPLOAD_VALUE;
21
+ this.initialValue = DEFAULT_MULTI_FILE_UPLOAD_VALUE;
22
+ this.maxFileCount = 6;
23
+
24
+ Object.assign(this, init);
25
+ }
26
+
27
+ override getDefaultValue(): string | File {
28
+ return DEFAULT_MULTI_FILE_UPLOAD_VALUE;
29
+ }
30
+
31
+ override toFormValue(modelValue: unknown): string | File {
32
+ return String(modelValue);
33
+ }
34
+ }
@@ -0,0 +1,42 @@
1
+ import { BaseUploadField } from "./base-upload-field.model";
2
+ import { FieldTypeEnum } from "../../../enums/fields";
3
+
4
+ const DEFAULT_MULTI_IMAGE_UPLOAD_VALUE = "";
5
+
6
+ /**
7
+ * Interface của Multi image upload.
8
+ */
9
+ export class MultiImageUploadField extends BaseUploadField<string | File> {
10
+ // Số lượng hình ảnh tối đa có thể tải lên.
11
+ maxFileCount: number;
12
+
13
+ // Độ dài card bao image.
14
+ imageCardWidth: string;
15
+
16
+ // Độ cao card bao image.
17
+ imageCardHeight: string;
18
+
19
+ constructor(init: Partial<MultiImageUploadField>) {
20
+ super(init);
21
+
22
+ /**
23
+ * Gán giá trị cho các props cần giá trị mặc định ở Multi image upload.
24
+ */
25
+ this.type = FieldTypeEnum.MultiImageUpload;
26
+ this.value = DEFAULT_MULTI_IMAGE_UPLOAD_VALUE;
27
+ this.initialValue = DEFAULT_MULTI_IMAGE_UPLOAD_VALUE;
28
+ this.maxFileCount = 6;
29
+ this.imageCardWidth = "108px";
30
+ this.imageCardHeight = "108px";
31
+
32
+ Object.assign(this, init);
33
+ }
34
+
35
+ override getDefaultValue(): string | File {
36
+ return DEFAULT_MULTI_IMAGE_UPLOAD_VALUE;
37
+ }
38
+
39
+ override toFormValue(modelValue: string | File): string {
40
+ return String(modelValue);
41
+ }
42
+ }
@@ -0,0 +1,33 @@
1
+ import { FieldTypeEnum } from '../../../enums/fields';
2
+ import { Suffix } from '../../common/common.model';
3
+ import { BaseUploadField } from './base-upload-field.model';
4
+
5
+ const DEFAULT_SINGLE_FILE_UPLOAD_VALUE = '';
6
+
7
+ /**
8
+ * Interface của Single file upload. Đầu vào có thể là chuỗi JSON hoặc đối tượng File.
9
+ */
10
+ export class SingleFileUploadField extends BaseUploadField<string | File> {
11
+ suffixes: Suffix[];
12
+ constructor(init: Partial<SingleFileUploadField>) {
13
+ super(init);
14
+
15
+ /**
16
+ * Gán giá trị cho các props cần giá trị mặc định ở Single file upload.
17
+ */
18
+
19
+ this.type = FieldTypeEnum.SingleFileUpload;
20
+ this.value = DEFAULT_SINGLE_FILE_UPLOAD_VALUE;
21
+ this.initialValue = DEFAULT_SINGLE_FILE_UPLOAD_VALUE;
22
+ this.suffixes = [];
23
+ Object.assign(this, init);
24
+ }
25
+
26
+ override getDefaultValue(): string | File {
27
+ return DEFAULT_SINGLE_FILE_UPLOAD_VALUE;
28
+ }
29
+
30
+ override toFormValue(modelValue: unknown): string {
31
+ return String(modelValue);
32
+ }
33
+ }
@@ -1 +1 @@
1
- export type FormMode = 'add' | 'edit' | 'view' | 'design';
1
+ export type FormMode = 'add' | 'edit' | 'view' | 'design';
@@ -1 +1 @@
1
- export * from './dynamic-form.model';
1
+ export * from './dynamic-form.model';
@@ -0,0 +1 @@
1
+ export * from './validations.model';
@@ -0,0 +1,14 @@
1
+ export interface RawValidation {
2
+ // Loại validation: required, minValue, maxLength,...
3
+ type: string;
4
+
5
+ // Dùng để truyền value cho loại validate. Cả có sẵn từ Reactive Form hoặc Custom Validate.
6
+ // Ví dụ: {type: minLength, params: {min:2}} hoặc Custom {type:between, params: {min:2, max:9}}
7
+ params?: any;
8
+
9
+ // Message chỉ địng cho validation.
10
+ message?: string;
11
+
12
+ // Phạm vi validation chỉ ở một field, hoặc group là validation chéo.
13
+ scope?: 'field' | 'group';
14
+ }
@@ -0,0 +1,16 @@
1
+ import { TestBed } from '@angular/core/testing';
2
+
3
+ import { DynamicFormService } from './dynamic-form.service';
4
+
5
+ describe('DynamicFormService', () => {
6
+ let service: DynamicFormService;
7
+
8
+ beforeEach(() => {
9
+ TestBed.configureTestingModule({});
10
+ service = TestBed.inject(DynamicFormService);
11
+ });
12
+
13
+ it('should be created', () => {
14
+ expect(service).toBeTruthy();
15
+ });
16
+ });
@@ -0,0 +1,251 @@
1
+ import { computed, inject, Injectable, signal } from "@angular/core";
2
+ import { BaseField } from "../models/fields/field.model";
3
+ import { Extra, ObjField } from "../models/common/obj-field.model";
4
+ import { isValidJSON, lowerCaseFirstChar } from "../utils/common";
5
+ import { FieldTypeEnum } from "../enums/fields";
6
+ import { InputPasswordField, InputTextField } from "../models/fields/input";
7
+ import { TextareaField } from "../models/fields/textarea/textarea-field.model";
8
+ import { SingleSelectField } from "../models/fields/select/single-select-field.model";
9
+ import { MultiSelectField } from "../models/fields/select/multi-select-field.model";
10
+ import { DatePickerField, DateRangeField } from "../models/fields/date";
11
+ import { SingleFileUploadField } from "../models/fields/upload/single-file-upload-field.model";
12
+ import { MultiFileUploadField } from "../models/fields/upload/multi-file-upload-field.model";
13
+ import { FormGroup } from "@angular/forms";
14
+ import { MultiImageUploadField } from "../models/fields/upload/multi-image-upload-field.model";
15
+ import { FormConfigService } from "./form-config.service";
16
+ import { AvatarUploadField } from "../models/fields/upload/avatar-upload-field.model";
17
+ import { TreeSelectField } from "../models/fields/select/tree-select-field.model";
18
+
19
+ @Injectable({
20
+ providedIn: "root",
21
+ })
22
+ export class DynamicFormService {
23
+ private formConfigService = inject(FormConfigService);
24
+
25
+ /**
26
+ * Lưu giữ FormGroup hiện tại của dynamic form.
27
+ */
28
+ private _formGroup!: FormGroup;
29
+
30
+ // Lấy FormGroup.
31
+ get formGroup() {
32
+ return this._formGroup;
33
+ }
34
+
35
+ // Gán FormGroup.
36
+ setFormGroup(formGroup: FormGroup) {
37
+ this._formGroup = formGroup;
38
+ }
39
+
40
+ /**
41
+ * Lưu giữ fields hiện tại của dynamic form.
42
+ */
43
+ private _fields!: BaseField<any>[];
44
+
45
+ // Lấy fields.
46
+ get fields() {
47
+ return this._fields;
48
+ }
49
+
50
+ // Gán fields.
51
+ setFields(fields: BaseField<any>[]) {
52
+ this._fields = fields;
53
+ }
54
+
55
+ /**
56
+ * Thao tác với control và fields cũng như output đầu ra của data form.
57
+ */
58
+ setFieldValue(fieldKey: string, rawValue: unknown) {
59
+ const field = this.fields.find((f) => f.key === fieldKey);
60
+ if (!field) return;
61
+
62
+ const formValue = field.toFormValue(rawValue);
63
+ this.formGroup.get(fieldKey)?.setValue(formValue);
64
+ }
65
+
66
+ /**
67
+ * Signal để kích hoạt submit từ bên ngoài.
68
+ */
69
+ private readonly _submitTrigger = signal<{
70
+ formId: string | null;
71
+ time: number;
72
+ } | null>(null);
73
+
74
+ // Lấy signal để track vào effect.
75
+ get submitTrigger() {
76
+ return this._submitTrigger.asReadonly();
77
+ }
78
+
79
+ // Tiến hành submit.
80
+ triggerSubmit(formId: string | null) {
81
+ this._submitTrigger.set({ formId, time: Date.now() }); // trigger tạo theo formId.
82
+ }
83
+
84
+ /**
85
+ * Signal để kích hoạt reset từ bên ngoài.
86
+ */
87
+ private readonly _resetTrigger = signal<{
88
+ formId: string;
89
+ time: number;
90
+ } | null>(null);
91
+
92
+ get resetTrigger() {
93
+ return this._resetTrigger.asReadonly();
94
+ }
95
+
96
+ triggerReset(formId: string) {
97
+ if (formId) this._resetTrigger.set({ formId, time: Date.now() });
98
+ }
99
+
100
+ /**
101
+ * Tạo mảng fields đầu vào theo mảng data từ objField.
102
+ */
103
+ createFieldsByObjFields(
104
+ objFields: ObjField[],
105
+ formType: string,
106
+ options?: {},
107
+ ): BaseField<any>[] {
108
+ let fields: BaseField<any>[] = [];
109
+
110
+ // Nếu không tồn tại objFields hoặc objFields là mảng rỗng.
111
+ if (!objFields || objFields.length === 0) return [];
112
+
113
+ for (const objField of objFields) {
114
+ // Bỏ qua những field không cấu hình.
115
+ if (!objField?.extra) {
116
+ continue;
117
+ }
118
+
119
+ // Nếu extra không phải chuỗi JSON hợp lệ.
120
+ if (objField?.extra && !isValidJSON(objField?.extra)) {
121
+ // console.warn(`Extra của field ${objField.code} không phải chuỗi dạng JSON`);
122
+ continue;
123
+ }
124
+
125
+ const extra: Extra = JSON.parse(objField?.extra);
126
+ if (!extra.form) {
127
+ continue;
128
+ }
129
+
130
+ const form = extra.form;
131
+ const { formTypes, configs } = form;
132
+
133
+ if (!formTypes.includes(formType)) {
134
+ // console.error(`Field '${objField.code}' không tồn tại formType '${formType}'`);
135
+ continue;
136
+ }
137
+
138
+ const fieldConfig = configs?.[formType];
139
+ if (!fieldConfig) {
140
+ // console.error(`Field '${objField.code}' không có config field với formType '${formType}'`);
141
+ continue;
142
+ }
143
+
144
+ const field = this.createFieldFromJson(fieldConfig, objField);
145
+ if (field) {
146
+ fields.push(field);
147
+ } else {
148
+ // console.error(`Field '${objField.code}' không có fieldType phù hợp`);
149
+ continue;
150
+ }
151
+ }
152
+
153
+ return fields.sort((a, b) => a.seqNum - b.seqNum);
154
+ }
155
+
156
+ private createFieldFromJson(
157
+ fieldConfig: BaseField<any>,
158
+ objField: ObjField,
159
+ ): BaseField<any> | null {
160
+ fieldConfig.key =
161
+ fieldConfig?.key || lowerCaseFirstChar(objField.code) || "";
162
+ fieldConfig.label = fieldConfig?.label || objField?.name || "";
163
+ fieldConfig.groupCode = fieldConfig.groupCode ?? objField.viewType ?? "";
164
+ fieldConfig.seqNum = fieldConfig.seqNum ?? objField.seqNum;
165
+ fieldConfig.required = fieldConfig.required ?? objField.required === 3;
166
+
167
+ const fieldType = fieldConfig.type;
168
+ if (fieldType === FieldTypeEnum.InputText) {
169
+ return new InputTextField({ ...(fieldConfig as InputTextField) });
170
+ }
171
+
172
+ if (fieldType === FieldTypeEnum.InputPassword) {
173
+ return new InputPasswordField({ ...(fieldConfig as InputPasswordField) });
174
+ }
175
+
176
+ if (fieldType === FieldTypeEnum.Textarea) {
177
+ return new TextareaField({ ...(fieldConfig as TextareaField) });
178
+ }
179
+
180
+ if (fieldType === FieldTypeEnum.SingleSelect) {
181
+ const singleSelect = fieldConfig as SingleSelectField;
182
+ if (!singleSelect.apiConfig) {
183
+ singleSelect.apiConfig = {
184
+ baseUrl: this.formConfigService.handleApiUrlCreation(
185
+ objField.apiURL || "",
186
+ objField.objTypeGroupCode,
187
+ ),
188
+ };
189
+ }
190
+ return new SingleSelectField({ ...singleSelect });
191
+ }
192
+
193
+ if (fieldType === FieldTypeEnum.MultiSelect) {
194
+ const multiSelect = fieldConfig as MultiSelectField;
195
+ if (!multiSelect.apiConfig) {
196
+ multiSelect.apiConfig = {
197
+ baseUrl: this.formConfigService.handleApiUrlCreation(
198
+ objField.apiURL || "",
199
+ objField.objTypeGroupCode,
200
+ ),
201
+ };
202
+ }
203
+ return new MultiSelectField({ ...multiSelect });
204
+ }
205
+
206
+ if (fieldType === FieldTypeEnum.TreeSelect) {
207
+ const treeSelect = fieldConfig as TreeSelectField;
208
+ if (!treeSelect.apiConfig) {
209
+ treeSelect.apiConfig = {
210
+ baseUrl: this.formConfigService.handleApiUrlCreation(
211
+ objField.apiURL || "",
212
+ objField.objTypeGroupCode,
213
+ ),
214
+ };
215
+ }
216
+ return new TreeSelectField({ ...treeSelect });
217
+ }
218
+
219
+ if (fieldType === FieldTypeEnum.DatePicker) {
220
+ return new DatePickerField({ ...(fieldConfig as DatePickerField) });
221
+ }
222
+
223
+ if (fieldType === FieldTypeEnum.DateRange) {
224
+ return new DateRangeField({ ...(fieldConfig as DateRangeField) });
225
+ }
226
+
227
+ if (fieldType === FieldTypeEnum.SingleFileUpload) {
228
+ return new SingleFileUploadField({
229
+ ...(fieldConfig as SingleFileUploadField),
230
+ });
231
+ }
232
+
233
+ if (fieldType === FieldTypeEnum.MultiFileUpload) {
234
+ return new MultiFileUploadField({
235
+ ...(fieldConfig as MultiFileUploadField),
236
+ });
237
+ }
238
+
239
+ if (fieldType === FieldTypeEnum.AvatarUpload) {
240
+ return new AvatarUploadField({ ...(fieldConfig as AvatarUploadField) });
241
+ }
242
+
243
+ if (fieldType === FieldTypeEnum.MultiImageUpload) {
244
+ return new MultiImageUploadField({
245
+ ...(fieldConfig as MultiImageUploadField),
246
+ });
247
+ }
248
+
249
+ return null;
250
+ }
251
+ }
@@ -0,0 +1,16 @@
1
+ import { TestBed } from '@angular/core/testing';
2
+
3
+ import { FieldService } from './field.service';
4
+
5
+ describe('FieldService', () => {
6
+ let service: FieldService;
7
+
8
+ beforeEach(() => {
9
+ TestBed.configureTestingModule({});
10
+ service = TestBed.inject(FieldService);
11
+ });
12
+
13
+ it('should be created', () => {
14
+ expect(service).toBeTruthy();
15
+ });
16
+ });