@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.
- package/cjs/form/combobox/ComboboxProvider.js +5 -1
- package/cjs/form/combobox/ComboboxProvider.js.map +1 -1
- package/cjs/form/combobox/FilteredOptions/FilteredOptions.js +14 -12
- package/cjs/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
- package/cjs/form/combobox/FilteredOptions/filtered-options-util.d.ts +3 -3
- package/cjs/form/combobox/FilteredOptions/filtered-options-util.js +1 -3
- package/cjs/form/combobox/FilteredOptions/filtered-options-util.js.map +1 -1
- package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.d.ts +8 -5
- package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js +8 -13
- package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
- package/cjs/form/combobox/Input/Input.js +9 -7
- package/cjs/form/combobox/Input/Input.js.map +1 -1
- package/cjs/form/combobox/SelectedOptions/SelectedOptions.d.ts +2 -1
- package/cjs/form/combobox/SelectedOptions/SelectedOptions.js +3 -3
- package/cjs/form/combobox/SelectedOptions/SelectedOptions.js.map +1 -1
- package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.d.ts +10 -7
- package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.js +6 -8
- package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.js.map +1 -1
- package/cjs/form/combobox/combobox-utils.d.ts +10 -0
- package/cjs/form/combobox/combobox-utils.js +27 -0
- package/cjs/form/combobox/combobox-utils.js.map +1 -0
- package/cjs/form/combobox/customOptionsContext.d.ts +5 -4
- package/cjs/form/combobox/customOptionsContext.js +1 -1
- package/cjs/form/combobox/customOptionsContext.js.map +1 -1
- package/cjs/form/combobox/types.d.ts +22 -11
- package/cjs/form/file-upload/FileUpload.context.d.ts +8 -0
- package/cjs/form/file-upload/FileUpload.context.js +7 -0
- package/cjs/form/file-upload/FileUpload.context.js.map +1 -0
- package/cjs/form/file-upload/FileUpload.d.ts +118 -0
- package/cjs/form/file-upload/FileUpload.js +73 -0
- package/cjs/form/file-upload/FileUpload.js.map +1 -0
- package/cjs/form/file-upload/FileUpload.types.d.ts +55 -0
- package/cjs/form/file-upload/FileUpload.types.js +8 -0
- package/cjs/form/file-upload/FileUpload.types.js.map +1 -0
- package/cjs/form/file-upload/i18n/get.d.ts +2 -0
- package/cjs/form/file-upload/i18n/get.js +38 -0
- package/cjs/form/file-upload/i18n/get.js.map +1 -0
- package/cjs/form/file-upload/i18n/i18n.context.d.ts +11 -0
- package/cjs/form/file-upload/i18n/i18n.context.js +39 -0
- package/cjs/form/file-upload/i18n/i18n.context.js.map +1 -0
- package/cjs/form/file-upload/i18n/i18n.types.d.ts +13 -0
- package/cjs/form/file-upload/i18n/i18n.types.js +3 -0
- package/cjs/form/file-upload/i18n/i18n.types.js.map +1 -0
- package/cjs/form/file-upload/i18n/locales/nb.json +20 -0
- package/cjs/form/file-upload/i18n/merge.d.ts +2 -0
- package/cjs/form/file-upload/i18n/merge.js +29 -0
- package/cjs/form/file-upload/i18n/merge.js.map +1 -0
- package/cjs/form/file-upload/index.d.ts +7 -0
- package/cjs/form/file-upload/index.js +16 -0
- package/cjs/form/file-upload/index.js.map +1 -0
- package/cjs/form/file-upload/parts/Trigger.d.ts +7 -0
- package/cjs/form/file-upload/parts/Trigger.js +43 -0
- package/cjs/form/file-upload/parts/Trigger.js.map +1 -0
- package/cjs/form/file-upload/parts/dropzone/Dropzone.d.ts +4 -0
- package/cjs/form/file-upload/parts/dropzone/Dropzone.js +106 -0
- package/cjs/form/file-upload/parts/dropzone/Dropzone.js.map +1 -0
- package/cjs/form/file-upload/parts/dropzone/dropzone.types.d.ts +18 -0
- package/cjs/form/file-upload/parts/dropzone/dropzone.types.js +3 -0
- package/cjs/form/file-upload/parts/dropzone/dropzone.types.js.map +1 -0
- package/cjs/form/file-upload/parts/dropzone/useDropzone.d.ts +13 -0
- package/cjs/form/file-upload/parts/dropzone/useDropzone.js +34 -0
- package/cjs/form/file-upload/parts/dropzone/useDropzone.js.map +1 -0
- package/cjs/form/file-upload/parts/item/Item.d.ts +55 -0
- package/cjs/form/file-upload/parts/item/Item.js +79 -0
- package/cjs/form/file-upload/parts/item/Item.js.map +1 -0
- package/cjs/form/file-upload/parts/item/Item.types.d.ts +5 -0
- package/cjs/form/file-upload/parts/item/Item.types.js +3 -0
- package/cjs/form/file-upload/parts/item/Item.types.js.map +1 -0
- package/cjs/form/file-upload/parts/item/ItemButton.d.ts +12 -0
- package/cjs/form/file-upload/parts/item/ItemButton.js +22 -0
- package/cjs/form/file-upload/parts/item/ItemButton.js.map +1 -0
- package/cjs/form/file-upload/parts/item/ItemIcon.d.ts +9 -0
- package/cjs/form/file-upload/parts/item/ItemIcon.js +51 -0
- package/cjs/form/file-upload/parts/item/ItemIcon.js.map +1 -0
- package/cjs/form/file-upload/parts/item/ItemName.d.ts +9 -0
- package/cjs/form/file-upload/parts/item/ItemName.js +32 -0
- package/cjs/form/file-upload/parts/item/ItemName.js.map +1 -0
- package/cjs/form/file-upload/parts/item/utils/download-file.d.ts +1 -0
- package/cjs/form/file-upload/parts/item/utils/download-file.js +13 -0
- package/cjs/form/file-upload/parts/item/utils/download-file.js.map +1 -0
- package/cjs/form/file-upload/parts/item/utils/file-type-checker.d.ts +2 -0
- package/cjs/form/file-upload/parts/item/utils/file-type-checker.js +6 -0
- package/cjs/form/file-upload/parts/item/utils/file-type-checker.js.map +1 -0
- package/cjs/form/file-upload/parts/item/utils/format-file-size.d.ts +2 -0
- package/cjs/form/file-upload/parts/item/utils/format-file-size.js +24 -0
- package/cjs/form/file-upload/parts/item/utils/format-file-size.js.map +1 -0
- package/cjs/form/file-upload/useFileUpload.d.ts +12 -0
- package/cjs/form/file-upload/useFileUpload.js +33 -0
- package/cjs/form/file-upload/useFileUpload.js.map +1 -0
- package/cjs/form/file-upload/utils/is-accepted-file-type.d.ts +1 -0
- package/cjs/form/file-upload/utils/is-accepted-file-type.js +26 -0
- package/cjs/form/file-upload/utils/is-accepted-file-type.js.map +1 -0
- package/cjs/form/file-upload/utils/is-accepted-size.d.ts +1 -0
- package/cjs/form/file-upload/utils/is-accepted-size.js +11 -0
- package/cjs/form/file-upload/utils/is-accepted-size.js.map +1 -0
- package/cjs/form/file-upload/utils/validate-files.d.ts +8 -0
- package/cjs/form/file-upload/utils/validate-files.js +48 -0
- package/cjs/form/file-upload/utils/validate-files.js.map +1 -0
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +3 -1
- package/cjs/index.js.map +1 -1
- package/cjs/loader/Loader.d.ts +0 -7
- package/cjs/loader/Loader.js.map +1 -1
- package/cjs/table/DataCell.d.ts +1 -3
- package/cjs/table/DataCell.js.map +1 -1
- package/cjs/util/create-context.d.ts +1 -0
- package/cjs/util/create-context.js.map +1 -1
- package/cjs/util/hooks/useEventListener.d.ts +1 -1
- package/cjs/util/hooks/useMergeRefs.d.ts +1 -1
- package/esm/form/combobox/ComboboxProvider.js +5 -1
- package/esm/form/combobox/ComboboxProvider.js.map +1 -1
- package/esm/form/combobox/FilteredOptions/FilteredOptions.js +14 -12
- package/esm/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
- package/esm/form/combobox/FilteredOptions/filtered-options-util.d.ts +3 -3
- package/esm/form/combobox/FilteredOptions/filtered-options-util.js +1 -3
- package/esm/form/combobox/FilteredOptions/filtered-options-util.js.map +1 -1
- package/esm/form/combobox/FilteredOptions/filteredOptionsContext.d.ts +8 -5
- package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js +8 -13
- package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
- package/esm/form/combobox/Input/Input.js +9 -7
- package/esm/form/combobox/Input/Input.js.map +1 -1
- package/esm/form/combobox/SelectedOptions/SelectedOptions.d.ts +2 -1
- package/esm/form/combobox/SelectedOptions/SelectedOptions.js +3 -3
- package/esm/form/combobox/SelectedOptions/SelectedOptions.js.map +1 -1
- package/esm/form/combobox/SelectedOptions/selectedOptionsContext.d.ts +10 -7
- package/esm/form/combobox/SelectedOptions/selectedOptionsContext.js +6 -8
- package/esm/form/combobox/SelectedOptions/selectedOptionsContext.js.map +1 -1
- package/esm/form/combobox/combobox-utils.d.ts +10 -0
- package/esm/form/combobox/combobox-utils.js +22 -0
- package/esm/form/combobox/combobox-utils.js.map +1 -0
- package/esm/form/combobox/customOptionsContext.d.ts +5 -4
- package/esm/form/combobox/customOptionsContext.js +1 -1
- package/esm/form/combobox/customOptionsContext.js.map +1 -1
- package/esm/form/combobox/types.d.ts +22 -11
- package/esm/form/file-upload/FileUpload.context.d.ts +8 -0
- package/esm/form/file-upload/FileUpload.context.js +3 -0
- package/esm/form/file-upload/FileUpload.context.js.map +1 -0
- package/esm/form/file-upload/FileUpload.d.ts +118 -0
- package/esm/form/file-upload/FileUpload.js +44 -0
- package/esm/form/file-upload/FileUpload.js.map +1 -0
- package/esm/form/file-upload/FileUpload.types.d.ts +55 -0
- package/esm/form/file-upload/FileUpload.types.js +5 -0
- package/esm/form/file-upload/FileUpload.types.js.map +1 -0
- package/esm/form/file-upload/i18n/get.d.ts +2 -0
- package/esm/form/file-upload/i18n/get.js +34 -0
- package/esm/form/file-upload/i18n/get.js.map +1 -0
- package/esm/form/file-upload/i18n/i18n.context.d.ts +11 -0
- package/esm/form/file-upload/i18n/i18n.context.js +32 -0
- package/esm/form/file-upload/i18n/i18n.context.js.map +1 -0
- package/esm/form/file-upload/i18n/i18n.types.d.ts +13 -0
- package/esm/form/file-upload/i18n/i18n.types.js +2 -0
- package/esm/form/file-upload/i18n/i18n.types.js.map +1 -0
- package/esm/form/file-upload/i18n/locales/nb.json +20 -0
- package/esm/form/file-upload/i18n/merge.d.ts +2 -0
- package/esm/form/file-upload/i18n/merge.js +25 -0
- package/esm/form/file-upload/i18n/merge.js.map +1 -0
- package/esm/form/file-upload/index.d.ts +7 -0
- package/esm/form/file-upload/index.js +6 -0
- package/esm/form/file-upload/index.js.map +1 -0
- package/esm/form/file-upload/parts/Trigger.d.ts +7 -0
- package/esm/form/file-upload/parts/Trigger.js +18 -0
- package/esm/form/file-upload/parts/Trigger.js.map +1 -0
- package/esm/form/file-upload/parts/dropzone/Dropzone.d.ts +4 -0
- package/esm/form/file-upload/parts/dropzone/Dropzone.js +78 -0
- package/esm/form/file-upload/parts/dropzone/Dropzone.js.map +1 -0
- package/esm/form/file-upload/parts/dropzone/dropzone.types.d.ts +18 -0
- package/esm/form/file-upload/parts/dropzone/dropzone.types.js +2 -0
- package/esm/form/file-upload/parts/dropzone/dropzone.types.js.map +1 -0
- package/esm/form/file-upload/parts/dropzone/useDropzone.d.ts +13 -0
- package/esm/form/file-upload/parts/dropzone/useDropzone.js +30 -0
- package/esm/form/file-upload/parts/dropzone/useDropzone.js.map +1 -0
- package/esm/form/file-upload/parts/item/Item.d.ts +55 -0
- package/esm/form/file-upload/parts/item/Item.js +50 -0
- package/esm/form/file-upload/parts/item/Item.js.map +1 -0
- package/esm/form/file-upload/parts/item/Item.types.d.ts +5 -0
- package/esm/form/file-upload/parts/item/Item.types.js +2 -0
- package/esm/form/file-upload/parts/item/Item.types.js.map +1 -0
- package/esm/form/file-upload/parts/item/ItemButton.d.ts +12 -0
- package/esm/form/file-upload/parts/item/ItemButton.js +17 -0
- package/esm/form/file-upload/parts/item/ItemButton.js.map +1 -0
- package/esm/form/file-upload/parts/item/ItemIcon.d.ts +9 -0
- package/esm/form/file-upload/parts/item/ItemIcon.js +46 -0
- package/esm/form/file-upload/parts/item/ItemIcon.js.map +1 -0
- package/esm/form/file-upload/parts/item/ItemName.d.ts +9 -0
- package/esm/form/file-upload/parts/item/ItemName.js +27 -0
- package/esm/form/file-upload/parts/item/ItemName.js.map +1 -0
- package/esm/form/file-upload/parts/item/utils/download-file.d.ts +1 -0
- package/esm/form/file-upload/parts/item/utils/download-file.js +9 -0
- package/esm/form/file-upload/parts/item/utils/download-file.js.map +1 -0
- package/esm/form/file-upload/parts/item/utils/file-type-checker.d.ts +2 -0
- package/esm/form/file-upload/parts/item/utils/file-type-checker.js +2 -0
- package/esm/form/file-upload/parts/item/utils/file-type-checker.js.map +1 -0
- package/esm/form/file-upload/parts/item/utils/format-file-size.d.ts +2 -0
- package/esm/form/file-upload/parts/item/utils/format-file-size.js +20 -0
- package/esm/form/file-upload/parts/item/utils/format-file-size.js.map +1 -0
- package/esm/form/file-upload/useFileUpload.d.ts +12 -0
- package/esm/form/file-upload/useFileUpload.js +29 -0
- package/esm/form/file-upload/useFileUpload.js.map +1 -0
- package/esm/form/file-upload/utils/is-accepted-file-type.d.ts +1 -0
- package/esm/form/file-upload/utils/is-accepted-file-type.js +22 -0
- package/esm/form/file-upload/utils/is-accepted-file-type.js.map +1 -0
- package/esm/form/file-upload/utils/is-accepted-size.d.ts +1 -0
- package/esm/form/file-upload/utils/is-accepted-size.js +7 -0
- package/esm/form/file-upload/utils/is-accepted-size.js.map +1 -0
- package/esm/form/file-upload/utils/validate-files.d.ts +8 -0
- package/esm/form/file-upload/utils/validate-files.js +44 -0
- package/esm/form/file-upload/utils/validate-files.js.map +1 -0
- package/esm/index.d.ts +1 -0
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -1
- package/esm/loader/Loader.d.ts +0 -7
- package/esm/loader/Loader.js.map +1 -1
- package/esm/table/DataCell.d.ts +1 -3
- package/esm/table/DataCell.js.map +1 -1
- package/esm/util/create-context.d.ts +1 -0
- package/esm/util/create-context.js.map +1 -1
- package/esm/util/hooks/useEventListener.d.ts +1 -1
- package/esm/util/hooks/useMergeRefs.d.ts +1 -1
- package/package.json +13 -3
- package/src/form/combobox/ComboboxProvider.tsx +7 -3
- package/src/form/combobox/FilteredOptions/FilteredOptions.tsx +22 -15
- package/src/form/combobox/FilteredOptions/filtered-options-util.ts +5 -10
- package/src/form/combobox/FilteredOptions/filteredOptionsContext.tsx +19 -29
- package/src/form/combobox/Input/Input.tsx +14 -8
- package/src/form/combobox/SelectedOptions/SelectedOptions.tsx +8 -5
- package/src/form/combobox/SelectedOptions/selectedOptionsContext.tsx +24 -25
- package/src/form/combobox/combobox-utils.test.ts +67 -0
- package/src/form/combobox/combobox-utils.ts +32 -0
- package/src/form/combobox/combobox.stories.tsx +67 -32
- package/src/form/combobox/combobox.test.tsx +32 -1
- package/src/form/combobox/customOptionsContext.tsx +9 -8
- package/src/form/combobox/types.ts +23 -11
- package/src/form/file-upload/FileUpload.context.tsx +9 -0
- package/src/form/file-upload/FileUpload.tsx +142 -0
- package/src/form/file-upload/FileUpload.types.ts +57 -0
- package/src/form/file-upload/file-upload-dropzone.stories.tsx +123 -0
- package/src/form/file-upload/file-upload-item.stories.tsx +136 -0
- package/src/form/file-upload/file-upload.stories.tsx +236 -0
- package/src/form/file-upload/i18n/get.ts +48 -0
- package/src/form/file-upload/i18n/i18n.context.test.tsx +92 -0
- package/src/form/file-upload/i18n/i18n.context.ts +67 -0
- package/src/form/file-upload/i18n/i18n.types.ts +20 -0
- package/src/form/file-upload/i18n/locales/nb.json +20 -0
- package/src/form/file-upload/i18n/merge.ts +35 -0
- package/src/form/file-upload/index.ts +21 -0
- package/src/form/file-upload/parts/Trigger.tsx +48 -0
- package/src/form/file-upload/parts/dropzone/Dropzone.tsx +181 -0
- package/src/form/file-upload/parts/dropzone/dropzone.types.ts +22 -0
- package/src/form/file-upload/parts/dropzone/useDropzone.ts +43 -0
- package/src/form/file-upload/parts/item/Item.tsx +165 -0
- package/src/form/file-upload/parts/item/Item.types.ts +6 -0
- package/src/form/file-upload/parts/item/ItemButton.tsx +52 -0
- package/src/form/file-upload/parts/item/ItemIcon.tsx +74 -0
- package/src/form/file-upload/parts/item/ItemName.tsx +58 -0
- package/src/form/file-upload/parts/item/utils/download-file.ts +9 -0
- package/src/form/file-upload/parts/item/utils/file-type-checker.ts +4 -0
- package/src/form/file-upload/parts/item/utils/format-file-size.test.ts +76 -0
- package/src/form/file-upload/parts/item/utils/format-file-size.ts +25 -0
- package/src/form/file-upload/useFileUpload.ts +54 -0
- package/src/form/file-upload/utils/is-accepted-file-type.test.ts +69 -0
- package/src/form/file-upload/utils/is-accepted-file-type.ts +25 -0
- package/src/form/file-upload/utils/is-accepted-size.test.ts +26 -0
- package/src/form/file-upload/utils/is-accepted-size.ts +7 -0
- package/src/form/file-upload/utils/validate-files.test.ts +132 -0
- package/src/form/file-upload/utils/validate-files.ts +62 -0
- package/src/index.ts +14 -0
- package/src/internal-header/header.stories.tsx +8 -5
- package/src/loader/Loader.tsx +0 -7
- package/src/table/DataCell.tsx +1 -6
- package/src/util/create-context.tsx +1 -0
- 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>
|
package/src/loader/Loader.tsx
CHANGED
|
@@ -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 */
|
package/src/table/DataCell.tsx
CHANGED
|
@@ -15,12 +15,7 @@ export interface DataCellProps
|
|
|
15
15
|
textSize?: "medium" | "small";
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export
|
|
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
|
|
@@ -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.
|
|
4
|
+
type PossibleRef<T> = React.LegacyRef<T> | undefined;
|
|
5
5
|
|
|
6
6
|
// https://github.com/gregberge/react-merge-refs
|
|
7
7
|
/**
|