@tft/crispr-forms 14.0.1-rc.1 → 14.0.1-rc.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 (291) hide show
  1. package/esm2020/public-api.mjs +5 -0
  2. package/esm2020/src/index.mjs +2 -0
  3. package/esm2020/src/lib/crispr-forms.module.mjs +57 -0
  4. package/esm2020/src/lib/field-component-map.const.mjs +27 -0
  5. package/esm2020/src/lib/field.directive.mjs +69 -0
  6. package/esm2020/{lib → src/lib}/form/form.component.mjs +3 -2
  7. package/esm2020/src/lib/form-group-list/form-group-list.component.mjs +93 -0
  8. package/esm2020/src/lib/form-group-list/index.mjs +2 -0
  9. package/esm2020/{lib → src/lib}/pipes/crispr-pipes.module.mjs +1 -1
  10. package/esm2020/src/lib/pipes/initial-control-value.pipe.mjs +21 -0
  11. package/esm2020/src/lib/public_api.mjs +3 -0
  12. package/esm2020/src/lib/sub-group/index.mjs +3 -0
  13. package/esm2020/src/lib/sub-group/sub-group.component.mjs +21 -0
  14. package/esm2020/src/lib/sub-group/sub-group.module.mjs +42 -0
  15. package/esm2020/tft-crispr-forms.mjs +2 -2
  16. package/esm2020/{lib/material → ui}/autocomplete-chiplist-field/autocomplete-chiplist-field.component.mjs +5 -5
  17. package/esm2020/ui/autocomplete-chiplist-field/index.mjs +2 -0
  18. package/esm2020/{lib/material → ui}/autocomplete-field/autocomplete-field.component.mjs +5 -5
  19. package/esm2020/ui/autocomplete-field/index.mjs +2 -0
  20. package/esm2020/ui/button/button.component.mjs +46 -0
  21. package/esm2020/ui/button/index.mjs +2 -0
  22. package/esm2020/ui/checkbox-field/checkbox-field.component.mjs +42 -0
  23. package/esm2020/ui/checkbox-field/index.mjs +2 -0
  24. package/esm2020/{lib/material → ui}/datepicker-field/datepicker-field.component.mjs +4 -3
  25. package/esm2020/ui/datepicker-field/index.mjs +2 -0
  26. package/esm2020/ui/divider/divider.component.mjs +28 -0
  27. package/esm2020/ui/divider/index.mjs +2 -0
  28. package/esm2020/ui/field-container/field-container.component.mjs +58 -0
  29. package/esm2020/ui/field-container/public-api.mjs +2 -0
  30. package/esm2020/ui/field-container/tft-crispr-forms-ui-field-container.mjs +5 -0
  31. package/esm2020/ui/file-dropzone/file-dropzone.directive.mjs +40 -0
  32. package/esm2020/ui/file-dropzone/public-api.mjs +2 -0
  33. package/esm2020/ui/file-dropzone/tft-crispr-forms-ui-file-dropzone.mjs +5 -0
  34. package/esm2020/{lib/material → ui}/file-upload/file-upload.component.mjs +7 -6
  35. package/esm2020/ui/file-upload/index.mjs +2 -0
  36. package/esm2020/{lib/material → ui}/heading/heading.component.mjs +4 -3
  37. package/esm2020/ui/heading/public-api.mjs +2 -0
  38. package/esm2020/ui/heading/tft-crispr-forms-ui-heading.mjs +5 -0
  39. package/esm2020/{lib/material → ui}/image-upload-field/image-upload-field.component.mjs +7 -53
  40. package/esm2020/ui/image-upload-field/public-api.mjs +2 -0
  41. package/esm2020/ui/image-upload-field/tft-crispr-forms-ui-image-upload-field.mjs +5 -0
  42. package/esm2020/{lib/material → ui}/info/info.component.mjs +1 -1
  43. package/esm2020/ui/info/public-api.mjs +2 -0
  44. package/esm2020/ui/info/tft-crispr-forms-ui-info.mjs +5 -0
  45. package/esm2020/ui/input-field/index.mjs +2 -0
  46. package/esm2020/{lib/material → ui}/input-field/input-field.component.mjs +5 -4
  47. package/esm2020/ui/option/index.mjs +2 -0
  48. package/esm2020/{lib/material → ui}/option/option.component.mjs +2 -2
  49. package/esm2020/ui/public-api.mjs +21 -0
  50. package/esm2020/ui/radio-field/index.mjs +2 -0
  51. package/esm2020/ui/radio-field/radio-field.component.mjs +36 -0
  52. package/esm2020/ui/select-field/index.mjs +2 -0
  53. package/esm2020/{lib/material → ui}/select-field/select-field.component.mjs +10 -8
  54. package/esm2020/ui/selected-file/public-api.mjs +2 -0
  55. package/esm2020/{lib/material → ui}/selected-file/selected-file.component.mjs +1 -1
  56. package/esm2020/ui/selected-file/tft-crispr-forms-ui-selected-file.mjs +5 -0
  57. package/esm2020/ui/slider-field/index.mjs +2 -0
  58. package/esm2020/{lib/material → ui}/slider-field/slider-field.component.mjs +5 -4
  59. package/esm2020/ui/textarea-field/index.mjs +2 -0
  60. package/esm2020/{lib/material → ui}/textarea-field/textarea-field.component.mjs +5 -4
  61. package/esm2020/ui/tft-crispr-forms-ui.mjs +5 -0
  62. package/esm2020/ui/unit-conversion-field/index.mjs +2 -0
  63. package/esm2020/ui/unit-conversion-field/unit-conversion-field.component.mjs +81 -0
  64. package/esm2020/utils/abstracts/autocomplete-field.abstract.mjs +30 -0
  65. package/esm2020/utils/abstracts/crispr-control.mixin.mjs +27 -0
  66. package/esm2020/utils/abstracts/crispr-field.abstract.mjs +20 -0
  67. package/esm2020/utils/abstracts/index.mjs +4 -0
  68. package/esm2020/utils/functions/buildFormGroupFromConfig.mjs +28 -0
  69. package/esm2020/utils/functions/callOptionsIfFunction.mjs +4 -0
  70. package/esm2020/utils/functions/createControlForType.mjs +19 -0
  71. package/esm2020/utils/functions/filterOptionsByLabel.mjs +11 -0
  72. package/esm2020/utils/functions/image-compression.helpers.mjs +50 -0
  73. package/esm2020/utils/functions/index.mjs +8 -0
  74. package/esm2020/utils/functions/isControlConfig.mjs +7 -0
  75. package/esm2020/utils/functions/observablifyOptions.mjs +29 -0
  76. package/esm2020/utils/models/autocomplete-chiplist-field.config.mjs +2 -0
  77. package/esm2020/utils/models/autocomplete-field.config.mjs +2 -0
  78. package/esm2020/utils/models/button.config.mjs +2 -0
  79. package/esm2020/utils/models/checkbox-field.config.mjs +2 -0
  80. package/esm2020/utils/models/crispr-field.config.mjs +23 -0
  81. package/esm2020/utils/models/datepicker-field.config.mjs +2 -0
  82. package/esm2020/utils/models/divider.config.mjs +2 -0
  83. package/esm2020/utils/models/file-upload-field.config.mjs +2 -0
  84. package/esm2020/utils/models/form-group-list.config.mjs +2 -0
  85. package/esm2020/utils/models/heading.config.mjs +3 -0
  86. package/esm2020/utils/models/image-upload-field.config.mjs +2 -0
  87. package/esm2020/utils/models/index.mjs +18 -0
  88. package/esm2020/utils/models/input-field.config.mjs +2 -0
  89. package/esm2020/utils/models/radio-field.config.mjs +2 -0
  90. package/esm2020/utils/models/select-field.config.mjs +2 -0
  91. package/esm2020/utils/models/slider-field.config.mjs +2 -0
  92. package/esm2020/utils/models/textarea-field.config.mjs +2 -0
  93. package/esm2020/utils/models/unit-conversion-field.config.mjs +2 -0
  94. package/esm2020/utils/operators/form.operators.mjs +24 -0
  95. package/esm2020/utils/operators/index.mjs +2 -0
  96. package/esm2020/utils/public-api.mjs +5 -0
  97. package/esm2020/utils/tft-crispr-forms-utils.mjs +5 -0
  98. package/fesm2015/tft-crispr-forms-ui-field-container.mjs +64 -0
  99. package/fesm2015/tft-crispr-forms-ui-field-container.mjs.map +1 -0
  100. package/fesm2015/tft-crispr-forms-ui-file-dropzone.mjs +47 -0
  101. package/fesm2015/tft-crispr-forms-ui-file-dropzone.mjs.map +1 -0
  102. package/fesm2015/tft-crispr-forms-ui-heading.mjs +37 -0
  103. package/fesm2015/tft-crispr-forms-ui-heading.mjs.map +1 -0
  104. package/fesm2015/tft-crispr-forms-ui-image-upload-field.mjs +182 -0
  105. package/fesm2015/tft-crispr-forms-ui-image-upload-field.mjs.map +1 -0
  106. package/fesm2015/tft-crispr-forms-ui-info.mjs +30 -0
  107. package/fesm2015/tft-crispr-forms-ui-info.mjs.map +1 -0
  108. package/fesm2015/tft-crispr-forms-ui-selected-file.mjs +33 -0
  109. package/fesm2015/tft-crispr-forms-ui-selected-file.mjs.map +1 -0
  110. package/fesm2015/tft-crispr-forms-ui.mjs +684 -0
  111. package/fesm2015/tft-crispr-forms-ui.mjs.map +1 -0
  112. package/fesm2015/tft-crispr-forms-utils.mjs +270 -0
  113. package/fesm2015/tft-crispr-forms-utils.mjs.map +1 -0
  114. package/fesm2015/tft-crispr-forms.mjs +32 -1355
  115. package/fesm2015/tft-crispr-forms.mjs.map +1 -1
  116. package/fesm2020/tft-crispr-forms-ui-field-container.mjs +65 -0
  117. package/fesm2020/tft-crispr-forms-ui-field-container.mjs.map +1 -0
  118. package/fesm2020/tft-crispr-forms-ui-file-dropzone.mjs +47 -0
  119. package/fesm2020/tft-crispr-forms-ui-file-dropzone.mjs.map +1 -0
  120. package/fesm2020/tft-crispr-forms-ui-heading.mjs +37 -0
  121. package/fesm2020/tft-crispr-forms-ui-heading.mjs.map +1 -0
  122. package/fesm2020/tft-crispr-forms-ui-image-upload-field.mjs +185 -0
  123. package/fesm2020/tft-crispr-forms-ui-image-upload-field.mjs.map +1 -0
  124. package/fesm2020/tft-crispr-forms-ui-info.mjs +30 -0
  125. package/fesm2020/tft-crispr-forms-ui-info.mjs.map +1 -0
  126. package/fesm2020/tft-crispr-forms-ui-selected-file.mjs +33 -0
  127. package/fesm2020/tft-crispr-forms-ui-selected-file.mjs.map +1 -0
  128. package/fesm2020/tft-crispr-forms-ui.mjs +676 -0
  129. package/fesm2020/tft-crispr-forms-ui.mjs.map +1 -0
  130. package/fesm2020/tft-crispr-forms-utils.mjs +269 -0
  131. package/fesm2020/tft-crispr-forms-utils.mjs.map +1 -0
  132. package/fesm2020/tft-crispr-forms.mjs +33 -1349
  133. package/fesm2020/tft-crispr-forms.mjs.map +1 -1
  134. package/index.d.ts +5 -1
  135. package/package.json +67 -3
  136. package/public-api.d.ts +3 -0
  137. package/src/index.d.ts +1 -0
  138. package/{lib → src/lib}/crispr-forms.module.d.ts +1 -1
  139. package/{lib → src/lib}/field-component-map.const.d.ts +7 -6
  140. package/{lib → src/lib}/field.directive.d.ts +3 -3
  141. package/{lib → src/lib}/form/form.component.d.ts +1 -1
  142. package/{lib → src/lib}/form-group-list/form-group-list.component.d.ts +11 -13
  143. package/{lib → src/lib}/form-group-list/index.d.ts +0 -0
  144. package/{lib → src/lib}/pipes/crispr-pipes.module.d.ts +0 -0
  145. package/{lib → src/lib}/pipes/initial-control-value.pipe.d.ts +1 -1
  146. package/src/lib/public_api.d.ts +2 -0
  147. package/{lib → src/lib}/sub-group/index.d.ts +0 -0
  148. package/{lib → src/lib}/sub-group/sub-group.component.d.ts +11 -13
  149. package/{lib → src/lib}/sub-group/sub-group.module.d.ts +1 -1
  150. package/tft-crispr-forms-14.0.1-rc.2.tgz +0 -0
  151. package/ui/README.md +3 -0
  152. package/{lib/material → ui}/autocomplete-chiplist-field/autocomplete-chiplist-field.component.d.ts +1 -2
  153. package/ui/autocomplete-chiplist-field/index.d.ts +1 -0
  154. package/{lib/material → ui}/autocomplete-field/autocomplete-field.component.d.ts +1 -2
  155. package/ui/autocomplete-field/index.d.ts +1 -0
  156. package/{lib/material → ui}/button/button.component.d.ts +1 -2
  157. package/ui/button/index.d.ts +1 -0
  158. package/ui/checkbox-field/checkbox-field.component.d.ts +21 -0
  159. package/ui/checkbox-field/index.d.ts +1 -0
  160. package/{lib/material → ui}/datepicker-field/datepicker-field.component.d.ts +11 -13
  161. package/ui/datepicker-field/index.d.ts +1 -0
  162. package/{lib/material → ui}/divider/divider.component.d.ts +1 -2
  163. package/ui/divider/index.d.ts +1 -0
  164. package/{lib → ui}/field-container/field-container.component.d.ts +1 -1
  165. package/ui/field-container/index.d.ts +5 -0
  166. package/{lib/field-container/index.d.ts → ui/field-container/public-api.d.ts} +0 -0
  167. package/{lib/material/file-upload → ui/file-dropzone}/file-dropzone.directive.d.ts +0 -0
  168. package/ui/file-dropzone/index.d.ts +5 -0
  169. package/{lib/material/file-upload/index.d.ts → ui/file-dropzone/public-api.d.ts} +0 -1
  170. package/{lib/material → ui}/file-upload/file-upload.component.d.ts +11 -13
  171. package/ui/file-upload/index.d.ts +1 -0
  172. package/{lib/material → ui}/heading/heading.component.d.ts +1 -2
  173. package/ui/heading/index.d.ts +5 -0
  174. package/ui/heading/public-api.d.ts +1 -0
  175. package/{lib/material → ui}/image-upload-field/image-upload-field.component.d.ts +12 -17
  176. package/ui/image-upload-field/index.d.ts +5 -0
  177. package/{lib/material/image-upload-field/index.d.ts → ui/image-upload-field/public-api.d.ts} +0 -0
  178. package/ui/index.d.ts +5 -0
  179. package/ui/info/index.d.ts +5 -0
  180. package/{lib/material → ui}/info/info.component.d.ts +1 -1
  181. package/ui/info/public-api.d.ts +1 -0
  182. package/ui/input-field/index.d.ts +1 -0
  183. package/ui/input-field/input-field.component.d.ts +22 -0
  184. package/{lib/material → ui}/option/index.d.ts +0 -0
  185. package/{lib/material → ui}/option/option.component.d.ts +1 -1
  186. package/ui/public-api.d.ts +19 -0
  187. package/ui/radio-field/index.d.ts +1 -0
  188. package/ui/radio-field/radio-field.component.d.ts +23 -0
  189. package/ui/select-field/index.d.ts +1 -0
  190. package/{lib/material → ui}/select-field/select-field.component.d.ts +11 -13
  191. package/ui/selected-file/index.d.ts +5 -0
  192. package/ui/selected-file/public-api.d.ts +1 -0
  193. package/{lib/material → ui}/selected-file/selected-file.component.d.ts +0 -0
  194. package/ui/slider-field/index.d.ts +1 -0
  195. package/{lib/material → ui}/slider-field/slider-field.component.d.ts +11 -13
  196. package/ui/textarea-field/index.d.ts +1 -0
  197. package/ui/textarea-field/textarea-field.component.d.ts +21 -0
  198. package/ui/unit-conversion-field/index.d.ts +1 -0
  199. package/{lib/material → ui}/unit-conversion-field/unit-conversion-field.component.d.ts +11 -14
  200. package/utils/README.md +3 -0
  201. package/{lib → utils}/abstracts/autocomplete-field.abstract.d.ts +0 -0
  202. package/{lib → utils}/abstracts/crispr-control.mixin.d.ts +0 -0
  203. package/{lib → utils}/abstracts/crispr-field.abstract.d.ts +0 -0
  204. package/{lib → utils}/abstracts/index.d.ts +0 -0
  205. package/utils/functions/buildFormGroupFromConfig.d.ts +9 -0
  206. package/utils/functions/callOptionsIfFunction.d.ts +3 -0
  207. package/utils/functions/createControlForType.d.ts +9 -0
  208. package/utils/functions/filterOptionsByLabel.d.ts +7 -0
  209. package/utils/functions/image-compression.helpers.d.ts +5 -0
  210. package/utils/functions/index.d.ts +7 -0
  211. package/utils/functions/isControlConfig.d.ts +5 -0
  212. package/utils/functions/observablifyOptions.d.ts +12 -0
  213. package/utils/index.d.ts +5 -0
  214. package/{lib → utils}/models/autocomplete-chiplist-field.config.d.ts +2 -1
  215. package/{lib → utils}/models/autocomplete-field.config.d.ts +1 -2
  216. package/{lib → utils}/models/button.config.d.ts +0 -0
  217. package/{lib → utils}/models/checkbox-field.config.d.ts +1 -2
  218. package/{lib → utils}/models/crispr-field.config.d.ts +1 -10
  219. package/{lib → utils}/models/datepicker-field.config.d.ts +1 -2
  220. package/{lib → utils}/models/divider.config.d.ts +1 -1
  221. package/{lib → utils}/models/file-upload-field.config.d.ts +3 -4
  222. package/{lib → utils}/models/form-group-list.config.d.ts +1 -2
  223. package/{lib → utils}/models/heading.config.d.ts +1 -2
  224. package/{lib → utils}/models/image-upload-field.config.d.ts +2 -1
  225. package/{lib → utils}/models/index.d.ts +0 -0
  226. package/{lib → utils}/models/input-field.config.d.ts +1 -2
  227. package/{lib → utils}/models/radio-field.config.d.ts +0 -0
  228. package/{lib → utils}/models/select-field.config.d.ts +1 -2
  229. package/{lib → utils}/models/slider-field.config.d.ts +1 -2
  230. package/{lib → utils}/models/textarea-field.config.d.ts +1 -2
  231. package/{lib → utils}/models/unit-conversion-field.config.d.ts +1 -2
  232. package/{lib → utils/operators}/form.operators.d.ts +0 -0
  233. package/utils/operators/index.d.ts +1 -0
  234. package/utils/public-api.d.ts +4 -0
  235. package/esm2020/index.mjs +0 -2
  236. package/esm2020/lib/abstracts/autocomplete-field.abstract.mjs +0 -30
  237. package/esm2020/lib/abstracts/crispr-control.mixin.mjs +0 -27
  238. package/esm2020/lib/abstracts/crispr-field.abstract.mjs +0 -20
  239. package/esm2020/lib/abstracts/index.mjs +0 -4
  240. package/esm2020/lib/crispr-forms.module.mjs +0 -57
  241. package/esm2020/lib/field-component-map.const.mjs +0 -28
  242. package/esm2020/lib/field-container/field-container.component.mjs +0 -63
  243. package/esm2020/lib/field-container/index.mjs +0 -2
  244. package/esm2020/lib/field.directive.mjs +0 -69
  245. package/esm2020/lib/form-group-list/form-group-list.component.mjs +0 -92
  246. package/esm2020/lib/form-group-list/index.mjs +0 -2
  247. package/esm2020/lib/form.helpers.mjs +0 -190
  248. package/esm2020/lib/form.operators.mjs +0 -24
  249. package/esm2020/lib/material/button/button.component.mjs +0 -45
  250. package/esm2020/lib/material/checkbox-field/checkbox-field.component.mjs +0 -40
  251. package/esm2020/lib/material/divider/divider.component.mjs +0 -27
  252. package/esm2020/lib/material/file-upload/file-dropzone.directive.mjs +0 -40
  253. package/esm2020/lib/material/file-upload/index.mjs +0 -3
  254. package/esm2020/lib/material/image-upload-field/image-compression.helpers.mjs +0 -4
  255. package/esm2020/lib/material/image-upload-field/index.mjs +0 -2
  256. package/esm2020/lib/material/index.mjs +0 -17
  257. package/esm2020/lib/material/option/index.mjs +0 -2
  258. package/esm2020/lib/material/radio-field/radio-field.component.mjs +0 -36
  259. package/esm2020/lib/material/unit-conversion-field/unit-conversion-field.component.mjs +0 -81
  260. package/esm2020/lib/models/autocomplete-chiplist-field.config.mjs +0 -2
  261. package/esm2020/lib/models/autocomplete-field.config.mjs +0 -2
  262. package/esm2020/lib/models/button.config.mjs +0 -2
  263. package/esm2020/lib/models/checkbox-field.config.mjs +0 -2
  264. package/esm2020/lib/models/crispr-field.config.mjs +0 -23
  265. package/esm2020/lib/models/datepicker-field.config.mjs +0 -2
  266. package/esm2020/lib/models/divider.config.mjs +0 -2
  267. package/esm2020/lib/models/file-upload-field.config.mjs +0 -2
  268. package/esm2020/lib/models/form-group-list.config.mjs +0 -2
  269. package/esm2020/lib/models/heading.config.mjs +0 -3
  270. package/esm2020/lib/models/image-upload-field.config.mjs +0 -2
  271. package/esm2020/lib/models/index.mjs +0 -18
  272. package/esm2020/lib/models/input-field.config.mjs +0 -2
  273. package/esm2020/lib/models/radio-field.config.mjs +0 -2
  274. package/esm2020/lib/models/select-field.config.mjs +0 -2
  275. package/esm2020/lib/models/slider-field.config.mjs +0 -2
  276. package/esm2020/lib/models/textarea-field.config.mjs +0 -2
  277. package/esm2020/lib/models/unit-conversion-field.config.mjs +0 -2
  278. package/esm2020/lib/pipes/initial-control-value.pipe.mjs +0 -20
  279. package/esm2020/lib/public_api.mjs +0 -10
  280. package/esm2020/lib/sub-group/index.mjs +0 -3
  281. package/esm2020/lib/sub-group/sub-group.component.mjs +0 -20
  282. package/esm2020/lib/sub-group/sub-group.module.mjs +0 -42
  283. package/lib/form.helpers.d.ts +0 -88
  284. package/lib/material/checkbox-field/checkbox-field.component.d.ts +0 -23
  285. package/lib/material/image-upload-field/image-compression.helpers.d.ts +0 -1
  286. package/lib/material/index.d.ts +0 -16
  287. package/lib/material/input-field/input-field.component.d.ts +0 -24
  288. package/lib/material/radio-field/radio-field.component.d.ts +0 -26
  289. package/lib/material/textarea-field/textarea-field.component.d.ts +0 -23
  290. package/lib/public_api.d.ts +0 -9
  291. package/tft-crispr-forms-14.0.1-rc.1.tgz +0 -0
@@ -0,0 +1,65 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Component, ChangeDetectionStrategy, Input } from '@angular/core';
3
+ import { of } from 'rxjs';
4
+ import '@angular/forms';
5
+ import { distinctUntilChanged, tap } from 'rxjs/operators';
6
+ import * as i1 from '@angular/common';
7
+ import { CommonModule } from '@angular/common';
8
+ import { HeadingComponent } from '@tft/crispr-forms/ui/heading';
9
+
10
+ class FieldContainerComponent {
11
+ constructor() {
12
+ // boolean whether field-container is inline
13
+ this.inlineField = false;
14
+ this.subs = [];
15
+ }
16
+ ngOnInit() {
17
+ this.disabled$ = this.connectDisabledCallback(this.group, this.config);
18
+ // we tried moving this into afterViewChecked and afterContentChecked lifecycle hooks without any luck
19
+ if (this.config.computeValue) {
20
+ this.subs.push(this.config.computeValue(this.group).pipe(distinctUntilChanged(), tap(computedValue => this.group.get(this.config.controlName).setValue(computedValue))).subscribe());
21
+ }
22
+ }
23
+ ngOnDestroy() {
24
+ this.subs.forEach(sub => sub.unsubscribe);
25
+ }
26
+ /**
27
+ * Connects user defined disabledCallback function to the the view, so that the control is enabled/disabled
28
+ * appropriately. It also will hide disabled fields in the UI unless `hideDisabled` is set to
29
+ * false in the controls config
30
+ * @param group used to get valueChanges from control
31
+ * @param config configuration object used to
32
+ */
33
+ connectDisabledCallback(group, config = null) {
34
+ const control = group.get(config.controlName);
35
+ // If the disabled$ function exists on the field config then call it with the disabledCallbackConfig
36
+ // as a parameter otherwise return an observable of true.
37
+ return config?.disabledCallback && config.disabledCallback instanceof Function
38
+ ? config.disabledCallback(group).pipe(
39
+ // This enables/disables when callback conditions are met
40
+ tap((shouldDisable) => shouldDisable ? control.disable() : control.enable()))
41
+ : of(false);
42
+ }
43
+ }
44
+ FieldContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: FieldContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
45
+ FieldContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.1", type: FieldContainerComponent, isStandalone: true, selector: "crispr-field-container", inputs: { config: "config", group: "group", inlineField: "inlineField" }, ngImport: i0, 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", styles: ["::ng-deep mat-form-field.mat-form-field{display:block;padding:.25em 0}.inline-field{display:inline-block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "component", type: HeadingComponent, selector: "crispr-heading", inputs: ["config"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: FieldContainerComponent, decorators: [{
47
+ type: Component,
48
+ args: [{ selector: 'crispr-field-container', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
49
+ CommonModule,
50
+ HeadingComponent,
51
+ ], 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", styles: ["::ng-deep mat-form-field.mat-form-field{display:block;padding:.25em 0}.inline-field{display:inline-block}\n"] }]
52
+ }], propDecorators: { config: [{
53
+ type: Input
54
+ }], group: [{
55
+ type: Input
56
+ }], inlineField: [{
57
+ type: Input
58
+ }] } });
59
+
60
+ /**
61
+ * Generated bundle index. Do not edit.
62
+ */
63
+
64
+ export { FieldContainerComponent };
65
+ //# sourceMappingURL=tft-crispr-forms-ui-field-container.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tft-crispr-forms-ui-field-container.mjs","sources":["../../../../libs/crispr-forms/ui/field-container/field-container.component.ts","../../../../libs/crispr-forms/ui/field-container/field-container.component.html","../../../../libs/crispr-forms/ui/field-container/tft-crispr-forms-ui-field-container.ts"],"sourcesContent":["import { Component, OnInit, Input, ChangeDetectionStrategy, OnDestroy } from '@angular/core';\nimport { Observable, of, Subscription } from 'rxjs';\nimport { FormGroup } from '@angular/forms';\nimport { tap, distinctUntilChanged } from 'rxjs/operators';\nimport { CommonModule } from '@angular/common';\nimport { HeadingComponent } from '@tft/crispr-forms/ui/heading';\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport type { CrisprControlConfig } from '@tft/crispr-forms/utils';\n\n@Component({\n selector: 'crispr-field-container',\n templateUrl: './field-container.component.html',\n styleUrls: ['./field-container.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n HeadingComponent,\n ],\n})\nexport class FieldContainerComponent implements OnInit, OnDestroy {\n // the configuration object for the field\n @Input() config: CrisprControlConfig;\n // the parent formGroup\n @Input() group: FormGroup;\n // boolean whether field-container is inline\n @Input() inlineField = false;\n // used to determine whether or not field should be shown\n disabled$: Observable<boolean>;\n\n subs: Subscription[] = [];\n\n ngOnInit() {\n this.disabled$ = this.connectDisabledCallback(this.group, this.config);\n // we tried moving this into afterViewChecked and afterContentChecked lifecycle hooks without any luck\n if (this.config.computeValue) {\n this.subs.push(\n this.config.computeValue(this.group).pipe(\n distinctUntilChanged(),\n tap(computedValue => this.group.get(this.config.controlName).setValue(computedValue))\n ).subscribe(),\n );\n }\n }\n\n ngOnDestroy(): void {\n this.subs.forEach(sub => sub.unsubscribe);\n }\n /**\n * Connects user defined disabledCallback function to the the view, so that the control is enabled/disabled\n * appropriately. It also will hide disabled fields in the UI unless `hideDisabled` is set to\n * false in the controls config\n * @param group used to get valueChanges from control\n * @param config configuration object used to\n */\n connectDisabledCallback(group: FormGroup, config: CrisprControlConfig = null) {\n const control = group.get(config.controlName);\n // If the disabled$ function exists on the field config then call it with the disabledCallbackConfig\n // as a parameter otherwise return an observable of true.\n return config?.disabledCallback && config.disabledCallback instanceof Function\n ? config.disabledCallback(group).pipe(\n // This enables/disables when callback conditions are met\n tap((shouldDisable) => shouldDisable ? control.disable() : control.enable())\n )\n : of(false);\n }\n}\n","<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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, Directive, Output, Input, HostListener } from '@angular/core';
3
+
4
+ class FileDropzoneDirective {
5
+ constructor() {
6
+ this.fileDrop = new EventEmitter();
7
+ this.crisprFileDropzone = true;
8
+ }
9
+ onDrop($event) {
10
+ if (this.crisprFileDropzone) {
11
+ $event.preventDefault();
12
+ this.fileDrop.emit($event.dataTransfer.files);
13
+ }
14
+ }
15
+ // Prevents DOM from trying to open file in browser
16
+ onDragOver($event) {
17
+ if (this.crisprFileDropzone) {
18
+ $event.preventDefault();
19
+ }
20
+ }
21
+ }
22
+ FileDropzoneDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: FileDropzoneDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
23
+ FileDropzoneDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.1", type: FileDropzoneDirective, isStandalone: true, selector: "[crisprFileDropzone]", inputs: { crisprFileDropzone: "crisprFileDropzone" }, outputs: { fileDrop: "fileDrop" }, host: { listeners: { "drop": "onDrop($event)", "dragover": "onDragOver($event)" } }, ngImport: i0 });
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: FileDropzoneDirective, decorators: [{
25
+ type: Directive,
26
+ args: [{
27
+ selector: '[crisprFileDropzone]',
28
+ standalone: true,
29
+ }]
30
+ }], propDecorators: { fileDrop: [{
31
+ type: Output
32
+ }], crisprFileDropzone: [{
33
+ type: Input
34
+ }], onDrop: [{
35
+ type: HostListener,
36
+ args: ['drop', ['$event']]
37
+ }], onDragOver: [{
38
+ type: HostListener,
39
+ args: ['dragover', ['$event']]
40
+ }] } });
41
+
42
+ /**
43
+ * Generated bundle index. Do not edit.
44
+ */
45
+
46
+ export { FileDropzoneDirective };
47
+ //# sourceMappingURL=tft-crispr-forms-ui-file-dropzone.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tft-crispr-forms-ui-file-dropzone.mjs","sources":["../../../../libs/crispr-forms/ui/file-dropzone/file-dropzone.directive.ts","../../../../libs/crispr-forms/ui/file-dropzone/tft-crispr-forms-ui-file-dropzone.ts"],"sourcesContent":["import { Directive, HostListener, Output, EventEmitter, Input } from '@angular/core';\n\n@Directive({\n selector: '[crisprFileDropzone]',\n standalone: true,\n})\nexport class FileDropzoneDirective {\n\n @Output() fileDrop = new EventEmitter<FileList>();\n\n @Input() crisprFileDropzone = true;\n\n @HostListener('drop', ['$event'])\n onDrop($event: DragEvent) {\n if(this.crisprFileDropzone) {\n $event.preventDefault();\n this.fileDrop.emit($event.dataTransfer.files);\n }\n }\n\n // Prevents DOM from trying to open file in browser\n @HostListener('dragover', ['$event'])\n onDragOver($event: DragEvent) {\n if(this.crisprFileDropzone) {\n $event.preventDefault();\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;MAMa,qBAAqB,CAAA;AAJlC,IAAA,WAAA,GAAA;AAMY,QAAA,IAAA,CAAA,QAAQ,GAAI,IAAI,YAAY,EAAY,CAAC;QAE1C,IAAkB,CAAA,kBAAA,GAAG,IAAI,CAAC;AAiBpC,KAAA;AAdC,IAAA,MAAM,CAAC,MAAiB,EAAA;QACtB,IAAG,IAAI,CAAC,kBAAkB,EAAE;YAC1B,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AAC/C,SAAA;KACF;;AAID,IAAA,UAAU,CAAC,MAAiB,EAAA;QAC1B,IAAG,IAAI,CAAC,kBAAkB,EAAE;YAC1B,MAAM,CAAC,cAAc,EAAE,CAAC;AACzB,SAAA;KACF;;kHApBU,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;sGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAJjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAA;8BAGW,QAAQ,EAAA,CAAA;sBAAjB,MAAM;gBAEE,kBAAkB,EAAA,CAAA;sBAA1B,KAAK;gBAGN,MAAM,EAAA,CAAA;sBADL,YAAY;uBAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAUhC,UAAU,EAAA,CAAA;sBADT,YAAY;uBAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAA;;;ACrBtC;;AAEG;;;;"}
@@ -0,0 +1,37 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Component, ChangeDetectionStrategy, Input } from '@angular/core';
3
+ import { CrisprFieldComponent } from '@tft/crispr-forms/utils';
4
+ import * as i1 from '@angular/common';
5
+ import { CommonModule } from '@angular/common';
6
+ import * as i2 from '@angular/material/form-field';
7
+ import { MatFormFieldModule } from '@angular/material/form-field';
8
+ import { InfoComponent } from '@tft/crispr-forms/ui/info';
9
+
10
+ const defaultConfig = {
11
+ typographyClass: 'mat-h3'
12
+ };
13
+ class HeadingComponent extends CrisprFieldComponent {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.defaultConfig = defaultConfig;
17
+ }
18
+ }
19
+ HeadingComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: HeadingComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
20
+ HeadingComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.1", type: HeadingComponent, isStandalone: true, selector: "crispr-heading", inputs: { config: "config" }, usesInheritance: true, ngImport: i0, 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", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix]" }, { kind: "component", type: InfoComponent, selector: "crispr-info", inputs: ["info"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: HeadingComponent, decorators: [{
22
+ type: Component,
23
+ args: [{ selector: 'crispr-heading', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
24
+ CommonModule,
25
+ MatFormFieldModule,
26
+ InfoComponent
27
+ ], 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", styles: [":host{display:block}\n"] }]
28
+ }], propDecorators: { config: [{
29
+ type: Input
30
+ }] } });
31
+
32
+ /**
33
+ * Generated bundle index. Do not edit.
34
+ */
35
+
36
+ export { HeadingComponent };
37
+ //# sourceMappingURL=tft-crispr-forms-ui-heading.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tft-crispr-forms-ui-heading.mjs","sources":["../../../../libs/crispr-forms/ui/heading/heading.component.ts","../../../../libs/crispr-forms/ui/heading/heading.component.html","../../../../libs/crispr-forms/ui/heading/tft-crispr-forms-ui-heading.ts"],"sourcesContent":["import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\n// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries\nimport { CrisprFieldComponent, HeadingConfig } from '@tft/crispr-forms/utils';\nimport { CommonModule } from '@angular/common';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { InfoComponent } from '@tft/crispr-forms/ui/info';\n\nconst defaultConfig: Partial<HeadingConfig> = {\n typographyClass: 'mat-h3'\n}\n@Component({\n selector: 'crispr-heading',\n templateUrl: './heading.component.html',\n styleUrls: ['./heading.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n MatFormFieldModule,\n InfoComponent\n ],\n})\nexport class HeadingComponent extends CrisprFieldComponent<HeadingConfig>{\n @Input() config: HeadingConfig;\n defaultConfig = defaultConfig;\n}\n"," <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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;AAOA,MAAM,aAAa,GAA2B;AAC5C,IAAA,eAAe,EAAE,QAAQ;CAC1B,CAAA;AAaK,MAAO,gBAAiB,SAAQ,oBAAmC,CAAA;AAZzE,IAAA,WAAA,GAAA;;QAcE,IAAa,CAAA,aAAA,GAAG,aAAa,CAAC;AAC/B,KAAA;;6GAHY,gBAAgB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,gBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,+HCtB7B,6OAUA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDOI,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,mGAClB,aAAa,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,mBAAA,EAAA,IAAA,EAAA,CAAA,CAAA;2FAGJ,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAZ5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,mBAGT,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,kBAAkB;wBAClB,aAAa;AACd,qBAAA,EAAA,QAAA,EAAA,6OAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,CAAA;8BAGQ,MAAM,EAAA,CAAA;sBAAd,KAAK;;;AEvBR;;AAEG;;;;"}
@@ -0,0 +1,185 @@
1
+ import * as i3 from '@angular/common';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { Component, ChangeDetectionStrategy, Optional, Self, ViewChild } from '@angular/core';
5
+ import * as i1 from '@angular/forms';
6
+ import { ReactiveFormsModule } from '@angular/forms';
7
+ import * as i5 from '@angular/material/button';
8
+ import { MatButtonModule } from '@angular/material/button';
9
+ import * as i6 from '@angular/material/form-field';
10
+ import { MatFormFieldModule } from '@angular/material/form-field';
11
+ import * as i4 from '@angular/material/icon';
12
+ import { MatIconModule } from '@angular/material/icon';
13
+ import * as i7 from '@angular/material/input';
14
+ import { MatInputModule } from '@angular/material/input';
15
+ import * as i2 from '@angular/platform-browser';
16
+ import imageCompression from 'browser-image-compression';
17
+ import { Subject, combineLatest, of } from 'rxjs';
18
+ import { shareReplay, switchMap, map, tap, startWith } from 'rxjs/operators';
19
+ import * as i8 from '@tft/form-validation-handler';
20
+ import { FormValidationHandlerModule } from '@tft/form-validation-handler';
21
+ import { FileDropzoneDirective } from '@tft/crispr-forms/ui/file-dropzone';
22
+ import { SelectedFileComponent } from '@tft/crispr-forms/ui/selected-file';
23
+ import { FieldContainerComponent } from '@tft/crispr-forms/ui/field-container';
24
+ import { crisprControlMixin, CrisprFieldComponent, convertBytesToMb } from '@tft/crispr-forms/utils';
25
+
26
+ /* eslint-disable @nrwl/nx/enforce-module-boundaries */
27
+ const ImageUploadFieldMixin = crisprControlMixin(CrisprFieldComponent);
28
+ class ImageUploadFieldComponent extends ImageUploadFieldMixin {
29
+ constructor(ngControl, domSanitizer, cdr) {
30
+ super();
31
+ this.ngControl = ngControl;
32
+ this.domSanitizer = domSanitizer;
33
+ this.cdr = cdr;
34
+ this.defaultConfig = {
35
+ // allowMultipleFiles: false,
36
+ acceptedTypes: 'image/*',
37
+ dropZoneText: 'DROP FILE HERE',
38
+ selectFilesButtonType: 'button',
39
+ selectButtonText: 'SELECT',
40
+ showClearFilesButton: true,
41
+ clearFilesButtonText: 'CLEAR',
42
+ resetFilesButtonText: 'RESET',
43
+ imagePreviewHeight: '250px',
44
+ compressImage: false,
45
+ targetCompressedImageFileSizeMb: .4,
46
+ minCompressionThresholdMb: .6,
47
+ useWebWorker: true,
48
+ };
49
+ this.inputImageFileSubject = new Subject();
50
+ this.inputImageFile$ = this.inputImageFileSubject.asObservable().pipe(shareReplay(1));
51
+ this.compressedFile$ = this.inputImageFile$.pipe(switchMap(async (file) => {
52
+ if (!file || !(file instanceof File))
53
+ return null;
54
+ const { compressImage, targetCompressedImageFileSizeMb, minCompressionThresholdMb, maxWidthOrHeight, useWebWorker } = this.config;
55
+ const fileSizeMb = convertBytesToMb(file.size);
56
+ const shouldCompress = compressImage
57
+ && targetCompressedImageFileSizeMb < fileSizeMb
58
+ && minCompressionThresholdMb < fileSizeMb;
59
+ if (shouldCompress) {
60
+ const options = {
61
+ // Use maxWidthOrHeight if it was provided, else use target compressed size
62
+ ...(maxWidthOrHeight ? { maxWidthOrHeight } : { maxSizeMB: targetCompressedImageFileSizeMb }),
63
+ useWebWorker,
64
+ maxIterations: 30,
65
+ onProgress: (progress) => {
66
+ this.progress = progress;
67
+ this.cdr.detectChanges();
68
+ }
69
+ };
70
+ return await imageCompression(file, options);
71
+ }
72
+ else
73
+ return file;
74
+ }), map((compressedFile) => {
75
+ if (!compressedFile)
76
+ return compressedFile;
77
+ const { type, name, lastModified } = compressedFile;
78
+ return new File([compressedFile], this.config.fileName || name, {
79
+ type,
80
+ lastModified
81
+ });
82
+ }), tap(file => {
83
+ // only set the value if there is a file because resetToInitialValue sets the control value
84
+ // to initial value and clears the compressed image, so setting it to null here would undo that
85
+ if (file) {
86
+ this.control.setValue(file);
87
+ }
88
+ if (file || this.value) {
89
+ this.control.markAsTouched();
90
+ setTimeout(() => {
91
+ this.cdr.detectChanges();
92
+ }, 100);
93
+ }
94
+ }), shareReplay(1));
95
+ this.compressedImageUrlString$ = this.compressedFile$.pipe(switchMap(async (file) => {
96
+ if (!file)
97
+ return null;
98
+ const compressedStringImage = await imageCompression.getDataUrlFromFile(file);
99
+ return this.domSanitizer.bypassSecurityTrustResourceUrl(compressedStringImage);
100
+ }), shareReplay(1));
101
+ this.isUploaded = false;
102
+ if (this.ngControl != null) {
103
+ // Setting the value accessor directly (instead of using
104
+ // the providers) to avoid running into a circular import.
105
+ ngControl.valueAccessor = this;
106
+ }
107
+ }
108
+ ngOnInit() {
109
+ super.ngOnInit();
110
+ this.imageSrcUrl$ = combineLatest([
111
+ this.compressedImageUrlString$.pipe(startWith(null)),
112
+ this.control.valueChanges.pipe(startWith(this.value), map((controlValue) => {
113
+ if (!controlValue)
114
+ return null;
115
+ if (controlValue instanceof File)
116
+ return null;
117
+ return this.config.mapInputValueToUrl?.(controlValue) || controlValue;
118
+ }))
119
+ ]).pipe(map(([compressedImageUrlString, controlUrl]) => {
120
+ return compressedImageUrlString || controlUrl || null;
121
+ }));
122
+ this.disabled$ = this.config.disabledCallback
123
+ ? this.config.disabledCallback(this.group)
124
+ : of(false);
125
+ }
126
+ filesChanged(files) {
127
+ if (files && files.length > 0) {
128
+ const imageFile = files[0];
129
+ // We clear the control here so that it is invalid while compressing
130
+ // the input pipeline will take care of resetting it
131
+ this.control.patchValue(null);
132
+ // this.control.setErrors({compressing: {loadingMessage: 'Please wait while file compresses'}});
133
+ this.control.markAsTouched();
134
+ this.inputImageFileSubject.next(imageFile);
135
+ }
136
+ }
137
+ clearFileInput() {
138
+ this.inputImageFileSubject.next(null);
139
+ this.fileInputRef.nativeElement.value = '';
140
+ this.control.patchValue(null);
141
+ this.control.markAsTouched();
142
+ this.isUploaded = false;
143
+ }
144
+ resetToInitialValue(initialValue) {
145
+ this.inputImageFileSubject.next(null);
146
+ this.control.patchValue(initialValue);
147
+ this.isUploaded = false;
148
+ }
149
+ writeValue(value) { }
150
+ registerOnChange(fn) {
151
+ this.onChange = fn;
152
+ }
153
+ registerOnTouched(fn) { }
154
+ }
155
+ ImageUploadFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: ImageUploadFieldComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i2.DomSanitizer }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
156
+ ImageUploadFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.1", type: ImageUploadFieldComponent, isStandalone: true, selector: "crispr-image-upload-field", viewQueries: [{ propertyName: "fileInputRef", first: true, predicate: ["fileInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field floatLabel=\"always\"\n [color]=\"config.color\"\n [appearance]=\"config.appearance\"\n [formGroup]=\"group\">\n <mat-label>{{config.label}}</mat-label>\n <input [formControlName]=\"config.controlName\" matInput type=\"text\"/>\n <input\n #fileInput\n type=\"file\"\n [accept]=\"config.acceptedTypes\"\n (change)=\"filesChanged($event.target.files)\"/>\n <div class=\"ui-container\">\n\n <div class=\"image-preview\" [style.height]=\"config.imagePreviewHeight\">\n <crispr-selected-file\n *ngIf=\"(progress < 100) && inputImageFile$ | async as file; else dropzoneOrPreview\"\n [color]=\"config.color === 'primary' ? 'accent' : 'primary'\"\n [fileName]=\"'Compressing: ' + file.name\"\n [showProgress]=\"true\"\n [progress]=\"progress\">\n </crispr-selected-file>\n\n <ng-template #dropzoneOrPreview>\n <!-- <img *ngIf=\"(initialUrlString$ | async) as initialUrlString;\" [src]=\"initialUrlString\" alt=\"\"> -->\n <img *ngIf=\"imageSrcUrl$ | async as srcUrl; else noImage\" [src]=\"srcUrl\" alt=\"\">\n <ng-template #noImage>\n <div class=\"drop-container\"\n [crisprFileDropzone]=\"!(disabled$ | async)\"\n (fileDrop)=\"filesChanged($event)\">\n <mat-icon class=\"drop-icon\" inline=\"true\">cloud_upload</mat-icon>\n <h2 class=\"mat-h2\">{{config.dropZoneText}}</h2>\n </div>\n </ng-template>\n\n </ng-template>\n </div>\n\n\n\n <!-- </ng-template> -->\n <div class=\"button-container\" *ngIf=\"true\">\n\n <button\n mat-button\n (click)=\"clearFileInput()\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>delete</mat-icon>\n {{config.clearFilesButtonText}}\n </button>\n\n <button\n *ngIf=\"value\"\n mat-button\n (click)=\"resetToInitialValue(value)\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>replay</mat-icon>\n {{config.resetFilesButtonText}}\n </button>\n\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [disabled]=\"(disabled$ | async)\"\n (click)=\"fileInput.click()\"\n [attr.aria-label]=\"config.controlName\">\n <mat-icon>\n camera\n </mat-icon>\n SELECT\n </button>\n </div>\n </div>\n\n <mat-hint *ngIf=\"config.hint && (control.valid || !control.touched)\">{{config.hint}}</mat-hint>\n\n </mat-form-field>\n\n</crispr-field-container>\n", styles: [":host ::ng-deep .mat-form-field .mat-form-field-infix{padding-top:0}:host ::ng-deep .mat-form-field .mat-button-wrapper{display:flex;flex-direction:column;align-items:center;padding-top:8px}:host .ui-container{display:flex;flex-direction:column}:host .ui-container .image-preview{display:flex;flex-direction:column;align-content:space-between;justify-content:center;align-items:center;margin:8px 0;flex-grow:1}:host .ui-container .image-preview crispr-selected-file{width:100%}:host .ui-container .image-preview .drop-container{display:flex;box-sizing:border-box;flex-direction:column;align-items:center;border:3px dashed gray;height:100%;width:100%;align-content:center;justify-content:center;border-radius:8px}:host .ui-container .image-preview .drop-container .drop-icon{height:32px;width:32px;font-size:36px}:host .ui-container .image-preview .drop-container .mat-h2{margin:0}:host .ui-container .image-preview img{height:inherit;max-width:100%}:host .ui-container .button-container{display:flex;flex-direction:var(--image-upload-button-container-direction);justify-content:flex-end}:host .ui-container .button-container button{margin-left:8px}:host input{position:absolute;max-height:0;visibility:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { 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],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: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: SelectedFileComponent, selector: "crispr-selected-file", inputs: ["fileName", "progress", "showProgress", "color"] }, { kind: "directive", type: FileDropzoneDirective, selector: "[crisprFileDropzone]", inputs: ["crisprFileDropzone"], outputs: ["fileDrop"] }, { kind: "ngmodule", type: FormValidationHandlerModule }, { kind: "directive", type: i8.ControlErrorsDirective, selector: "[formControl], [formControlName]" }, { kind: "directive", type: i8.ControlErrorContainerDirective, selector: "[controlErrorContainer], [formGroup]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
157
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: ImageUploadFieldComponent, decorators: [{
158
+ type: Component,
159
+ args: [{ selector: 'crispr-image-upload-field', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
160
+ CommonModule,
161
+ FieldContainerComponent,
162
+ ReactiveFormsModule,
163
+ MatIconModule,
164
+ MatButtonModule,
165
+ MatFormFieldModule,
166
+ MatInputModule,
167
+ SelectedFileComponent,
168
+ FileDropzoneDirective,
169
+ FormValidationHandlerModule
170
+ ], template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field floatLabel=\"always\"\n [color]=\"config.color\"\n [appearance]=\"config.appearance\"\n [formGroup]=\"group\">\n <mat-label>{{config.label}}</mat-label>\n <input [formControlName]=\"config.controlName\" matInput type=\"text\"/>\n <input\n #fileInput\n type=\"file\"\n [accept]=\"config.acceptedTypes\"\n (change)=\"filesChanged($event.target.files)\"/>\n <div class=\"ui-container\">\n\n <div class=\"image-preview\" [style.height]=\"config.imagePreviewHeight\">\n <crispr-selected-file\n *ngIf=\"(progress < 100) && inputImageFile$ | async as file; else dropzoneOrPreview\"\n [color]=\"config.color === 'primary' ? 'accent' : 'primary'\"\n [fileName]=\"'Compressing: ' + file.name\"\n [showProgress]=\"true\"\n [progress]=\"progress\">\n </crispr-selected-file>\n\n <ng-template #dropzoneOrPreview>\n <!-- <img *ngIf=\"(initialUrlString$ | async) as initialUrlString;\" [src]=\"initialUrlString\" alt=\"\"> -->\n <img *ngIf=\"imageSrcUrl$ | async as srcUrl; else noImage\" [src]=\"srcUrl\" alt=\"\">\n <ng-template #noImage>\n <div class=\"drop-container\"\n [crisprFileDropzone]=\"!(disabled$ | async)\"\n (fileDrop)=\"filesChanged($event)\">\n <mat-icon class=\"drop-icon\" inline=\"true\">cloud_upload</mat-icon>\n <h2 class=\"mat-h2\">{{config.dropZoneText}}</h2>\n </div>\n </ng-template>\n\n </ng-template>\n </div>\n\n\n\n <!-- </ng-template> -->\n <div class=\"button-container\" *ngIf=\"true\">\n\n <button\n mat-button\n (click)=\"clearFileInput()\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>delete</mat-icon>\n {{config.clearFilesButtonText}}\n </button>\n\n <button\n *ngIf=\"value\"\n mat-button\n (click)=\"resetToInitialValue(value)\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>replay</mat-icon>\n {{config.resetFilesButtonText}}\n </button>\n\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [disabled]=\"(disabled$ | async)\"\n (click)=\"fileInput.click()\"\n [attr.aria-label]=\"config.controlName\">\n <mat-icon>\n camera\n </mat-icon>\n SELECT\n </button>\n </div>\n </div>\n\n <mat-hint *ngIf=\"config.hint && (control.valid || !control.touched)\">{{config.hint}}</mat-hint>\n\n </mat-form-field>\n\n</crispr-field-container>\n", styles: [":host ::ng-deep .mat-form-field .mat-form-field-infix{padding-top:0}:host ::ng-deep .mat-form-field .mat-button-wrapper{display:flex;flex-direction:column;align-items:center;padding-top:8px}:host .ui-container{display:flex;flex-direction:column}:host .ui-container .image-preview{display:flex;flex-direction:column;align-content:space-between;justify-content:center;align-items:center;margin:8px 0;flex-grow:1}:host .ui-container .image-preview crispr-selected-file{width:100%}:host .ui-container .image-preview .drop-container{display:flex;box-sizing:border-box;flex-direction:column;align-items:center;border:3px dashed gray;height:100%;width:100%;align-content:center;justify-content:center;border-radius:8px}:host .ui-container .image-preview .drop-container .drop-icon{height:32px;width:32px;font-size:36px}:host .ui-container .image-preview .drop-container .mat-h2{margin:0}:host .ui-container .image-preview img{height:inherit;max-width:100%}:host .ui-container .button-container{display:flex;flex-direction:var(--image-upload-button-container-direction);justify-content:flex-end}:host .ui-container .button-container button{margin-left:8px}:host input{position:absolute;max-height:0;visibility:hidden}\n"] }]
171
+ }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
172
+ type: Optional
173
+ }, {
174
+ type: Self
175
+ }] }, { type: i2.DomSanitizer }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { fileInputRef: [{
176
+ type: ViewChild,
177
+ args: ['fileInput']
178
+ }] } });
179
+
180
+ /**
181
+ * Generated bundle index. Do not edit.
182
+ */
183
+
184
+ export { ImageUploadFieldComponent };
185
+ //# sourceMappingURL=tft-crispr-forms-ui-image-upload-field.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tft-crispr-forms-ui-image-upload-field.mjs","sources":["../../../../libs/crispr-forms/ui/image-upload-field/image-upload-field.component.ts","../../../../libs/crispr-forms/ui/image-upload-field/image-upload-field.component.html","../../../../libs/crispr-forms/ui/image-upload-field/tft-crispr-forms-ui-image-upload-field.ts"],"sourcesContent":["/* eslint-disable @nrwl/nx/enforce-module-boundaries */\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n ElementRef,\n ViewChild,\n OnInit,\n ChangeDetectionStrategy,\n Optional,\n Self,\n ChangeDetectorRef,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport imageCompression from 'browser-image-compression';\nimport { combineLatest, Observable, of, Subject } from 'rxjs';\nimport { map, shareReplay, startWith, switchMap, tap } from 'rxjs/operators';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\nimport { FileDropzoneDirective } from '@tft/crispr-forms/ui/file-dropzone';\nimport { SelectedFileComponent } from '@tft/crispr-forms/ui/selected-file';\nimport { FieldContainerComponent } from '@tft/crispr-forms/ui/field-container';\nimport { crisprControlMixin, CrisprFieldComponent, convertBytesToMb, ImageUploadFieldConfig } from '@tft/crispr-forms/utils';\n\nconst ImageUploadFieldMixin = crisprControlMixin<ImageUploadFieldConfig>(CrisprFieldComponent);\n\n@Component({\n selector: 'crispr-image-upload-field',\n templateUrl: './image-upload-field.component.html',\n styleUrls: ['./image-upload-field.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n FieldContainerComponent,\n ReactiveFormsModule,\n MatIconModule,\n MatButtonModule,\n MatFormFieldModule,\n MatInputModule,\n SelectedFileComponent,\n FileDropzoneDirective,\n FormValidationHandlerModule\n ],\n})\nexport class ImageUploadFieldComponent extends ImageUploadFieldMixin implements OnInit, ControlValueAccessor {\n\n onChange: () => void;\n\n defaultConfig: Partial<ImageUploadFieldConfig> = {\n // allowMultipleFiles: false,\n acceptedTypes: 'image/*',\n dropZoneText: 'DROP FILE HERE',\n selectFilesButtonType: 'button',\n selectButtonText: 'SELECT',\n showClearFilesButton: true,\n clearFilesButtonText: 'CLEAR',\n resetFilesButtonText: 'RESET',\n imagePreviewHeight: '250px',\n compressImage: false,\n targetCompressedImageFileSizeMb: .4,\n minCompressionThresholdMb: .6,\n useWebWorker: true,\n }\n\n private inputImageFileSubject = new Subject<File | null>();\n inputImageFile$ = this.inputImageFileSubject.asObservable().pipe(\n shareReplay(1),\n );\n /**\n * the compression progress\n */\n progress: number | undefined;\n\n compressedFile$: Observable<File> = this.inputImageFile$.pipe(\n switchMap(async (file) => {\n if (!file || !(file instanceof File)) return null;\n const { compressImage, targetCompressedImageFileSizeMb, minCompressionThresholdMb, maxWidthOrHeight, useWebWorker } = this.config;\n const fileSizeMb = convertBytesToMb(file.size);\n const shouldCompress = compressImage\n && targetCompressedImageFileSizeMb < fileSizeMb\n && minCompressionThresholdMb < fileSizeMb\n if (shouldCompress) {\n const options = {\n // Use maxWidthOrHeight if it was provided, else use target compressed size\n ...(maxWidthOrHeight ? {maxWidthOrHeight} : { maxSizeMB: targetCompressedImageFileSizeMb}),\n useWebWorker,\n maxIterations: 30,\n onProgress: (progress: number) => {\n this.progress = progress;\n this.cdr.detectChanges();\n }\n }\n return await imageCompression(file, options);\n } else return file;\n }),\n map((compressedFile: File) => {\n if(!compressedFile) return compressedFile;\n const { type, name, lastModified } = compressedFile\n return new File([compressedFile], this.config.fileName || name, {\n type,\n lastModified\n });\n }),\n tap(file => {\n // only set the value if there is a file because resetToInitialValue sets the control value\n // to initial value and clears the compressed image, so setting it to null here would undo that\n if (file) {\n this.control.setValue(file);\n }\n if (file || this.value) {\n this.control.markAsTouched();\n setTimeout(() => {\n this.cdr.detectChanges();\n }, 100)\n }\n }),\n shareReplay(1)\n )\n\n compressedImageUrlString$: Observable<string | null> = this.compressedFile$.pipe(\n switchMap(async (file) => {\n if(!file) return null;\n const compressedStringImage = await imageCompression.getDataUrlFromFile(file);\n return this.domSanitizer.bypassSecurityTrustResourceUrl(compressedStringImage) as string\n }),\n shareReplay(1),\n )\n\n // This is what is displayed by the image preview\n imageSrcUrl$: Observable<string | null>;\n\n @ViewChild('fileInput') fileInputRef: ElementRef\n\n selectedFiles: FileList;\n\n isUploaded = false;\n\n disabled$: Observable<boolean>;\n\n constructor(\n @Optional() @Self() public ngControl: NgControl,\n private domSanitizer: DomSanitizer,\n private cdr: ChangeDetectorRef,\n ) {\n super();\n if (this.ngControl != null) {\n // Setting the value accessor directly (instead of using\n // the providers) to avoid running into a circular import.\n ngControl.valueAccessor = this;\n }\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.imageSrcUrl$ = combineLatest([\n this.compressedImageUrlString$.pipe(startWith(null)),\n this.control.valueChanges.pipe(\n startWith(this.value),\n map((controlValue): string => {\n if(!controlValue) return null;\n if(controlValue instanceof File) return null;\n return this.config.mapInputValueToUrl?.(controlValue) || controlValue as string\n })\n )\n ]).pipe(\n map(([compressedImageUrlString, controlUrl]) => {\n return compressedImageUrlString || controlUrl || null;\n })\n )\n this.disabled$ = this.config.disabledCallback\n ? this.config.disabledCallback(this.group)\n : of(false);\n }\n\n filesChanged(files: FileList): void {\n if (files && files.length > 0 ) {\n const imageFile = files[0];\n // We clear the control here so that it is invalid while compressing\n // the input pipeline will take care of resetting it\n this.control.patchValue(null);\n // this.control.setErrors({compressing: {loadingMessage: 'Please wait while file compresses'}});\n this.control.markAsTouched();\n this.inputImageFileSubject.next(imageFile);\n }\n }\n\n clearFileInput(): void {\n this.inputImageFileSubject.next(null);\n this.fileInputRef.nativeElement.value = ''\n this.control.patchValue(null);\n this.control.markAsTouched();\n this.isUploaded = false;\n }\n\n resetToInitialValue(initialValue: string): void {\n this.inputImageFileSubject.next(null);\n this.control.patchValue(initialValue)\n this.isUploaded = false;\n }\n\n writeValue( value: null ) { }\n\n registerOnChange( fn: () => void ) {\n this.onChange = fn;\n }\n\n registerOnTouched( fn: () => void ) { }\n}\n\n\n","<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field floatLabel=\"always\"\n [color]=\"config.color\"\n [appearance]=\"config.appearance\"\n [formGroup]=\"group\">\n <mat-label>{{config.label}}</mat-label>\n <input [formControlName]=\"config.controlName\" matInput type=\"text\"/>\n <input\n #fileInput\n type=\"file\"\n [accept]=\"config.acceptedTypes\"\n (change)=\"filesChanged($event.target.files)\"/>\n <div class=\"ui-container\">\n\n <div class=\"image-preview\" [style.height]=\"config.imagePreviewHeight\">\n <crispr-selected-file\n *ngIf=\"(progress < 100) && inputImageFile$ | async as file; else dropzoneOrPreview\"\n [color]=\"config.color === 'primary' ? 'accent' : 'primary'\"\n [fileName]=\"'Compressing: ' + file.name\"\n [showProgress]=\"true\"\n [progress]=\"progress\">\n </crispr-selected-file>\n\n <ng-template #dropzoneOrPreview>\n <!-- <img *ngIf=\"(initialUrlString$ | async) as initialUrlString;\" [src]=\"initialUrlString\" alt=\"\"> -->\n <img *ngIf=\"imageSrcUrl$ | async as srcUrl; else noImage\" [src]=\"srcUrl\" alt=\"\">\n <ng-template #noImage>\n <div class=\"drop-container\"\n [crisprFileDropzone]=\"!(disabled$ | async)\"\n (fileDrop)=\"filesChanged($event)\">\n <mat-icon class=\"drop-icon\" inline=\"true\">cloud_upload</mat-icon>\n <h2 class=\"mat-h2\">{{config.dropZoneText}}</h2>\n </div>\n </ng-template>\n\n </ng-template>\n </div>\n\n\n\n <!-- </ng-template> -->\n <div class=\"button-container\" *ngIf=\"true\">\n\n <button\n mat-button\n (click)=\"clearFileInput()\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>delete</mat-icon>\n {{config.clearFilesButtonText}}\n </button>\n\n <button\n *ngIf=\"value\"\n mat-button\n (click)=\"resetToInitialValue(value)\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>replay</mat-icon>\n {{config.resetFilesButtonText}}\n </button>\n\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [disabled]=\"(disabled$ | async)\"\n (click)=\"fileInput.click()\"\n [attr.aria-label]=\"config.controlName\">\n <mat-icon>\n camera\n </mat-icon>\n SELECT\n </button>\n </div>\n </div>\n\n <mat-hint *ngIf=\"config.hint && (control.valid || !control.touched)\">{{config.hint}}</mat-hint>\n\n </mat-form-field>\n\n</crispr-field-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import * as i1 from '@angular/common';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { Component, ChangeDetectionStrategy, Input } from '@angular/core';
5
+ import * as i2 from '@angular/material/icon';
6
+ import { MatIconModule } from '@angular/material/icon';
7
+ import * as i3 from '@angular/material/tooltip';
8
+ import { MatTooltipModule } from '@angular/material/tooltip';
9
+
10
+ class InfoComponent {
11
+ }
12
+ InfoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: InfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13
+ InfoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.1", type: InfoComponent, isStandalone: true, selector: "crispr-info", inputs: { info: "info" }, ngImport: i0, template: "<mat-icon\n *ngIf=\"info\"\n [matTooltip]=\"info.content\"\n [matTooltipPosition]=\"info.tooltipPosition || 'below'\"\n matSuffix>\n {{info.iconName || 'info'}}\n</mat-icon>\n", styles: [":host mat-icon{font-size:1.2em;width:1em;height:1em;opacity:.8;margin-right:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: InfoComponent, decorators: [{
15
+ type: Component,
16
+ args: [{ selector: 'crispr-info', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
17
+ CommonModule,
18
+ MatIconModule,
19
+ MatTooltipModule
20
+ ], template: "<mat-icon\n *ngIf=\"info\"\n [matTooltip]=\"info.content\"\n [matTooltipPosition]=\"info.tooltipPosition || 'below'\"\n matSuffix>\n {{info.iconName || 'info'}}\n</mat-icon>\n", styles: [":host mat-icon{font-size:1.2em;width:1em;height:1em;opacity:.8;margin-right:0}\n"] }]
21
+ }], propDecorators: { info: [{
22
+ type: Input
23
+ }] } });
24
+
25
+ /**
26
+ * Generated bundle index. Do not edit.
27
+ */
28
+
29
+ export { InfoComponent };
30
+ //# sourceMappingURL=tft-crispr-forms-ui-info.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tft-crispr-forms-ui-info.mjs","sources":["../../../../libs/crispr-forms/ui/info/info.component.ts","../../../../libs/crispr-forms/ui/info/info.component.html","../../../../libs/crispr-forms/ui/info/tft-crispr-forms-ui-info.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport type { Info } from '@tft/crispr-forms/utils';\n\n@Component({\n selector: 'crispr-info',\n templateUrl: './info.component.html',\n styleUrls: ['./info.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n MatIconModule,\n MatTooltipModule\n ],\n})\nexport class InfoComponent {\n\n @Input() info: Info;\n\n}\n","<mat-icon\n *ngIf=\"info\"\n [matTooltip]=\"info.content\"\n [matTooltipPosition]=\"info.tooltipPosition || 'below'\"\n matSuffix>\n {{info.iconName || 'info'}}\n</mat-icon>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;MAkBa,aAAa,CAAA;;0GAAb,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAb,aAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,iGClB1B,sLAOA,EAAA,MAAA,EAAA,CAAA,kFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDMI,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,mLACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,mBAAA,EAAA,IAAA,EAAA,CAAA,CAAA;2FAGP,aAAa,EAAA,UAAA,EAAA,CAAA;kBAZzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,mBAGN,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,aAAa;wBACb,gBAAgB;AACjB,qBAAA,EAAA,QAAA,EAAA,sLAAA,EAAA,MAAA,EAAA,CAAA,kFAAA,CAAA,EAAA,CAAA;8BAIQ,IAAI,EAAA,CAAA;sBAAZ,KAAK;;;AEpBR;;AAEG;;;;"}
@@ -0,0 +1,33 @@
1
+ import * as i1 from '@angular/common';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { Component, Input } from '@angular/core';
5
+ import * as i2 from '@angular/material/progress-bar';
6
+ import { MatProgressBarModule } from '@angular/material/progress-bar';
7
+
8
+ class SelectedFileComponent {
9
+ }
10
+ SelectedFileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: SelectedFileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11
+ SelectedFileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.1", type: SelectedFileComponent, isStandalone: true, selector: "crispr-selected-file", inputs: { fileName: "fileName", progress: "progress", showProgress: "showProgress", color: "color" }, ngImport: i0, 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", styles: ["mat-progress-bar{margin-bottom:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i2.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }], preserveWhitespaces: true });
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: SelectedFileComponent, decorators: [{
13
+ type: Component,
14
+ args: [{ selector: 'crispr-selected-file', standalone: true, imports: [
15
+ CommonModule,
16
+ MatProgressBarModule
17
+ ], 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", styles: ["mat-progress-bar{margin-bottom:8px}\n"] }]
18
+ }], propDecorators: { fileName: [{
19
+ type: Input
20
+ }], progress: [{
21
+ type: Input
22
+ }], showProgress: [{
23
+ type: Input
24
+ }], color: [{
25
+ type: Input
26
+ }] } });
27
+
28
+ /**
29
+ * Generated bundle index. Do not edit.
30
+ */
31
+
32
+ export { SelectedFileComponent };
33
+ //# sourceMappingURL=tft-crispr-forms-ui-selected-file.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tft-crispr-forms-ui-selected-file.mjs","sources":["../../../../libs/crispr-forms/ui/selected-file/selected-file.component.ts","../../../../libs/crispr-forms/ui/selected-file/selected-file.component.html","../../../../libs/crispr-forms/ui/selected-file/tft-crispr-forms-ui-selected-file.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport { ThemePalette } from '@angular/material/core';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\n\n@Component({\n selector: 'crispr-selected-file',\n templateUrl: './selected-file.component.html',\n styleUrls: ['./selected-file.component.scss'],\n standalone: true,\n imports: [\n CommonModule,\n MatProgressBarModule\n ],\n})\nexport class SelectedFileComponent {\n\n @Input() fileName: string;\n @Input() progress: number;\n @Input() showProgress: boolean;\n @Input() color: ThemePalette;\n\n}\n","<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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;MAea,qBAAqB,CAAA;;kHAArB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,ECflC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,oLAOA,EDII,MAAA,EAAA,CAAA,uCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,kIACZ,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,IAAA,EAAA,CAAA,CAAA;2FAGX,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAVjC,SAAS;+BACE,sBAAsB,EAAA,UAAA,EAGpB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,oBAAoB;AACrB,qBAAA,EAAA,QAAA,EAAA,oLAAA,EAAA,MAAA,EAAA,CAAA,uCAAA,CAAA,EAAA,CAAA;8BAIQ,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBACG,KAAK,EAAA,CAAA;sBAAb,KAAK;;;AEpBR;;AAEG;;;;"}