@tft/crispr-forms 12.2.22 → 13.0.3

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 (339) hide show
  1. package/README.md +9 -69
  2. package/esm2020/index.mjs +2 -0
  3. package/esm2020/lib/abstracts/autocomplete-field.abstract.mjs +30 -0
  4. package/esm2020/lib/abstracts/crispr-control.mixin.mjs +27 -0
  5. package/esm2020/lib/abstracts/crispr-field.abstract.mjs +17 -0
  6. package/esm2020/lib/abstracts/index.mjs +4 -0
  7. package/esm2020/lib/crispr-forms.module.mjs +66 -0
  8. package/esm2020/lib/field-component-map.const.mjs +25 -0
  9. package/esm2020/lib/field-container/field-container.component.mjs +85 -0
  10. package/esm2020/lib/field-container/index.mjs +2 -0
  11. package/esm2020/lib/field.directive.mjs +77 -0
  12. package/esm2020/lib/form/form.component.mjs +54 -0
  13. package/esm2020/lib/form-group-list/form-group-list.component.mjs +51 -0
  14. package/esm2020/lib/form-group-list/form-group-list.module.mjs +54 -0
  15. package/esm2020/lib/form-group-list/index.mjs +3 -0
  16. package/esm2020/lib/form.helpers.mjs +185 -0
  17. package/esm2020/lib/form.operators.mjs +24 -0
  18. package/esm2020/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.mjs +111 -0
  19. package/esm2020/lib/material/autocomplete-field/autocomplete-field.component.mjs +70 -0
  20. package/esm2020/lib/material/button/button.component.mjs +35 -0
  21. package/esm2020/lib/material/checkbox-field/checkbox-field.component.mjs +31 -0
  22. package/esm2020/lib/material/datepicker-field/datepicker-field.component.mjs +45 -0
  23. package/esm2020/lib/material/divider/divider.component.mjs +22 -0
  24. package/esm2020/lib/material/file-upload/file-dropzone.directive.mjs +39 -0
  25. package/esm2020/lib/material/file-upload/file-upload.component.mjs +145 -0
  26. package/esm2020/lib/material/file-upload/index.mjs +3 -0
  27. package/esm2020/lib/material/heading/heading.component.mjs +54 -0
  28. package/esm2020/lib/material/image-upload-field/image-compression.helpers.mjs +4 -0
  29. package/esm2020/lib/material/image-upload-field/image-upload-field.component.mjs +233 -0
  30. package/esm2020/lib/material/image-upload-field/index.mjs +2 -0
  31. package/esm2020/lib/material/index.mjs +18 -0
  32. package/esm2020/lib/material/info/info.component.mjs +46 -0
  33. package/esm2020/lib/material/input-field/input-field.component.mjs +27 -0
  34. package/esm2020/lib/material/material.module.mjs +200 -0
  35. package/esm2020/lib/material/option/index.mjs +2 -0
  36. package/esm2020/lib/material/option/option.component.mjs +14 -0
  37. package/esm2020/lib/material/radio-field/radio-field.component.mjs +29 -0
  38. package/esm2020/lib/material/select-field/select-field.component.mjs +58 -0
  39. package/esm2020/lib/material/selected-file/selected-file.component.mjs +47 -0
  40. package/esm2020/lib/material/slider-field/slider-field.component.mjs +30 -0
  41. package/esm2020/lib/material/textarea-field/textarea-field.component.mjs +28 -0
  42. package/esm2020/lib/material/unit-conversion-field/unit-conversion-field.component.mjs +69 -0
  43. package/esm2020/lib/models/autocomplete-chiplist-field.config.mjs +2 -0
  44. package/esm2020/lib/models/autocomplete-field.config.mjs +2 -0
  45. package/esm2020/lib/models/button.config.mjs +2 -0
  46. package/esm2020/lib/models/checkbox-field.config.mjs +2 -0
  47. package/esm2020/lib/models/crispr-field.config.mjs +23 -0
  48. package/esm2020/lib/models/datepicker-field.config.mjs +2 -0
  49. package/esm2020/lib/models/divider.config.mjs +2 -0
  50. package/esm2020/lib/models/file-upload-field.config.mjs +2 -0
  51. package/esm2020/lib/models/form-group-list.config.mjs +2 -0
  52. package/esm2020/lib/models/heading.config.mjs +3 -0
  53. package/esm2020/lib/models/image-upload-field.config.mjs +2 -0
  54. package/esm2020/lib/models/index.mjs +18 -0
  55. package/esm2020/lib/models/input-field.config.mjs +2 -0
  56. package/esm2020/lib/models/radio-field.config.mjs +2 -0
  57. package/esm2020/lib/models/select-field.config.mjs +2 -0
  58. package/esm2020/lib/models/slider-field.config.mjs +2 -0
  59. package/esm2020/lib/models/textarea-field.config.mjs +2 -0
  60. package/esm2020/lib/models/unit-conversion-field.config.mjs +2 -0
  61. package/esm2020/lib/pipes/crispr-pipes.module.mjs +26 -0
  62. package/esm2020/lib/pipes/initial-control-value.pipe.mjs +20 -0
  63. package/esm2020/lib/public_api.mjs +10 -0
  64. package/esm2020/lib/sub-group/index.mjs +3 -0
  65. package/esm2020/lib/sub-group/sub-group.component.mjs +20 -0
  66. package/esm2020/lib/sub-group/sub-group.module.mjs +45 -0
  67. package/esm2020/tft-crispr-forms.mjs +5 -0
  68. package/fesm2015/tft-crispr-forms.mjs +1904 -0
  69. package/fesm2015/tft-crispr-forms.mjs.map +1 -0
  70. package/fesm2020/tft-crispr-forms.mjs +1896 -0
  71. package/fesm2020/tft-crispr-forms.mjs.map +1 -0
  72. package/lib/abstracts/autocomplete-field.abstract.d.ts +4 -1
  73. package/lib/abstracts/crispr-control.mixin.d.ts +1 -1
  74. package/lib/abstracts/crispr-field.abstract.d.ts +4 -1
  75. package/lib/crispr-forms.module.d.ts +14 -0
  76. package/lib/field-component-map.const.d.ts +21 -20
  77. package/lib/field-container/field-container.component.d.ts +11 -1
  78. package/lib/field-container/index.d.ts +1 -0
  79. package/lib/field.directive.d.ts +14 -5
  80. package/lib/form/form.component.d.ts +6 -1
  81. package/lib/form-group-list/form-group-list.component.d.ts +4 -1
  82. package/lib/form-group-list/form-group-list.module.d.ts +15 -0
  83. package/lib/form-group-list/index.d.ts +2 -0
  84. package/lib/form.helpers.d.ts +1 -1
  85. package/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.d.ts +3 -0
  86. package/lib/material/autocomplete-field/autocomplete-field.component.d.ts +3 -0
  87. package/lib/material/button/button.component.d.ts +3 -0
  88. package/lib/material/checkbox-field/checkbox-field.component.d.ts +3 -0
  89. package/lib/material/datepicker-field/datepicker-field.component.d.ts +3 -0
  90. package/lib/material/divider/divider.component.d.ts +3 -0
  91. package/lib/material/file-upload/file-dropzone.directive.d.ts +3 -0
  92. package/lib/material/file-upload/file-upload.component.d.ts +20 -2
  93. package/lib/material/file-upload/index.d.ts +2 -0
  94. package/lib/material/heading/heading.component.d.ts +12 -1
  95. package/lib/material/image-upload-field/image-compression.helpers.d.ts +1 -0
  96. package/lib/material/image-upload-field/image-upload-field.component.d.ts +64 -0
  97. package/lib/material/image-upload-field/index.d.ts +1 -0
  98. package/lib/material/index.d.ts +4 -1
  99. package/lib/material/info/info.component.d.ts +12 -1
  100. package/lib/material/input-field/input-field.component.d.ts +3 -0
  101. package/lib/material/material.module.d.ts +42 -0
  102. package/lib/material/option/index.d.ts +1 -0
  103. package/lib/material/option/option.component.d.ts +3 -0
  104. package/lib/material/radio-field/radio-field.component.d.ts +3 -0
  105. package/lib/material/select-field/select-field.component.d.ts +3 -0
  106. package/lib/material/selected-file/selected-file.component.d.ts +10 -0
  107. package/lib/material/slider-field/slider-field.component.d.ts +3 -0
  108. package/lib/material/textarea-field/textarea-field.component.d.ts +3 -0
  109. package/lib/material/unit-conversion-field/unit-conversion-field.component.d.ts +3 -0
  110. package/lib/models/button.config.d.ts +3 -2
  111. package/lib/models/crispr-field.config.d.ts +5 -6
  112. package/lib/models/file-upload-field.config.d.ts +4 -3
  113. package/lib/models/image-upload-field.config.d.ts +47 -0
  114. package/lib/models/index.d.ts +2 -0
  115. package/lib/models/radio-field.config.d.ts +1 -1
  116. package/lib/pipes/crispr-pipes.module.d.ts +8 -0
  117. package/lib/pipes/initial-control-value.pipe.d.ts +3 -0
  118. package/lib/public_api.d.ts +1 -0
  119. package/lib/sub-group/index.d.ts +2 -0
  120. package/lib/sub-group/sub-group.component.d.ts +3 -0
  121. package/lib/sub-group/sub-group.module.d.ts +12 -0
  122. package/package.json +30 -15
  123. package/tft-crispr-forms-13.0.3.tgz +0 -0
  124. package/tft-crispr-forms.d.ts +1 -25
  125. package/bundles/tft-crispr-forms.umd.js +0 -1722
  126. package/bundles/tft-crispr-forms.umd.js.map +0 -1
  127. package/esm2015/index.js +0 -2
  128. package/esm2015/index.js.map +0 -1
  129. package/esm2015/index.metadata.json +0 -1
  130. package/esm2015/lib/abstracts/autocomplete-field.abstract.js +0 -27
  131. package/esm2015/lib/abstracts/autocomplete-field.abstract.js.map +0 -1
  132. package/esm2015/lib/abstracts/autocomplete-field.abstract.metadata.json +0 -1
  133. package/esm2015/lib/abstracts/crispr-control.mixin.js +0 -27
  134. package/esm2015/lib/abstracts/crispr-control.mixin.js.map +0 -1
  135. package/esm2015/lib/abstracts/crispr-control.mixin.metadata.json +0 -1
  136. package/esm2015/lib/abstracts/crispr-field.abstract.js +0 -14
  137. package/esm2015/lib/abstracts/crispr-field.abstract.js.map +0 -1
  138. package/esm2015/lib/abstracts/crispr-field.abstract.metadata.json +0 -1
  139. package/esm2015/lib/abstracts/index.js +0 -4
  140. package/esm2015/lib/abstracts/index.js.map +0 -1
  141. package/esm2015/lib/abstracts/index.metadata.json +0 -1
  142. package/esm2015/lib/crispr-forms.module.js +0 -41
  143. package/esm2015/lib/crispr-forms.module.js.map +0 -1
  144. package/esm2015/lib/crispr-forms.module.metadata.json +0 -1
  145. package/esm2015/lib/crispr-forms.module.ngfactory.js.map +0 -1
  146. package/esm2015/lib/field-component-map.const.js +0 -28
  147. package/esm2015/lib/field-component-map.const.js.map +0 -1
  148. package/esm2015/lib/field-component-map.const.metadata.json +0 -1
  149. package/esm2015/lib/field-container/field-container.component.js +0 -57
  150. package/esm2015/lib/field-container/field-container.component.js.map +0 -1
  151. package/esm2015/lib/field-container/field-container.component.metadata.json +0 -1
  152. package/esm2015/lib/field-container/field-container.component.ngfactory.js.map +0 -1
  153. package/esm2015/lib/field-container/field-container.component.scss.shim.ngstyle.js.map +0 -1
  154. package/esm2015/lib/field.directive.js +0 -55
  155. package/esm2015/lib/field.directive.js.map +0 -1
  156. package/esm2015/lib/field.directive.metadata.json +0 -1
  157. package/esm2015/lib/field.directive.ngfactory.js.map +0 -1
  158. package/esm2015/lib/form/form.component.js +0 -40
  159. package/esm2015/lib/form/form.component.js.map +0 -1
  160. package/esm2015/lib/form/form.component.metadata.json +0 -1
  161. package/esm2015/lib/form/form.component.ngfactory.js.map +0 -1
  162. package/esm2015/lib/form/form.component.scss.shim.ngstyle.js.map +0 -1
  163. package/esm2015/lib/form-group-list/form-group-list.component.js +0 -44
  164. package/esm2015/lib/form-group-list/form-group-list.component.js.map +0 -1
  165. package/esm2015/lib/form-group-list/form-group-list.component.metadata.json +0 -1
  166. package/esm2015/lib/form-group-list/form-group-list.component.ngfactory.js.map +0 -1
  167. package/esm2015/lib/form-group-list/form-group-list.component.scss.shim.ngstyle.js.map +0 -1
  168. package/esm2015/lib/form.helpers.js +0 -186
  169. package/esm2015/lib/form.helpers.js.map +0 -1
  170. package/esm2015/lib/form.helpers.metadata.json +0 -1
  171. package/esm2015/lib/form.operators.js +0 -24
  172. package/esm2015/lib/form.operators.js.map +0 -1
  173. package/esm2015/lib/form.operators.metadata.json +0 -1
  174. package/esm2015/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.js +0 -101
  175. package/esm2015/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.js.map +0 -1
  176. package/esm2015/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.metadata.json +0 -1
  177. package/esm2015/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.ngfactory.js.map +0 -1
  178. package/esm2015/lib/material/autocomplete-chiplist-field/autocomplete-chiplist-field.component.scss.shim.ngstyle.js.map +0 -1
  179. package/esm2015/lib/material/autocomplete-field/autocomplete-field.component.js +0 -60
  180. package/esm2015/lib/material/autocomplete-field/autocomplete-field.component.js.map +0 -1
  181. package/esm2015/lib/material/autocomplete-field/autocomplete-field.component.metadata.json +0 -1
  182. package/esm2015/lib/material/autocomplete-field/autocomplete-field.component.ngfactory.js.map +0 -1
  183. package/esm2015/lib/material/autocomplete-field/autocomplete-field.component.scss.shim.ngstyle.js.map +0 -1
  184. package/esm2015/lib/material/button/button.component.js +0 -30
  185. package/esm2015/lib/material/button/button.component.js.map +0 -1
  186. package/esm2015/lib/material/button/button.component.metadata.json +0 -1
  187. package/esm2015/lib/material/button/button.component.ngfactory.js.map +0 -1
  188. package/esm2015/lib/material/button/button.component.scss.shim.ngstyle.js.map +0 -1
  189. package/esm2015/lib/material/checkbox-field/checkbox-field.component.js +0 -25
  190. package/esm2015/lib/material/checkbox-field/checkbox-field.component.js.map +0 -1
  191. package/esm2015/lib/material/checkbox-field/checkbox-field.component.metadata.json +0 -1
  192. package/esm2015/lib/material/checkbox-field/checkbox-field.component.ngfactory.js.map +0 -1
  193. package/esm2015/lib/material/checkbox-field/checkbox-field.component.scss.shim.ngstyle.js.map +0 -1
  194. package/esm2015/lib/material/datepicker-field/datepicker-field.component.js +0 -45
  195. package/esm2015/lib/material/datepicker-field/datepicker-field.component.js.map +0 -1
  196. package/esm2015/lib/material/datepicker-field/datepicker-field.component.metadata.json +0 -1
  197. package/esm2015/lib/material/datepicker-field/datepicker-field.component.ngfactory.js.map +0 -1
  198. package/esm2015/lib/material/datepicker-field/datepicker-field.component.scss.shim.ngstyle.js.map +0 -1
  199. package/esm2015/lib/material/divider/divider.component.js +0 -20
  200. package/esm2015/lib/material/divider/divider.component.js.map +0 -1
  201. package/esm2015/lib/material/divider/divider.component.metadata.json +0 -1
  202. package/esm2015/lib/material/divider/divider.component.ngfactory.js.map +0 -1
  203. package/esm2015/lib/material/divider/divider.component.scss.shim.ngstyle.js.map +0 -1
  204. package/esm2015/lib/material/file-upload/file-dropzone.directive.js +0 -31
  205. package/esm2015/lib/material/file-upload/file-dropzone.directive.js.map +0 -1
  206. package/esm2015/lib/material/file-upload/file-dropzone.directive.metadata.json +0 -1
  207. package/esm2015/lib/material/file-upload/file-dropzone.directive.ngfactory.js.map +0 -1
  208. package/esm2015/lib/material/file-upload/file-upload.component.js +0 -80
  209. package/esm2015/lib/material/file-upload/file-upload.component.js.map +0 -1
  210. package/esm2015/lib/material/file-upload/file-upload.component.metadata.json +0 -1
  211. package/esm2015/lib/material/file-upload/file-upload.component.ngfactory.js.map +0 -1
  212. package/esm2015/lib/material/file-upload/file-upload.component.scss.shim.ngstyle.js.map +0 -1
  213. package/esm2015/lib/material/heading/heading.component.js +0 -23
  214. package/esm2015/lib/material/heading/heading.component.js.map +0 -1
  215. package/esm2015/lib/material/heading/heading.component.metadata.json +0 -1
  216. package/esm2015/lib/material/heading/heading.component.ngfactory.js.map +0 -1
  217. package/esm2015/lib/material/heading/heading.component.scss.shim.ngstyle.js.map +0 -1
  218. package/esm2015/lib/material/index.js +0 -15
  219. package/esm2015/lib/material/index.js.map +0 -1
  220. package/esm2015/lib/material/index.metadata.json +0 -1
  221. package/esm2015/lib/material/info/info.component.js +0 -15
  222. package/esm2015/lib/material/info/info.component.js.map +0 -1
  223. package/esm2015/lib/material/info/info.component.metadata.json +0 -1
  224. package/esm2015/lib/material/info/info.component.ngfactory.js.map +0 -1
  225. package/esm2015/lib/material/info/info.component.scss.shim.ngstyle.js.map +0 -1
  226. package/esm2015/lib/material/input-field/input-field.component.js +0 -22
  227. package/esm2015/lib/material/input-field/input-field.component.js.map +0 -1
  228. package/esm2015/lib/material/input-field/input-field.component.metadata.json +0 -1
  229. package/esm2015/lib/material/input-field/input-field.component.ngfactory.js.map +0 -1
  230. package/esm2015/lib/material/input-field/input-field.component.scss.shim.ngstyle.js.map +0 -1
  231. package/esm2015/lib/material/material.module.js +0 -107
  232. package/esm2015/lib/material/material.module.js.map +0 -1
  233. package/esm2015/lib/material/material.module.metadata.json +0 -1
  234. package/esm2015/lib/material/material.module.ngfactory.js.map +0 -1
  235. package/esm2015/lib/material/option/option.component.js +0 -15
  236. package/esm2015/lib/material/option/option.component.js.map +0 -1
  237. package/esm2015/lib/material/option/option.component.metadata.json +0 -1
  238. package/esm2015/lib/material/option/option.component.ngfactory.js.map +0 -1
  239. package/esm2015/lib/material/option/option.component.scss.shim.ngstyle.js.map +0 -1
  240. package/esm2015/lib/material/radio-field/radio-field.component.js +0 -25
  241. package/esm2015/lib/material/radio-field/radio-field.component.js.map +0 -1
  242. package/esm2015/lib/material/radio-field/radio-field.component.metadata.json +0 -1
  243. package/esm2015/lib/material/radio-field/radio-field.component.ngfactory.js.map +0 -1
  244. package/esm2015/lib/material/radio-field/radio-field.component.scss.shim.ngstyle.js.map +0 -1
  245. package/esm2015/lib/material/select-field/select-field.component.js +0 -50
  246. package/esm2015/lib/material/select-field/select-field.component.js.map +0 -1
  247. package/esm2015/lib/material/select-field/select-field.component.metadata.json +0 -1
  248. package/esm2015/lib/material/select-field/select-field.component.ngfactory.js.map +0 -1
  249. package/esm2015/lib/material/select-field/select-field.component.scss.shim.ngstyle.js.map +0 -1
  250. package/esm2015/lib/material/selected-file/selected-file.component.js +0 -17
  251. package/esm2015/lib/material/selected-file/selected-file.component.js.map +0 -1
  252. package/esm2015/lib/material/selected-file/selected-file.component.metadata.json +0 -1
  253. package/esm2015/lib/material/selected-file/selected-file.component.ngfactory.js.map +0 -1
  254. package/esm2015/lib/material/selected-file/selected-file.component.scss.shim.ngstyle.js.map +0 -1
  255. package/esm2015/lib/material/slider-field/slider-field.component.js +0 -26
  256. package/esm2015/lib/material/slider-field/slider-field.component.js.map +0 -1
  257. package/esm2015/lib/material/slider-field/slider-field.component.metadata.json +0 -1
  258. package/esm2015/lib/material/slider-field/slider-field.component.ngfactory.js.map +0 -1
  259. package/esm2015/lib/material/slider-field/slider-field.component.scss.shim.ngstyle.js.map +0 -1
  260. package/esm2015/lib/material/textarea-field/textarea-field.component.js +0 -22
  261. package/esm2015/lib/material/textarea-field/textarea-field.component.js.map +0 -1
  262. package/esm2015/lib/material/textarea-field/textarea-field.component.metadata.json +0 -1
  263. package/esm2015/lib/material/textarea-field/textarea-field.component.ngfactory.js.map +0 -1
  264. package/esm2015/lib/material/textarea-field/textarea-field.component.scss.shim.ngstyle.js.map +0 -1
  265. package/esm2015/lib/material/unit-conversion-field/unit-conversion-field.component.js +0 -63
  266. package/esm2015/lib/material/unit-conversion-field/unit-conversion-field.component.js.map +0 -1
  267. package/esm2015/lib/material/unit-conversion-field/unit-conversion-field.component.metadata.json +0 -1
  268. package/esm2015/lib/material/unit-conversion-field/unit-conversion-field.component.ngfactory.js.map +0 -1
  269. package/esm2015/lib/material/unit-conversion-field/unit-conversion-field.component.scss.shim.ngstyle.js.map +0 -1
  270. package/esm2015/lib/models/autocomplete-chiplist-field.config.js +0 -2
  271. package/esm2015/lib/models/autocomplete-chiplist-field.config.js.map +0 -1
  272. package/esm2015/lib/models/autocomplete-chiplist-field.config.metadata.json +0 -1
  273. package/esm2015/lib/models/autocomplete-field.config.js +0 -2
  274. package/esm2015/lib/models/autocomplete-field.config.js.map +0 -1
  275. package/esm2015/lib/models/autocomplete-field.config.metadata.json +0 -1
  276. package/esm2015/lib/models/button.config.js +0 -2
  277. package/esm2015/lib/models/button.config.js.map +0 -1
  278. package/esm2015/lib/models/button.config.metadata.json +0 -1
  279. package/esm2015/lib/models/checkbox-field.config.js +0 -2
  280. package/esm2015/lib/models/checkbox-field.config.js.map +0 -1
  281. package/esm2015/lib/models/checkbox-field.config.metadata.json +0 -1
  282. package/esm2015/lib/models/crispr-field.config.js +0 -22
  283. package/esm2015/lib/models/crispr-field.config.js.map +0 -1
  284. package/esm2015/lib/models/crispr-field.config.metadata.json +0 -1
  285. package/esm2015/lib/models/datepicker-field.config.js +0 -2
  286. package/esm2015/lib/models/datepicker-field.config.js.map +0 -1
  287. package/esm2015/lib/models/datepicker-field.config.metadata.json +0 -1
  288. package/esm2015/lib/models/divider.config.js +0 -2
  289. package/esm2015/lib/models/divider.config.js.map +0 -1
  290. package/esm2015/lib/models/divider.config.metadata.json +0 -1
  291. package/esm2015/lib/models/file-upload-field.config.js +0 -2
  292. package/esm2015/lib/models/file-upload-field.config.js.map +0 -1
  293. package/esm2015/lib/models/file-upload-field.config.metadata.json +0 -1
  294. package/esm2015/lib/models/form-group-list.config.js +0 -2
  295. package/esm2015/lib/models/form-group-list.config.js.map +0 -1
  296. package/esm2015/lib/models/form-group-list.config.metadata.json +0 -1
  297. package/esm2015/lib/models/heading.config.js +0 -3
  298. package/esm2015/lib/models/heading.config.js.map +0 -1
  299. package/esm2015/lib/models/heading.config.metadata.json +0 -1
  300. package/esm2015/lib/models/index.js +0 -16
  301. package/esm2015/lib/models/index.js.map +0 -1
  302. package/esm2015/lib/models/index.metadata.json +0 -1
  303. package/esm2015/lib/models/input-field.config.js +0 -2
  304. package/esm2015/lib/models/input-field.config.js.map +0 -1
  305. package/esm2015/lib/models/input-field.config.metadata.json +0 -1
  306. package/esm2015/lib/models/radio-field.config.js +0 -2
  307. package/esm2015/lib/models/radio-field.config.js.map +0 -1
  308. package/esm2015/lib/models/radio-field.config.metadata.json +0 -1
  309. package/esm2015/lib/models/select-field.config.js +0 -2
  310. package/esm2015/lib/models/select-field.config.js.map +0 -1
  311. package/esm2015/lib/models/select-field.config.metadata.json +0 -1
  312. package/esm2015/lib/models/slider-field.config.js +0 -2
  313. package/esm2015/lib/models/slider-field.config.js.map +0 -1
  314. package/esm2015/lib/models/slider-field.config.metadata.json +0 -1
  315. package/esm2015/lib/models/textarea-field.config.js +0 -2
  316. package/esm2015/lib/models/textarea-field.config.js.map +0 -1
  317. package/esm2015/lib/models/textarea-field.config.metadata.json +0 -1
  318. package/esm2015/lib/models/unit-conversion-field.config.js +0 -2
  319. package/esm2015/lib/models/unit-conversion-field.config.js.map +0 -1
  320. package/esm2015/lib/models/unit-conversion-field.config.metadata.json +0 -1
  321. package/esm2015/lib/pipes/initial-control-value.pipe.js +0 -16
  322. package/esm2015/lib/pipes/initial-control-value.pipe.js.map +0 -1
  323. package/esm2015/lib/pipes/initial-control-value.pipe.metadata.json +0 -1
  324. package/esm2015/lib/pipes/initial-control-value.pipe.ngfactory.js.map +0 -1
  325. package/esm2015/lib/public_api.js +0 -9
  326. package/esm2015/lib/public_api.js.map +0 -1
  327. package/esm2015/lib/public_api.metadata.json +0 -1
  328. package/esm2015/lib/sub-group/sub-group.component.js +0 -17
  329. package/esm2015/lib/sub-group/sub-group.component.js.map +0 -1
  330. package/esm2015/lib/sub-group/sub-group.component.metadata.json +0 -1
  331. package/esm2015/lib/sub-group/sub-group.component.ngfactory.js.map +0 -1
  332. package/esm2015/lib/sub-group/sub-group.component.scss.shim.ngstyle.js.map +0 -1
  333. package/esm2015/tft-crispr-forms.js +0 -30
  334. package/esm2015/tft-crispr-forms.js.map +0 -1
  335. package/esm2015/tft-crispr-forms.metadata.json +0 -1
  336. package/fesm2015/tft-crispr-forms.js +0 -1266
  337. package/fesm2015/tft-crispr-forms.js.map +0 -1
  338. package/tft-crispr-forms-12.2.22.tgz +0 -0
  339. package/tft-crispr-forms.metadata.json +0 -1
@@ -1,1266 +0,0 @@
1
- import { of, combineLatest, from, isObservable, BehaviorSubject } from 'rxjs';
2
- import { FormGroup, FormArray, FormControl, NgControl, ReactiveFormsModule } from '@angular/forms';
3
- import { map, startWith, debounceTime, distinctUntilChanged, switchMap, tap } from 'rxjs/operators';
4
- import { Directive, Component, ChangeDetectionStrategy, ViewChild, Optional, Self, Input, EventEmitter, Output, HostListener, NgModule, ComponentFactoryResolver, ViewContainerRef, Renderer2, Pipe } from '@angular/core';
5
- import { MatSelectModule } from '@angular/material/select';
6
- import { MatAutocompleteTrigger, MatAutocompleteModule } from '@angular/material/autocomplete';
7
- import { ENTER } from '@angular/cdk/keycodes';
8
- import { ComponentPortal, PortalModule } from '@angular/cdk/portal';
9
- import { CommonModule } from '@angular/common';
10
- import { MatButtonModule } from '@angular/material/button';
11
- import { MatButtonToggleModule } from '@angular/material/button-toggle';
12
- import { MatCheckboxModule } from '@angular/material/checkbox';
13
- import { MatChipsModule } from '@angular/material/chips';
14
- import { MatDatepickerModule } from '@angular/material/datepicker';
15
- import { MatFormFieldModule } from '@angular/material/form-field';
16
- import { MatIconModule } from '@angular/material/icon';
17
- import { MatInputModule } from '@angular/material/input';
18
- import { MatRadioModule } from '@angular/material/radio';
19
- import { MatSlideToggleModule } from '@angular/material/slide-toggle';
20
- import { MatSliderModule } from '@angular/material/slider';
21
- import { MatTooltipModule } from '@angular/material/tooltip';
22
- import { MatDividerModule } from '@angular/material/divider';
23
- import { MatProgressBarModule } from '@angular/material/progress-bar';
24
- import { FormValidationHandlerModule } from '@tft/form-validation-handler';
25
- import { MatMomentDateModule } from '@angular/material-moment-adapter';
26
-
27
- const DEFAULT_EMPTY_OPTIONS_MESSAGE = 'No Items';
28
-
29
- // export type ControlType = keyof typeof FIELD_COMPONENTS;
30
- var ControlType;
31
- (function (ControlType) {
32
- ControlType["AUTOCOMPLETE"] = "autocomplete";
33
- ControlType["AUTOCOMPLETE_CHIPLIST"] = "autocompleteChiplist";
34
- ControlType["BUTTON"] = "button";
35
- ControlType["CHECKBOX"] = "checkbox";
36
- ControlType["CUSTOM"] = "custom";
37
- ControlType["DATEPICKER"] = "datepicker";
38
- ControlType["DIVIDER"] = "divider";
39
- ControlType["FILE_UPLOAD"] = "fileUpload";
40
- ControlType["HEADING"] = "heading";
41
- ControlType["INPUT"] = "input";
42
- ControlType["GROUP_LIST"] = "groupList";
43
- ControlType["RADIO"] = "radio";
44
- ControlType["SELECT"] = "select";
45
- ControlType["SLIDER"] = "slider";
46
- ControlType["SUB_GROUP"] = "subGroup";
47
- ControlType["TEXTAREA"] = "textarea";
48
- ControlType["UNIT_CONVERSION"] = "unitConversion";
49
- })(ControlType || (ControlType = {}));
50
-
51
- ;
52
-
53
- function valueIn(values) {
54
- return map((value) => {
55
- if (value) {
56
- return values.some(v => {
57
- if (isRegex(v)) {
58
- const trimmedStringForRegex = v.substr(1, v.length - 2);
59
- const regex = new RegExp(trimmedStringForRegex);
60
- return regex.test(value);
61
- }
62
- else {
63
- return v === value;
64
- }
65
- });
66
- }
67
- else {
68
- return false;
69
- }
70
- });
71
- }
72
- function isRegex(string) {
73
- return string.startsWith('/') && string.endsWith('/');
74
- }
75
-
76
- /**
77
- * Watches a single control for a list of values, returns true when field value matches any value in list
78
- * unless an evaluate method is found on config, in which case that method is run on the returned boolean value
79
- * @param group the direct parent of the field we want to watch
80
- * @param config
81
- */
82
- function checkControlForValues(group, config) {
83
- // check that all the pieces we need are available
84
- if (config && config.controlName && Array.isArray(config.values)) {
85
- return getValueChanges(group, config.controlName).pipe(
86
- // return a boolean, true if value is in the values being watch for, otherwise false
87
- valueIn(config.values), map((isValueInValues) => {
88
- // since we can only check if the value is in the list of watched values, the evaluate function gives us
89
- // a chance to make other decisions based on if the boolean returned, e.g. return true if value not in watched values
90
- if (config.evaluate && config.evaluate instanceof Function) {
91
- return config.evaluate(isValueInValues);
92
- }
93
- else {
94
- return isValueInValues;
95
- }
96
- }));
97
- }
98
- else {
99
- //
100
- return of(true);
101
- }
102
- }
103
- /**
104
- * Watches a list of fields for individual lists of values returning true when any field contains one
105
- * of the values being watched for, or optionally running a function on the array of resolved booleans
106
- * from the listed fields and returning a boolean
107
- * @param group the form group that has the fields to watch as direct descendants
108
- * @param config the configuration to use when calling the function
109
- */
110
- function checkControlsForValues(group, config) {
111
- // if no config is passed we just want to show the field, so we return an observable of true
112
- if (!config || !config.watchConfigs) {
113
- return of(true);
114
- }
115
- // we run checkControlForValues on every control in the list of WatchConfigs creating
116
- // an array of Observable watching fields for values
117
- const fieldTriggers = config.watchConfigs.map(watchConfig => {
118
- // resolves a boolean, true when field value matches a watched value, otherwise false
119
- return checkControlForValues(group, watchConfig);
120
- });
121
- return combineLatest(fieldTriggers).pipe(startWith([true]), map((booleans) => {
122
- // if the user passed an evaluate function use it
123
- if (config.evaluate && config.evaluate instanceof Function) {
124
- return config.evaluate(booleans);
125
- }
126
- else { // otherwise we return true if any of the watched fields resolve to true
127
- return booleans.some(bool => bool);
128
- }
129
- }));
130
- }
131
- /**
132
- * Watches values on an array of fields, computing their values as they change
133
- * @param group the group to get the fields from, for now it can only be the parent of the computed field
134
- * @param computeFieldsConfig the configuration that drives the computation, holds the names to watch and the
135
- * computation function that get called against the array of values
136
- */
137
- function computeValueFromFields(group, computeFieldsConfig) {
138
- // TODO: better checking
139
- const { controlNamesToWatch } = computeFieldsConfig;
140
- //creates an observable listener for each control in the controlNamesToWatch array
141
- return combineLatest(controlNamesToWatch.map(controlNameToWatch => getValueChanges(group, controlNameToWatch))).pipe(
142
- // each time a watched field values changes a new array of the latest field values is pipe through to the
143
- // compute callback. Which runs the users logic on the values to compute this fields value
144
- map(valuesArray => computeFieldsConfig.computeCallback(valuesArray)));
145
- }
146
- /**
147
- * A simple wrapper for doing error checking around getting the valueChanges observable from a control on a form group
148
- * @param group the form group we want to pull the observable from
149
- * @param controlName the name of the control who's value we want to subscribe to
150
- */
151
- function getValueChanges(group, controlName) {
152
- const control = group.get(controlName);
153
- if (!control) {
154
- throw new Error(`No control with controlName ${controlName}`);
155
- }
156
- return control.valueChanges;
157
- }
158
- /**
159
- * TODO: move to utils library after library is built
160
- * Allows developer to pass an array of operators into the pipe of an Observable.
161
- * Useful for creating function with a variable amount of operators to be run
162
- * @param observable the observable to pass the operators to
163
- * @param operators array of operators to pipe
164
- */
165
- function pipeOperatorsIntoObservable(observable, operators) {
166
- try {
167
- return operators.reduce((obs, op) => {
168
- return obs.pipe(op);
169
- }, observable);
170
- }
171
- catch (_a) {
172
- console.error('Unable to pipe operators into observable');
173
- return of(null);
174
- }
175
- }
176
- function callOptionsIfFunction(options, parentGroup, searchString) {
177
- return options instanceof Function ? options(parentGroup, searchString) : options;
178
- }
179
- /**
180
- * The user can give us select options as an array, a function that resolves to a promise,
181
- * or an observable. This functions consumes any of those and returns an observable that
182
- * resolves an array of options
183
- *
184
- * @param options the options passed in from the config
185
- * @param emptyMessageOption the message to display when the array is empty
186
- */
187
- function observablifyOptions(options, parentGroup, searchString) {
188
- const calledOptions = callOptionsIfFunction(options, parentGroup, searchString);
189
- // if options are a promise
190
- return calledOptions instanceof Promise
191
- // convert to observable
192
- ? from(calledOptions)
193
- // if array that isn't empty
194
- : Array.isArray(calledOptions) && calledOptions.length
195
- // convert to observable
196
- ? of(calledOptions)
197
- // if observable
198
- : isObservable(calledOptions)
199
- // return it
200
- ? calledOptions
201
- // else an empty array
202
- : of([]);
203
- }
204
- /**
205
- * Determines if the field config is for a form control (not a divider, heading or other non-control field)
206
- * */
207
- function isControlConfig(fieldConfig) {
208
- return 'controlName' in fieldConfig;
209
- }
210
- /**
211
- * builds out form group based on config
212
- * @param config a configuration for a form group
213
- * @param value an object of initial values to pass in
214
- * @param group the form group to modify and build out
215
- */
216
- function buildFormGroupFromConfig(config, value = null, group = new FormGroup({})) {
217
- config.fields.forEach((controlConfig) => {
218
- var _a;
219
- if (isControlConfig(controlConfig)) {
220
- // then add a control to the group using the controlName from configuration
221
- const { controlName } = controlConfig;
222
- // if there's a value object and it has a non-null/undefined value for this field use it.
223
- // Otherwise, default to null
224
- const controlValue = (_a = (value && value[controlName])) !== null && _a !== void 0 ? _a : null;
225
- group.addControl(controlName, createControlForType(controlConfig, controlValue));
226
- }
227
- });
228
- group.setValidators(config.validators);
229
- return group;
230
- }
231
- /**
232
- * Analyze the config and build a form control to spec. Notice we don't use FormBuilder here
233
- * as we want to keep this function pure.
234
- * @param controlConfig the configuration object for the control to build
235
- * @param value an initial value to use if passed in
236
- */
237
- function createControlForType(controlConfig, value = null) {
238
- // build form control out based on the control type
239
- const control = controlConfig.controlType === ControlType.SUB_GROUP
240
- ? buildFormGroupFromConfig(controlConfig, value)
241
- : controlConfig.controlType === ControlType.GROUP_LIST
242
- ? new FormArray([], controlConfig.validators)
243
- : new FormControl(value || null, controlConfig.validators);
244
- return control;
245
- }
246
- /**
247
- * A basic filter function that filters the search string against the label of the options object
248
- * @param options the array of options to filter
249
- * @param searchString the string from the input
250
- */
251
- function filterOptionsByLabel(options, searchString) {
252
- return options.filter(option => {
253
- return option.label && option.label.toLowerCase().includes(searchString.toLowerCase());
254
- });
255
- }
256
-
257
- function crisprControlMixin(BaseClass) {
258
- return class extends BaseClass {
259
- set value(value) {
260
- this.setControlValue(value);
261
- this._value = value;
262
- }
263
- get value() {
264
- return this._value;
265
- }
266
- ngOnInit() {
267
- super.ngOnInit();
268
- this.control = this.group.get(this.config.controlName);
269
- this.setControlValue(this.value);
270
- // setTimeouts are ugly but this seems to be the only way to get the computed field to compute initial values
271
- setTimeout(() => {
272
- this.control.updateValueAndValidity();
273
- });
274
- }
275
- setControlValue(value) {
276
- if (value && this.control && this.config.controlType !== ControlType.SUB_GROUP) {
277
- this.control.setValue(value);
278
- }
279
- }
280
- };
281
- }
282
-
283
- // eslint-disable-next-line @angular-eslint/directive-class-suffix
284
- class CrisprFieldComponent {
285
- ngOnInit() {
286
- this.applyDefaultConfig();
287
- }
288
- applyDefaultConfig() {
289
- this.config = this.defaultConfig ? Object.assign(Object.assign({}, this.defaultConfig), this.config) : this.config;
290
- }
291
- }
292
- CrisprFieldComponent.decorators = [
293
- { type: Directive }
294
- ];
295
-
296
- const AbstractAutocompleteFieldMixin = crisprControlMixin(CrisprFieldComponent);
297
- // eslint-disable-next-line @angular-eslint/directive-class-suffix
298
- class AbstractAutocompleteComponent extends AbstractAutocompleteFieldMixin {
299
- constructor() {
300
- super(...arguments);
301
- // we need a separate control for the UI because of the way the material autocomplete chiplist works
302
- this.autocompleteInputControl = new FormControl('');
303
- }
304
- ngOnInit() {
305
- super.ngOnInit();
306
- this.group.addControl(this.config.controlName, new FormControl());
307
- // filter options by the search string using either the default filter function or one passed in through config
308
- this.options$ = this.autocompleteInputControl.valueChanges.pipe(
309
- // this is needed to have the options panel to open on focus
310
- startWith(''), debounceTime(this.config.typeDebounceTime), distinctUntilChanged(), map(searchText => searchText || ''), switchMap((searchText) => observablifyOptions(this.config.options, this.group, searchText)));
311
- }
312
- }
313
- AbstractAutocompleteComponent.decorators = [
314
- { type: Directive }
315
- ];
316
-
317
- const InputFieldMixin = crisprControlMixin(CrisprFieldComponent);
318
- class InputFieldComponent extends InputFieldMixin {
319
- constructor() {
320
- super();
321
- this.defaultConfig = { inputType: 'text' };
322
- }
323
- ngOnInit() {
324
- super.ngOnInit();
325
- }
326
- }
327
- InputFieldComponent.decorators = [
328
- { type: Component, args: [{
329
- selector: 'crispr-input-field',
330
- 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 <mat-label *ngIf=\"config.label\">\n {{config.label}}\n </mat-label>\n <input\n [type]=\"config.inputType\"\n matInput\n [placeholder]=\"config.placeholder\"\n [formControlName]=\"config.controlName\"\n [min]=\"config.min\"\n [max]=\"config.max\"\n [maxlength]=\"config.maxLength\"\n [step]=\"config.step\"\n [autofocus]=\"config.autofocus\"\n [pattern]=\"config.pattern\"\n [spellcheck]=\"config.spellcheck\"\n [autocomplete]=\"config.autoComplete\"\n [autocapitalize]=\"config.autoCapitalize\">\n <span *ngIf=\"config.fieldSuffix\" matSuffix>{{config.fieldSuffix}}</span>\n <crispr-info\n matSuffix\n *ngIf=\"config.info\"\n [info]=\"config.info\">\n </crispr-info>\n\n </mat-form-field>\n\n\n</crispr-field-container>\n",
331
- changeDetection: ChangeDetectionStrategy.OnPush,
332
- styles: [""]
333
- },] }
334
- ];
335
- InputFieldComponent.ctorParameters = () => [];
336
-
337
- const SelectFieldMixin = crisprControlMixin(CrisprFieldComponent);
338
- class SelectFieldComponent extends SelectFieldMixin {
339
- constructor() {
340
- super(...arguments);
341
- this.defaultConfig = {
342
- enableToggleAll: false,
343
- color: 'primary'
344
- };
345
- this.allSelected = false;
346
- }
347
- ngOnInit() {
348
- super.ngOnInit();
349
- // options$ can be passed as an array, promise that resolves array, or observable that resolves array
350
- // this functions accounts for all possibilities and converts to observable that resolves array
351
- this.options$ = observablifyOptions(this.config.options, this.group);
352
- }
353
- ngAfterViewInit() {
354
- var _a, _b;
355
- if (this.config.multiple
356
- && this.config.enableToggleAll
357
- && ((_a = this.selectField.options) === null || _a === void 0 ? void 0 : _a.length) === ((_b = this.value) === null || _b === void 0 ? void 0 : _b.length)) {
358
- this.allSelected = true;
359
- }
360
- }
361
- toggleAll(isSelected) {
362
- if (isSelected) {
363
- this.selectField.options.forEach(option => option.deselect());
364
- }
365
- else {
366
- this.selectField.options.forEach(option => option.select());
367
- }
368
- this.allSelected = !this.allSelected;
369
- }
370
- }
371
- SelectFieldComponent.decorators = [
372
- { type: Component, args: [{
373
- selector: 'crispr-select-field',
374
- template: "<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 <mat-label *ngIf=\"config.label\">\n {{config.label}}\n </mat-label>\n <mat-select\n #selectField\n [formControlName]=\"config.controlName\"\n [placeholder]=\"config.placeholder\"\n [multiple]=\"config.multiple\">\n\n <mat-checkbox\n [color]=\"config.color\"\n [checked]=\"allSelected\"\n *ngIf=\"config?.multiple && config.enableToggleAll\"\n (click)=\"toggleAll(allSelected)\">\n Select All\n </mat-checkbox>\n <mat-option\n *ngFor=\"let option of options$ | async\"\n [value]=\"option.value\">\n <crispr-option [option]=\"option\">\n </crispr-option>\n </mat-option>\n\n </mat-select>\n\n <span *ngIf=\"config.fieldSuffix\" matSuffix>{{config.fieldSuffix}}</span>\n <crispr-info\n *ngIf=\"config.info\"\n matSuffix\n [info]=\"config.info\">\n </crispr-info>\n </mat-form-field>\n\n</crispr-field-container>\n",
375
- changeDetection: ChangeDetectionStrategy.OnPush,
376
- styles: ["mat-checkbox{display:block;padding:16px}"]
377
- },] }
378
- ];
379
- SelectFieldComponent.propDecorators = {
380
- selectField: [{ type: ViewChild, args: ['selectField',] }]
381
- };
382
-
383
- const defaultConfig$8 = {
384
- autoActiveFirstOption: true,
385
- typeDebounceTime: 500,
386
- emptyOptionsMessage: DEFAULT_EMPTY_OPTIONS_MESSAGE
387
- };
388
- class AutocompleteFieldComponent extends AbstractAutocompleteComponent {
389
- constructor() {
390
- super(...arguments);
391
- this.defaultConfig = defaultConfig$8;
392
- }
393
- ngOnInit() {
394
- super.ngOnInit();
395
- }
396
- setControlValue(value) {
397
- if (this.control && value) {
398
- // sets the initial value on the control if one is passed
399
- this.control.setValue(value.value || '');
400
- this.autocompleteInputControl.setValue(value.label || '');
401
- }
402
- }
403
- /**
404
- * The material autocomplete defaults to displaying the options value instead of its label.
405
- * We only have the value from the selected option to work with, so we have to pass the options
406
- * through a function called in the template and return the function that the material displayWith
407
- * input is expecting.
408
- * @param options the array of options to search for option with corresponding value
409
- */
410
- displayLabel(options) {
411
- if (this.config.displayWith) {
412
- return this.config.displayWith(options);
413
- }
414
- return (value) => {
415
- var _a;
416
- const label = !!options && Array.isArray(options)
417
- ? (_a = options.find((option) => JSON.stringify(option.value) === JSON.stringify(value))) === null || _a === void 0 ? void 0 : _a.label : value;
418
- return label;
419
- };
420
- }
421
- handleSelect(event) {
422
- this.control.setValue(event.option.value);
423
- this.autoInputRef.nativeElement.blur();
424
- }
425
- }
426
- AutocompleteFieldComponent.decorators = [
427
- { type: Component, args: [{
428
- selector: 'crispr-autocomplete-field',
429
- 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 <mat-label *ngIf=\"config.label\">\n {{config.label}}\n </mat-label>\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 <span *ngIf=\"config.fieldSuffix\" matSuffix>{{config.fieldSuffix}}</span>\n <crispr-info\n *ngIf=\"config.info\"\n matSuffix\n [info]=\"config.info \">\n </crispr-info>\n\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"config.autoActiveFirstOption\"\n (optionSelected)=\"handleSelect($event)\"\n [displayWith]=\"displayLabel(options$ | async)\">\n\n <ng-container *ngIf=\"options$ | async as options; else emptyOption\">\n <ng-container *ngIf=\"options.length > 0; else emptyOption\">\n <mat-option\n *ngFor=\"let option of options$ | async\"\n [value]=\"option.value\">\n <crispr-option [option]=\"option\"></crispr-option>\n </mat-option>\n </ng-container>\n\n </ng-container>\n <ng-template #emptyOption>\n <mat-option disabled=\"true\">\n {{config.emptyOptionsMessage}}\n </mat-option>\n </ng-template>\n\n </mat-autocomplete>\n </mat-form-field>\n</crispr-field-container>\n",
430
- changeDetection: ChangeDetectionStrategy.OnPush,
431
- styles: [""]
432
- },] }
433
- ];
434
- AutocompleteFieldComponent.propDecorators = {
435
- autoInput: [{ type: ViewChild, args: ['autoInput', { read: MatAutocompleteTrigger },] }],
436
- autoInputRef: [{ type: ViewChild, args: ['autoInput',] }]
437
- };
438
-
439
- const ɵ0 = (chip, option) => chip.value === option.value;
440
- const defaultConfig$7 = {
441
- chipsSelectable: true,
442
- areChipsRemovable: true,
443
- tabToSelect: true,
444
- autoActiveFirstOption: true,
445
- imageUrlParam: 'image',
446
- typeDebounceTime: 500,
447
- allowDuplicates: false,
448
- duplicateCompareFunction: ɵ0,
449
- separatorKeyCodes: [ENTER],
450
- emptyOptionsMessage: DEFAULT_EMPTY_OPTIONS_MESSAGE,
451
- };
452
- class AutocompleteChiplistFieldComponent extends AbstractAutocompleteComponent {
453
- constructor() {
454
- super(...arguments);
455
- this.defaultConfig = defaultConfig$7;
456
- this.chips$ = new BehaviorSubject([]);
457
- this.controlValue$ = this.chips$.pipe(tap(chips => {
458
- this.control.setValue(chips.map(chip => chip.value));
459
- }));
460
- }
461
- ngOnInit() {
462
- super.ngOnInit();
463
- this.remainingOptions$ = combineLatest([
464
- this.chips$,
465
- this.options$
466
- ]).pipe(map(([chips, options]) => {
467
- return this.config.allowDuplicates
468
- ? options
469
- : options === null || options === void 0 ? void 0 : options.filter(option => {
470
- return !chips.some(chip => this.config.duplicateCompareFunction(chip, option));
471
- });
472
- }));
473
- }
474
- setControlValue(value) {
475
- if (value) {
476
- this.chips$.next(value);
477
- }
478
- }
479
- // handles mat selecting
480
- handleSelect(event) {
481
- const selectedOption = event.option.value;
482
- this.chips$.next([...this.chips$.value, selectedOption]);
483
- this.chipInputRef.nativeElement.value = '';
484
- this.autocompleteInputControl.setValue('');
485
- // setTimeout needed because the panel thinks it's still open at this point
486
- setTimeout(() => this.chipInput.openPanel());
487
- }
488
- /**
489
- * To follow ARIA standards we want to select the active option on blur.
490
- * matChipInputAddOnBlur should do this but it causes buggy behaviour
491
- * @param event blur event that triggers the handle blur
492
- */
493
- handleTab(_event) {
494
- if (this.chipInput.activeOption && (this.config.tabToSelect || this.config.addChipOnBlur)) {
495
- const chip = this.chipInput.activeOption.value;
496
- this.chips$.next([...this.chips$.value, chip]);
497
- }
498
- }
499
- /**
500
- * Handles selection via key tokens passed through separatorKeyCodes propert
501
- * NOTE: If TAB is used focus does not move on to next component
502
- * @param event
503
- */
504
- handleTokenEnd(event) {
505
- var _a;
506
- if (this.chipInput.activeOption) {
507
- this.chipInput.activeOption.select();
508
- }
509
- (_a = event.chipInput) === null || _a === void 0 ? void 0 : _a.clear();
510
- }
511
- mapToLabel(option) {
512
- return option ? option.label : '';
513
- }
514
- removeChip(removedChip) {
515
- const remainingChips = this.chips$.value.filter(chip => chip !== removedChip);
516
- this.chips$.next(remainingChips);
517
- }
518
- }
519
- AutocompleteChiplistFieldComponent.decorators = [
520
- { type: Component, args: [{
521
- selector: 'crispr-autocomplete-chiplist-field',
522
- template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field\n [color]=\"config.color\"\n [appearance]=\"config.appearance\">\n <mat-label *ngIf=\"config.label\">\n {{config.label}}\n </mat-label>\n\n <mat-chip-list\n #chipList>\n <mat-chip\n class=\"refinement-chip\"\n *ngFor=\"let chip of controlValue$ | async\"\n [selectable]=\"config.chipsSelectable\"\n [removable]=\"config.areChipsRemovable\"\n (removed)=\"removeChip(chip)\">\n <span *ngIf=\"chip.imageUrl as imageUrl\" class=\"image-container\">\n <img [src]=\"imageUrl\" alt=\"image of {{chip.label}}\">\n </span>\n {{chip.label}}\n <mat-icon\n matChipRemove\n *ngIf=\"config.areChipsRemovable\">\n cancel\n </mat-icon>\n </mat-chip>\n\n <input\n matInput\n [formControl]=\"autocompleteInputControl\"\n [placeholder]=\"config.placeholder\"\n [matChipInputFor]=\"chipList\"\n [matAutocomplete]=\"auto\"\n (keydown.tab)=\"handleTab($event)\"\n [matChipInputSeparatorKeyCodes]=\"config.separatorKeyCodes\"\n (matChipInputTokenEnd)=\"handleTokenEnd($event)\"\n role=\"searchbox\"\n type=\"text\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n #autoInput/>\n <span *ngIf=\"config.fieldSuffix\" matSuffix>{{config.fieldSuffix}}</span>\n <crispr-info\n *ngIf=\"config.info\"\n matSuffix\n [info]=\"config.info \">\n </crispr-info>\n\n </mat-chip-list>\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"this.config.autoActiveFirstOption\"\n (optionSelected)=\"handleSelect($event)\"\n [displayWith]=\"mapToLabel\">\n <ng-container *ngIf=\"remainingOptions$ | async as remainingOptions; else emptyOption\">\n <ng-container *ngIf=\"remainingOptions.length > 0; else emptyOption\">\n <mat-option\n *ngFor=\"let option of remainingOptions$ | async\"\n [value]=\"option\">\n <crispr-option [option]=\"option\"></crispr-option>\n </mat-option>\n </ng-container>\n\n </ng-container>\n <ng-template #emptyOption>\n <mat-option disabled=\"true\">\n {{config.emptyOptionsMessage}}\n </mat-option>\n </ng-template>\n </mat-autocomplete>\n\n\n </mat-form-field>\n</crispr-field-container>\n",
523
- changeDetection: ChangeDetectionStrategy.OnPush,
524
- styles: [".refinement-chip .image-container{width:26px;height:26px;border-radius:50%;overflow:hidden;margin:-2px 4px -2px -8px}.refinement-chip .image-container img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}"]
525
- },] }
526
- ];
527
- AutocompleteChiplistFieldComponent.propDecorators = {
528
- chipInput: [{ type: ViewChild, args: ['autoInput', { read: MatAutocompleteTrigger },] }],
529
- chipInputRef: [{ type: ViewChild, args: ['autoInput',] }]
530
- };
531
-
532
- const defaultConfig$6 = {
533
- labelPosition: 'after',
534
- inline: false
535
- };
536
- const CheckboxFieldMixin = crisprControlMixin(CrisprFieldComponent);
537
- class CheckboxFieldComponent extends CheckboxFieldMixin {
538
- constructor() {
539
- super(...arguments);
540
- this.defaultConfig = defaultConfig$6;
541
- }
542
- ngOnInit() {
543
- super.ngOnInit();
544
- }
545
- }
546
- CheckboxFieldComponent.decorators = [
547
- { type: Component, args: [{
548
- selector: 'crispr-checkbox-field',
549
- template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\"\n [inlineField]=\"config.inline\">\n <div\n [formGroup]=\"group\">\n <mat-checkbox\n [color]=\"config.color\"\n [labelPosition]=\"config.labelPosition\"\n [formControlName]=\"config.controlName\">\n {{config.label}}\n <crispr-info\n matSuffix *ngIf=\"config.info\"\n [info]=\"config.info\">\n </crispr-info>\n </mat-checkbox>\n </div>\n</crispr-field-container>\n",
550
- changeDetection: ChangeDetectionStrategy.OnPush,
551
- styles: [""]
552
- },] }
553
- ];
554
-
555
- const defaultConfig$5 = { rows: 5 };
556
- const TextareaFieldMixin = crisprControlMixin(CrisprFieldComponent);
557
- class TextareaFieldComponent extends TextareaFieldMixin {
558
- constructor() {
559
- super(...arguments);
560
- this.defaultConfig = defaultConfig$5;
561
- }
562
- ngOnInit() {
563
- super.ngOnInit();
564
- }
565
- }
566
- TextareaFieldComponent.decorators = [
567
- { type: Component, args: [{
568
- selector: 'crispr-textarea-field',
569
- 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 <mat-label *ngIf=\"config.label\">\n {{config.label}}\n </mat-label>\n <textarea\n [rows]=\"config.rows\"\n matInput\n [placeholder]=\"config.placeholder\"\n [formControlName]=\"config.controlName\">\n </textarea>\n <span *ngIf=\"config.fieldSuffix\" matSuffix>{{config.fieldSuffix}}</span>\n <crispr-info\n *ngIf=\"config.info\"\n matSuffix\n [info]=\"config.info\">\n </crispr-info>\n </mat-form-field>\n\n</crispr-field-container>\n",
570
- changeDetection: ChangeDetectionStrategy.OnPush,
571
- styles: [""]
572
- },] }
573
- ];
574
-
575
- const defaultConfig$4 = { displayLimits: true };
576
- const SliderFieldMixin = crisprControlMixin(CrisprFieldComponent);
577
- class SliderFieldComponent extends SliderFieldMixin {
578
- constructor() {
579
- super();
580
- this.defaultConfig = defaultConfig$4;
581
- }
582
- get flexDirection() {
583
- return this.config.vertical ? 'column' : 'row';
584
- }
585
- ngOnInit() {
586
- super.ngOnInit();
587
- }
588
- }
589
- SliderFieldComponent.decorators = [
590
- { type: Component, args: [{
591
- selector: 'crispr-slider-field',
592
- template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n <div\n [formGroup]=\"group\">\n <label *ngIf=\"config.label\">\n {{config.label}}\n <crispr-info\n *ngIf=\"config.info\"\n [info]=\"config.info\">\n </crispr-info>\n </label>\n <div class=\"slider-container\"\n [ngStyle]=\"{'flex-direction': flexDirection}\">\n <span *ngIf=\"config.displayLimits\">\n {{config.min}}\n </span>\n <mat-slider\n class=\"example-margin\"\n [formControlName]=\"config.controlName\"\n [invert]=\"config.invert\"\n [max]=\"config.max\"\n [min]=\"config.min\"\n [step]=\"config.step\"\n [thumbLabel]=\"config.thumbLabel\"\n [tickInterval]=\"config.tickInterval\"\n [vertical]=\"config.vertical\">\n </mat-slider>\n <span *ngIf=\"config.displayLimits\">\n {{config.max}}\n </span>\n </div>\n\n </div>\n</crispr-field-container>\n\n",
593
- changeDetection: ChangeDetectionStrategy.OnPush,
594
- styles: [".slider-container{display:flex;align-items:center}.slider-container .mat-slider-horizontal{width:100%}"]
595
- },] }
596
- ];
597
- SliderFieldComponent.ctorParameters = () => [];
598
-
599
- class ButtonComponent extends CrisprFieldComponent {
600
- constructor() {
601
- super(...arguments);
602
- this.defaultConfig = { buttonType: 'raised', type: 'submit' };
603
- }
604
- get matButtonClass() {
605
- return this.config.buttonType ? `mat-${this.config.buttonType}-button` : '';
606
- }
607
- ngOnInit() {
608
- super.ngOnInit();
609
- this.formValid$ = this.group.statusChanges.pipe(map(status => status === 'VALID'), startWith(this.group.valid));
610
- }
611
- handleClick(group, event) {
612
- if (this.config.callback) {
613
- this.config.callback(group, event);
614
- }
615
- }
616
- }
617
- ButtonComponent.decorators = [
618
- { type: Component, args: [{
619
- selector: 'crispr-button',
620
- template: "<button\n [formGroup]=\"group\"\n mat-button\n [ngClass]=\"matButtonClass\"\n [color]=\"config.color\"\n [disabled]=\"config.disabledOnInvalidForm && !(formValid$ | async)\"\n [type]=\"config.type\"\n (click)=\"handleClick(group, $event)\"\n [matTooltip]=\"config.info?.content\"\n [matTooltipPosition]=\"config.info?.tooltipPosition || 'below'\">\n {{ config.label }}\n <mat-icon *ngIf=\"config.icon\">\n {{ config.icon}}\n </mat-icon>\n</button>\n\n",
621
- changeDetection: ChangeDetectionStrategy.OnPush,
622
- styles: [""]
623
- },] }
624
- ];
625
-
626
- const defaultConfig$3 = {
627
- startView: 'month',
628
- };
629
- const DatepickerFieldMixin = crisprControlMixin(CrisprFieldComponent);
630
- class DatepickerFieldComponent extends DatepickerFieldMixin {
631
- constructor() {
632
- super(...arguments);
633
- this.defaultConfig = defaultConfig$3;
634
- // handleSelectedChange(event, picker: MatDatepicker<unknown>) {
635
- // console.log({event, picker})
636
- // if(this.config.selectedChange) {
637
- // this.config.selectedChange(event, picker);
638
- // }
639
- // }
640
- }
641
- ngOnInit() {
642
- var _a, _b;
643
- super.ngOnInit();
644
- this.startAt$ = this.config.startAt instanceof Date
645
- ? of(this.config.startAt)
646
- : this.config.startAt instanceof Function
647
- ? this.config.startAt(this.group)
648
- : of(null);
649
- this.dateClass = ((_a = this.config) === null || _a === void 0 ? void 0 : _a.cellClassFunction) || null;
650
- this.dateClass$ = this.config.dateClass ? (_b = this.config) === null || _b === void 0 ? void 0 : _b.dateClass(this.group) : of(() => '');
651
- }
652
- ngAfterContentInit() {
653
- if (this.config.datepickerActions) {
654
- this.calendarFooterPortal = new ComponentPortal(this.config.datepickerActions);
655
- }
656
- }
657
- }
658
- DatepickerFieldComponent.decorators = [
659
- { type: Component, args: [{
660
- selector: 'crispr-datepicker-field',
661
- 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 <mat-label *ngIf=\"config.label\">\n {{config.label}}\n </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 <mat-datepicker-actions *ngIf=\"calendarFooterPortal\">\n <ng-template [cdkPortalOutlet]=\"calendarFooterPortal\"></ng-template>\n </mat-datepicker-actions>\n </mat-datepicker>\n\n </mat-form-field>\n</crispr-field-container>\n\n",
662
- changeDetection: ChangeDetectionStrategy.OnPush,
663
- styles: [""]
664
- },] }
665
- ];
666
-
667
- const FileUploadFieldMixin = crisprControlMixin(CrisprFieldComponent);
668
- class FileUploadComponent extends FileUploadFieldMixin {
669
- // ngControl: NgControl = null;
670
- constructor(ngControl) {
671
- super();
672
- this.ngControl = ngControl;
673
- this.defaultConfig = {
674
- allowMultipleFiles: false,
675
- acceptedTypes: '*.*',
676
- dropZoneText: 'DROP FILE HERE',
677
- selectFilesButtonType: 'button',
678
- selectButtonText: 'SELECT',
679
- showClearFilesButton: true,
680
- clearFilesButtonText: 'CLEAR',
681
- uploadButtonText: 'UPLOAD',
682
- uploadButtonType: 'button',
683
- showUploadProgress: false,
684
- disableOnUpload: true
685
- };
686
- this.isUploaded = false;
687
- this.fileProgress = [];
688
- if (this.ngControl != null) {
689
- // Setting the value accessor directly (instead of using
690
- // the providers) to avoid running into a circular import.
691
- ngControl.valueAccessor = this;
692
- }
693
- }
694
- ngOnInit() {
695
- super.ngOnInit();
696
- this.disabled$ = this.config.disabledCallback
697
- ? this.config.disabledCallback(this.group, this.config)
698
- : of(false);
699
- }
700
- filesChanged(files) {
701
- if (files && files.length > 0) {
702
- this.selectedFiles = files;
703
- this.control.patchValue(files);
704
- }
705
- }
706
- uploadFiles() {
707
- if (this.selectedFiles && this.config.uploadFiles) {
708
- this.isUploaded = true;
709
- this.config.uploadFiles(this.group, this.selectedFiles, this);
710
- }
711
- }
712
- resetFileInput() {
713
- this.fileInputRef.nativeElement.value = '';
714
- this.control.patchValue(null);
715
- this.isUploaded = false;
716
- }
717
- writeValue(value) {
718
- // clear file input
719
- // this.host.nativeElement.value = '';
720
- // this.file = null;
721
- }
722
- registerOnChange(fn) {
723
- this.onChange = fn;
724
- }
725
- registerOnTouched(fn) {
726
- }
727
- }
728
- FileUploadComponent.decorators = [
729
- { type: Component, args: [{
730
- selector: 'crispr-file-upload',
731
- template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n <mat-form-field floatLabel=\"always\"\n [color]=\"config.color\"\n appearance=\"outline\"\n [crisprFileDropzone]=\"!(disabled$ | async) && !(config.disableOnUpload && isUploaded)\"\n [formGroup]=\"group\"\n (fileDrop)=\"filesChanged($event)\">\n\n <input [formControlName]=\"config.controlName\" matInput type=\"text\"/>\n\n <input\n #fileInput\n type=\"file\"\n style=\"display: none\"\n [accept]=\"config.acceptedTypes\"\n [multiple]=\"config.allowMultipleFiles\"\n (change)=\"filesChanged($event.target.files)\"/>\n <mat-label>{{config.label}}</mat-label>\n\n <div *ngIf=\"!(selectedFiles?.length > 0); else selectedFileList\" class=\"drop-info\">\n <mat-icon class=\"drop-icon\" inline=\"true\">cloud_upload</mat-icon>\n <h2 class=\"mat-h2\">{{config.dropZoneText}}</h2>\n or\n <button\n mat-raised-button\n type=\"button\"\n color=\"primary\"\n [disabled]=\"(disabled$ | async) || config.disableOnUpload && isUploaded\"\n (click)=\"fileInput.click()\"\n [attr.aria-label]=\"config.controlName\">\n {{config.selectButtonText}}\n </button>\n </div>\n <ng-template #selectedFileList>\n <div class=\"selected-files-container\">\n <div class=\"selected-files-list\">\n <crispr-selected-file\n *ngFor=\"let file of selectedFiles; let i = index;\"\n [color]=\"config.color === 'primary' ? 'accent' : 'primary'\"\n [fileName]=\"file.name\"\n [showProgress]=\"config.showUploadProgress\"\n [progress]=\"fileProgress && (fileProgress[i] | async)\">\n </crispr-selected-file>\n </div>\n\n </div>\n </ng-template>\n\n </mat-form-field>\n <div class=\"button-container\" *ngIf=\"selectedFiles?.length > 0\">\n\n <button\n mat-button\n (click)=\"resetFileInput()\"\n type=\"button\"\n [disabled]=\"(disabled$ | async) || (config.disableOnUpload && isUploaded)\"\n aria-label=\"Remove Selected File(s)\">\n {{config.clearFilesButtonText}}\n <mat-icon>delete</mat-icon>\n </button>\n\n <button\n *ngIf=\"!!config.uploadFiles\"\n mat-raised-button\n type=\"button\"\n color=\"accent\"\n class=\"file-input-button\"\n [disabled]=\"(disabled$ | async) || (config.disableOnUpload && isUploaded)\"\n (click)=\"uploadFiles()\"\n [attr.aria-label]=\"config.uploadButtonText\">\n {{ config.uploadButtonText }}\n </button>\n\n </div>\n</crispr-field-container>\n",
732
- changeDetection: ChangeDetectionStrategy.OnPush,
733
- styles: [":host ::ng-deep .mat-form-field .mat-form-field-infix{padding-top:0;display:flex;justify-content:center}:host .drop-info{display:flex;flex-direction:column;align-items:center}:host .drop-info .drop-icon{font-size:36px}:host .drop-info .mat-h2{margin:0}:host .button-container{display:flex;justify-content:flex-end;margin-top:-16px}:host .button-container button{margin-left:8px}:host .selected-files-container{width:100%}:host [matInput]{position:absolute;max-height:0;visibility:hidden}"]
734
- },] }
735
- ];
736
- FileUploadComponent.ctorParameters = () => [
737
- { type: NgControl, decorators: [{ type: Optional }, { type: Self }] }
738
- ];
739
- FileUploadComponent.propDecorators = {
740
- fileInputRef: [{ type: ViewChild, args: ['fileInput',] }]
741
- };
742
-
743
- const defaultConfig$2 = {
744
- typographyClass: 'mat-h3'
745
- };
746
- class HeadingComponent extends CrisprFieldComponent {
747
- constructor() {
748
- super(...arguments);
749
- this.defaultConfig = defaultConfig$2;
750
- }
751
- }
752
- HeadingComponent.decorators = [
753
- { type: Component, args: [{
754
- selector: 'crispr-heading',
755
- template: " <label\n *ngIf=\"!!config?.label\"\n [ngClass]=\"config.typographyClass\">\n {{ config.label }}\n <crispr-info\n *ngIf=\"config.info\"\n matSuffix\n [info]=\"config.info\">\n </crispr-info>\n </label>\n",
756
- changeDetection: ChangeDetectionStrategy.OnPush,
757
- styles: [":host{display:block}"]
758
- },] }
759
- ];
760
- HeadingComponent.propDecorators = {
761
- config: [{ type: Input }]
762
- };
763
-
764
- class DividerComponent extends CrisprFieldComponent {
765
- constructor() {
766
- super(...arguments);
767
- // TODO: pull in type after configs are better organized
768
- this.defaultConfig = {};
769
- }
770
- ngOnInit() {
771
- super.ngOnInit();
772
- }
773
- }
774
- DividerComponent.decorators = [
775
- { type: Component, args: [{
776
- selector: 'crispr-divider',
777
- template: "<mat-divider [ngClass]=\"config.classes\"></mat-divider>",
778
- styles: [":host{display:block;padding:1em 0}::ng-deep.mat-divider.mat-divider-horizontal{position:relative}"]
779
- },] }
780
- ];
781
-
782
- const RadioFieldMixin = crisprControlMixin(CrisprFieldComponent);
783
- class RadioFieldComponent extends RadioFieldMixin {
784
- constructor() {
785
- super(...arguments);
786
- this.defaultConfig = {};
787
- }
788
- ngOnInit() {
789
- super.ngOnInit();
790
- // options$ can be passed as an array, promise that resolves array, or observable that resolves array
791
- // this functions accounts for all possibilities and converts to observable that resolves array
792
- this.options$ = observablifyOptions(this.config.options, this.group);
793
- }
794
- }
795
- RadioFieldComponent.decorators = [
796
- { type: Component, args: [{
797
- selector: 'crispr-radio-field',
798
- template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-radio-group\n [formControl]=\"control\"\n [color]=\"config.color\">\n <mat-radio-button class=\"example-radio-button\" *ngFor=\"let option of options$ | async\" [value]=\"option.value\">\n {{option.label}}\n </mat-radio-button>\n </mat-radio-group>\n</crispr-field-container>\n",
799
- changeDetection: ChangeDetectionStrategy.OnPush,
800
- styles: ["mat-radio-button{padding:12px}"]
801
- },] }
802
- ];
803
-
804
- const defaultConfig$1 = {};
805
- const UnitConversionFieldMixin = crisprControlMixin(CrisprFieldComponent);
806
- class UnitConversionFieldComponent extends UnitConversionFieldMixin {
807
- constructor() {
808
- super(...arguments);
809
- this.defaultConfig = defaultConfig$1;
810
- this.displayValueControl = new FormControl();
811
- this.unitSelectControl = new FormControl();
812
- }
813
- ngOnInit() {
814
- var _a, _b;
815
- super.ngOnInit();
816
- // TODO: Validators need work. validation is tricky because the input needs to be validated against but the validator will compare against the controls value
817
- // this.displayValueControl.setValidators(this.config.validators);
818
- const controlValuePipeline = [
819
- this.displayValueControl.valueChanges.pipe(startWith(this.displayValueControl.value))
820
- ];
821
- // setup all required pieces when showing a field for selecting units
822
- if (this.config.showUnitSelect) {
823
- this.unitOptions$ = observablifyOptions(this.config.selectableUnits, this.group);
824
- controlValuePipeline.push(this.unitSelectControl.valueChanges.pipe(startWith(((_a = this.config) === null || _a === void 0 ? void 0 : _a.initialDisplayUnit) || null)));
825
- this.unitSelectControl.setValue(((_b = this.config) === null || _b === void 0 ? void 0 : _b.initialDisplayUnit) || null);
826
- }
827
- this.transformationSubscription = combineLatest(controlValuePipeline).subscribe(([displayValue, unitValue]) => {
828
- const computedValue = this.config.storedValueConversion(displayValue, unitValue);
829
- this.control.setValue(computedValue);
830
- });
831
- }
832
- ngOnDestroy() {
833
- this.transformationSubscription.unsubscribe();
834
- }
835
- setInitialDisplayValue(storedValue, unit) {
836
- const initialDisplayValue = this.config.initialDisplayValueConversion(storedValue || null, unit);
837
- this.displayValueControl.setValue(initialDisplayValue);
838
- }
839
- /**
840
- * We override the 'setControlValue' we inherited from crisprControlMixin and add our custom logic,
841
- * This function gets called onInit because were object oriented. it's so great, so great that I'm
842
- * typing a paragraph to explain what the hell is going on...
843
- * @param value the initial value for the control passed down from the form components input
844
- */
845
- setControlValue(value) {
846
- var _a;
847
- const initialUnitValue = this.config.showUnitSelect ? (_a = this.config) === null || _a === void 0 ? void 0 : _a.initialDisplayUnit : null;
848
- this.setInitialDisplayValue(value, initialUnitValue);
849
- }
850
- }
851
- UnitConversionFieldComponent.decorators = [
852
- { type: Component, args: [{
853
- // eslint-disable-next-line @angular-eslint/component-selector
854
- selector: 'crispr-unit-conversion-field',
855
- template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n <mat-form-field\n [style.width.%]=\"config.showUnitSelect ? 60 : 100\"\n class=\"number-field\"\n [color]=\"config.color\"\n [appearance]=\"config.appearance\">\n <mat-label *ngIf=\"config.label\">\n {{config.label}}\n </mat-label>\n <input\n type=\"number\"\n matInput\n [formControl]=\"displayValueControl\"\n [placeholder]=\"config.placeholder\"\n [min]=\"config.min\"\n [max]=\"config.max\"\n [step]=\"config.step\"\n [autofocus]=\"config.autofocus\">\n <span *ngIf=\"config.fieldSuffix\" matSuffix>{{config.fieldSuffix}}</span>\n <crispr-info\n matSuffix\n *ngIf=\"config.info\"\n [info]=\"config.info\">\n </crispr-info>\n </mat-form-field>\n\n <mat-form-field\n *ngIf=\"config.showUnitSelect\"\n [color]=\"config.color\"\n [appearance]=\"config.appearance\"\n [formGroup]=\"group\"\n class=\"unit-field\">\n <mat-label *ngIf=\"config.label\">\n {{config.label}}\n </mat-label>\n <mat-select\n #selectField\n [formControl]=\"unitSelectControl\">\n\n <mat-option\n *ngFor=\"let option of unitOptions$ | async\"\n [value]=\"option.value\">\n <crispr-option [option]=\"option\">\n </crispr-option>\n </mat-option>\n\n </mat-select>\n\n <!-- <span *ngIf=\"config.fieldSuffix\" matSuffix>{{config.fieldSuffix}}</span> -->\n <!-- <crispr-info\n *ngIf=\"config.info\"\n matSuffix\n [info]=\"config.info\">\n </crispr-info> -->\n </mat-form-field>\n\n\n</crispr-field-container>\n",
856
- changeDetection: ChangeDetectionStrategy.OnPush,
857
- styles: [".unit-field{width:40%;margin-left:16px}:host ::ng-deep .field-container{display:flex}"]
858
- },] }
859
- ];
860
-
861
- class FieldContainerComponent {
862
- constructor() {
863
- // boolean whether field-container is inline
864
- this.inlineField = false;
865
- this.subs = [];
866
- }
867
- ngOnInit() {
868
- this.disabled$ = this.connectDisabledCallback(this.group, this.config);
869
- // we tried moving this into afterViewChecked and afterContentChecked lifecycle hooks without any luck
870
- if (this.config.computeValue) {
871
- this.subs.push(this.config.computeValue(this.group).pipe(distinctUntilChanged(), tap(computedValue => this.group.get(this.config.controlName).setValue(computedValue))).subscribe());
872
- }
873
- else if (this.config.computeFieldConfig) {
874
- console.warn(`computeFieldConfig property is deprecated, please use computeValue. Example here: https://stackblitz.com/github/nayfin/tft-documentation?file=src%2Fapp%2Fcrispr-forms-demo%2Ffeatures%2Fcomputed-field%2Fcomputed-field.component.ts`);
875
- this.subs.push(computeValueFromFields(this.group, this.config.computeFieldConfig).pipe(distinctUntilChanged(), tap(computedValue => this.group.get(this.config.controlName).setValue(computedValue))).subscribe());
876
- }
877
- }
878
- ngOnDestroy() {
879
- this.subs.forEach(sub => sub.unsubscribe);
880
- }
881
- /**
882
- * Connects user defined disabledCallback function to the the view, so that the control is enabled/disabled
883
- * appropriately. It also keeps the form will hide disabled fields in the UI unless `hideDisabled` is set to
884
- * false in the controls config
885
- * @param group used to get valueChanges from control
886
- * @param config configuration object used to
887
- */
888
- connectDisabledCallback(group, config = null) {
889
- const control = group.get(config.controlName);
890
- // If the disabled$ function exists on the field config then call it with the disabledCallbackConfig
891
- // as a parameter otherwise return an observable of true.
892
- return (config === null || config === void 0 ? void 0 : config.disabledCallback) && config.disabledCallback instanceof Function
893
- ? config.disabledCallback(group, config.disabledCallbackConfig || null).pipe(
894
- // This enables/disables when callback conditions are met
895
- tap((shouldDisable) => shouldDisable ? control.disable() : control.enable()))
896
- : of(false);
897
- }
898
- }
899
- FieldContainerComponent.decorators = [
900
- { type: Component, args: [{
901
- selector: 'crispr-field-container',
902
- template: "<div\n *ngIf=\"(disabled$ | async) ? !config.hideDisabled : true\"\n [ngClass]=\"config.classes\"\n [class.inline-field]=\"inlineField\"\n class=\"field-container\">\n\n <crispr-heading\n *ngIf=\"config.heading\"\n [config]=\"config.heading\">\n </crispr-heading>\n\n <ng-content>\n </ng-content>\n\n</div>\n",
903
- changeDetection: ChangeDetectionStrategy.OnPush,
904
- styles: ["::ng-deep mat-form-field.mat-form-field{display:block}.inline-field{display:inline-block}"]
905
- },] }
906
- ];
907
- FieldContainerComponent.propDecorators = {
908
- config: [{ type: Input }],
909
- group: [{ type: Input }],
910
- inlineField: [{ type: Input }]
911
- };
912
-
913
- class InfoComponent {
914
- }
915
- InfoComponent.decorators = [
916
- { type: Component, args: [{
917
- selector: 'crispr-info',
918
- template: "<mat-icon\n *ngIf=\"info\"\n [matTooltip]=\"info.content\"\n [matTooltipPosition]=\"info.tooltipPosition || 'below'\"\n matSuffix>\n info\n</mat-icon>\n",
919
- changeDetection: ChangeDetectionStrategy.OnPush,
920
- styles: ["mat-icon{font-size:1.2em;width:1em;height:1em;opacity:.8}"]
921
- },] }
922
- ];
923
- InfoComponent.propDecorators = {
924
- info: [{ type: Input }]
925
- };
926
-
927
- class OptionComponent {
928
- }
929
- OptionComponent.decorators = [
930
- { type: Component, args: [{
931
- selector: 'crispr-option',
932
- template: "<img\n *ngIf=\"option.imageUrl\"\n [src]=\"option.imageUrl\"\n alt=\"image of {{option.label}}\"\n style=\"vertical-align:middle;\"\n aria-hidden\n height=\"25\"/>\n{{ option.label }}\n",
933
- changeDetection: ChangeDetectionStrategy.OnPush,
934
- styles: [""]
935
- },] }
936
- ];
937
- OptionComponent.propDecorators = {
938
- option: [{ type: Input }]
939
- };
940
-
941
- class SelectedFileComponent {
942
- }
943
- SelectedFileComponent.decorators = [
944
- { type: Component, args: [{
945
- selector: 'crispr-selected-file',
946
- template: "<h3 class=\"mat-h3\">{{ fileName }}</h3>\n<mat-progress-bar\n *ngIf=\"showProgress\"\n mode=\"determinate\"\n [color]=\"color\"\n [value]=\"progress\">\n</mat-progress-bar>\n",
947
- styles: ["mat-progress-bar{margin-bottom:8px}"]
948
- },] }
949
- ];
950
- SelectedFileComponent.propDecorators = {
951
- fileName: [{ type: Input }],
952
- progress: [{ type: Input }],
953
- showProgress: [{ type: Input }],
954
- color: [{ type: Input }]
955
- };
956
-
957
- class FileDropzoneDirective {
958
- constructor() {
959
- this.fileDrop = new EventEmitter();
960
- this.crisprFileDropzone = true;
961
- }
962
- onDrop($event) {
963
- if (this.crisprFileDropzone) {
964
- $event.preventDefault();
965
- this.fileDrop.emit($event.dataTransfer.files);
966
- }
967
- }
968
- // Prevents DOM from trying to open file in browser
969
- onDragOver($event) {
970
- if (this.crisprFileDropzone) {
971
- $event.preventDefault();
972
- }
973
- }
974
- }
975
- FileDropzoneDirective.decorators = [
976
- { type: Directive, args: [{
977
- selector: '[crisprFileDropzone]'
978
- },] }
979
- ];
980
- FileDropzoneDirective.propDecorators = {
981
- fileDrop: [{ type: Output }],
982
- crisprFileDropzone: [{ type: Input }],
983
- onDrop: [{ type: HostListener, args: ['drop', ['$event'],] }],
984
- onDragOver: [{ type: HostListener, args: ['dragover', ['$event'],] }]
985
- };
986
-
987
- // TODO: Should we import UI library?
988
- // Will the tree shaker shake the unused modules?
989
- const MAT_DESIGN_MODULES = [
990
- MatIconModule,
991
- MatAutocompleteModule,
992
- MatDatepickerModule,
993
- MatInputModule,
994
- MatRadioModule,
995
- MatSelectModule,
996
- MatCheckboxModule,
997
- MatChipsModule,
998
- MatSliderModule,
999
- MatSlideToggleModule,
1000
- MatButtonModule,
1001
- MatButtonToggleModule,
1002
- MatChipsModule,
1003
- MatTooltipModule,
1004
- MatFormFieldModule,
1005
- MatMomentDateModule,
1006
- MatDividerModule,
1007
- MatProgressBarModule,
1008
- PortalModule
1009
- ];
1010
- const CRISPR_FIELDS = [
1011
- FieldContainerComponent,
1012
- InputFieldComponent,
1013
- SelectFieldComponent,
1014
- RadioFieldComponent,
1015
- AutocompleteFieldComponent,
1016
- AutocompleteChiplistFieldComponent,
1017
- CheckboxFieldComponent,
1018
- TextareaFieldComponent,
1019
- DatepickerFieldComponent,
1020
- SliderFieldComponent,
1021
- ButtonComponent,
1022
- HeadingComponent,
1023
- DividerComponent,
1024
- FileUploadComponent,
1025
- UnitConversionFieldComponent
1026
- ];
1027
- class MaterialModule {
1028
- }
1029
- MaterialModule.decorators = [
1030
- { type: NgModule, args: [{
1031
- imports: [
1032
- CommonModule,
1033
- ReactiveFormsModule,
1034
- FormValidationHandlerModule,
1035
- ...MAT_DESIGN_MODULES,
1036
- ],
1037
- exports: [
1038
- ...MAT_DESIGN_MODULES,
1039
- ...CRISPR_FIELDS
1040
- ],
1041
- declarations: [
1042
- ...CRISPR_FIELDS,
1043
- InfoComponent,
1044
- OptionComponent,
1045
- SelectedFileComponent,
1046
- FileDropzoneDirective,
1047
- ],
1048
- entryComponents: CRISPR_FIELDS
1049
- },] }
1050
- ];
1051
-
1052
- class CrisprFormComponent {
1053
- constructor() {
1054
- this.form = new FormGroup({});
1055
- this.value = null;
1056
- this.submitted = new EventEmitter();
1057
- // proxy value and status change events through to consuming component
1058
- this.valueChanges = this.form.valueChanges;
1059
- this.statusChanges = this.form.statusChanges;
1060
- this.subs = [];
1061
- }
1062
- ngOnInit() {
1063
- // build out the form, note that we pass in the form as the third argument and the function modifies it
1064
- buildFormGroupFromConfig(this.config, this.value, this.form);
1065
- }
1066
- handleSubmit() {
1067
- this.form.markAllAsTouched();
1068
- this.submitted.emit(this.form);
1069
- }
1070
- }
1071
- CrisprFormComponent.decorators = [
1072
- { type: Component, args: [{
1073
- selector: 'crispr-form',
1074
- template: "<form\n class=\"crispr-form\"\n [ngClass]=\"config.classes\"\n [formGroup]=\"form\"\n (ngSubmit)=\"handleSubmit()\"\n [autocomplete]=\"config.autocomplete || 'off'\"\n [errorDictionary]=\"config.errorDictionary\">\n\n <ng-container\n *ngFor=\"let field of config.fields;\"\n crisprField\n [value]=\"value | initialControlValue : field\"\n [config]=\"field\"\n [group]=\"form\">\n </ng-container>\n\n</form>\n",
1075
- changeDetection: ChangeDetectionStrategy.OnPush,
1076
- styles: [""]
1077
- },] }
1078
- ];
1079
- CrisprFormComponent.propDecorators = {
1080
- config: [{ type: Input }],
1081
- form: [{ type: Input }],
1082
- value: [{ type: Input }],
1083
- submitted: [{ type: Output }],
1084
- valueChanges: [{ type: Output }],
1085
- statusChanges: [{ type: Output }]
1086
- };
1087
-
1088
- const defaultConfig = {
1089
- addButtonLabel: 'ADD ITEM',
1090
- minListLength: 1,
1091
- };
1092
- const FormGroupListMixin = crisprControlMixin(CrisprFieldComponent);
1093
- class FormGroupListComponent extends FormGroupListMixin {
1094
- constructor() {
1095
- super(...arguments);
1096
- this.defaultConfig = defaultConfig;
1097
- }
1098
- ngOnInit() {
1099
- super.ngOnInit();
1100
- // TODO: this is required to ngFor of controls in template, must be a better way
1101
- this.formArray = this.control;
1102
- }
1103
- setControlValue(values) {
1104
- if (this.control) {
1105
- if ((values === null || values === void 0 ? void 0 : values.length) > 0) {
1106
- values.forEach(value => this.addGroup(value));
1107
- }
1108
- else if (this.config.displayInitialItem) {
1109
- this.addGroup();
1110
- }
1111
- }
1112
- }
1113
- addGroup(value = null) {
1114
- this.control.push(createControlForType(this.config.itemConfig, value));
1115
- }
1116
- deleteGroup(index) {
1117
- this.control.removeAt(index);
1118
- }
1119
- }
1120
- FormGroupListComponent.decorators = [
1121
- { type: Component, args: [{
1122
- selector: 'crispr-form-group-list',
1123
- template: "\n<crispr-field-container\n [config]=\"config\"\n [group]=\"group\"\n [formGroup]=\"group\">\n\n <div [formArrayName]=\"config.controlName\">\n <!-- TODO: add sortBy function -->\n <div *ngFor=\"let control of formArray?.controls; let i = index;\">\n <!-- TODO: use content projection to allow custom item label component -->\n <div class=\"item-header\">\n <span class=\"mat-h2\" *ngIf=\"config.itemLabelBuilder\"> {{ config.itemLabelBuilder(i) }} </span>\n <button\n mat-icon-button\n *ngIf=\"i + 1 > config.minListLength\">\n <mat-icon (click)=\"deleteGroup(i)\">delete</mat-icon>\n </button>\n </div>\n <div\n [formGroupName]=\"i\">\n <ng-container\n *ngFor=\"let field of config.itemConfig.fields;\"\n crisprField\n [config]=\"field\"\n [value]=\"value && value[i] | initialControlValue : field\"\n [group]=\"control\">\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"group-footer\">\n <button\n type=\"button\"\n class=\"add\"\n mat-raised-button\n [color]=\"config.addButtonColor\"\n (click)=\"addGroup()\">\n {{config.addItemLabel || config.addButtonLabel}}\n </button>\n </div>\n\n</crispr-field-container>\n",
1124
- changeDetection: ChangeDetectionStrategy.OnPush,
1125
- styles: [".item-header{display:flex;justify-content:space-between}.group-footer{display:flex;justify-content:flex-end}.group-footer button.add{margin-bottom:16px}"]
1126
- },] }
1127
- ];
1128
-
1129
- const FormGroupMixin = crisprControlMixin(CrisprFieldComponent);
1130
- class SubGroupComponent extends FormGroupMixin {
1131
- ngOnInit() {
1132
- super.ngOnInit();
1133
- }
1134
- }
1135
- SubGroupComponent.decorators = [
1136
- { type: Component, args: [{
1137
- selector: 'crispr-sub-group',
1138
- template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n <ng-container\n *ngFor=\"let fieldConfig of config.fields;\"\n crisprField\n [value]=\"value | initialControlValue : fieldConfig\"\n [config]=\"fieldConfig\"\n [group]=\"control\">\n </ng-container>\n</crispr-field-container>\n\n",
1139
- changeDetection: ChangeDetectionStrategy.OnPush,
1140
- styles: [""]
1141
- },] }
1142
- ];
1143
-
1144
- // tslint:disable-next-line: max-line-length
1145
- const FIELD_COMPONENTS = {
1146
- button: ButtonComponent,
1147
- input: InputFieldComponent,
1148
- select: SelectFieldComponent,
1149
- radio: RadioFieldComponent,
1150
- subGroup: SubGroupComponent,
1151
- groupList: FormGroupListComponent,
1152
- autocomplete: AutocompleteFieldComponent,
1153
- autocompleteChiplist: AutocompleteChiplistFieldComponent,
1154
- textarea: TextareaFieldComponent,
1155
- checkbox: CheckboxFieldComponent,
1156
- slider: SliderFieldComponent,
1157
- datepicker: DatepickerFieldComponent,
1158
- fileUpload: FileUploadComponent,
1159
- heading: HeadingComponent,
1160
- divider: DividerComponent,
1161
- unitConversion: UnitConversionFieldComponent
1162
- };
1163
- function isControlComponent(component) {
1164
- return isControlConfig(component.config) || component.config.controlType === ControlType.BUTTON;
1165
- }
1166
-
1167
- class CrisprFieldDirective {
1168
- constructor(resolver, container, renderer) {
1169
- this.resolver = resolver;
1170
- this.container = container;
1171
- this.renderer = renderer;
1172
- }
1173
- ngOnInit() {
1174
- /**
1175
- * create component and set values from config on its instance
1176
- */
1177
- const component = this.config.component || FIELD_COMPONENTS[this.config.controlType];
1178
- const factory = this.resolver.resolveComponentFactory(component);
1179
- const componentRef = this.container.createComponent(factory);
1180
- this.component = componentRef.instance;
1181
- this.component.config = this.config;
1182
- if (isControlComponent(this.component)) {
1183
- this.component.group = this.group;
1184
- if ('value' in this.component) {
1185
- this.component.value = this.value;
1186
- }
1187
- }
1188
- // adds any config classes to the dynamically generated component
1189
- // doing this here keeps us from having to extend a base component into each field component individually
1190
- if (!this.config.classes)
1191
- return;
1192
- this.config.classes.forEach((klass) => {
1193
- // check for passing multiple classes in one array element
1194
- if (klass.includes(' ')) {
1195
- throw Error(`Improperly formatted class. '${klass}' cannot contain spaces.`);
1196
- }
1197
- else {
1198
- this.renderer.addClass(componentRef.location.nativeElement, klass);
1199
- }
1200
- });
1201
- }
1202
- }
1203
- CrisprFieldDirective.decorators = [
1204
- { type: Directive, args: [{
1205
- selector: '[crisprField]'
1206
- },] }
1207
- ];
1208
- CrisprFieldDirective.ctorParameters = () => [
1209
- { type: ComponentFactoryResolver },
1210
- { type: ViewContainerRef },
1211
- { type: Renderer2 }
1212
- ];
1213
- CrisprFieldDirective.propDecorators = {
1214
- config: [{ type: Input }],
1215
- group: [{ type: Input }],
1216
- value: [{ type: Input }]
1217
- };
1218
-
1219
- class InitialControlValuePipe {
1220
- // TODO: does changing any to unknown break anything?
1221
- transform(initialFormValue, fieldConfig) {
1222
- return (initialFormValue && isControlConfig(fieldConfig))
1223
- ? initialFormValue[fieldConfig.controlName] || null
1224
- : null;
1225
- }
1226
- }
1227
- InitialControlValuePipe.decorators = [
1228
- { type: Pipe, args: [{
1229
- name: 'initialControlValue'
1230
- },] }
1231
- ];
1232
-
1233
- class CrisprFormsModule {
1234
- }
1235
- CrisprFormsModule.decorators = [
1236
- { type: NgModule, args: [{
1237
- imports: [
1238
- CommonModule,
1239
- ReactiveFormsModule,
1240
- FormValidationHandlerModule,
1241
- MaterialModule
1242
- ],
1243
- declarations: [
1244
- CrisprFieldDirective,
1245
- CrisprFormComponent,
1246
- FormGroupListComponent,
1247
- InitialControlValuePipe,
1248
- SubGroupComponent,
1249
- ],
1250
- exports: [
1251
- CrisprFormComponent,
1252
- MaterialModule
1253
- ],
1254
- entryComponents: [
1255
- FormGroupListComponent,
1256
- SubGroupComponent
1257
- ],
1258
- },] }
1259
- ];
1260
-
1261
- /**
1262
- * Generated bundle index. Do not edit.
1263
- */
1264
-
1265
- export { AbstractAutocompleteComponent, AutocompleteChiplistFieldComponent, AutocompleteFieldComponent, ButtonComponent, CheckboxFieldComponent, ControlType, CrisprFieldComponent, CrisprFormComponent, CrisprFormsModule, DEFAULT_EMPTY_OPTIONS_MESSAGE, DatepickerFieldComponent, DividerComponent, FileUploadComponent, HeadingComponent, InputFieldComponent, RadioFieldComponent, SelectFieldComponent, SliderFieldComponent, TextareaFieldComponent, UnitConversionFieldComponent, buildFormGroupFromConfig, callOptionsIfFunction, checkControlForValues, checkControlsForValues, computeValueFromFields, createControlForType, crisprControlMixin, filterOptionsByLabel, isControlConfig, observablifyOptions, ɵ0, MaterialModule as ɵa, FieldContainerComponent as ɵb, InputFieldComponent as ɵc, SelectFieldComponent as ɵd, RadioFieldComponent as ɵe, AutocompleteFieldComponent as ɵf, AbstractAutocompleteComponent as ɵg, AutocompleteChiplistFieldComponent as ɵh, CheckboxFieldComponent as ɵi, TextareaFieldComponent as ɵj, DatepickerFieldComponent as ɵk, SliderFieldComponent as ɵl, ButtonComponent as ɵm, CrisprFieldComponent as ɵn, HeadingComponent as ɵo, DividerComponent as ɵp, FileUploadComponent as ɵq, UnitConversionFieldComponent as ɵr, InfoComponent as ɵs, OptionComponent as ɵt, SelectedFileComponent as ɵu, FileDropzoneDirective as ɵv, CrisprFieldDirective as ɵw, FormGroupListComponent as ɵx, InitialControlValuePipe as ɵy, SubGroupComponent as ɵz };
1266
- //# sourceMappingURL=tft-crispr-forms.js.map