@tft/crispr-forms 18.0.1 → 19.0.2

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 (305) hide show
  1. package/README.md +111 -112
  2. package/fesm2022/tft-crispr-forms-autocomplete-field.component-jdr2Hr6I.mjs +95 -0
  3. package/fesm2022/tft-crispr-forms-autocomplete-field.component-jdr2Hr6I.mjs.map +1 -0
  4. package/fesm2022/tft-crispr-forms-index-BHv9E1Y2.mjs +36 -0
  5. package/fesm2022/tft-crispr-forms-index-BHv9E1Y2.mjs.map +1 -0
  6. package/fesm2022/tft-crispr-forms-index-BIhGbdgn.mjs +68 -0
  7. package/fesm2022/tft-crispr-forms-index-BIhGbdgn.mjs.map +1 -0
  8. package/fesm2022/tft-crispr-forms-index-BQFuEW6x.mjs +40 -0
  9. package/fesm2022/tft-crispr-forms-index-BQFuEW6x.mjs.map +1 -0
  10. package/fesm2022/tft-crispr-forms-index-BWsxn34Q.mjs +2 -0
  11. package/fesm2022/tft-crispr-forms-index-BWsxn34Q.mjs.map +1 -0
  12. package/fesm2022/tft-crispr-forms-index-Bh8kDfe4.mjs +39 -0
  13. package/fesm2022/tft-crispr-forms-index-Bh8kDfe4.mjs.map +1 -0
  14. package/fesm2022/tft-crispr-forms-index-C9gYJRzb.mjs +182 -0
  15. package/fesm2022/tft-crispr-forms-index-C9gYJRzb.mjs.map +1 -0
  16. package/fesm2022/tft-crispr-forms-index-ClPQl_5D.mjs +137 -0
  17. package/fesm2022/tft-crispr-forms-index-ClPQl_5D.mjs.map +1 -0
  18. package/fesm2022/tft-crispr-forms-index-DCRLl0jR.mjs +190 -0
  19. package/fesm2022/tft-crispr-forms-index-DCRLl0jR.mjs.map +1 -0
  20. package/fesm2022/tft-crispr-forms-index-Dx-HIAiX.mjs +39 -0
  21. package/fesm2022/tft-crispr-forms-index-Dx-HIAiX.mjs.map +1 -0
  22. package/fesm2022/tft-crispr-forms-index-Dyx5SqHu.mjs +88 -0
  23. package/fesm2022/tft-crispr-forms-index-Dyx5SqHu.mjs.map +1 -0
  24. package/fesm2022/tft-crispr-forms-index-LX0Bvkjk.mjs +73 -0
  25. package/fesm2022/tft-crispr-forms-index-LX0Bvkjk.mjs.map +1 -0
  26. package/fesm2022/tft-crispr-forms-index-UAYeTe3L.mjs +17 -0
  27. package/fesm2022/tft-crispr-forms-index-UAYeTe3L.mjs.map +1 -0
  28. package/fesm2022/tft-crispr-forms-index-UvEVbwnf.mjs +41 -0
  29. package/fesm2022/tft-crispr-forms-index-UvEVbwnf.mjs.map +1 -0
  30. package/fesm2022/tft-crispr-forms-index-joNvlmny.mjs +61 -0
  31. package/fesm2022/tft-crispr-forms-index-joNvlmny.mjs.map +1 -0
  32. package/fesm2022/tft-crispr-forms-index-kjMTlZoq.mjs +24 -0
  33. package/fesm2022/tft-crispr-forms-index-kjMTlZoq.mjs.map +1 -0
  34. package/fesm2022/tft-crispr-forms.mjs +300 -175
  35. package/fesm2022/tft-crispr-forms.mjs.map +1 -1
  36. package/package.json +3 -5
  37. package/tft-crispr-forms-19.0.2.tgz +0 -0
  38. package/types/tft-crispr-forms.d.ts +887 -0
  39. package/esm2022/public-api.mjs +0 -4
  40. package/esm2022/src/index.mjs +0 -2
  41. package/esm2022/src/lib/crispr-forms.module.mjs +0 -55
  42. package/esm2022/src/lib/display-field.directive.mjs +0 -52
  43. package/esm2022/src/lib/field-component-map.const.mjs +0 -29
  44. package/esm2022/src/lib/field.directive.mjs +0 -69
  45. package/esm2022/src/lib/form/form.component.mjs +0 -62
  46. package/esm2022/src/lib/form-group-list/form-group-list.component.mjs +0 -97
  47. package/esm2022/src/lib/form-group-list/index.mjs +0 -2
  48. package/esm2022/src/lib/pipes/crispr-pipes.module.mjs +0 -24
  49. package/esm2022/src/lib/pipes/initial-control-value.pipe.mjs +0 -20
  50. package/esm2022/src/lib/public_api.mjs +0 -3
  51. package/esm2022/src/lib/sub-group/index.mjs +0 -3
  52. package/esm2022/src/lib/sub-group/sub-group.component.mjs +0 -20
  53. package/esm2022/src/lib/sub-group/sub-group.module.mjs +0 -42
  54. package/esm2022/src/lib/ui/autocomplete-chiplist-field/autocomplete-chiplist-field.component.mjs +0 -138
  55. package/esm2022/src/lib/ui/autocomplete-chiplist-field/index.mjs +0 -2
  56. package/esm2022/src/lib/ui/autocomplete-chiplist-field/public-api.mjs +0 -2
  57. package/esm2022/src/lib/ui/autocomplete-field/autocomplete-field.component.mjs +0 -95
  58. package/esm2022/src/lib/ui/autocomplete-field/index.mjs +0 -2
  59. package/esm2022/src/lib/ui/autocomplete-field/public-api.mjs +0 -2
  60. package/esm2022/src/lib/ui/button/button.component.mjs +0 -52
  61. package/esm2022/src/lib/ui/button/index.mjs +0 -2
  62. package/esm2022/src/lib/ui/button/public-api.mjs +0 -2
  63. package/esm2022/src/lib/ui/checkbox-field/checkbox-field.component.mjs +0 -42
  64. package/esm2022/src/lib/ui/checkbox-field/index.mjs +0 -2
  65. package/esm2022/src/lib/ui/checkbox-field/public-api.mjs +0 -2
  66. package/esm2022/src/lib/ui/datepicker-field/datepicker-field.component.mjs +0 -66
  67. package/esm2022/src/lib/ui/datepicker-field/index.mjs +0 -2
  68. package/esm2022/src/lib/ui/datepicker-field/public-api.mjs +0 -2
  69. package/esm2022/src/lib/ui/divider/divider.component.mjs +0 -25
  70. package/esm2022/src/lib/ui/divider/index.mjs +0 -2
  71. package/esm2022/src/lib/ui/divider/public-api.mjs +0 -2
  72. package/esm2022/src/lib/ui/field-container/field-container.component.mjs +0 -59
  73. package/esm2022/src/lib/ui/field-container/index.mjs +0 -2
  74. package/esm2022/src/lib/ui/field-container/public-api.mjs +0 -2
  75. package/esm2022/src/lib/ui/file-dropzone/file-dropzone.directive.mjs +0 -40
  76. package/esm2022/src/lib/ui/file-dropzone/index.mjs +0 -2
  77. package/esm2022/src/lib/ui/file-dropzone/public-api.mjs +0 -2
  78. package/esm2022/src/lib/ui/file-upload-field/file-upload-field.component.mjs +0 -107
  79. package/esm2022/src/lib/ui/file-upload-field/index.mjs +0 -2
  80. package/esm2022/src/lib/ui/file-upload-field/public-api.mjs +0 -2
  81. package/esm2022/src/lib/ui/heading/heading.component.mjs +0 -27
  82. package/esm2022/src/lib/ui/heading/index.mjs +0 -2
  83. package/esm2022/src/lib/ui/heading/public-api.mjs +0 -2
  84. package/esm2022/src/lib/ui/image-upload-field/image-upload-field.component.mjs +0 -184
  85. package/esm2022/src/lib/ui/image-upload-field/index.mjs +0 -2
  86. package/esm2022/src/lib/ui/image-upload-field/public-api.mjs +0 -2
  87. package/esm2022/src/lib/ui/index.mjs +0 -2
  88. package/esm2022/src/lib/ui/info/index.mjs +0 -2
  89. package/esm2022/src/lib/ui/info/info.component.mjs +0 -23
  90. package/esm2022/src/lib/ui/info/public-api.mjs +0 -2
  91. package/esm2022/src/lib/ui/input-field/index.mjs +0 -2
  92. package/esm2022/src/lib/ui/input-field/input-field.component.mjs +0 -43
  93. package/esm2022/src/lib/ui/input-field/public-api.mjs +0 -2
  94. package/esm2022/src/lib/ui/map/index.mjs +0 -2
  95. package/esm2022/src/lib/ui/map/map-field.component.mjs +0 -53
  96. package/esm2022/src/lib/ui/map/public-api.mjs +0 -2
  97. package/esm2022/src/lib/ui/option/index.mjs +0 -2
  98. package/esm2022/src/lib/ui/option/option.component.mjs +0 -16
  99. package/esm2022/src/lib/ui/option/public-api.mjs +0 -2
  100. package/esm2022/src/lib/ui/public-api.mjs +0 -7
  101. package/esm2022/src/lib/ui/radio-field/index.mjs +0 -2
  102. package/esm2022/src/lib/ui/radio-field/public-api.mjs +0 -2
  103. package/esm2022/src/lib/ui/radio-field/radio-field.component.mjs +0 -39
  104. package/esm2022/src/lib/ui/select-field/index.mjs +0 -2
  105. package/esm2022/src/lib/ui/select-field/public-api.mjs +0 -2
  106. package/esm2022/src/lib/ui/select-field/select-field.component.mjs +0 -73
  107. package/esm2022/src/lib/ui/selected-file/index.mjs +0 -2
  108. package/esm2022/src/lib/ui/selected-file/public-api.mjs +0 -2
  109. package/esm2022/src/lib/ui/selected-file/selected-file.component.mjs +0 -26
  110. package/esm2022/src/lib/ui/slider-field/index.mjs +0 -2
  111. package/esm2022/src/lib/ui/slider-field/public-api.mjs +0 -2
  112. package/esm2022/src/lib/ui/slider-field/slider-field.component.mjs +0 -46
  113. package/esm2022/src/lib/ui/textarea-field/index.mjs +0 -2
  114. package/esm2022/src/lib/ui/textarea-field/public-api.mjs +0 -2
  115. package/esm2022/src/lib/ui/textarea-field/textarea-field.component.mjs +0 -42
  116. package/esm2022/src/lib/ui/unit-conversion-field/index.mjs +0 -2
  117. package/esm2022/src/lib/ui/unit-conversion-field/public-api.mjs +0 -2
  118. package/esm2022/src/lib/ui/unit-conversion-field/unit-conversion-field.component.mjs +0 -86
  119. package/esm2022/src/lib/utils/abstracts/autocomplete-field.abstract.mjs +0 -30
  120. package/esm2022/src/lib/utils/abstracts/crispr-control.mixin.mjs +0 -27
  121. package/esm2022/src/lib/utils/abstracts/crispr-display-field.abstract.mjs +0 -14
  122. package/esm2022/src/lib/utils/abstracts/crispr-field.abstract.mjs +0 -19
  123. package/esm2022/src/lib/utils/abstracts/index.mjs +0 -5
  124. package/esm2022/src/lib/utils/functions/buildFormGroupFromConfig.mjs +0 -28
  125. package/esm2022/src/lib/utils/functions/callOptionsIfFunction.mjs +0 -4
  126. package/esm2022/src/lib/utils/functions/createControlForType.mjs +0 -19
  127. package/esm2022/src/lib/utils/functions/filterOptionsByLabel.mjs +0 -11
  128. package/esm2022/src/lib/utils/functions/image-compression.helpers.mjs +0 -50
  129. package/esm2022/src/lib/utils/functions/index.mjs +0 -8
  130. package/esm2022/src/lib/utils/functions/isControlConfig.mjs +0 -7
  131. package/esm2022/src/lib/utils/functions/observablifyOptions.mjs +0 -29
  132. package/esm2022/src/lib/utils/index.mjs +0 -2
  133. package/esm2022/src/lib/utils/models/autocomplete-chiplist-field.config.mjs +0 -2
  134. package/esm2022/src/lib/utils/models/autocomplete-field.config.mjs +0 -2
  135. package/esm2022/src/lib/utils/models/button.config.mjs +0 -2
  136. package/esm2022/src/lib/utils/models/checkbox-field.config.mjs +0 -2
  137. package/esm2022/src/lib/utils/models/crispr-field.config.mjs +0 -24
  138. package/esm2022/src/lib/utils/models/datepicker-field.config.mjs +0 -2
  139. package/esm2022/src/lib/utils/models/divider.config.mjs +0 -2
  140. package/esm2022/src/lib/utils/models/file-upload-field.config.mjs +0 -2
  141. package/esm2022/src/lib/utils/models/form-group-list.config.mjs +0 -2
  142. package/esm2022/src/lib/utils/models/heading.config.mjs +0 -3
  143. package/esm2022/src/lib/utils/models/image-upload-field.config.mjs +0 -2
  144. package/esm2022/src/lib/utils/models/index.mjs +0 -19
  145. package/esm2022/src/lib/utils/models/input-field.config.mjs +0 -2
  146. package/esm2022/src/lib/utils/models/map-field.config.mjs +0 -2
  147. package/esm2022/src/lib/utils/models/radio-field.config.mjs +0 -2
  148. package/esm2022/src/lib/utils/models/select-field.config.mjs +0 -2
  149. package/esm2022/src/lib/utils/models/slider-field.config.mjs +0 -2
  150. package/esm2022/src/lib/utils/models/textarea-field.config.mjs +0 -2
  151. package/esm2022/src/lib/utils/models/unit-conversion-field.config.mjs +0 -2
  152. package/esm2022/src/lib/utils/operators/form.operators.mjs +0 -24
  153. package/esm2022/src/lib/utils/operators/index.mjs +0 -2
  154. package/esm2022/src/lib/utils/public-api.mjs +0 -5
  155. package/esm2022/tft-crispr-forms.mjs +0 -5
  156. package/fesm2022/tft-crispr-forms-index-BC1uV7T_.mjs +0 -19
  157. package/fesm2022/tft-crispr-forms-index-BC1uV7T_.mjs.map +0 -1
  158. package/fesm2022/tft-crispr-forms-index-BDJfgpKH.mjs +0 -142
  159. package/fesm2022/tft-crispr-forms-index-BDJfgpKH.mjs.map +0 -1
  160. package/fesm2022/tft-crispr-forms-index-BVwoi2lw.mjs +0 -49
  161. package/fesm2022/tft-crispr-forms-index-BVwoi2lw.mjs.map +0 -1
  162. package/fesm2022/tft-crispr-forms-index-Bbcv75sh.mjs +0 -48
  163. package/fesm2022/tft-crispr-forms-index-Bbcv75sh.mjs.map +0 -1
  164. package/fesm2022/tft-crispr-forms-index-BdOC-6h3.mjs +0 -110
  165. package/fesm2022/tft-crispr-forms-index-BdOC-6h3.mjs.map +0 -1
  166. package/fesm2022/tft-crispr-forms-index-BwC11k3P.mjs +0 -73
  167. package/fesm2022/tft-crispr-forms-index-BwC11k3P.mjs.map +0 -1
  168. package/fesm2022/tft-crispr-forms-index-CN4M4eEo.mjs +0 -50
  169. package/fesm2022/tft-crispr-forms-index-CN4M4eEo.mjs.map +0 -1
  170. package/fesm2022/tft-crispr-forms-index-CP5Jn6EK.mjs +0 -63
  171. package/fesm2022/tft-crispr-forms-index-CP5Jn6EK.mjs.map +0 -1
  172. package/fesm2022/tft-crispr-forms-index-CYzZB0sA.mjs +0 -54
  173. package/fesm2022/tft-crispr-forms-index-CYzZB0sA.mjs.map +0 -1
  174. package/fesm2022/tft-crispr-forms-index-C_YTy6il.mjs +0 -102
  175. package/fesm2022/tft-crispr-forms-index-C_YTy6il.mjs.map +0 -1
  176. package/fesm2022/tft-crispr-forms-index-Cpu5cwLo.mjs +0 -80
  177. package/fesm2022/tft-crispr-forms-index-Cpu5cwLo.mjs.map +0 -1
  178. package/fesm2022/tft-crispr-forms-index-DLa8K3lm.mjs +0 -36
  179. package/fesm2022/tft-crispr-forms-index-DLa8K3lm.mjs.map +0 -1
  180. package/fesm2022/tft-crispr-forms-index-DNTOjcVZ.mjs +0 -49
  181. package/fesm2022/tft-crispr-forms-index-DNTOjcVZ.mjs.map +0 -1
  182. package/fesm2022/tft-crispr-forms-index-DYHyL8s6.mjs +0 -57
  183. package/fesm2022/tft-crispr-forms-index-DYHyL8s6.mjs.map +0 -1
  184. package/fesm2022/tft-crispr-forms-index-DhIYxOdD.mjs +0 -185
  185. package/fesm2022/tft-crispr-forms-index-DhIYxOdD.mjs.map +0 -1
  186. package/fesm2022/tft-crispr-forms-index-o78Cm3Kf.mjs +0 -91
  187. package/fesm2022/tft-crispr-forms-index-o78Cm3Kf.mjs.map +0 -1
  188. package/index.d.ts +0 -5
  189. package/public-api.d.ts +0 -3
  190. package/src/index.d.ts +0 -1
  191. package/src/lib/crispr-forms.module.d.ts +0 -16
  192. package/src/lib/display-field.directive.d.ts +0 -23
  193. package/src/lib/field-component-map.const.d.ts +0 -44
  194. package/src/lib/field.directive.d.ts +0 -24
  195. package/src/lib/form/form.component.d.ts +0 -19
  196. package/src/lib/form-group-list/form-group-list.component.d.ts +0 -40
  197. package/src/lib/form-group-list/index.d.ts +0 -1
  198. package/src/lib/pipes/crispr-pipes.module.d.ts +0 -8
  199. package/src/lib/pipes/initial-control-value.pipe.d.ts +0 -10
  200. package/src/lib/public_api.d.ts +0 -2
  201. package/src/lib/sub-group/index.d.ts +0 -2
  202. package/src/lib/sub-group/sub-group.component.d.ts +0 -24
  203. package/src/lib/sub-group/sub-group.module.d.ts +0 -12
  204. package/src/lib/ui/autocomplete-chiplist-field/autocomplete-chiplist-field.component.d.ts +0 -36
  205. package/src/lib/ui/autocomplete-chiplist-field/index.d.ts +0 -1
  206. package/src/lib/ui/autocomplete-chiplist-field/public-api.d.ts +0 -1
  207. package/src/lib/ui/autocomplete-field/autocomplete-field.component.d.ts +0 -25
  208. package/src/lib/ui/autocomplete-field/index.d.ts +0 -1
  209. package/src/lib/ui/autocomplete-field/public-api.d.ts +0 -1
  210. package/src/lib/ui/button/button.component.d.ts +0 -15
  211. package/src/lib/ui/button/index.d.ts +0 -1
  212. package/src/lib/ui/button/public-api.d.ts +0 -1
  213. package/src/lib/ui/checkbox-field/checkbox-field.component.d.ts +0 -23
  214. package/src/lib/ui/checkbox-field/index.d.ts +0 -1
  215. package/src/lib/ui/checkbox-field/public-api.d.ts +0 -1
  216. package/src/lib/ui/datepicker-field/datepicker-field.component.d.ts +0 -32
  217. package/src/lib/ui/datepicker-field/index.d.ts +0 -1
  218. package/src/lib/ui/datepicker-field/public-api.d.ts +0 -1
  219. package/src/lib/ui/divider/divider.component.d.ts +0 -9
  220. package/src/lib/ui/divider/index.d.ts +0 -1
  221. package/src/lib/ui/divider/public-api.d.ts +0 -1
  222. package/src/lib/ui/field-container/field-container.component.d.ts +0 -24
  223. package/src/lib/ui/field-container/index.d.ts +0 -1
  224. package/src/lib/ui/field-container/public-api.d.ts +0 -1
  225. package/src/lib/ui/file-dropzone/file-dropzone.directive.d.ts +0 -10
  226. package/src/lib/ui/file-dropzone/index.d.ts +0 -1
  227. package/src/lib/ui/file-dropzone/public-api.d.ts +0 -1
  228. package/src/lib/ui/file-upload-field/file-upload-field.component.d.ts +0 -39
  229. package/src/lib/ui/file-upload-field/index.d.ts +0 -1
  230. package/src/lib/ui/file-upload-field/public-api.d.ts +0 -1
  231. package/src/lib/ui/heading/heading.component.d.ts +0 -8
  232. package/src/lib/ui/heading/index.d.ts +0 -1
  233. package/src/lib/ui/heading/public-api.d.ts +0 -1
  234. package/src/lib/ui/image-upload-field/image-upload-field.component.d.ts +0 -50
  235. package/src/lib/ui/image-upload-field/index.d.ts +0 -1
  236. package/src/lib/ui/image-upload-field/public-api.d.ts +0 -1
  237. package/src/lib/ui/index.d.ts +0 -1
  238. package/src/lib/ui/info/index.d.ts +0 -1
  239. package/src/lib/ui/info/info.component.d.ts +0 -7
  240. package/src/lib/ui/info/public-api.d.ts +0 -1
  241. package/src/lib/ui/input-field/index.d.ts +0 -1
  242. package/src/lib/ui/input-field/input-field.component.d.ts +0 -24
  243. package/src/lib/ui/input-field/public-api.d.ts +0 -1
  244. package/src/lib/ui/map/index.d.ts +0 -1
  245. package/src/lib/ui/map/map-field.component.d.ts +0 -32
  246. package/src/lib/ui/map/public-api.d.ts +0 -1
  247. package/src/lib/ui/option/index.d.ts +0 -1
  248. package/src/lib/ui/option/option.component.d.ts +0 -7
  249. package/src/lib/ui/option/public-api.d.ts +0 -1
  250. package/src/lib/ui/public-api.d.ts +0 -6
  251. package/src/lib/ui/radio-field/index.d.ts +0 -1
  252. package/src/lib/ui/radio-field/public-api.d.ts +0 -1
  253. package/src/lib/ui/radio-field/radio-field.component.d.ts +0 -25
  254. package/src/lib/ui/select-field/index.d.ts +0 -1
  255. package/src/lib/ui/select-field/public-api.d.ts +0 -1
  256. package/src/lib/ui/select-field/select-field.component.d.ts +0 -34
  257. package/src/lib/ui/selected-file/index.d.ts +0 -1
  258. package/src/lib/ui/selected-file/public-api.d.ts +0 -1
  259. package/src/lib/ui/selected-file/selected-file.component.d.ts +0 -10
  260. package/src/lib/ui/slider-field/index.d.ts +0 -1
  261. package/src/lib/ui/slider-field/public-api.d.ts +0 -1
  262. package/src/lib/ui/slider-field/slider-field.component.d.ts +0 -24
  263. package/src/lib/ui/textarea-field/index.d.ts +0 -1
  264. package/src/lib/ui/textarea-field/public-api.d.ts +0 -1
  265. package/src/lib/ui/textarea-field/textarea-field.component.d.ts +0 -23
  266. package/src/lib/ui/unit-conversion-field/index.d.ts +0 -1
  267. package/src/lib/ui/unit-conversion-field/public-api.d.ts +0 -1
  268. package/src/lib/ui/unit-conversion-field/unit-conversion-field.component.d.ts +0 -38
  269. package/src/lib/utils/abstracts/autocomplete-field.abstract.d.ts +0 -28
  270. package/src/lib/utils/abstracts/crispr-control.mixin.d.ts +0 -16
  271. package/src/lib/utils/abstracts/crispr-display-field.abstract.d.ts +0 -22
  272. package/src/lib/utils/abstracts/crispr-field.abstract.d.ts +0 -11
  273. package/src/lib/utils/abstracts/index.d.ts +0 -4
  274. package/src/lib/utils/functions/buildFormGroupFromConfig.d.ts +0 -9
  275. package/src/lib/utils/functions/callOptionsIfFunction.d.ts +0 -3
  276. package/src/lib/utils/functions/createControlForType.d.ts +0 -9
  277. package/src/lib/utils/functions/filterOptionsByLabel.d.ts +0 -7
  278. package/src/lib/utils/functions/image-compression.helpers.d.ts +0 -5
  279. package/src/lib/utils/functions/index.d.ts +0 -7
  280. package/src/lib/utils/functions/isControlConfig.d.ts +0 -5
  281. package/src/lib/utils/functions/observablifyOptions.d.ts +0 -12
  282. package/src/lib/utils/index.d.ts +0 -1
  283. package/src/lib/utils/models/autocomplete-chiplist-field.config.d.ts +0 -20
  284. package/src/lib/utils/models/autocomplete-field.config.d.ts +0 -14
  285. package/src/lib/utils/models/button.config.d.ts +0 -17
  286. package/src/lib/utils/models/checkbox-field.config.d.ts +0 -6
  287. package/src/lib/utils/models/crispr-field.config.d.ts +0 -98
  288. package/src/lib/utils/models/datepicker-field.config.d.ts +0 -20
  289. package/src/lib/utils/models/divider.config.d.ts +0 -5
  290. package/src/lib/utils/models/file-upload-field.config.d.ts +0 -33
  291. package/src/lib/utils/models/form-group-list.config.d.ts +0 -18
  292. package/src/lib/utils/models/heading.config.d.ts +0 -6
  293. package/src/lib/utils/models/image-upload-field.config.d.ts +0 -54
  294. package/src/lib/utils/models/index.d.ts +0 -18
  295. package/src/lib/utils/models/input-field.config.d.ts +0 -16
  296. package/src/lib/utils/models/map-field.config.d.ts +0 -13
  297. package/src/lib/utils/models/radio-field.config.d.ts +0 -6
  298. package/src/lib/utils/models/select-field.config.d.ts +0 -21
  299. package/src/lib/utils/models/slider-field.config.d.ts +0 -11
  300. package/src/lib/utils/models/textarea-field.config.d.ts +0 -5
  301. package/src/lib/utils/models/unit-conversion-field.config.d.ts +0 -30
  302. package/src/lib/utils/operators/form.operators.d.ts +0 -1
  303. package/src/lib/utils/operators/index.d.ts +0 -1
  304. package/src/lib/utils/public-api.d.ts +0 -4
  305. package/tft-crispr-forms-18.0.1.tgz +0 -0
package/README.md CHANGED
@@ -1,173 +1,172 @@
1
- # CRISPR Forms
2
- ### Build forms like DNA builds life
3
- <a href="https://www.npmjs.com/package/@tft/interact">
4
- <img alt="npm latest version" src="https://img.shields.io/npm/v/@tft/interact/latest.svg">
5
- </a>
1
+ # crispr-forms
6
2
 
3
+ **Build complex forms dynamically from a configuration object.**
7
4
 
8
- [Interactive docs](https://stackblitz.com/github/nayfin/tft-documentation)
5
+ CRISPR Forms is an Angular library that allows you to build forms by providing a configuration object. This abstracts the template work, allowing you to focus on business logic. It is built on top of Angular Material.
9
6
 
7
+ [Interactive Docs](https://stackblitz.com/github/nayfin/tft-documentation)
10
8
 
11
- ## Description
9
+ ## Architecture Overview
12
10
 
13
- Web development tends to involve building a lot of forms, and even though it can be repetitive it's not necessarily easy. Connecting templates to `FormGroup`s takes time and there are a lot of opportunities to make mistakes along the way that can difficult to debug. Large form are difficult to keep organized, and long form templates are cumbersome to update.
11
+ At its core, CRISPR Forms is a component that dynamically generates form fields based on a configuration you provide.
14
12
 
15
- Luckily, we've abstracted out the template work entirely, allowing the end developer to simply pass a `config` object to the `tft-crispr-forms` component and it will use these instructions to build out the form. This allows the end developer to focus on the business logic and not the template details.
13
+ - **`<crispr-form>` component:** The main component you'll use. You pass it a `FormConfig` object, and it renders the form.
14
+ - **`FormConfig`:** A configuration object that defines the entire form, including its fields, validation, and behavior.
15
+ - **Field Components:** The library includes a variety of pre-built field components for different types of inputs (e.g., text input, select, datepicker). These are located in `libs/crispr-forms/src/lib/ui`.
16
+ - **Dynamic Field Generation:** A directive (`field.directive.ts`) and a component map (`field-component-map.const.ts`) work together to dynamically instantiate the correct field component based on the `controlType` specified in the field's configuration.
16
17
 
17
- We currently only support styling for Material Design, but support for other design systems is on our roadmap.
18
+ ## Key Concepts
18
19
 
19
- ### Supported Angular Material fields:
20
- - Autocomplete
21
- - Autocomplete Chiplist
22
- - Checkbox
23
- - Input
24
- - Select
25
- - Textarea
26
- - Slider
27
- - Datepicker
28
- - Button
29
- - Heading
30
- - Divider
20
+ - **`FormConfig`:** The main configuration object for the entire form. It contains an array of `FieldConfig` objects.
21
+ - **`FieldConfig`:** A base interface for all field configurations. Each field type extends this with its own specific options. These configuration interfaces are located in `libs/crispr-forms/src/lib/utils/models`.
22
+ - **`ControlType`:** An enum that specifies the type of field to render (e.g., `ControlType.INPUT`, `ControlType.SELECT`).
31
23
 
32
- ### More fields coming soon!
24
+ ## Installation
33
25
 
34
- Super sweet features:
35
- - computed values: field values based on one or many other field values (fieldC === fieldA * fieldB)
36
- - dynamically disabled fields: disable a field reactively based on other field(s) values
37
- - configurations to handle all the features of each Angular Material field
26
+ CRISPR Forms requires Angular Material.
38
27
 
39
- ## Installation
28
+ Install the package and its peer dependency:
29
+
30
+ ```bash
31
+ npm install @tft/crispr-forms @tft/form-validation-handler
32
+ ```
33
+
34
+ Add Angular Material:
35
+
36
+ ```bash
37
+ ng add @angular/material
38
+ ```
39
+
40
+ The datepicker field requires `date-fns`:
40
41
 
41
- CRISPR Forms has a few dependencies. First you'll need Angular Material. Usually you can just run `ng add @angular/material`. Find installation docs [here](https://material.angular.io/guide/getting-started).
42
+ ```bash
43
+ npm i date-fns @angular/material-date-fns-adapter
44
+ ```
42
45
 
43
- The datepicker field require `date-fns` and `@angular/material-date-fns-adapter` to be installed.
44
- `npm i date-fns @angular/material-date-fns-adapter`
46
+ You also need to provide `MAT_DATE_LOCALE` in your root module:
45
47
 
46
- You will have also have to provide value for `MAT_DATE_LOCALE` in your root module.
47
48
  ```ts
48
49
  import { MAT_DATE_LOCALE } from '@angular/material/core';
49
50
  import { enUS } from 'date-fns/locale';
50
51
 
51
-
52
52
  @NgModule({
53
- ...
53
+ // ...
54
54
  providers: [
55
55
  {
56
- provide: MAT_DATE_LOCALE,
57
- useValue: enUS,
56
+ provide: MAT_DATE_LOCALE,
57
+ useValue: enUS,
58
58
  },
59
59
  ],
60
- });
60
+ })
61
+ export class AppModule {}
61
62
  ```
62
63
 
63
- <!-- Next, you'll need our sister library `npm i --save @tft/form-validation-handler` this enables automatic user messages on invalid fields. -->
64
- There are default messages for all the built in Angular validators, but they can easily overwritten by setting the `errorDictionary` field on the `config` input. Custom messages can also be created for custom validators.
65
-
66
64
  ## Usage
67
65
 
68
- With CRISPR Forms we've abstracted out form template entirely allowing you to generate your form by simply passing a configuration object to the `tft-crispr-form` component.
69
-
70
- Interactive documentation can be found on Stackblitz [here](https://stackblitz.com/github/nayfin/tft-documentation), with editable examples for most features.
66
+ Provide a `FormConfig` object to the `<crispr-form>` component.
71
67
 
72
- In `some-component.html` we pass the configuration to the component and `handleSubmit` function to the `submitted` event.
68
+ **In your component's template:**
73
69
 
74
70
  ```html
75
- <crispr-form
76
- [config]="config"
77
- (submitted)="handleSubmit($event)">
78
- </crispr-form>
71
+ <crispr-form [config]="config" (submitted)="handleSubmit($event)"></crispr-form>
79
72
  ```
80
- In `some-component.ts` we define the `config` and `handleSubmit` function.
81
73
 
82
- ```ts
83
- export class DemoComponent implements OnInit {
74
+ **In your component's class:**
84
75
 
76
+ ```ts
77
+ import { Component } from '@angular/core';
78
+ import { FormConfig, ControlType } from '@tft/crispr-forms';
79
+ import { Validators } from '@angular/forms';
80
+
81
+ @Component({
82
+ selector: 'app-my-form',
83
+ templateUrl: './my-form.component.html',
84
+ })
85
+ export class MyFormComponent {
85
86
  config: FormConfig = {
86
87
  fields: [
87
- // a basic input field in the form with the following configuration
88
88
  {
89
89
  controlType: ControlType.INPUT,
90
- label: 'I am a label on a text input',
91
- controlName: 'textInput',
92
- placeholder: 'I am a placeholder in a text input',
93
- validators: [Validators.required, Validators.minLength(5)],
90
+ controlName: 'name',
91
+ label: 'Name',
92
+ validators: [Validators.required],
94
93
  },
95
94
  {
96
95
  controlType: ControlType.SELECT,
97
- label: 'I am a label on a text input',
98
- controlName: 'textInput',
96
+ controlName: 'role',
97
+ label: 'Role',
99
98
  options: [
100
- {label: 'option a', value: 'optionA'}
101
- {label: 'option a', value: 'optionA'}
99
+ { label: 'Admin', value: 'admin' },
100
+ { label: 'User', value: 'user' },
102
101
  ],
103
- placeholder: 'I am a placeholder in a text input',
104
- validators: [Validators.required, Validators.minLength(5)],
105
102
  },
106
- ]
103
+ ],
104
+ };
105
+
106
+ handleSubmit(event: any) {
107
+ console.log(event);
107
108
  }
108
109
  }
109
110
  ```
110
111
 
112
+ ## Supported Fields
111
113
 
112
- ## Buttons can reset form or take custom events
114
+ The following field types are supported:
113
115
 
114
- See example [here](https://stackblitz.com/github/nayfin/tft-documentation?file=src%2Fapp%2Fcrispr-forms-demo%2Ffields%2Fbutton%2Fbutton.component.ts).
116
+ - Autocomplete
117
+ - Autocomplete Chiplist
118
+ - Button
119
+ - Checkbox
120
+ - Datepicker
121
+ - Divider
122
+ - File Upload
123
+ - Form Group List
124
+ - Heading
125
+ - Image Upload
126
+ - Input
127
+ - Map
128
+ - Radio Buttons
129
+ - Select
130
+ - Slider
131
+ - Sub Group
132
+ - Textarea
133
+ - Unit Conversion
115
134
 
116
- ## Datepicker can take a callback function to pass a class to specified fields
135
+ ## Creating a Custom Field
117
136
 
118
- See example [here](https://stackblitz.com/github/nayfin/tft-documentation?file=src%2Fapp%2Fcrispr-forms-demo%2Ffields%2Fdatepicker%2Fdatepicker.component.ts). Be sure to check out the corresponding .scss file to see how we pass styles down to the cell class.
137
+ To create a new field type for CRISPR Forms, follow these steps:
119
138
 
120
- ## Pass Custom Components to CRISPR
139
+ 1. **Generate a new component:**
121
140
 
122
- Simply create a component and pass it as an argument to the `component` property.
141
+ ```bash
142
+ ng g c <your-field-name> --project=crispr-forms
143
+ ```
123
144
 
124
- ```ts
125
- export class CustomComponentComponent {
145
+ 2. **Define the configuration interface:**
146
+ Create a new file `libs/crispr-forms/src/lib/utils/models/<your-field-name>.config.ts`. This file will define the configuration interface for your new field. It should extend the base `FieldConfig`.
126
147
 
127
- customComponentConfig: FormConfig<CustomInputConfig> = {
128
- autocomplete: 'off',
129
- fields: [
130
- {
131
- component: CustomInputComponent,
132
- controlType: ControlType.CUSTOM,
133
- controlName: 'customComponent',
134
- },
135
-
136
- ```
137
- Examples of how to extend current field behavior available [here](https://stackblitz.com/github/nayfin/tft-documentation?file=src%2Fapp%2Fcrispr-forms-demo%2Ffeatures%2Finfo%2Finfo.component.ts0)
138
-
139
- ## Breaking Changest v13 => v14
140
-
141
- ### Switch from MomentDateAdaptor to FnsDateAdapter
142
-
143
- With momentjs shifting into maintenance mode, it no longer makes sense to use the `MomentDateAdaptor`, so we've switched to the `FnsDateAdapter`. This means that for `DatepickerFieldConfig`s the `datepickerFilter`, `cellClassFunction`, `dateClass` properties, instances of `Moment` will need to be replaced with `Date`.
144
-
145
- #### v13
146
-
147
- ```ts
148
- datepickerFilter?: (date: Moment) => boolean;
149
- cellClassFunction?: MatCalendarCellClassFunction<Moment>;
150
- dateClass?: (parentGroup: FormGroup) => Observable<MatCalendarCellClassFunction<Moment>>;
151
- ```
152
-
153
- #### v14
154
- ```ts
155
- datepickerFilter?: (date: Date) => boolean;
156
- cellClassFunction?: MatCalendarCellClassFunction<Date>;
157
- dateClass?: (parentGroup: FormGroup) => Observable<MatCalendarCellClassFunction<Date>>;
158
- ```
148
+ ```ts
149
+ import { FieldConfig } from './crispr-field.config';
159
150
 
160
- You'll also have to set up a date locale in your root module. See [installation](#installation) for details on how to set up the new adaptor.
151
+ export interface YourFieldConfig extends FieldConfig {
152
+ // your custom properties here
153
+ }
154
+ ```
161
155
 
156
+ 3. **Update `crispr-field.config.ts`:**
157
+ In `libs/crispr-forms/src/lib/utils/models/crispr-field.config.ts`:
158
+ - Add your new config to the `AnyFieldConfig` type.
159
+ - Add an entry to the `ControlType` enum.
162
160
 
161
+ 4. **Create the component:**
162
+ Your new component should extend `CrisprControlComponent` and implement the necessary logic.
163
163
 
164
- #### Upcoming / In Progress
164
+ 5. **Map the component:**
165
+ In `libs/crispr-forms/src/lib/field-component-map.const.ts`:
166
+ - Add your new component class to the `FIELD_COMPONENTS` array and the `CrisprControlComponent` type.
165
167
 
166
- - Creating modules for each component so that you can avoid importing unused components
168
+ ## Advanced Features
167
169
 
168
- - Framework agnostic with Angular Elements
169
- - More examples of how to change field layout
170
- - The rest of the Angular Material fields:
171
- - Radio button
172
- - Slide toggle
173
- - Button toggle
170
+ - **Computed Values:** Field values can be calculated based on the values of other fields.
171
+ - **Dynamically Disabled Fields:** Fields can be disabled reactively based on the values of other fields.
172
+ - **Custom Components:** You can pass your own custom components to be rendered as fields.
@@ -0,0 +1,95 @@
1
+ import * as i0 from '@angular/core';
2
+ import { ViewChild, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import * as i2 from '@angular/material/autocomplete';
4
+ import { MatAutocompleteModule, MatAutocompleteTrigger } from '@angular/material/autocomplete';
5
+ import * as i1$1 from '@angular/common';
6
+ import { CommonModule } from '@angular/common';
7
+ import * as i1 from '@angular/forms';
8
+ import { ReactiveFormsModule } from '@angular/forms';
9
+ import * as i3 from '@angular/material/input';
10
+ import { MatInputModule } from '@angular/material/input';
11
+ import { MatOptionModule } from '@angular/material/core';
12
+ import { O as OptionComponent } from './tft-crispr-forms-index-UAYeTe3L.mjs';
13
+ import * as i6 from '@tft/form-validation-handler';
14
+ import { FormValidationHandlerModule } from '@tft/form-validation-handler';
15
+ import { DEFAULT_EMPTY_OPTIONS_MESSAGE, AbstractAutocompleteComponent, InfoComponent, FieldContainerComponent } from './tft-crispr-forms.mjs';
16
+ import * as i2$1 from '@angular/material/form-field';
17
+
18
+ /* eslint-disable @nx/enforce-module-boundaries */
19
+ const defaultConfig = {
20
+ autoActiveFirstOption: true,
21
+ typeDebounceTime: 500,
22
+ emptyOptionsMessage: DEFAULT_EMPTY_OPTIONS_MESSAGE,
23
+ };
24
+ class AutocompleteFieldComponent extends AbstractAutocompleteComponent {
25
+ constructor() {
26
+ super(...arguments);
27
+ this.defaultConfig = defaultConfig;
28
+ }
29
+ ngOnInit() {
30
+ super.ngOnInit();
31
+ this.clearFieldSubscription =
32
+ this.autocompleteInputControl.valueChanges.subscribe((text) => {
33
+ if (typeof text === 'string' && text?.trim() === '') {
34
+ this.control().setValue(null);
35
+ }
36
+ });
37
+ }
38
+ ngOnDestroy() {
39
+ this.clearFieldSubscription.unsubscribe();
40
+ }
41
+ setControlValue(value) {
42
+ if (this.control() && value) {
43
+ // sets the initial value on the control if one is passed
44
+ this.control().setValue(value.value || '');
45
+ this.autocompleteInputControl.setValue(value.label || '');
46
+ }
47
+ }
48
+ /**
49
+ * The material autocomplete defaults to displaying the options value instead of its label.
50
+ * We only have the value from the selected option to work with, so we have to pass the options
51
+ * through a function called in the template and return the function that the material displayWith
52
+ * input is expecting.
53
+ * @param options the array of options to search for option with corresponding value
54
+ */
55
+ displayLabel(options) {
56
+ if (this.config().displayWith) {
57
+ return this.config().displayWith(options);
58
+ }
59
+ return (value) => {
60
+ const label = !!options && Array.isArray(options)
61
+ ? options.find((option) => JSON.stringify(option.value) === JSON.stringify(value))?.label
62
+ : value;
63
+ return label;
64
+ };
65
+ }
66
+ handleSelect(event) {
67
+ this.control().setValue(event.option.value);
68
+ this.autoInputRef.nativeElement.blur();
69
+ }
70
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: AutocompleteFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
71
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: AutocompleteFieldComponent, isStandalone: true, selector: "crispr-autocomplete-field", viewQueries: [{ propertyName: "autoInput", first: true, predicate: ["autoInput"], descendants: true, read: MatAutocompleteTrigger }, { propertyName: "autoInputRef", first: true, predicate: ["autoInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\n<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n\n <mat-form-field\n [color]=\"config().color\"\n [appearance]=\"config().appearance\"\n [formGroup]=\"group()\">\n @if (config().label) {<mat-label>{{config().label}}</mat-label>}\n\n <input class=\"hidden-error-directive-anchor\" [formControlName]=\"config().controlName\" type=\"text\"/>\n\n <input\n matInput\n [formControl]=\"autocompleteInputControl\"\n [placeholder]=\"config().placeholder\"\n [matAutocomplete]=\"auto\"\n role=\"textbox\"\n type=\"textbox\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n #autoInput>\n\n @if (config().fieldSuffix) {<span matSuffix>{{config().fieldSuffix}}</span>}\n @if (config().info) {<crispr-info matSuffix [info]=\"config().info \"></crispr-info>}\n\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"config().autoActiveFirstOption\"\n (optionSelected)=\"handleSelect($event)\"\n [displayWith]=\"displayLabel(options$ | async)\">\n\n @if (options$ | async; as options) {\n @if (options.length > 0) {\n @for (option of options; track option) {\n <mat-option\n [value]=\"option.value\">\n <crispr-option [option]=\"option\"></crispr-option>\n </mat-option>\n }\n } @else {\n <mat-option disabled=\"true\">\n {{config().emptyOptionsMessage}}\n </mat-option>\n }\n } @else {\n <mat-option disabled=\"true\">\n {{config().emptyOptionsMessage}}\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (config().hint && (control().valid || !control().touched)) {<mat-hint>{{config().hint}}</mat-hint>}\n\n </mat-form-field>\n</crispr-field-container>\n", styles: [".hidden-error-directive-anchor{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: InfoComponent, selector: "crispr-info", inputs: ["info"] }, { kind: "component", type: OptionComponent, selector: "crispr-option", inputs: ["option"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: FieldContainerComponent, selector: "crispr-field-container", inputs: ["config", "group", "inlineField"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i2.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i2.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: FormValidationHandlerModule }, { kind: "directive", type: i6.ControlErrorsDirective, selector: "[formControl], [formControlName]" }, { kind: "directive", type: i6.ControlErrorContainerDirective, selector: "[controlErrorContainer], [formGroup]" }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true }); }
72
+ }
73
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: AutocompleteFieldComponent, decorators: [{
74
+ type: Component,
75
+ args: [{ selector: 'crispr-autocomplete-field', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
76
+ CommonModule,
77
+ InfoComponent,
78
+ OptionComponent,
79
+ ReactiveFormsModule,
80
+ FieldContainerComponent,
81
+ MatAutocompleteModule,
82
+ MatInputModule,
83
+ MatOptionModule,
84
+ FormValidationHandlerModule,
85
+ ], standalone: true, template: "\n<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n\n <mat-form-field\n [color]=\"config().color\"\n [appearance]=\"config().appearance\"\n [formGroup]=\"group()\">\n @if (config().label) {<mat-label>{{config().label}}</mat-label>}\n\n <input class=\"hidden-error-directive-anchor\" [formControlName]=\"config().controlName\" type=\"text\"/>\n\n <input\n matInput\n [formControl]=\"autocompleteInputControl\"\n [placeholder]=\"config().placeholder\"\n [matAutocomplete]=\"auto\"\n role=\"textbox\"\n type=\"textbox\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n #autoInput>\n\n @if (config().fieldSuffix) {<span matSuffix>{{config().fieldSuffix}}</span>}\n @if (config().info) {<crispr-info matSuffix [info]=\"config().info \"></crispr-info>}\n\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"config().autoActiveFirstOption\"\n (optionSelected)=\"handleSelect($event)\"\n [displayWith]=\"displayLabel(options$ | async)\">\n\n @if (options$ | async; as options) {\n @if (options.length > 0) {\n @for (option of options; track option) {\n <mat-option\n [value]=\"option.value\">\n <crispr-option [option]=\"option\"></crispr-option>\n </mat-option>\n }\n } @else {\n <mat-option disabled=\"true\">\n {{config().emptyOptionsMessage}}\n </mat-option>\n }\n } @else {\n <mat-option disabled=\"true\">\n {{config().emptyOptionsMessage}}\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (config().hint && (control().valid || !control().touched)) {<mat-hint>{{config().hint}}</mat-hint>}\n\n </mat-form-field>\n</crispr-field-container>\n", styles: [".hidden-error-directive-anchor{display:none}\n"] }]
86
+ }], propDecorators: { autoInput: [{
87
+ type: ViewChild,
88
+ args: ['autoInput', { read: MatAutocompleteTrigger }]
89
+ }], autoInputRef: [{
90
+ type: ViewChild,
91
+ args: ['autoInput']
92
+ }] } });
93
+
94
+ export { AutocompleteFieldComponent as A };
95
+ //# sourceMappingURL=tft-crispr-forms-autocomplete-field.component-jdr2Hr6I.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tft-crispr-forms-autocomplete-field.component-jdr2Hr6I.mjs","sources":["../../../../libs/crispr-forms/src/lib/ui/autocomplete-field/autocomplete-field.component.ts","../../../../libs/crispr-forms/src/lib/ui/autocomplete-field/autocomplete-field.component.html"],"sourcesContent":["/* eslint-disable @nx/enforce-module-boundaries */\nimport {\n Component,\n OnInit,\n ViewChild,\n ChangeDetectionStrategy,\n ElementRef,\n OnDestroy,\n} from '@angular/core';\nimport {\n MatAutocompleteTrigger,\n MatAutocompleteSelectedEvent,\n MatAutocompleteModule,\n} from '@angular/material/autocomplete';\n\nimport { Subscription } from 'rxjs';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatOptionModule } from '@angular/material/core';\nimport { OptionComponent } from '../option';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\n\nimport { FieldContainerComponent } from '../field-container';\nimport {\n SelectOption,\n AbstractAutocompleteComponent,\n AutocompleteFieldConfig,\n DEFAULT_EMPTY_OPTIONS_MESSAGE,\n} from '../../utils';\nimport { InfoComponent } from '../info';\n\nconst defaultConfig: Partial<AutocompleteFieldConfig> = {\n autoActiveFirstOption: true,\n typeDebounceTime: 500,\n emptyOptionsMessage: DEFAULT_EMPTY_OPTIONS_MESSAGE,\n};\n\n@Component({\n selector: 'crispr-autocomplete-field',\n templateUrl: './autocomplete-field.component.html',\n styleUrls: ['./autocomplete-field.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n InfoComponent,\n OptionComponent,\n ReactiveFormsModule,\n FieldContainerComponent,\n MatAutocompleteModule,\n MatInputModule,\n MatOptionModule,\n FormValidationHandlerModule,\n ],\n standalone: true\n})\nexport class AutocompleteFieldComponent\n extends AbstractAutocompleteComponent<AutocompleteFieldConfig>\n implements OnInit, OnDestroy\n{\n defaultConfig = defaultConfig;\n @ViewChild('autoInput', { read: MatAutocompleteTrigger })\n autoInput: MatAutocompleteTrigger;\n @ViewChild('autoInput') autoInputRef: ElementRef<HTMLInputElement>;\n\n clearFieldSubscription: Subscription;\n\n ngOnInit() {\n super.ngOnInit();\n this.clearFieldSubscription =\n this.autocompleteInputControl.valueChanges.subscribe((text: string) => {\n if (typeof text === 'string' && text?.trim() === '') {\n this.control().setValue(null);\n }\n });\n }\n\n ngOnDestroy() {\n this.clearFieldSubscription.unsubscribe();\n }\n\n setControlValue(value: SelectOption) {\n if (this.control() && value) {\n // sets the initial value on the control if one is passed\n this.control().setValue(value.value || '');\n this.autocompleteInputControl.setValue(value.label || '');\n }\n }\n\n /**\n * The material autocomplete defaults to displaying the options value instead of its label.\n * We only have the value from the selected option to work with, so we have to pass the options\n * through a function called in the template and return the function that the material displayWith\n * input is expecting.\n * @param options the array of options to search for option with corresponding value\n */\n displayLabel(options: SelectOption[]) {\n if (this.config().displayWith) {\n return this.config().displayWith(options);\n }\n return (value: any) => {\n const label: string =\n !!options && Array.isArray(options)\n ? options.find(\n (option) => JSON.stringify(option.value) === JSON.stringify(value)\n )?.label\n : value;\n return label;\n };\n }\n\n handleSelect(event: MatAutocompleteSelectedEvent) {\n this.control().setValue(event.option.value);\n this.autoInputRef.nativeElement.blur();\n }\n}\n","\n<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n\n <mat-form-field\n [color]=\"config().color\"\n [appearance]=\"config().appearance\"\n [formGroup]=\"group()\">\n @if (config().label) {<mat-label>{{config().label}}</mat-label>}\n\n <input class=\"hidden-error-directive-anchor\" [formControlName]=\"config().controlName\" type=\"text\"/>\n\n <input\n matInput\n [formControl]=\"autocompleteInputControl\"\n [placeholder]=\"config().placeholder\"\n [matAutocomplete]=\"auto\"\n role=\"textbox\"\n type=\"textbox\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n #autoInput>\n\n @if (config().fieldSuffix) {<span matSuffix>{{config().fieldSuffix}}</span>}\n @if (config().info) {<crispr-info matSuffix [info]=\"config().info \"></crispr-info>}\n\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"config().autoActiveFirstOption\"\n (optionSelected)=\"handleSelect($event)\"\n [displayWith]=\"displayLabel(options$ | async)\">\n\n @if (options$ | async; as options) {\n @if (options.length > 0) {\n @for (option of options; track option) {\n <mat-option\n [value]=\"option.value\">\n <crispr-option [option]=\"option\"></crispr-option>\n </mat-option>\n }\n } @else {\n <mat-option disabled=\"true\">\n {{config().emptyOptionsMessage}}\n </mat-option>\n }\n } @else {\n <mat-option disabled=\"true\">\n {{config().emptyOptionsMessage}}\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (config().hint && (control().valid || !control().touched)) {<mat-hint>{{config().hint}}</mat-hint>}\n\n </mat-form-field>\n</crispr-field-container>\n"],"names":["i4","i5","i6"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import * as i0 from '@angular/core';
2
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import * as i2 from '@angular/material/slider';
4
+ import { MatSliderModule } from '@angular/material/slider';
5
+ import * as i1 from '@angular/forms';
6
+ import { ReactiveFormsModule } from '@angular/forms';
7
+ import { CrisprControlComponent, InfoComponent, FieldContainerComponent } from './tft-crispr-forms.mjs';
8
+
9
+ /* eslint-disable @nx/enforce-module-boundaries */
10
+ const defaultConfig = {
11
+ displayLimits: true,
12
+ displayWith: (val) => val,
13
+ };
14
+ class SliderFieldComponent extends CrisprControlComponent {
15
+ constructor() {
16
+ super();
17
+ this.defaultConfig = defaultConfig;
18
+ }
19
+ ngOnInit() {
20
+ super.ngOnInit();
21
+ }
22
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SliderFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: SliderFieldComponent, isStandalone: true, selector: "crispr-slider-field", usesInheritance: true, ngImport: i0, template: "<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n @if (config().label) {\n <label>\n {{config().label}}\n @if (config().info) {\n <crispr-info\n [info]=\"config().info\">\n </crispr-info>\n }\n </label>\n }\n <div class=\"slider-container\">\n @if (config().displayLimits) {\n <span>\n {{config().min}}\n </span>\n }\n <mat-slider\n [discrete]=\"config().discrete\"\n [displayWith]=\"config().displayWith\"\n class=\"example-margin\"\n [formGroup]=\"group()\"\n [max]=\"config().max\"\n [min]=\"config().min\"\n [step]=\"config().step\">\n <input matSliderThumb\n [formControlName]=\"config().controlName\">\n </mat-slider>\n @if (config().displayLimits) {\n <span>\n {{config().max}}\n </span>\n }\n </div>\n\n</crispr-field-container>\n\n", styles: [".slider-container{display:flex;align-items:center}.slider-container mat-slider{flex:1}\n"], dependencies: [{ kind: "component", type: InfoComponent, selector: "crispr-info", inputs: ["info"] }, { kind: "component", type: FieldContainerComponent, selector: "crispr-field-container", inputs: ["config", "group", "inlineField"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "component", type: i2.MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i2.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true }); }
24
+ }
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SliderFieldComponent, decorators: [{
26
+ type: Component,
27
+ args: [{ selector: 'crispr-slider-field', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
28
+ InfoComponent,
29
+ FieldContainerComponent,
30
+ ReactiveFormsModule,
31
+ MatSliderModule
32
+ ], standalone: true, template: "<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n @if (config().label) {\n <label>\n {{config().label}}\n @if (config().info) {\n <crispr-info\n [info]=\"config().info\">\n </crispr-info>\n }\n </label>\n }\n <div class=\"slider-container\">\n @if (config().displayLimits) {\n <span>\n {{config().min}}\n </span>\n }\n <mat-slider\n [discrete]=\"config().discrete\"\n [displayWith]=\"config().displayWith\"\n class=\"example-margin\"\n [formGroup]=\"group()\"\n [max]=\"config().max\"\n [min]=\"config().min\"\n [step]=\"config().step\">\n <input matSliderThumb\n [formControlName]=\"config().controlName\">\n </mat-slider>\n @if (config().displayLimits) {\n <span>\n {{config().max}}\n </span>\n }\n </div>\n\n</crispr-field-container>\n\n", styles: [".slider-container{display:flex;align-items:center}.slider-container mat-slider{flex:1}\n"] }]
33
+ }], ctorParameters: () => [] });
34
+
35
+ export { SliderFieldComponent };
36
+ //# sourceMappingURL=tft-crispr-forms-index-BHv9E1Y2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tft-crispr-forms-index-BHv9E1Y2.mjs","sources":["../../../../libs/crispr-forms/src/lib/ui/slider-field/slider-field.component.ts","../../../../libs/crispr-forms/src/lib/ui/slider-field/slider-field.component.html"],"sourcesContent":["/* eslint-disable @nx/enforce-module-boundaries */\nimport { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';\nimport { MatSliderModule } from '@angular/material/slider';\n\nimport { ReactiveFormsModule } from '@angular/forms';\n// import { FormValidationHandlerModule } from '@tft/form-validation-handler';\nimport { FieldContainerComponent } from '../field-container';\nimport { InfoComponent } from '../info';\nimport {\n SliderFieldConfig\n} from '../../utils';\nimport { CrisprControlComponent } from '../../utils/abstracts/crispr-control.abstract';\n\nconst defaultConfig: Partial<SliderFieldConfig> = { \n displayLimits: true,\n displayWith: (val) => val,\n};\n\n\n@Component({\n selector: 'crispr-slider-field',\n templateUrl: './slider-field.component.html',\n styleUrls: ['./slider-field.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n InfoComponent,\n FieldContainerComponent,\n ReactiveFormsModule,\n MatSliderModule\n ],\n standalone: true\n})\nexport class SliderFieldComponent extends CrisprControlComponent<SliderFieldConfig> implements OnInit {\n defaultConfig = defaultConfig;\n constructor() {\n super();\n }\n\n ngOnInit() {\n super.ngOnInit();\n }\n}\n","<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n @if (config().label) {\n <label>\n {{config().label}}\n @if (config().info) {\n <crispr-info\n [info]=\"config().info\">\n </crispr-info>\n }\n </label>\n }\n <div class=\"slider-container\">\n @if (config().displayLimits) {\n <span>\n {{config().min}}\n </span>\n }\n <mat-slider\n [discrete]=\"config().discrete\"\n [displayWith]=\"config().displayWith\"\n class=\"example-margin\"\n [formGroup]=\"group()\"\n [max]=\"config().max\"\n [min]=\"config().min\"\n [step]=\"config().step\">\n <input matSliderThumb\n [formControlName]=\"config().controlName\">\n </mat-slider>\n @if (config().displayLimits) {\n <span>\n {{config().max}}\n </span>\n }\n </div>\n\n</crispr-field-container>\n\n"],"names":[],"mappings":";;;;;;;;AAAA;AAaA,MAAM,aAAa,GAA+B;AAChD,IAAA,aAAa,EAAE,IAAI;AACnB,IAAA,WAAW,EAAE,CAAC,GAAG,KAAK,GAAG;CAC1B;AAgBK,MAAO,oBAAqB,SAAQ,sBAAyC,CAAA;AAEjF,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QAFT,IAAA,CAAA,aAAa,GAAG,aAAa;IAG7B;IAEA,QAAQ,GAAA;QACN,KAAK,CAAC,QAAQ,EAAE;IAClB;8GARW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChCjC,k5BAuCA,EAAA,MAAA,EAAA,CAAA,0FAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDdQ,aAAa,0EACb,uBAAuB,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACvB,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,eAAA,EAAA,KAAA,EAAA,OAAA,EAAA,eAAA,EAAA,KAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,mBAAA,EAAA,IAAA,EAAA,CAAA,CAAA;;2FAIV,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAbhC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,eAAA,EAGd,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACL,aAAa;wBACb,uBAAuB;wBACvB,mBAAmB;wBACnB;AACH,qBAAA,EAAA,UAAA,EACW,IAAI,EAAA,QAAA,EAAA,k5BAAA,EAAA,MAAA,EAAA,CAAA,0FAAA,CAAA,EAAA;;;;;"}
@@ -0,0 +1,68 @@
1
+ import * as i0 from '@angular/core';
2
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import * as i1 from '@angular/material/datepicker';
4
+ import { MatDatepickerModule } from '@angular/material/datepicker';
5
+ import { MatDateFnsModule } from '@angular/material-date-fns-adapter';
6
+ import { of } from 'rxjs';
7
+ import * as i5 from '@angular/cdk/portal';
8
+ import { ComponentPortal, PortalModule } from '@angular/cdk/portal';
9
+ import * as i2 from '@angular/material/form-field';
10
+ import { MatFormFieldModule } from '@angular/material/form-field';
11
+ import * as i1$2 from '@angular/common';
12
+ import { CommonModule } from '@angular/common';
13
+ import * as i1$1 from '@angular/forms';
14
+ import { ReactiveFormsModule } from '@angular/forms';
15
+ import * as i3 from '@angular/material/input';
16
+ import { MatInputModule } from '@angular/material/input';
17
+ import * as i6 from '@tft/form-validation-handler';
18
+ import { FormValidationHandlerModule } from '@tft/form-validation-handler';
19
+ import { CrisprControlComponent, FieldContainerComponent } from './tft-crispr-forms.mjs';
20
+
21
+ /* eslint-disable @nx/enforce-module-boundaries */
22
+ const defaultConfig = {
23
+ startView: 'month',
24
+ };
25
+ class DatepickerFieldComponent extends CrisprControlComponent {
26
+ constructor() {
27
+ super(...arguments);
28
+ this.defaultConfig = defaultConfig;
29
+ }
30
+ ngOnInit() {
31
+ super.ngOnInit();
32
+ const config = this.config();
33
+ this.startAt$ =
34
+ config.startAt instanceof Date
35
+ ? of(config.startAt)
36
+ : config.startAt instanceof Function
37
+ ? config.startAt(this.group())
38
+ : of(null);
39
+ this.dateClass = config?.cellClassFunction || null;
40
+ this.dateClass$ = config.dateClass
41
+ ? config?.dateClass(this.group())
42
+ : of(() => '');
43
+ }
44
+ ngAfterContentInit() {
45
+ if (this.config().datepickerActions) {
46
+ this.calendarFooterPortal = new ComponentPortal(this.config().datepickerActions);
47
+ }
48
+ }
49
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: DatepickerFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
50
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: DatepickerFieldComponent, isStandalone: true, selector: "crispr-datepicker-field", usesInheritance: true, ngImport: i0, template: "<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n <mat-form-field\n [color]=\"config().color\"\n [appearance]=\"config().appearance\"\n [formGroup]=\"group()\">\n @if (config().label) {<mat-label>{{config().label}}</mat-label>}\n <input\n matInput\n [formControlName]=\"config().controlName\"\n [min]=\"config().min\"\n [max]=\"config().max\"\n [matDatepicker]=\"picker\"\n [matDatepickerFilter]=\"config().datepickerFilter\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker\n [touchUi]=\"config().touchUi\"\n [startView]=\"config().startView\"\n [startAt]=\"startAt$ | async\"\n [dateClass]=\"dateClass || (dateClass$ | async)\"\n #picker>\n @if (calendarFooterPortal) {\n <mat-datepicker-actions>\n <ng-template [cdkPortalOutlet]=\"calendarFooterPortal\"></ng-template>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n\n @if (config().hint && (control().valid || !control().touched)) {<mat-hint>{{config().hint}}</mat-hint>}\n\n </mat-form-field>\n</crispr-field-container>\n\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: FieldContainerComponent, selector: "crispr-field-container", inputs: ["config", "group", "inlineField"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i1.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i1.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i1.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i1.MatDatepickerActions, selector: "mat-datepicker-actions, mat-date-range-picker-actions" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatDateFnsModule }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i5.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "ngmodule", type: FormValidationHandlerModule }, { kind: "directive", type: i6.ControlErrorsDirective, selector: "[formControl], [formControlName]" }, { kind: "directive", type: i6.ControlErrorContainerDirective, selector: "[controlErrorContainer], [formGroup]" }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true }); }
51
+ }
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: DatepickerFieldComponent, decorators: [{
53
+ type: Component,
54
+ args: [{ selector: 'crispr-datepicker-field', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
55
+ CommonModule,
56
+ FieldContainerComponent,
57
+ MatDatepickerModule,
58
+ MatFormFieldModule,
59
+ ReactiveFormsModule,
60
+ MatInputModule,
61
+ MatDateFnsModule,
62
+ PortalModule,
63
+ FormValidationHandlerModule,
64
+ ], standalone: true, template: "<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n <mat-form-field\n [color]=\"config().color\"\n [appearance]=\"config().appearance\"\n [formGroup]=\"group()\">\n @if (config().label) {<mat-label>{{config().label}}</mat-label>}\n <input\n matInput\n [formControlName]=\"config().controlName\"\n [min]=\"config().min\"\n [max]=\"config().max\"\n [matDatepicker]=\"picker\"\n [matDatepickerFilter]=\"config().datepickerFilter\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker\n [touchUi]=\"config().touchUi\"\n [startView]=\"config().startView\"\n [startAt]=\"startAt$ | async\"\n [dateClass]=\"dateClass || (dateClass$ | async)\"\n #picker>\n @if (calendarFooterPortal) {\n <mat-datepicker-actions>\n <ng-template [cdkPortalOutlet]=\"calendarFooterPortal\"></ng-template>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n\n @if (config().hint && (control().valid || !control().touched)) {<mat-hint>{{config().hint}}</mat-hint>}\n\n </mat-form-field>\n</crispr-field-container>\n\n" }]
65
+ }] });
66
+
67
+ export { DatepickerFieldComponent };
68
+ //# sourceMappingURL=tft-crispr-forms-index-BIhGbdgn.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tft-crispr-forms-index-BIhGbdgn.mjs","sources":["../../../../libs/crispr-forms/src/lib/ui/datepicker-field/datepicker-field.component.ts","../../../../libs/crispr-forms/src/lib/ui/datepicker-field/datepicker-field.component.html"],"sourcesContent":["/* eslint-disable @nx/enforce-module-boundaries */\nimport {\n Component,\n OnInit,\n ChangeDetectionStrategy,\n AfterContentInit,\n} from '@angular/core';\nimport {\n MatCalendarCellClassFunction,\n MatDatepickerModule,\n} from '@angular/material/datepicker';\nimport { MatDateFnsModule } from '@angular/material-date-fns-adapter';\nimport { Observable, of } from 'rxjs';\nimport { ComponentPortal, Portal, PortalModule } from '@angular/cdk/portal';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatInputModule } from '@angular/material/input';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\nimport { FieldContainerComponent } from '../field-container';\nimport {\n DatepickerFieldConfig,\n} from '../../utils';\nimport { CrisprControlComponent } from '../../utils/abstracts/crispr-control.abstract';\n\nconst defaultConfig: Partial<DatepickerFieldConfig> = {\n startView: 'month',\n};\n\n@Component({\n selector: 'crispr-datepicker-field',\n templateUrl: './datepicker-field.component.html',\n styleUrls: ['./datepicker-field.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n FieldContainerComponent,\n MatDatepickerModule,\n MatFormFieldModule,\n ReactiveFormsModule,\n MatInputModule,\n MatDateFnsModule,\n PortalModule,\n FormValidationHandlerModule,\n ],\n standalone: true\n})\nexport class DatepickerFieldComponent\n extends CrisprControlComponent<DatepickerFieldConfig>\n implements OnInit, AfterContentInit\n{\n defaultConfig = defaultConfig;\n\n dateClass: MatCalendarCellClassFunction<Date>;\n dateClass$: Observable<MatCalendarCellClassFunction<Date>>;\n startAt$: Observable<Date>;\n\n /** A portal containing the footer component type for this calendar. */\n calendarFooterPortal: Portal<any>;\n\n ngOnInit() {\n super.ngOnInit();\n const config = this.config();\n this.startAt$ =\n config.startAt instanceof Date\n ? of(config.startAt)\n : config.startAt instanceof Function\n ? config.startAt(this.group())\n : of(null);\n this.dateClass = config?.cellClassFunction || null;\n this.dateClass$ = config.dateClass\n ? config?.dateClass(this.group())\n : of(() => '');\n }\n\n ngAfterContentInit() {\n if (this.config().datepickerActions) {\n this.calendarFooterPortal = new ComponentPortal(\n this.config().datepickerActions\n );\n }\n }\n\n // handleSelectedChange(event, picker: MatDatepicker<unknown>) {\n // console.log({event, picker})\n // if(this.config.selectedChange) {\n // this.config.selectedChange(event, picker);\n // }\n // }\n}\n","<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n <mat-form-field\n [color]=\"config().color\"\n [appearance]=\"config().appearance\"\n [formGroup]=\"group()\">\n @if (config().label) {<mat-label>{{config().label}}</mat-label>}\n <input\n matInput\n [formControlName]=\"config().controlName\"\n [min]=\"config().min\"\n [max]=\"config().max\"\n [matDatepicker]=\"picker\"\n [matDatepickerFilter]=\"config().datepickerFilter\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker\n [touchUi]=\"config().touchUi\"\n [startView]=\"config().startView\"\n [startAt]=\"startAt$ | async\"\n [dateClass]=\"dateClass || (dateClass$ | async)\"\n #picker>\n @if (calendarFooterPortal) {\n <mat-datepicker-actions>\n <ng-template [cdkPortalOutlet]=\"calendarFooterPortal\"></ng-template>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n\n @if (config().hint && (control().valid || !control().touched)) {<mat-hint>{{config().hint}}</mat-hint>}\n\n </mat-form-field>\n</crispr-field-container>\n\n"],"names":["i4","i7"],"mappings":"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"}