@popsure/dirty-swan 0.28.0-beta.4 → 0.28.0

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 (357) hide show
  1. package/Readme.md +2 -0
  2. package/dist/{App.d.ts → cjs/App.d.ts} +0 -1
  3. package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
  4. package/dist/{index.js → cjs/index.js} +2811 -1441
  5. package/dist/cjs/index.js.map +1 -0
  6. package/dist/{lib → cjs/lib}/components/autocompleteAddress/demo.d.ts +0 -1
  7. package/dist/cjs/lib/components/autocompleteAddress/index.d.ts +19 -0
  8. package/dist/{lib/components/input/currency → cjs/lib/components/autocompleteAddress}/index.test.d.ts +0 -0
  9. package/dist/{lib/components/autocompleteAddress/util → cjs/lib/components/autocompleteAddress}/mapStyle.d.ts +0 -0
  10. package/dist/{lib → cjs/lib}/components/autocompleteAddress/util/index.d.ts +1 -1
  11. package/dist/{lib → cjs/lib}/components/button/icons/index.d.ts +0 -0
  12. package/dist/cjs/lib/components/button/index.d.ts +13 -0
  13. package/dist/{lib → cjs/lib}/components/cards/cardButton/index.d.ts +0 -0
  14. package/dist/{lib → cjs/lib}/components/cards/cardWithLeftIcon/index.d.ts +0 -0
  15. package/dist/{lib → cjs/lib}/components/cards/cardWithTopIcon/index.d.ts +0 -0
  16. package/dist/{lib → cjs/lib}/components/cards/cardWithTopLeftIcon/index.d.ts +0 -0
  17. package/dist/{lib → cjs/lib}/components/cards/icons/index.d.ts +0 -0
  18. package/dist/{lib → cjs/lib}/components/cards/index.d.ts +0 -0
  19. package/dist/{lib → cjs/lib}/components/cards/infoCard/index.d.ts +0 -0
  20. package/dist/{lib → cjs/lib}/components/chip/index.d.ts +0 -1
  21. package/dist/cjs/lib/components/comparisonTable/components/AccordionItem/AccordionItem.d.ts +9 -0
  22. package/dist/cjs/lib/components/comparisonTable/components/AccordionItem/index.d.ts +1 -0
  23. package/dist/{lib → cjs/lib}/components/comparisonTable/components/Chevron.d.ts +0 -1
  24. package/dist/{lib → cjs/lib}/components/comparisonTable/components/Row/index.d.ts +1 -2
  25. package/dist/{lib → cjs/lib}/components/comparisonTable/components/TableArrows/Arrow.d.ts +0 -1
  26. package/dist/{lib → cjs/lib}/components/comparisonTable/components/TableArrows/index.d.ts +4 -3
  27. package/dist/{lib → cjs/lib}/components/comparisonTable/components/TableInfoButton/index.d.ts +0 -1
  28. package/dist/{lib → cjs/lib}/components/comparisonTable/components/TableRating/StarIcon.d.ts +0 -1
  29. package/dist/{lib → cjs/lib}/components/comparisonTable/components/TableRating/ZapIcon.d.ts +0 -1
  30. package/dist/{lib → cjs/lib}/components/comparisonTable/components/TableRating/index.d.ts +0 -1
  31. package/dist/{lib → cjs/lib}/components/comparisonTable/components/TableRowHeader/index.d.ts +0 -1
  32. package/dist/{lib → cjs/lib}/components/comparisonTable/components/TableTrueFalse.d.ts +0 -1
  33. package/dist/cjs/lib/components/comparisonTable/hooks/useComparisonTable.d.ts +14 -0
  34. package/dist/{lib → cjs/lib}/components/comparisonTable/index.d.ts +10 -4
  35. package/dist/{lib → cjs/lib}/components/dateSelector/index.d.ts +0 -1
  36. package/dist/{lib → cjs/lib}/components/downloadButton/index.d.ts +0 -0
  37. package/dist/{lib → cjs/lib}/components/input/autoSuggestInput/index.d.ts +0 -1
  38. package/dist/{lib → cjs/lib}/components/input/autoSuggestMultiSelect/index.d.ts +0 -1
  39. package/dist/{lib → cjs/lib}/components/input/currency/format/index.d.ts +0 -0
  40. package/dist/{lib → cjs/lib}/components/input/currency/index.d.ts +0 -1
  41. package/dist/cjs/lib/components/input/currency/index.test.d.ts +1 -0
  42. package/dist/{lib → cjs/lib}/components/input/iban/formatIban/index.d.ts +0 -0
  43. package/dist/{lib → cjs/lib}/components/input/iban/index.d.ts +0 -1
  44. package/dist/cjs/lib/components/input/index.d.ts +16 -0
  45. package/dist/{lib → cjs/lib}/components/markdown/index.d.ts +0 -0
  46. package/dist/{lib/components/modal/regularModal → cjs/lib/components/modal/bottomModal}/index.d.ts +0 -1
  47. package/dist/{lib → cjs/lib}/components/modal/bottomOrRegularModal/index.d.ts +0 -1
  48. package/dist/{lib → cjs/lib}/components/modal/hooks/useOnClose.d.ts +0 -0
  49. package/dist/{lib → cjs/lib}/components/modal/index.d.ts +0 -0
  50. package/dist/{lib/components/modal/bottomModal → cjs/lib/components/modal/regularModal}/index.d.ts +0 -1
  51. package/dist/cjs/lib/components/multiDropzone/UploadFileCell/index.d.ts +10 -0
  52. package/dist/cjs/lib/components/multiDropzone/icons/index.d.ts +11 -0
  53. package/dist/cjs/lib/components/multiDropzone/index.d.ts +15 -0
  54. package/dist/cjs/lib/components/multiDropzone/index.test.d.ts +1 -0
  55. package/dist/cjs/lib/components/multiDropzone/types.d.ts +31 -0
  56. package/dist/cjs/lib/components/multiDropzone/utils/index.d.ts +11 -0
  57. package/dist/{lib → cjs/lib}/components/segmentedControl/index.d.ts +0 -1
  58. package/dist/cjs/lib/components/segmentedControl/index.test.d.ts +1 -0
  59. package/dist/{lib → cjs/lib}/components/signaturePad/index.d.ts +0 -0
  60. package/dist/{lib → cjs/lib}/index.d.ts +0 -0
  61. package/dist/{lib → cjs/lib}/models/autoSuggestInput/index.d.ts +0 -0
  62. package/dist/{lib → cjs/lib}/models/download.d.ts +0 -0
  63. package/dist/{lib → cjs/lib}/scss/private/base/demo.d.ts +0 -1
  64. package/dist/{lib → cjs/lib}/scss/public/demo.d.ts +0 -1
  65. package/dist/{lib → cjs/lib}/util/calendarDate/index.d.ts +0 -0
  66. package/dist/cjs/lib/util/formatBytes/index.d.ts +1 -0
  67. package/dist/cjs/lib/util/testUtils/customRender.d.ts +7 -0
  68. package/dist/cjs/lib/util/testUtils/index.d.ts +2 -0
  69. package/dist/{lib → cjs/lib}/util/zeroFill.d.ts +0 -0
  70. package/dist/{mapStyle-32849fbf.js → cjs/mapStyle-a64f125f.js} +1 -1
  71. package/dist/cjs/mapStyle-a64f125f.js.map +1 -0
  72. package/dist/esm/App.d.ts +3 -0
  73. package/dist/esm/_commonjsHelpers-0f86abda.js +23 -0
  74. package/dist/esm/_commonjsHelpers-0f86abda.js.map +1 -0
  75. package/dist/esm/components/autocompleteAddress/demo.js +65 -0
  76. package/dist/esm/components/autocompleteAddress/demo.js.map +1 -0
  77. package/dist/esm/components/autocompleteAddress/index.js +2063 -0
  78. package/dist/esm/components/autocompleteAddress/index.js.map +1 -0
  79. package/dist/esm/components/autocompleteAddress/index.test.js +116 -0
  80. package/dist/esm/components/autocompleteAddress/index.test.js.map +1 -0
  81. package/dist/esm/components/button/index.js +25 -0
  82. package/dist/esm/components/button/index.js.map +1 -0
  83. package/dist/esm/components/cards/cardButton/index.js +6 -0
  84. package/dist/esm/components/cards/cardButton/index.js.map +1 -0
  85. package/dist/esm/components/cards/cardWithLeftIcon/index.js +7 -0
  86. package/dist/esm/components/cards/cardWithLeftIcon/index.js.map +1 -0
  87. package/dist/esm/components/cards/cardWithTopIcon/index.js +7 -0
  88. package/dist/esm/components/cards/cardWithTopIcon/index.js.map +1 -0
  89. package/dist/esm/components/cards/cardWithTopLeftIcon/index.js +7 -0
  90. package/dist/esm/components/cards/cardWithTopLeftIcon/index.js.map +1 -0
  91. package/dist/esm/components/cards/index.js +125 -0
  92. package/dist/esm/components/cards/index.js.map +1 -0
  93. package/dist/esm/components/cards/infoCard/index.js +7 -0
  94. package/dist/esm/components/cards/infoCard/index.js.map +1 -0
  95. package/dist/esm/components/chip/index.js +22 -0
  96. package/dist/esm/components/chip/index.js.map +1 -0
  97. package/dist/esm/components/comparisonTable/components/AccordionItem/AccordionItem.js +32 -0
  98. package/dist/esm/components/comparisonTable/components/AccordionItem/AccordionItem.js.map +1 -0
  99. package/dist/esm/components/comparisonTable/components/AccordionItem/index.js +8 -0
  100. package/dist/esm/components/comparisonTable/components/AccordionItem/index.js.map +1 -0
  101. package/dist/esm/components/comparisonTable/components/Chevron.js +10 -0
  102. package/dist/esm/components/comparisonTable/components/Chevron.js.map +1 -0
  103. package/dist/esm/components/comparisonTable/components/Row/index.js +36 -0
  104. package/dist/esm/components/comparisonTable/components/Row/index.js.map +1 -0
  105. package/dist/esm/components/comparisonTable/components/TableArrows/Arrow.js +10 -0
  106. package/dist/esm/components/comparisonTable/components/TableArrows/Arrow.js.map +1 -0
  107. package/dist/esm/components/comparisonTable/components/TableArrows/index.js +24 -0
  108. package/dist/esm/components/comparisonTable/components/TableArrows/index.js.map +1 -0
  109. package/dist/esm/components/comparisonTable/components/TableInfoButton/index.js +17 -0
  110. package/dist/esm/components/comparisonTable/components/TableInfoButton/index.js.map +1 -0
  111. package/dist/esm/components/comparisonTable/components/TableRating/StarIcon.js +10 -0
  112. package/dist/esm/components/comparisonTable/components/TableRating/StarIcon.js.map +1 -0
  113. package/dist/esm/components/comparisonTable/components/TableRating/ZapIcon.js +10 -0
  114. package/dist/esm/components/comparisonTable/components/TableRating/ZapIcon.js.map +1 -0
  115. package/dist/esm/components/comparisonTable/components/TableRating/index.js +27 -0
  116. package/dist/esm/components/comparisonTable/components/TableRating/index.js.map +1 -0
  117. package/dist/esm/components/comparisonTable/components/TableRowHeader/index.js +22 -0
  118. package/dist/esm/components/comparisonTable/components/TableRowHeader/index.js.map +1 -0
  119. package/dist/esm/components/comparisonTable/components/TableTrueFalse.js +13 -0
  120. package/dist/esm/components/comparisonTable/components/TableTrueFalse.js.map +1 -0
  121. package/dist/esm/components/comparisonTable/index.js +1585 -0
  122. package/dist/esm/components/comparisonTable/index.js.map +1 -0
  123. package/dist/esm/components/dateSelector/index.js +2161 -0
  124. package/dist/esm/components/dateSelector/index.js.map +1 -0
  125. package/dist/esm/components/downloadButton/index.js +36 -0
  126. package/dist/esm/components/downloadButton/index.js.map +1 -0
  127. package/dist/esm/components/input/autoSuggestInput/index.js +2161 -0
  128. package/dist/esm/components/input/autoSuggestInput/index.js.map +1 -0
  129. package/dist/esm/components/input/autoSuggestMultiSelect/index.js +42 -0
  130. package/dist/esm/components/input/autoSuggestMultiSelect/index.js.map +1 -0
  131. package/dist/esm/components/input/currency/index.js +52 -0
  132. package/dist/esm/components/input/currency/index.js.map +1 -0
  133. package/dist/esm/components/input/currency/index.test.js +120 -0
  134. package/dist/esm/components/input/currency/index.test.js.map +1 -0
  135. package/dist/esm/components/input/iban/index.js +34 -0
  136. package/dist/esm/components/input/iban/index.js.map +1 -0
  137. package/dist/esm/components/input/index.js +30 -0
  138. package/dist/esm/components/input/index.js.map +1 -0
  139. package/dist/esm/components/markdown/index.js +22164 -0
  140. package/dist/esm/components/markdown/index.js.map +1 -0
  141. package/dist/esm/components/modal/bottomModal/index.js +31 -0
  142. package/dist/esm/components/modal/bottomModal/index.js.map +1 -0
  143. package/dist/esm/components/modal/bottomOrRegularModal/index.js +35 -0
  144. package/dist/esm/components/modal/bottomOrRegularModal/index.js.map +1 -0
  145. package/dist/esm/components/modal/regularModal/index.js +24 -0
  146. package/dist/esm/components/modal/regularModal/index.js.map +1 -0
  147. package/dist/esm/components/multiDropzone/UploadFileCell/index.js +6 -0
  148. package/dist/esm/components/multiDropzone/UploadFileCell/index.js.map +1 -0
  149. package/dist/esm/components/multiDropzone/index.js +2851 -0
  150. package/dist/esm/components/multiDropzone/index.js.map +1 -0
  151. package/dist/esm/components/multiDropzone/index.test.js +7602 -0
  152. package/dist/esm/components/multiDropzone/index.test.js.map +1 -0
  153. package/dist/esm/components/segmentedControl/index.js +42 -0
  154. package/dist/esm/components/segmentedControl/index.js.map +1 -0
  155. package/dist/esm/components/segmentedControl/index.test.js +63 -0
  156. package/dist/esm/components/segmentedControl/index.test.js.map +1 -0
  157. package/dist/esm/components/signaturePad/index.js +560 -0
  158. package/dist/esm/components/signaturePad/index.js.map +1 -0
  159. package/dist/esm/customRender-39982d87.js +24102 -0
  160. package/dist/esm/customRender-39982d87.js.map +1 -0
  161. package/dist/esm/index-171a0108.js +997 -0
  162. package/dist/esm/index-171a0108.js.map +1 -0
  163. package/dist/esm/index-21239ab0.js +237 -0
  164. package/dist/esm/index-21239ab0.js.map +1 -0
  165. package/dist/esm/index-47663d39.js +48 -0
  166. package/dist/esm/index-47663d39.js.map +1 -0
  167. package/dist/esm/index-51913e93.js +382 -0
  168. package/dist/esm/index-51913e93.js.map +1 -0
  169. package/dist/esm/index-be398f1d.js +69 -0
  170. package/dist/esm/index-be398f1d.js.map +1 -0
  171. package/dist/esm/index-dd80248b.js +91 -0
  172. package/dist/esm/index-dd80248b.js.map +1 -0
  173. package/dist/esm/index-e9e37a34.js +62 -0
  174. package/dist/esm/index-e9e37a34.js.map +1 -0
  175. package/dist/esm/index.d.ts +2 -0
  176. package/dist/esm/index.js +49 -0
  177. package/dist/esm/index.js.map +1 -0
  178. package/dist/esm/lib/components/autocompleteAddress/demo.d.ts +4 -0
  179. package/dist/esm/lib/components/autocompleteAddress/index.d.ts +19 -0
  180. package/dist/esm/lib/components/autocompleteAddress/index.test.d.ts +1 -0
  181. package/dist/esm/lib/components/autocompleteAddress/mapStyle.d.ts +2 -0
  182. package/dist/esm/lib/components/autocompleteAddress/util/index.d.ts +4 -0
  183. package/dist/esm/lib/components/button/icons/index.d.ts +9 -0
  184. package/dist/esm/lib/components/button/index.d.ts +13 -0
  185. package/dist/esm/lib/components/cards/cardButton/index.d.ts +16 -0
  186. package/dist/esm/lib/components/cards/cardWithLeftIcon/index.d.ts +14 -0
  187. package/dist/esm/lib/components/cards/cardWithTopIcon/index.d.ts +15 -0
  188. package/dist/esm/lib/components/cards/cardWithTopLeftIcon/index.d.ts +14 -0
  189. package/dist/esm/lib/components/cards/icons/index.d.ts +13 -0
  190. package/dist/esm/lib/components/cards/index.d.ts +16 -0
  191. package/dist/esm/lib/components/cards/infoCard/index.d.ts +13 -0
  192. package/dist/esm/lib/components/chip/index.d.ts +6 -0
  193. package/dist/esm/lib/components/comparisonTable/components/AccordionItem/AccordionItem.d.ts +9 -0
  194. package/dist/esm/lib/components/comparisonTable/components/AccordionItem/index.d.ts +1 -0
  195. package/dist/esm/lib/components/comparisonTable/components/Chevron.d.ts +4 -0
  196. package/dist/esm/lib/components/comparisonTable/components/Row/index.d.ts +11 -0
  197. package/dist/esm/lib/components/comparisonTable/components/TableArrows/Arrow.d.ts +4 -0
  198. package/dist/esm/lib/components/comparisonTable/components/TableArrows/index.d.ts +10 -0
  199. package/dist/esm/lib/components/comparisonTable/components/TableInfoButton/index.d.ts +5 -0
  200. package/dist/esm/lib/components/comparisonTable/components/TableRating/StarIcon.d.ts +4 -0
  201. package/dist/esm/lib/components/comparisonTable/components/TableRating/ZapIcon.d.ts +4 -0
  202. package/dist/esm/lib/components/comparisonTable/components/TableRating/index.d.ts +7 -0
  203. package/dist/esm/lib/components/comparisonTable/components/TableRowHeader/index.d.ts +7 -0
  204. package/dist/esm/lib/components/comparisonTable/components/TableTrueFalse.d.ts +5 -0
  205. package/dist/esm/lib/components/comparisonTable/hooks/useComparisonTable.d.ts +14 -0
  206. package/dist/esm/lib/components/comparisonTable/index.d.ts +51 -0
  207. package/dist/esm/lib/components/dateSelector/index.d.ts +23 -0
  208. package/dist/esm/lib/components/downloadButton/index.d.ts +10 -0
  209. package/dist/esm/lib/components/input/autoSuggestInput/index.d.ts +13 -0
  210. package/dist/esm/lib/components/input/autoSuggestMultiSelect/index.d.ts +11 -0
  211. package/dist/esm/lib/components/input/currency/format/index.d.ts +2 -0
  212. package/dist/esm/lib/components/input/currency/index.d.ts +7 -0
  213. package/dist/esm/lib/components/input/currency/index.test.d.ts +1 -0
  214. package/dist/esm/lib/components/input/iban/formatIban/index.d.ts +1 -0
  215. package/dist/esm/lib/components/input/iban/index.d.ts +6 -0
  216. package/dist/esm/lib/components/input/index.d.ts +16 -0
  217. package/dist/esm/lib/components/markdown/index.d.ts +9 -0
  218. package/dist/esm/lib/components/modal/bottomModal/index.d.ts +3 -0
  219. package/dist/esm/lib/components/modal/bottomOrRegularModal/index.d.ts +3 -0
  220. package/dist/esm/lib/components/modal/hooks/useOnClose.d.ts +7 -0
  221. package/dist/esm/lib/components/modal/index.d.ts +13 -0
  222. package/dist/esm/lib/components/modal/regularModal/index.d.ts +3 -0
  223. package/dist/esm/lib/components/multiDropzone/UploadFileCell/index.d.ts +10 -0
  224. package/dist/esm/lib/components/multiDropzone/icons/index.d.ts +11 -0
  225. package/dist/esm/lib/components/multiDropzone/index.d.ts +15 -0
  226. package/dist/esm/lib/components/multiDropzone/index.test.d.ts +1 -0
  227. package/dist/esm/lib/components/multiDropzone/types.d.ts +31 -0
  228. package/dist/esm/lib/components/multiDropzone/utils/index.d.ts +11 -0
  229. package/dist/esm/lib/components/segmentedControl/index.d.ts +11 -0
  230. package/dist/esm/lib/components/segmentedControl/index.test.d.ts +1 -0
  231. package/dist/esm/lib/components/signaturePad/index.d.ts +19 -0
  232. package/dist/esm/lib/index.d.ts +20 -0
  233. package/dist/esm/lib/models/autoSuggestInput/index.d.ts +4 -0
  234. package/dist/esm/lib/models/download.d.ts +1 -0
  235. package/dist/esm/lib/scss/private/base/demo.d.ts +5 -0
  236. package/dist/esm/lib/scss/public/demo.d.ts +1 -0
  237. package/dist/esm/lib/util/calendarDate/index.d.ts +3 -0
  238. package/dist/esm/lib/util/formatBytes/index.d.ts +1 -0
  239. package/dist/esm/lib/util/testUtils/customRender.d.ts +7 -0
  240. package/dist/esm/lib/util/testUtils/index.d.ts +2 -0
  241. package/dist/esm/lib/util/zeroFill.d.ts +1 -0
  242. package/dist/esm/mapStyle-1288a869.js +187 -0
  243. package/dist/esm/mapStyle-1288a869.js.map +1 -0
  244. package/dist/esm/scss/private/base/demo.js +80 -0
  245. package/dist/esm/scss/private/base/demo.js.map +1 -0
  246. package/dist/esm/scss/public/demo.js +284 -0
  247. package/dist/esm/scss/public/demo.js.map +1 -0
  248. package/dist/esm/style-inject.es-1f59c1d0.js +29 -0
  249. package/dist/esm/style-inject.es-1f59c1d0.js.map +1 -0
  250. package/dist/esm/tslib.es6-5bc94358.js +104 -0
  251. package/dist/esm/tslib.es6-5bc94358.js.map +1 -0
  252. package/dist/esm/useOnClose-54f9e6b9.js +40 -0
  253. package/dist/esm/useOnClose-54f9e6b9.js.map +1 -0
  254. package/dist/esm/util/testUtils/customRender.js +7 -0
  255. package/dist/esm/util/testUtils/customRender.js.map +1 -0
  256. package/dist/esm/v4-d2999257.js +69 -0
  257. package/dist/esm/v4-d2999257.js.map +1 -0
  258. package/dist/index.css +75 -3
  259. package/dist/index.css.map +1 -1
  260. package/dist/lib/scss/index.scss +2 -0
  261. package/dist/lib/scss/private/components/_input.scss +1 -3
  262. package/dist/lib/scss/public/demo.tsx +1 -1
  263. package/{src/lib/components/autocompleteAddress/modes/dynamic.module.scss → dist/lib/scss/third-party/_google_places.scss} +37 -37
  264. package/dist/lib/scss/third-party/_index.scss +1 -0
  265. package/dist/lib/scss/utils/_index.scss +12 -0
  266. package/package.json +14 -8
  267. package/src/lib/components/autocompleteAddress/demo.tsx +5 -9
  268. package/src/lib/components/autocompleteAddress/index.stories.mdx +1 -1
  269. package/src/lib/components/autocompleteAddress/index.test.tsx +95 -0
  270. package/src/lib/components/autocompleteAddress/index.tsx +315 -113
  271. package/src/lib/components/autocompleteAddress/{util/mapStyle.ts → mapStyle.ts} +0 -0
  272. package/src/lib/components/autocompleteAddress/util/index.ts +1 -1
  273. package/src/lib/components/comparisonTable/components/AccordionItem/AccordionItem.module.scss +44 -0
  274. package/src/lib/components/comparisonTable/components/AccordionItem/AccordionItem.tsx +74 -0
  275. package/src/lib/components/comparisonTable/components/AccordionItem/index.tsx +1 -0
  276. package/src/lib/components/comparisonTable/components/Row/index.tsx +1 -3
  277. package/src/lib/components/comparisonTable/components/Row/style.module.scss +11 -2
  278. package/src/lib/components/comparisonTable/components/TableArrows/index.tsx +2 -4
  279. package/src/lib/components/comparisonTable/components/TableArrows/style.module.scss +3 -1
  280. package/src/lib/components/comparisonTable/hooks/useComparisonTable.ts +124 -0
  281. package/src/lib/components/comparisonTable/index.stories.mdx +226 -8
  282. package/src/lib/components/comparisonTable/index.tsx +175 -122
  283. package/src/lib/components/comparisonTable/style.module.scss +16 -6
  284. package/src/lib/components/input/autoSuggestInput/style.module.scss +4 -1
  285. package/src/lib/components/input/currency/index.stories.mdx +8 -0
  286. package/src/lib/components/input/currency/index.test.tsx +22 -22
  287. package/src/lib/components/input/index.stories.mdx +42 -0
  288. package/src/lib/components/input/index.tsx +77 -41
  289. package/src/lib/components/input/style.module.scss +10 -0
  290. package/src/lib/components/modal/regularModal/index.tsx +14 -12
  291. package/src/lib/components/modal/regularModal/style.module.scss +16 -15
  292. package/src/lib/components/multiDropzone/UploadFileCell/index.tsx +44 -64
  293. package/src/lib/components/multiDropzone/UploadFileCell/style.module.scss +3 -9
  294. package/src/lib/components/multiDropzone/icons/eye.svg +10 -3
  295. package/src/lib/components/multiDropzone/icons/file-error.svg +4 -0
  296. package/src/lib/components/multiDropzone/icons/file-upload.svg +4 -0
  297. package/src/lib/components/multiDropzone/icons/file.svg +4 -0
  298. package/src/lib/components/multiDropzone/icons/index.ts +12 -44
  299. package/src/lib/components/multiDropzone/icons/trash-error.svg +6 -0
  300. package/src/lib/components/multiDropzone/icons/trash.svg +5 -5
  301. package/src/lib/components/multiDropzone/icons/upload-small.svg +12 -0
  302. package/src/lib/components/multiDropzone/index.stories.mdx +75 -0
  303. package/src/lib/components/multiDropzone/index.test.tsx +230 -0
  304. package/src/lib/components/multiDropzone/index.tsx +104 -66
  305. package/src/lib/components/multiDropzone/types.ts +36 -0
  306. package/src/lib/components/multiDropzone/utils/index.test.ts +112 -0
  307. package/src/lib/components/multiDropzone/utils/index.ts +69 -0
  308. package/src/lib/components/segmentedControl/index.test.tsx +45 -0
  309. package/src/lib/components/segmentedControl/index.tsx +1 -0
  310. package/src/lib/scss/index.scss +2 -0
  311. package/src/lib/scss/private/components/_input.scss +1 -3
  312. package/src/lib/scss/public/demo.tsx +1 -1
  313. package/src/lib/scss/third-party/_google_places.scss +62 -0
  314. package/src/lib/scss/third-party/_index.scss +1 -0
  315. package/src/lib/scss/utils/_index.scss +12 -0
  316. package/src/lib/util/formatBytes/index.test.ts +19 -0
  317. package/src/lib/util/formatBytes/index.ts +13 -0
  318. package/src/lib/util/testUtils/customRender.tsx +15 -0
  319. package/src/lib/util/testUtils/index.ts +5 -0
  320. package/src/setupTests.js +50 -2
  321. package/dist/index.js.map +0 -1
  322. package/dist/lib/components/autocompleteAddress/components/GoogleMapsWrapper.d.ts +0 -8
  323. package/dist/lib/components/autocompleteAddress/index.d.ts +0 -23
  324. package/dist/lib/components/autocompleteAddress/modes/dynamic.d.ts +0 -12
  325. package/dist/lib/components/autocompleteAddress/modes/manual.d.ts +0 -9
  326. package/dist/lib/components/autocompleteAddress/util/googleMapsLoader.d.ts +0 -17
  327. package/dist/lib/components/button/index.d.ts +0 -13
  328. package/dist/lib/components/comparisonTable/hooks/useActiveTableArrows.d.ts +0 -10
  329. package/dist/lib/components/input/index.d.ts +0 -10
  330. package/dist/lib/components/multiDropzone/UploadFileCell/index.d.ts +0 -9
  331. package/dist/lib/components/multiDropzone/icons/index.d.ts +0 -25
  332. package/dist/lib/components/multiDropzone/index.d.ts +0 -21
  333. package/dist/mapStyle-32849fbf.js.map +0 -1
  334. package/src/lib/components/autocompleteAddress/components/GoogleMapsWrapper.tsx +0 -81
  335. package/src/lib/components/autocompleteAddress/modes/dynamic.tsx +0 -118
  336. package/src/lib/components/autocompleteAddress/modes/manual.tsx +0 -81
  337. package/src/lib/components/autocompleteAddress/util/googleMapsLoader.tsx +0 -73
  338. package/src/lib/components/comparisonTable/hooks/useActiveTableArrows.ts +0 -63
  339. package/src/lib/components/multiDropzone/icons/bmp-complete.svg +0 -10
  340. package/src/lib/components/multiDropzone/icons/bmp.svg +0 -10
  341. package/src/lib/components/multiDropzone/icons/doc-complete.svg +0 -11
  342. package/src/lib/components/multiDropzone/icons/doc.svg +0 -11
  343. package/src/lib/components/multiDropzone/icons/docx-complete.svg +0 -12
  344. package/src/lib/components/multiDropzone/icons/docx.svg +0 -12
  345. package/src/lib/components/multiDropzone/icons/generic-complete.svg +0 -4
  346. package/src/lib/components/multiDropzone/icons/generic-error.svg +0 -7
  347. package/src/lib/components/multiDropzone/icons/generic.svg +0 -4
  348. package/src/lib/components/multiDropzone/icons/heic-complete.svg +0 -11
  349. package/src/lib/components/multiDropzone/icons/heic.svg +0 -11
  350. package/src/lib/components/multiDropzone/icons/jpeg-complete.svg +0 -11
  351. package/src/lib/components/multiDropzone/icons/jpeg.svg +0 -11
  352. package/src/lib/components/multiDropzone/icons/jpg-complete.svg +0 -10
  353. package/src/lib/components/multiDropzone/icons/jpg.svg +0 -10
  354. package/src/lib/components/multiDropzone/icons/pdf-complete.svg +0 -8
  355. package/src/lib/components/multiDropzone/icons/pdf.svg +0 -8
  356. package/src/lib/components/multiDropzone/icons/png-complete.svg +0 -10
  357. package/src/lib/components/multiDropzone/icons/png.svg +0 -10
@@ -34,6 +34,25 @@ MultiDropzone component allows upload of multiple documents / files.
34
34
  token: 'abc',
35
35
  previewUrl: 'http://getpopsure.com/test_file_name.pdf',
36
36
  },
37
+ {
38
+ id: '124',
39
+ type: 'pdf',
40
+ progress: '72',
41
+ name: 'test_file_name.pdf',
42
+ token: 'abc',
43
+ previewUrl: 'http://getpopsure.com/test_file_name.pdf',
44
+ showLoadingSpinner: true,
45
+ showProgressBar: false,
46
+ },
47
+ {
48
+ id: '125',
49
+ type: 'pdf',
50
+ progress: '72',
51
+ name: 'test_file_name.pdf',
52
+ token: 'abc',
53
+ previewUrl: 'http://getpopsure.com/test_file_name.pdf',
54
+ showLoadingSpinner: true,
55
+ },
37
56
  {
38
57
  id: '456',
39
58
  type: 'pdf',
@@ -110,3 +129,59 @@ MultiDropzone component allows upload of multiple documents / files.
110
129
  onRemoveFile={() => {}}
111
130
  />
112
131
  </Preview>
132
+
133
+ ### Accepting only images
134
+
135
+ <Preview>
136
+ <MultiDropzone
137
+ accept="image"
138
+ isCondensed
139
+ uploadedFiles={[]}
140
+ onFileSelect={() => {}}
141
+ uploading={false}
142
+ onRemoveFile={() => {}}
143
+ />
144
+ </Preview>
145
+
146
+ ### Accepting only documents
147
+
148
+ <Preview>
149
+ <MultiDropzone
150
+ accept="document"
151
+ isCondensed
152
+ uploadedFiles={[]}
153
+ onFileSelect={() => {}}
154
+ uploading={false}
155
+ onRemoveFile={() => {}}
156
+ />
157
+ </Preview>
158
+
159
+ ### Limiting file size to 2MB
160
+
161
+ <Preview>
162
+ <MultiDropzone
163
+ isCondensed
164
+ uploadedFiles={[]}
165
+ onFileSelect={() => {}}
166
+ uploading={false}
167
+ onRemoveFile={() => {}}
168
+ maxSize={2096000}
169
+ />
170
+ </Preview>
171
+
172
+ ### i18n support
173
+
174
+ <Preview>
175
+ <MultiDropzone
176
+ uploadedFiles={[]}
177
+ onFileSelect={() => {}}
178
+ uploading={false}
179
+ onRemoveFile={() => {}}
180
+ textOverrides={{
181
+ instructionsText: 'Datei auswählen oder per Drag & Drop platzieren',
182
+ supportsTextShort: 'Unterstützt werden',
183
+ currentlyUploadingText:
184
+ 'Bitte warten während die Datei hochgeladen wird...'
185
+ }}
186
+ />
187
+ </Preview>
@@ -0,0 +1,230 @@
1
+ import { act, fireEvent, render } from '../../util/testUtils';
2
+ import '@testing-library/jest-dom';
3
+
4
+ import MultiDropzone, { MultiDropzoneProps } from '.';
5
+
6
+ const mockOnFileSelect = jest.fn();
7
+ const mockOnRemoveFile = jest.fn();
8
+ const file = new File(['DummyFile'], 'dummy.png', { type: 'image/png' });
9
+
10
+ const inputTestId = "ds-drop-input";
11
+ const spinnerTestId = "ds-filecell-spinner";
12
+ const progressbarTestId = "ds-filecell-progressbar";
13
+ const uploadedFilesMock = {
14
+ id: "123",
15
+ name: "File name",
16
+ progress: 100,
17
+ type: "jpg",
18
+ };
19
+
20
+ const setup = ({
21
+ uploadedFiles = [],
22
+ uploading = false,
23
+ ...rest
24
+ }: Partial<MultiDropzoneProps>) => {
25
+ return render(
26
+ <MultiDropzone
27
+ {...rest}
28
+ uploadedFiles={uploadedFiles}
29
+ uploading={uploading}
30
+ onFileSelect={mockOnFileSelect}
31
+ onRemoveFile={mockOnRemoveFile}
32
+ />
33
+ );
34
+ };
35
+
36
+ describe('MultiDropzone component', () => {
37
+ it("should call onFileSelect on files change", async () => {
38
+ const { getByTestId, user } = setup({});
39
+ const files = [file, file];
40
+
41
+ await user.upload(getByTestId(inputTestId), files);
42
+
43
+ expect(mockOnFileSelect).toHaveBeenCalledWith(files);
44
+ });
45
+
46
+ describe('Error states', () => {
47
+ it("should show max files error message", () => {
48
+ const screen = setup({
49
+ maxFiles: 1,
50
+ uploadedFiles: [uploadedFilesMock, {
51
+ ...uploadedFilesMock,
52
+ id: "222"
53
+ }],
54
+ });
55
+
56
+ expect(screen.getByText("Too many files.")).toBeVisible();
57
+ });
58
+
59
+ it("should show max file size error message", async () => {
60
+ const { getByTestId, getByText, user } = setup({ maxSize: 10 });
61
+ const bigFile = file;
62
+ Object.defineProperty(bigFile, 'size', { value: 1024 });
63
+
64
+ await user.upload(getByTestId(inputTestId), [bigFile]);
65
+
66
+ expect(
67
+ getByText("File is too large. It must be less than 10 Bytes.")
68
+ ).toBeInTheDocument();
69
+ });
70
+
71
+ it("should show wrong filetype error message", async () => {
72
+ const { getByTestId, getByText } = setup({ accept: "document" });
73
+ const input = getByTestId(inputTestId);
74
+
75
+ await act(async () => {
76
+ // Keeping fireevent to emulate file change like drop
77
+ // Using userevent.upload doesn't work since input has an accept/html validation
78
+ fireEvent.change(input, { target: { files: [file] } });
79
+ });
80
+
81
+ expect(
82
+ getByText("File type must be one of DOC, DOCX, PDF")
83
+ ).toBeInTheDocument();
84
+ });
85
+
86
+ it("should remove wrong filetype error message", async () => {
87
+ const { getByAltText, getByTestId, queryByText, user } = setup({ accept: "document" });
88
+ const input = getByTestId(inputTestId);
89
+
90
+ await act(async () => {
91
+ // Keeping fireevent to emulate file change like drop
92
+ // Using userevent.upload doesn't work since input has an accept/html validation
93
+ fireEvent.change(input, { target: { files: [file] } });
94
+ });
95
+
96
+ await user.click(getByAltText("remove"));
97
+
98
+ expect(queryByText("File type must be one of DOC, DOCX, PDF")).not.toBeInTheDocument();
99
+ });
100
+ });
101
+
102
+ describe('Copy text', () => {
103
+ it("should show uploader text", () => {
104
+ const screen = setup({});
105
+
106
+ expect(screen.getByText("Choose file or drag & drop")).toBeInTheDocument();
107
+ });
108
+
109
+ it("should show uploader text translated", () => {
110
+ const instructionsText = "Drag drop file";
111
+ const screen = setup({
112
+ textOverrides: { instructionsText }
113
+ });
114
+
115
+ expect(screen.getByText(instructionsText)).toBeInTheDocument();
116
+ });
117
+
118
+ it("should show image accept file type label", () => {
119
+ const screen = setup({ accept: "image" });
120
+
121
+ expect(
122
+ screen.getByText("Supports HEIC, BMP, JPEG, JPG, PNG")
123
+ ).toBeInTheDocument();
124
+ });
125
+
126
+ it("should show document accept file type label", () => {
127
+ const screen = setup({ accept: "document" });
128
+
129
+ expect(
130
+ screen.getByText("Supports DOC, DOCX, PDF")
131
+ ).toBeInTheDocument();
132
+ });
133
+
134
+ it("should custom document accept file type label", () => {
135
+ const screen = setup({ accept: {
136
+ "application/pdf": [".pdf"],
137
+ "image/jpg": [".jpg"],
138
+ } });
139
+
140
+ expect(
141
+ screen.getByText("Supports PDF, JPG")
142
+ ).toBeInTheDocument();
143
+ });
144
+
145
+ it("should show disabled text if is uploading", () => {
146
+ const screen = setup({ uploading: true });
147
+
148
+ expect(
149
+ screen.getByText("Please wait while uploading file...")
150
+ ).toBeInTheDocument();
151
+ });
152
+ });
153
+
154
+ describe('Uploaded files', () => {
155
+ it("should show uploaded files", () => {
156
+ const screen = setup({
157
+ uploadedFiles: [uploadedFilesMock],
158
+ });
159
+
160
+ expect(
161
+ screen.getByText(uploadedFilesMock.name)
162
+ ).toBeInTheDocument();
163
+ });
164
+
165
+ it("should call onRemoveFile with uploaded file id", () => {
166
+ const screen = setup({
167
+ uploadedFiles: [uploadedFilesMock],
168
+ });
169
+
170
+ screen.getByAltText("remove").click();
171
+
172
+ expect(mockOnRemoveFile).toBeCalledWith(uploadedFilesMock.id);
173
+ });
174
+
175
+ it("should show uploaded file with uploading label", () => {
176
+ const screen = setup({
177
+ uploadedFiles: [{ ...uploadedFilesMock, progress: 50 }],
178
+ });
179
+
180
+ expect(screen.getByText("Uploading...")).toBeInTheDocument();
181
+ });
182
+
183
+ it("should show uploaded file with progress bar", () => {
184
+ const screen = setup({
185
+ uploadedFiles: [{
186
+ ...uploadedFilesMock,
187
+ progress: 50,
188
+ }],
189
+ });
190
+
191
+ expect(screen.getByTestId(progressbarTestId)).toBeInTheDocument();
192
+ });
193
+
194
+ it("should show uploaded file with no progress bar", () => {
195
+ const screen = setup({
196
+ uploadedFiles: [{
197
+ ...uploadedFilesMock,
198
+ progress: 50,
199
+ showProgressBar: false
200
+ }],
201
+ });
202
+
203
+ expect(screen.queryByTestId(progressbarTestId)).not.toBeInTheDocument();
204
+ });
205
+
206
+ it("should show uploaded file with loading spinner", () => {
207
+ const screen = setup({
208
+ uploadedFiles: [{
209
+ ...uploadedFilesMock,
210
+ progress: 50,
211
+ showLoadingSpinner: true
212
+ }],
213
+ });
214
+
215
+ expect(screen.getByTestId(spinnerTestId)).toBeInTheDocument();
216
+ });
217
+
218
+ it("should show uploaded file with no loading spinner", () => {
219
+ const screen = setup({
220
+ uploadedFiles: [{
221
+ ...uploadedFilesMock,
222
+ progress: 50,
223
+ showLoadingSpinner: false
224
+ }],
225
+ });
226
+
227
+ expect(screen.queryByTestId(spinnerTestId)).not.toBeInTheDocument();
228
+ });
229
+ });
230
+ });
@@ -1,78 +1,90 @@
1
1
  import { useCallback, useState } from 'react';
2
- import { useDropzone, FileRejection } from 'react-dropzone';
3
2
  import classnames from 'classnames';
3
+ import { useDropzone, FileRejection } from 'react-dropzone';
4
4
  import AnimateHeight from 'react-animate-height';
5
+ import { v4 as uuidv4 } from 'uuid';
5
6
  import styles from './style.module.scss';
6
7
  import icons from './icons/index'; // TODO: inline all of the svgs
7
8
  import UploadFileCell from './UploadFileCell';
9
+ import {
10
+ formatAcceptFileList,
11
+ getErrorMessage,
12
+ getFormattedAcceptObject,
13
+ getUploadStatus
14
+ } from './utils';
8
15
 
9
- export type UploadStatus = 'UPLOADING' | 'COMPLETE' | 'ERROR';
10
-
11
- export type FileType =
12
- | 'heic'
13
- | 'bmp'
14
- | 'jpeg'
15
- | 'jpg'
16
- | 'png'
17
- | 'doc'
18
- | 'docx'
19
- | 'pdf';
20
-
21
- const getUploadStatus = (progress: number, error?: string): UploadStatus => {
22
- if (error) {
23
- return 'ERROR';
24
- }
25
-
26
- if (progress < 100) {
27
- return 'UPLOADING';
28
- }
29
-
30
- return 'COMPLETE';
31
- };
32
-
33
- export interface UploadedFile {
34
- id: string;
35
- name: string;
36
- type: FileType | string;
37
- previewUrl?: string;
38
- progress: number;
39
- error?: string;
40
- }
16
+ import {
17
+ AcceptType,
18
+ ErrorMessage,
19
+ FileType,
20
+ TextOverrides,
21
+ UploadedFile,
22
+ UploadStatus
23
+ } from './types';
24
+ import { formatBytes } from '../../util/formatBytes';
41
25
 
42
- interface Props {
26
+ interface MultiDropzoneProps {
27
+ accept?: AcceptType;
43
28
  onFileSelect: (files: File[]) => void;
44
29
  uploadedFiles: UploadedFile[];
45
30
  uploading: boolean;
46
31
  onRemoveFile: (id: string) => void;
47
32
  isCondensed?: boolean;
48
33
  maxFiles?: number;
34
+ maxSize?: number;
35
+ textOverrides?: TextOverrides;
49
36
  }
50
37
 
51
- export default ({
38
+ const MultiDropZone = ({
39
+ accept,
52
40
  uploadedFiles,
53
41
  onFileSelect,
54
42
  uploading,
55
43
  onRemoveFile,
56
44
  isCondensed = false,
57
45
  maxFiles = 0,
58
- }: Props) => {
59
- const [error, setError] = useState('');
46
+ maxSize,
47
+ textOverrides,
48
+ }: MultiDropzoneProps) => {
49
+ const [errors, setErrors] = useState<ErrorMessage[]>([]);
50
+ const formattedAccept = getFormattedAcceptObject(accept);
51
+ const fileList = formatAcceptFileList(formattedAccept);
52
+ const maxSizePlaceholder = maxSize && maxSize > 0
53
+ ? `${textOverrides?.sizeUpToText || "up to"} ${formatBytes(maxSize)}`
54
+ : "";
55
+ const placeholder = `${textOverrides?.supportsTextShort || "Supports"} ${fileList || "JPEG, PNG, PDF"} ${maxSizePlaceholder}`;
56
+ const isOverMaxFiles = maxFiles > 0 && uploadedFiles.length > maxFiles;
57
+
58
+ const removeError = (removeId: string) => (
59
+ setErrors(errors.filter(({ id }) => id !== removeId))
60
+ );
60
61
 
61
62
  const onDrop = useCallback(
62
63
  (acceptedFiles: File[], filesRejected: FileRejection[]) => {
63
- setError('');
64
-
65
- if (filesRejected.length > 0) {
66
- setError(filesRejected[0].errors[0].message);
67
- return;
68
- }
69
-
70
64
  onFileSelect(acceptedFiles);
65
+
66
+ setErrors((previousErrors) => ([
67
+ ...previousErrors,
68
+ ...filesRejected.map(({ errors }) => ({
69
+ id: uuidv4(),
70
+ message: getErrorMessage(
71
+ errors[0],
72
+ { fileList, maxSize },
73
+ textOverrides
74
+ ),
75
+ }))
76
+ ]));
71
77
  },
72
- [onFileSelect]
78
+ [fileList, maxSize, onFileSelect, textOverrides]
73
79
  );
74
80
 
75
- const { getRootProps, getInputProps } = useDropzone({ onDrop, maxFiles });
81
+
82
+ const { getRootProps, getInputProps } = useDropzone({
83
+ accept: formattedAccept,
84
+ disabled: uploading,
85
+ maxSize,
86
+ onDrop,
87
+ });
76
88
 
77
89
  return (
78
90
  <div className={styles.container}>
@@ -85,38 +97,64 @@ export default ({
85
97
  )}
86
98
  {...getRootProps()}
87
99
  >
88
- <input {...getInputProps()} />
100
+ <input
101
+ data-testid="ds-drop-input"
102
+ {...getInputProps()}
103
+ />
89
104
  <img
90
105
  className={isCondensed ? styles.img : ''}
91
- src={icons.uploadIcon}
106
+ src={isCondensed ? icons.uploadSmallIcon : icons.uploadIcon}
92
107
  alt="purple cloud with an arrow"
93
108
  />
94
109
  <div className={`p-h4 mt8 ${isCondensed ? styles.textInline : ''}`}>
95
110
  {uploading
96
- ? 'Please wait while uploading file...'
97
- : 'Choose file or drag & drop'}
111
+ ? textOverrides?.currentlyUploadingText ||
112
+ 'Please wait while uploading file...'
113
+ : textOverrides?.instructionsText || 'Choose file or drag & drop'}
114
+ </div>
115
+ <div className="p-p--small tc-grey-500">
116
+ {textOverrides?.supportsText || placeholder}
98
117
  </div>
99
- <div className="p-p--small tc-grey-500">Supports JPEG, PNG, PDF</div>
100
118
  </div>
101
- <AnimateHeight duration={300} height={error ? 'auto' : 0}>
102
- <p className="tc-red-500 p-p--small">{error}</p>
103
- </AnimateHeight>
119
+
120
+ {errors.map(({ id, message }) => message && (
121
+ <UploadFileCell
122
+ uploadStatus="ERROR"
123
+ file={{
124
+ error: message,
125
+ id,
126
+ name: message,
127
+ progress: 0,
128
+ type: "",
129
+ }}
130
+ key={id}
131
+ onRemoveFile={() => removeError(id)}
132
+ uploading={false}
133
+ />
134
+ ))}
135
+
104
136
  {uploadedFiles.length > 0 && (
105
137
  <div className="w100 mt16">
106
- {uploadedFiles.map((file) => {
107
- const uploadStatus = getUploadStatus(file.progress, file.error);
108
- return (
109
- <UploadFileCell
110
- uploadStatus={uploadStatus}
111
- file={file}
112
- key={file.id}
113
- onRemoveFile={onRemoveFile}
114
- uploading={uploading}
115
- />
116
- );
117
- })}
138
+ {uploadedFiles.map((file) => (
139
+ <UploadFileCell
140
+ uploadStatus={getUploadStatus(file.progress, file.error)}
141
+ file={file}
142
+ key={file.id}
143
+ onRemoveFile={onRemoveFile}
144
+ uploading={uploading}
145
+ />
146
+ ))}
118
147
  </div>
119
148
  )}
149
+
150
+ <AnimateHeight duration={300} height={isOverMaxFiles ? 'auto' : 0}>
151
+ <p className="tc-red-500 p-p--small">
152
+ {textOverrides?.tooManyFilesError || "Too many files."}
153
+ </p>
154
+ </AnimateHeight>
120
155
  </div>
121
156
  );
122
157
  };
158
+
159
+ export type { FileType, MultiDropzoneProps, UploadedFile, UploadStatus };
160
+ export default MultiDropZone;
@@ -0,0 +1,36 @@
1
+ import { Accept } from "react-dropzone";
2
+
3
+ export type UploadStatus = 'UPLOADING' | 'COMPLETE' | 'ERROR';
4
+
5
+ export const DOCUMENT_FILES = ['doc', 'docx', 'pdf'];
6
+ export const IMAGE_FILES = ['heic', 'bmp', 'jpeg', 'jpg', 'png'];
7
+
8
+ export const FILE_TYPES = [...DOCUMENT_FILES, ...IMAGE_FILES];
9
+ export type FileType = typeof FILE_TYPES[number];
10
+
11
+ export interface UploadedFile {
12
+ id: string;
13
+ name: string;
14
+ type: FileType | string;
15
+ previewUrl?: string;
16
+ progress: number;
17
+ error?: string;
18
+ showProgressBar?: boolean;
19
+ showLoadingSpinner?: boolean;
20
+ }
21
+
22
+ export type AcceptType = "document" | "image" | Accept;
23
+ export interface TextOverrides {
24
+ currentlyUploadingText?: string;
25
+ fileTypeError?: string;
26
+ fileTooLargeError?: string;
27
+ instructionsText?: string;
28
+ sizeUpToText?: string;
29
+ supportsText?: string;
30
+ supportsTextShort?: string;
31
+ tooManyFilesError?: string;
32
+ }
33
+ export interface ErrorMessage {
34
+ id: string;
35
+ message: string;
36
+ }
@@ -0,0 +1,112 @@
1
+ import { ErrorCode } from 'react-dropzone';
2
+ import {
3
+ formatAcceptFileList,
4
+ getErrorMessage,
5
+ getFormattedAcceptObject,
6
+ getUploadStatus
7
+ } from '.';
8
+
9
+ const documentsAccept = {
10
+ 'application/doc': ['.doc'],
11
+ 'application/docx': ['.docx'],
12
+ 'application/pdf': ['.pdf']
13
+ };
14
+
15
+ const imagesAccept = {
16
+ 'image/heic': [".heic"],
17
+ 'image/bmp': [".bmp"],
18
+ 'image/jpeg': [".jpeg"],
19
+ 'image/jpg': [".jpg"],
20
+ 'image/png': [".png"]
21
+ };
22
+
23
+ describe('getUploadStatus', () => {
24
+ it('Should return error status if error is passed', () => {
25
+ expect(getUploadStatus(0, "Error message")).toEqual("ERROR");
26
+ });
27
+
28
+ it("Should return uploading status if progress hasn't finished", () => {
29
+ expect(getUploadStatus(50)).toEqual("UPLOADING");
30
+ });
31
+
32
+ it("Should return complete status if progress has finished", () => {
33
+ expect(getUploadStatus(100)).toEqual("COMPLETE");
34
+ });
35
+ });
36
+
37
+ describe('getFormattedAcceptObject', () => {
38
+ it('Should return image accept object if is of type image', () => {
39
+ expect(getFormattedAcceptObject("image")).toEqual(imagesAccept);
40
+ });
41
+
42
+ it('Should return documents accept object if is of type document', () => {
43
+ expect(getFormattedAcceptObject("document")).toEqual(documentsAccept);
44
+ });
45
+
46
+ it('Should return accept object if it is manually defined', () => {
47
+ const accept = { "application/pdf": [".pdf"] };
48
+
49
+ expect(getFormattedAcceptObject(accept)).toEqual(accept);
50
+ });
51
+ });
52
+
53
+ describe('formatAcceptFileList', () => {
54
+ it('Should return empty object if accept is empty', () => {
55
+ expect(formatAcceptFileList({})).toEqual("");
56
+ });
57
+
58
+ it('Should return documents list if documents accept is passed', () => {
59
+ expect(formatAcceptFileList(documentsAccept)).toEqual("DOC, DOCX, PDF");
60
+ });
61
+
62
+ it('Should return images list if images accept is passed', () => {
63
+ expect(formatAcceptFileList(imagesAccept)).toEqual("HEIC, BMP, JPEG, JPG, PNG");
64
+ });
65
+
66
+ it('Should return extension based on accept passed', () => {
67
+ const accept = {
68
+ "application/pdf": [".pdf"],
69
+ "image/jpg": [".jpg"]
70
+ };
71
+
72
+ expect(formatAcceptFileList(accept)).toEqual("PDF, JPG");
73
+ });
74
+ });
75
+
76
+ describe('getErrorMessage', () => {
77
+ it('Should return default error message', () => {
78
+ const defaultMessage = "Default Error Message.";
79
+
80
+ expect(
81
+ getErrorMessage({
82
+ code: "UNKNOWN",
83
+ message: defaultMessage
84
+ }, {
85
+ fileList: ""
86
+ })
87
+ ).toEqual(defaultMessage);
88
+ });
89
+
90
+ it('Should return default FileInvalidType default message', () => {
91
+ const fileList = "JPG, PDF";
92
+
93
+ expect(
94
+ getErrorMessage({
95
+ code: ErrorCode.FileInvalidType,
96
+ message: ""
97
+ }, { fileList })
98
+ ).toEqual(`File type must be one of ${fileList}`);
99
+ });
100
+
101
+ it('Should return FileInvalidType with textOverride message', () => {
102
+ const fileTypeError = "File Invalid Error";
103
+ const fileList = "JPG, PDF";
104
+
105
+ expect(
106
+ getErrorMessage({
107
+ code: ErrorCode.FileInvalidType,
108
+ message: ""
109
+ }, { fileList }, { fileTypeError })
110
+ ).toEqual(`${fileTypeError} ${fileList}`);
111
+ });
112
+ });