@navikt/ds-react 6.2.0 → 6.3.1

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 (271) hide show
  1. package/cjs/form/combobox/ComboboxProvider.js +5 -1
  2. package/cjs/form/combobox/ComboboxProvider.js.map +1 -1
  3. package/cjs/form/combobox/FilteredOptions/FilteredOptions.js +14 -12
  4. package/cjs/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
  5. package/cjs/form/combobox/FilteredOptions/filtered-options-util.d.ts +3 -3
  6. package/cjs/form/combobox/FilteredOptions/filtered-options-util.js +1 -3
  7. package/cjs/form/combobox/FilteredOptions/filtered-options-util.js.map +1 -1
  8. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.d.ts +8 -5
  9. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js +8 -13
  10. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  11. package/cjs/form/combobox/Input/Input.js +9 -7
  12. package/cjs/form/combobox/Input/Input.js.map +1 -1
  13. package/cjs/form/combobox/SelectedOptions/SelectedOptions.d.ts +2 -1
  14. package/cjs/form/combobox/SelectedOptions/SelectedOptions.js +3 -3
  15. package/cjs/form/combobox/SelectedOptions/SelectedOptions.js.map +1 -1
  16. package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.d.ts +10 -7
  17. package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.js +6 -8
  18. package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.js.map +1 -1
  19. package/cjs/form/combobox/combobox-utils.d.ts +10 -0
  20. package/cjs/form/combobox/combobox-utils.js +27 -0
  21. package/cjs/form/combobox/combobox-utils.js.map +1 -0
  22. package/cjs/form/combobox/customOptionsContext.d.ts +5 -4
  23. package/cjs/form/combobox/customOptionsContext.js +1 -1
  24. package/cjs/form/combobox/customOptionsContext.js.map +1 -1
  25. package/cjs/form/combobox/types.d.ts +22 -11
  26. package/cjs/form/file-upload/FileUpload.context.d.ts +8 -0
  27. package/cjs/form/file-upload/FileUpload.context.js +7 -0
  28. package/cjs/form/file-upload/FileUpload.context.js.map +1 -0
  29. package/cjs/form/file-upload/FileUpload.d.ts +118 -0
  30. package/cjs/form/file-upload/FileUpload.js +73 -0
  31. package/cjs/form/file-upload/FileUpload.js.map +1 -0
  32. package/cjs/form/file-upload/FileUpload.types.d.ts +55 -0
  33. package/cjs/form/file-upload/FileUpload.types.js +8 -0
  34. package/cjs/form/file-upload/FileUpload.types.js.map +1 -0
  35. package/cjs/form/file-upload/i18n/get.d.ts +2 -0
  36. package/cjs/form/file-upload/i18n/get.js +38 -0
  37. package/cjs/form/file-upload/i18n/get.js.map +1 -0
  38. package/cjs/form/file-upload/i18n/i18n.context.d.ts +11 -0
  39. package/cjs/form/file-upload/i18n/i18n.context.js +39 -0
  40. package/cjs/form/file-upload/i18n/i18n.context.js.map +1 -0
  41. package/cjs/form/file-upload/i18n/i18n.types.d.ts +13 -0
  42. package/cjs/form/file-upload/i18n/i18n.types.js +3 -0
  43. package/cjs/form/file-upload/i18n/i18n.types.js.map +1 -0
  44. package/cjs/form/file-upload/i18n/locales/nb.json +20 -0
  45. package/cjs/form/file-upload/i18n/merge.d.ts +2 -0
  46. package/cjs/form/file-upload/i18n/merge.js +29 -0
  47. package/cjs/form/file-upload/i18n/merge.js.map +1 -0
  48. package/cjs/form/file-upload/index.d.ts +7 -0
  49. package/cjs/form/file-upload/index.js +16 -0
  50. package/cjs/form/file-upload/index.js.map +1 -0
  51. package/cjs/form/file-upload/parts/Trigger.d.ts +7 -0
  52. package/cjs/form/file-upload/parts/Trigger.js +43 -0
  53. package/cjs/form/file-upload/parts/Trigger.js.map +1 -0
  54. package/cjs/form/file-upload/parts/dropzone/Dropzone.d.ts +4 -0
  55. package/cjs/form/file-upload/parts/dropzone/Dropzone.js +106 -0
  56. package/cjs/form/file-upload/parts/dropzone/Dropzone.js.map +1 -0
  57. package/cjs/form/file-upload/parts/dropzone/dropzone.types.d.ts +18 -0
  58. package/cjs/form/file-upload/parts/dropzone/dropzone.types.js +3 -0
  59. package/cjs/form/file-upload/parts/dropzone/dropzone.types.js.map +1 -0
  60. package/cjs/form/file-upload/parts/dropzone/useDropzone.d.ts +13 -0
  61. package/cjs/form/file-upload/parts/dropzone/useDropzone.js +34 -0
  62. package/cjs/form/file-upload/parts/dropzone/useDropzone.js.map +1 -0
  63. package/cjs/form/file-upload/parts/item/Item.d.ts +55 -0
  64. package/cjs/form/file-upload/parts/item/Item.js +79 -0
  65. package/cjs/form/file-upload/parts/item/Item.js.map +1 -0
  66. package/cjs/form/file-upload/parts/item/Item.types.d.ts +5 -0
  67. package/cjs/form/file-upload/parts/item/Item.types.js +3 -0
  68. package/cjs/form/file-upload/parts/item/Item.types.js.map +1 -0
  69. package/cjs/form/file-upload/parts/item/ItemButton.d.ts +12 -0
  70. package/cjs/form/file-upload/parts/item/ItemButton.js +22 -0
  71. package/cjs/form/file-upload/parts/item/ItemButton.js.map +1 -0
  72. package/cjs/form/file-upload/parts/item/ItemIcon.d.ts +9 -0
  73. package/cjs/form/file-upload/parts/item/ItemIcon.js +51 -0
  74. package/cjs/form/file-upload/parts/item/ItemIcon.js.map +1 -0
  75. package/cjs/form/file-upload/parts/item/ItemName.d.ts +9 -0
  76. package/cjs/form/file-upload/parts/item/ItemName.js +32 -0
  77. package/cjs/form/file-upload/parts/item/ItemName.js.map +1 -0
  78. package/cjs/form/file-upload/parts/item/utils/download-file.d.ts +1 -0
  79. package/cjs/form/file-upload/parts/item/utils/download-file.js +13 -0
  80. package/cjs/form/file-upload/parts/item/utils/download-file.js.map +1 -0
  81. package/cjs/form/file-upload/parts/item/utils/file-type-checker.d.ts +2 -0
  82. package/cjs/form/file-upload/parts/item/utils/file-type-checker.js +6 -0
  83. package/cjs/form/file-upload/parts/item/utils/file-type-checker.js.map +1 -0
  84. package/cjs/form/file-upload/parts/item/utils/format-file-size.d.ts +2 -0
  85. package/cjs/form/file-upload/parts/item/utils/format-file-size.js +24 -0
  86. package/cjs/form/file-upload/parts/item/utils/format-file-size.js.map +1 -0
  87. package/cjs/form/file-upload/useFileUpload.d.ts +12 -0
  88. package/cjs/form/file-upload/useFileUpload.js +33 -0
  89. package/cjs/form/file-upload/useFileUpload.js.map +1 -0
  90. package/cjs/form/file-upload/utils/is-accepted-file-type.d.ts +1 -0
  91. package/cjs/form/file-upload/utils/is-accepted-file-type.js +26 -0
  92. package/cjs/form/file-upload/utils/is-accepted-file-type.js.map +1 -0
  93. package/cjs/form/file-upload/utils/is-accepted-size.d.ts +1 -0
  94. package/cjs/form/file-upload/utils/is-accepted-size.js +11 -0
  95. package/cjs/form/file-upload/utils/is-accepted-size.js.map +1 -0
  96. package/cjs/form/file-upload/utils/validate-files.d.ts +8 -0
  97. package/cjs/form/file-upload/utils/validate-files.js +48 -0
  98. package/cjs/form/file-upload/utils/validate-files.js.map +1 -0
  99. package/cjs/index.d.ts +1 -0
  100. package/cjs/index.js +3 -1
  101. package/cjs/index.js.map +1 -1
  102. package/cjs/loader/Loader.d.ts +0 -7
  103. package/cjs/loader/Loader.js.map +1 -1
  104. package/cjs/table/DataCell.d.ts +1 -3
  105. package/cjs/table/DataCell.js.map +1 -1
  106. package/cjs/util/create-context.d.ts +1 -0
  107. package/cjs/util/create-context.js.map +1 -1
  108. package/cjs/util/hooks/useEventListener.d.ts +1 -1
  109. package/cjs/util/hooks/useMergeRefs.d.ts +1 -1
  110. package/esm/form/combobox/ComboboxProvider.js +5 -1
  111. package/esm/form/combobox/ComboboxProvider.js.map +1 -1
  112. package/esm/form/combobox/FilteredOptions/FilteredOptions.js +14 -12
  113. package/esm/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
  114. package/esm/form/combobox/FilteredOptions/filtered-options-util.d.ts +3 -3
  115. package/esm/form/combobox/FilteredOptions/filtered-options-util.js +1 -3
  116. package/esm/form/combobox/FilteredOptions/filtered-options-util.js.map +1 -1
  117. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.d.ts +8 -5
  118. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js +8 -13
  119. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  120. package/esm/form/combobox/Input/Input.js +9 -7
  121. package/esm/form/combobox/Input/Input.js.map +1 -1
  122. package/esm/form/combobox/SelectedOptions/SelectedOptions.d.ts +2 -1
  123. package/esm/form/combobox/SelectedOptions/SelectedOptions.js +3 -3
  124. package/esm/form/combobox/SelectedOptions/SelectedOptions.js.map +1 -1
  125. package/esm/form/combobox/SelectedOptions/selectedOptionsContext.d.ts +10 -7
  126. package/esm/form/combobox/SelectedOptions/selectedOptionsContext.js +6 -8
  127. package/esm/form/combobox/SelectedOptions/selectedOptionsContext.js.map +1 -1
  128. package/esm/form/combobox/combobox-utils.d.ts +10 -0
  129. package/esm/form/combobox/combobox-utils.js +22 -0
  130. package/esm/form/combobox/combobox-utils.js.map +1 -0
  131. package/esm/form/combobox/customOptionsContext.d.ts +5 -4
  132. package/esm/form/combobox/customOptionsContext.js +1 -1
  133. package/esm/form/combobox/customOptionsContext.js.map +1 -1
  134. package/esm/form/combobox/types.d.ts +22 -11
  135. package/esm/form/file-upload/FileUpload.context.d.ts +8 -0
  136. package/esm/form/file-upload/FileUpload.context.js +3 -0
  137. package/esm/form/file-upload/FileUpload.context.js.map +1 -0
  138. package/esm/form/file-upload/FileUpload.d.ts +118 -0
  139. package/esm/form/file-upload/FileUpload.js +44 -0
  140. package/esm/form/file-upload/FileUpload.js.map +1 -0
  141. package/esm/form/file-upload/FileUpload.types.d.ts +55 -0
  142. package/esm/form/file-upload/FileUpload.types.js +5 -0
  143. package/esm/form/file-upload/FileUpload.types.js.map +1 -0
  144. package/esm/form/file-upload/i18n/get.d.ts +2 -0
  145. package/esm/form/file-upload/i18n/get.js +34 -0
  146. package/esm/form/file-upload/i18n/get.js.map +1 -0
  147. package/esm/form/file-upload/i18n/i18n.context.d.ts +11 -0
  148. package/esm/form/file-upload/i18n/i18n.context.js +32 -0
  149. package/esm/form/file-upload/i18n/i18n.context.js.map +1 -0
  150. package/esm/form/file-upload/i18n/i18n.types.d.ts +13 -0
  151. package/esm/form/file-upload/i18n/i18n.types.js +2 -0
  152. package/esm/form/file-upload/i18n/i18n.types.js.map +1 -0
  153. package/esm/form/file-upload/i18n/locales/nb.json +20 -0
  154. package/esm/form/file-upload/i18n/merge.d.ts +2 -0
  155. package/esm/form/file-upload/i18n/merge.js +25 -0
  156. package/esm/form/file-upload/i18n/merge.js.map +1 -0
  157. package/esm/form/file-upload/index.d.ts +7 -0
  158. package/esm/form/file-upload/index.js +6 -0
  159. package/esm/form/file-upload/index.js.map +1 -0
  160. package/esm/form/file-upload/parts/Trigger.d.ts +7 -0
  161. package/esm/form/file-upload/parts/Trigger.js +18 -0
  162. package/esm/form/file-upload/parts/Trigger.js.map +1 -0
  163. package/esm/form/file-upload/parts/dropzone/Dropzone.d.ts +4 -0
  164. package/esm/form/file-upload/parts/dropzone/Dropzone.js +78 -0
  165. package/esm/form/file-upload/parts/dropzone/Dropzone.js.map +1 -0
  166. package/esm/form/file-upload/parts/dropzone/dropzone.types.d.ts +18 -0
  167. package/esm/form/file-upload/parts/dropzone/dropzone.types.js +2 -0
  168. package/esm/form/file-upload/parts/dropzone/dropzone.types.js.map +1 -0
  169. package/esm/form/file-upload/parts/dropzone/useDropzone.d.ts +13 -0
  170. package/esm/form/file-upload/parts/dropzone/useDropzone.js +30 -0
  171. package/esm/form/file-upload/parts/dropzone/useDropzone.js.map +1 -0
  172. package/esm/form/file-upload/parts/item/Item.d.ts +55 -0
  173. package/esm/form/file-upload/parts/item/Item.js +50 -0
  174. package/esm/form/file-upload/parts/item/Item.js.map +1 -0
  175. package/esm/form/file-upload/parts/item/Item.types.d.ts +5 -0
  176. package/esm/form/file-upload/parts/item/Item.types.js +2 -0
  177. package/esm/form/file-upload/parts/item/Item.types.js.map +1 -0
  178. package/esm/form/file-upload/parts/item/ItemButton.d.ts +12 -0
  179. package/esm/form/file-upload/parts/item/ItemButton.js +17 -0
  180. package/esm/form/file-upload/parts/item/ItemButton.js.map +1 -0
  181. package/esm/form/file-upload/parts/item/ItemIcon.d.ts +9 -0
  182. package/esm/form/file-upload/parts/item/ItemIcon.js +46 -0
  183. package/esm/form/file-upload/parts/item/ItemIcon.js.map +1 -0
  184. package/esm/form/file-upload/parts/item/ItemName.d.ts +9 -0
  185. package/esm/form/file-upload/parts/item/ItemName.js +27 -0
  186. package/esm/form/file-upload/parts/item/ItemName.js.map +1 -0
  187. package/esm/form/file-upload/parts/item/utils/download-file.d.ts +1 -0
  188. package/esm/form/file-upload/parts/item/utils/download-file.js +9 -0
  189. package/esm/form/file-upload/parts/item/utils/download-file.js.map +1 -0
  190. package/esm/form/file-upload/parts/item/utils/file-type-checker.d.ts +2 -0
  191. package/esm/form/file-upload/parts/item/utils/file-type-checker.js +2 -0
  192. package/esm/form/file-upload/parts/item/utils/file-type-checker.js.map +1 -0
  193. package/esm/form/file-upload/parts/item/utils/format-file-size.d.ts +2 -0
  194. package/esm/form/file-upload/parts/item/utils/format-file-size.js +20 -0
  195. package/esm/form/file-upload/parts/item/utils/format-file-size.js.map +1 -0
  196. package/esm/form/file-upload/useFileUpload.d.ts +12 -0
  197. package/esm/form/file-upload/useFileUpload.js +29 -0
  198. package/esm/form/file-upload/useFileUpload.js.map +1 -0
  199. package/esm/form/file-upload/utils/is-accepted-file-type.d.ts +1 -0
  200. package/esm/form/file-upload/utils/is-accepted-file-type.js +22 -0
  201. package/esm/form/file-upload/utils/is-accepted-file-type.js.map +1 -0
  202. package/esm/form/file-upload/utils/is-accepted-size.d.ts +1 -0
  203. package/esm/form/file-upload/utils/is-accepted-size.js +7 -0
  204. package/esm/form/file-upload/utils/is-accepted-size.js.map +1 -0
  205. package/esm/form/file-upload/utils/validate-files.d.ts +8 -0
  206. package/esm/form/file-upload/utils/validate-files.js +44 -0
  207. package/esm/form/file-upload/utils/validate-files.js.map +1 -0
  208. package/esm/index.d.ts +1 -0
  209. package/esm/index.js +1 -0
  210. package/esm/index.js.map +1 -1
  211. package/esm/loader/Loader.d.ts +0 -7
  212. package/esm/loader/Loader.js.map +1 -1
  213. package/esm/table/DataCell.d.ts +1 -3
  214. package/esm/table/DataCell.js.map +1 -1
  215. package/esm/util/create-context.d.ts +1 -0
  216. package/esm/util/create-context.js.map +1 -1
  217. package/esm/util/hooks/useEventListener.d.ts +1 -1
  218. package/esm/util/hooks/useMergeRefs.d.ts +1 -1
  219. package/package.json +13 -3
  220. package/src/form/combobox/ComboboxProvider.tsx +7 -3
  221. package/src/form/combobox/FilteredOptions/FilteredOptions.tsx +22 -15
  222. package/src/form/combobox/FilteredOptions/filtered-options-util.ts +5 -10
  223. package/src/form/combobox/FilteredOptions/filteredOptionsContext.tsx +19 -29
  224. package/src/form/combobox/Input/Input.tsx +14 -8
  225. package/src/form/combobox/SelectedOptions/SelectedOptions.tsx +8 -5
  226. package/src/form/combobox/SelectedOptions/selectedOptionsContext.tsx +24 -25
  227. package/src/form/combobox/combobox-utils.test.ts +67 -0
  228. package/src/form/combobox/combobox-utils.ts +32 -0
  229. package/src/form/combobox/combobox.stories.tsx +67 -32
  230. package/src/form/combobox/combobox.test.tsx +32 -1
  231. package/src/form/combobox/customOptionsContext.tsx +9 -8
  232. package/src/form/combobox/types.ts +23 -11
  233. package/src/form/file-upload/FileUpload.context.tsx +9 -0
  234. package/src/form/file-upload/FileUpload.tsx +142 -0
  235. package/src/form/file-upload/FileUpload.types.ts +57 -0
  236. package/src/form/file-upload/file-upload-dropzone.stories.tsx +123 -0
  237. package/src/form/file-upload/file-upload-item.stories.tsx +136 -0
  238. package/src/form/file-upload/file-upload.stories.tsx +236 -0
  239. package/src/form/file-upload/i18n/get.ts +48 -0
  240. package/src/form/file-upload/i18n/i18n.context.test.tsx +92 -0
  241. package/src/form/file-upload/i18n/i18n.context.ts +67 -0
  242. package/src/form/file-upload/i18n/i18n.types.ts +20 -0
  243. package/src/form/file-upload/i18n/locales/nb.json +20 -0
  244. package/src/form/file-upload/i18n/merge.ts +35 -0
  245. package/src/form/file-upload/index.ts +21 -0
  246. package/src/form/file-upload/parts/Trigger.tsx +48 -0
  247. package/src/form/file-upload/parts/dropzone/Dropzone.tsx +181 -0
  248. package/src/form/file-upload/parts/dropzone/dropzone.types.ts +22 -0
  249. package/src/form/file-upload/parts/dropzone/useDropzone.ts +43 -0
  250. package/src/form/file-upload/parts/item/Item.tsx +165 -0
  251. package/src/form/file-upload/parts/item/Item.types.ts +6 -0
  252. package/src/form/file-upload/parts/item/ItemButton.tsx +52 -0
  253. package/src/form/file-upload/parts/item/ItemIcon.tsx +74 -0
  254. package/src/form/file-upload/parts/item/ItemName.tsx +58 -0
  255. package/src/form/file-upload/parts/item/utils/download-file.ts +9 -0
  256. package/src/form/file-upload/parts/item/utils/file-type-checker.ts +4 -0
  257. package/src/form/file-upload/parts/item/utils/format-file-size.test.ts +76 -0
  258. package/src/form/file-upload/parts/item/utils/format-file-size.ts +25 -0
  259. package/src/form/file-upload/useFileUpload.ts +54 -0
  260. package/src/form/file-upload/utils/is-accepted-file-type.test.ts +69 -0
  261. package/src/form/file-upload/utils/is-accepted-file-type.ts +25 -0
  262. package/src/form/file-upload/utils/is-accepted-size.test.ts +26 -0
  263. package/src/form/file-upload/utils/is-accepted-size.ts +7 -0
  264. package/src/form/file-upload/utils/validate-files.test.ts +132 -0
  265. package/src/form/file-upload/utils/validate-files.ts +62 -0
  266. package/src/index.ts +14 -0
  267. package/src/internal-header/header.stories.tsx +8 -5
  268. package/src/loader/Loader.tsx +0 -7
  269. package/src/table/DataCell.tsx +1 -6
  270. package/src/util/create-context.tsx +1 -0
  271. package/src/util/hooks/useMergeRefs.ts +1 -1
@@ -0,0 +1,132 @@
1
+ import { validateFiles } from "./validate-files";
2
+
3
+ const createTxtFile = (name: string = "foo.txt") =>
4
+ new File(["foo"], name, {
5
+ type: "text/plain",
6
+ });
7
+ const createCsvFile = (name: string = "bar.csv") =>
8
+ new File(["abc,123"], name, {
9
+ type: "text/csv",
10
+ });
11
+
12
+ describe("partitionFiles", () => {
13
+ test("accepts all files when accept parameter is undefined", () => {
14
+ const files = [createTxtFile(), createCsvFile()];
15
+ const {
16
+ partitionedFiles: { accepted, rejected },
17
+ } = validateFiles(files);
18
+
19
+ expect(accepted.length).toBe(2);
20
+ expect(rejected.length).toBe(0);
21
+ });
22
+
23
+ test("accepts all files when accept parameter is empty", () => {
24
+ const files = [createTxtFile(), createCsvFile()];
25
+ const {
26
+ partitionedFiles: { accepted, rejected },
27
+ } = validateFiles(files, "");
28
+
29
+ expect(accepted.length).toBe(2);
30
+ expect(rejected.length).toBe(0);
31
+ });
32
+
33
+ test("rejects file that does not match accept parameter", () => {
34
+ const txtFileName = "foo.txt";
35
+ const csvFileName = "bar.csv";
36
+ const files = [createTxtFile(txtFileName), createCsvFile(csvFileName)];
37
+ const {
38
+ partitionedFiles: { accepted, rejected },
39
+ } = validateFiles(files, ".txt");
40
+
41
+ expect(accepted.length).toBe(1);
42
+ expect(rejected.length).toBe(1);
43
+ expect(accepted[0].name).toBe(txtFileName);
44
+ expect(rejected[0].file.name).toBe(csvFileName);
45
+ });
46
+
47
+ test("rejects file that does not pass validator", () => {
48
+ const txtFileName = "foo.txt";
49
+ const csvFileName = "bar.csv";
50
+ const csvFile = createCsvFile(csvFileName);
51
+ const txtFile = createTxtFile(txtFileName);
52
+ const files = [txtFile, csvFile];
53
+ const validator = (file: File) => {
54
+ if (file.name === txtFile.name) {
55
+ return true;
56
+ }
57
+ return "custom validation error";
58
+ };
59
+ const {
60
+ partitionedFiles: { accepted, rejected },
61
+ } = validateFiles(files, undefined, validator);
62
+
63
+ expect(accepted.length).toBe(1);
64
+ expect(rejected.length).toBe(1);
65
+ expect(accepted[0].name).toBe(txtFileName);
66
+ expect(rejected[0].file.name).toBe(csvFileName);
67
+ expect(rejected[0].reasons).toEqual(["custom validation error"]);
68
+ });
69
+
70
+ test("rejects file that passes accept parameter but does not pass validator", () => {
71
+ const txtFileName = "foo.txt";
72
+ const csvFileName = "bar.csv";
73
+ const csvFile = createCsvFile(csvFileName);
74
+ const txtFile = createTxtFile(txtFileName);
75
+ const files = [txtFile, csvFile];
76
+ const validator = (file: File) => {
77
+ if (file.name === txtFile.name) {
78
+ return true;
79
+ }
80
+ return "custom validation error";
81
+ };
82
+ const {
83
+ partitionedFiles: { accepted, rejected },
84
+ } = validateFiles(files, ".txt, .csv", validator);
85
+
86
+ expect(accepted.length).toBe(1);
87
+ expect(rejected.length).toBe(1);
88
+ expect(accepted[0].name).toBe(txtFileName);
89
+ expect(rejected[0].file.name).toBe(csvFileName);
90
+ });
91
+
92
+ test("rejects file that passes validator but does not pass accept parameter", () => {
93
+ const txtFileName = "foo.txt";
94
+ const csvFileName = "bar.csv";
95
+ const csvFile = createCsvFile(csvFileName);
96
+ const txtFile = createTxtFile(txtFileName);
97
+ const files = [txtFile, csvFile];
98
+ const validator = (file: File) => {
99
+ if (file.name === csvFile.name || file.name === txtFile.name) {
100
+ return true;
101
+ }
102
+ return "custom validation error";
103
+ };
104
+ const {
105
+ partitionedFiles: { accepted, rejected },
106
+ } = validateFiles(files, ".csv", validator);
107
+
108
+ expect(accepted.length).toBe(1);
109
+ expect(rejected.length).toBe(1);
110
+ expect(accepted[0].name).toBe(csvFileName);
111
+ expect(rejected[0].file.name).toBe(txtFileName);
112
+ expect(rejected[0].reasons).toEqual(["fileType"]);
113
+ });
114
+
115
+ test("rejects file that is too large", () => {
116
+ const txtFileName = "foo.txt";
117
+ const csvFileName = "bar.csv";
118
+ const csvFile = createCsvFile(csvFileName);
119
+ const txtFile = createTxtFile(txtFileName);
120
+ const files = [txtFile, csvFile];
121
+ const maxSizeInBytes = 5;
122
+ const {
123
+ partitionedFiles: { accepted, rejected },
124
+ } = validateFiles(files, undefined, undefined, maxSizeInBytes);
125
+
126
+ expect(accepted.length).toBe(1);
127
+ expect(rejected.length).toBe(1);
128
+ expect(accepted[0].name).toBe(txtFileName);
129
+ expect(rejected[0].file.name).toBe(csvFileName);
130
+ expect(rejected[0].reasons).toEqual(["fileSize"]);
131
+ });
132
+ });
@@ -0,0 +1,62 @@
1
+ import {
2
+ FileObject,
3
+ FileUploadBaseProps,
4
+ FilesPartitioned,
5
+ fileRejectionReason,
6
+ } from "../FileUpload.types";
7
+ import { isAcceptedFileType } from "./is-accepted-file-type";
8
+ import { isAcceptedSize } from "./is-accepted-size";
9
+
10
+ export const validateFiles = (
11
+ files: File[],
12
+ accept?: string,
13
+ validator?: FileUploadBaseProps["validator"],
14
+ maxSizeInBytes: number = -1,
15
+ ) => {
16
+ const allFiles: FileObject[] = [];
17
+ const accepted: File[] = [];
18
+ const rejected: FilesPartitioned["rejected"] = [];
19
+
20
+ files.forEach((file) => {
21
+ const acceptedFileType = isAcceptedFileType(file, accept);
22
+ const acceptedFileSize = isAcceptedSize(file, maxSizeInBytes);
23
+ const customValidation = validator ? validator(file) : true;
24
+
25
+ const reasons: FilesPartitioned["rejected"][0]["reasons"] = [];
26
+ if (customValidation !== true) {
27
+ reasons.push(customValidation);
28
+ }
29
+
30
+ if (!acceptedFileType) {
31
+ reasons.push(fileRejectionReason.FileType);
32
+ }
33
+
34
+ if (!acceptedFileSize) {
35
+ reasons.push(fileRejectionReason.FileSize);
36
+ }
37
+
38
+ allFiles.push({
39
+ file,
40
+ error: reasons.length > 0,
41
+ reasons,
42
+ });
43
+
44
+ if (reasons.length === 0) {
45
+ accepted.push(file);
46
+ return;
47
+ }
48
+
49
+ rejected.push({
50
+ file,
51
+ reasons,
52
+ });
53
+ });
54
+
55
+ return {
56
+ files: allFiles,
57
+ partitionedFiles: {
58
+ accepted,
59
+ rejected,
60
+ },
61
+ };
62
+ };
package/src/index.ts CHANGED
@@ -136,6 +136,20 @@ export { Select, type SelectProps } from "./form/select";
136
136
  export { Switch, type SwitchProps } from "./form/switch";
137
137
  export { Textarea, type TextareaProps } from "./form/textarea";
138
138
  export { TextField, type TextFieldProps } from "./form/textfield";
139
+ export {
140
+ UNSAFE_FileUpload,
141
+ type FileUploadDropzoneProps,
142
+ type FileUploadTriggerProps,
143
+ type FileObject,
144
+ type FileRejected,
145
+ type FileAccepted,
146
+ type FileRejectedPartitioned,
147
+ type FilesPartitioned,
148
+ type FileRejectionReason,
149
+ type FileUploadItemProps,
150
+ type FileItem,
151
+ type FileMetadata,
152
+ } from "./form/file-upload";
139
153
 
140
154
  /**
141
155
  * @deprecated
@@ -2,10 +2,12 @@ import { Meta } from "@storybook/react";
2
2
  import React from "react";
3
3
  import {
4
4
  ChevronDownIcon,
5
+ CogIcon,
5
6
  ExternalLinkIcon,
7
+ LeaveIcon,
6
8
  MenuGridIcon,
7
9
  } from "@navikt/aksel-icons";
8
- import { BodyLong, BodyShort, Detail } from "@navikt/ds-react";
10
+ import { BodyLong, BodyShort, Detail, Spacer } from "@navikt/ds-react";
9
11
  import { Dropdown } from "../dropdown";
10
12
  import InternalHeader from "./InternalHeader";
11
13
 
@@ -102,10 +104,11 @@ export const Default = {
102
104
  <Dropdown.Menu.Divider />
103
105
  <Dropdown.Menu.List>
104
106
  <Dropdown.Menu.List.Item as="a" href="/#settings">
105
- Innstillinger
107
+ Innstillinger <Spacer />{" "}
108
+ <CogIcon aria-hidden fontSize="1.5rem" />
106
109
  </Dropdown.Menu.List.Item>
107
110
  <Dropdown.Menu.List.Item onClick={() => console.log("logg ut")}>
108
- Logg ut
111
+ Logg ut <Spacer /> <LeaveIcon aria-hidden fontSize="1.5rem" />
109
112
  </Dropdown.Menu.List.Item>
110
113
  </Dropdown.Menu.List>
111
114
  </Dropdown.Menu>
@@ -180,10 +183,10 @@ export const UserWithMenu = () => (
180
183
  <Dropdown.Menu.Divider />
181
184
  <Dropdown.Menu.List>
182
185
  <Dropdown.Menu.List.Item as="a" href="/#settings">
183
- Innstillinger
186
+ Innstillinger <Spacer /> <CogIcon aria-hidden fontSize="1.5rem" />
184
187
  </Dropdown.Menu.List.Item>
185
188
  <Dropdown.Menu.List.Item onClick={() => console.log("logg ut")}>
186
- Logg ut
189
+ Logg ut <Spacer /> <LeaveIcon aria-hidden fontSize="1.5rem" />
187
190
  </Dropdown.Menu.List.Item>
188
191
  </Dropdown.Menu.List>
189
192
  </Dropdown.Menu>
@@ -32,13 +32,6 @@ export interface LoaderProps extends Omit<SVGProps<SVGSVGElement>, "ref"> {
32
32
  * @default "neutral"
33
33
  */
34
34
  variant?: "neutral" | "interaction" | "inverted";
35
- /**
36
- * Allows getting a ref to the component instance.
37
- * Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).
38
- *
39
- * @see https://react.dev/learn/referencing-values-with-refs#refs-and-the-dom
40
- */
41
- ref?: React.Ref<SVGSVGElement>;
42
35
  }
43
36
 
44
37
  /* Workaround for @types/react v17/v18 feil */
@@ -15,12 +15,7 @@ export interface DataCellProps
15
15
  textSize?: "medium" | "small";
16
16
  }
17
17
 
18
- export interface DataCellType
19
- extends React.ForwardRefExoticComponent<
20
- DataCellProps & React.RefAttributes<HTMLTableCellElement>
21
- > {}
22
-
23
- export const DataCell: DataCellType = forwardRef(
18
+ export const DataCell = forwardRef<HTMLTableCellElement, DataCellProps>(
24
19
  ({ className, children = "", align, textSize, ...rest }, ref) => {
25
20
  return (
26
21
  <BodyShort
@@ -16,6 +16,7 @@ export interface CreateContextOptions<T> {
16
16
  errorMessage?: string;
17
17
  name?: string;
18
18
  defaultValue?: T;
19
+ strict?: boolean;
19
20
  }
20
21
 
21
22
  type ProviderProps<T> = T & { children: React.ReactNode };
@@ -1,7 +1,7 @@
1
1
  /* https://github.com/radix-ui/primitives/blob/main/packages/react/compose-refs/src/composeRefs.tsx */
2
2
  import React from "react";
3
3
 
4
- type PossibleRef<T> = React.Ref<T> | undefined;
4
+ type PossibleRef<T> = React.LegacyRef<T> | undefined;
5
5
 
6
6
  // https://github.com/gregberge/react-merge-refs
7
7
  /**