@gooddata/sdk-ui-kit 11.24.0-alpha.2 → 11.24.0-alpha.4
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/esm/@ui/@types/icon.d.ts +1 -1
- package/esm/@ui/@types/icon.d.ts.map +1 -1
- package/esm/@ui/UiIcon/icons.d.ts.map +1 -1
- package/esm/@ui/UiIcon/icons.js +3 -0
- package/esm/@ui/UiIcon/icons.js.map +1 -1
- package/esm/FileUpload/FileDropzone/FileDropzone.d.ts +45 -0
- package/esm/FileUpload/FileDropzone/FileDropzone.d.ts.map +1 -0
- package/esm/FileUpload/FileDropzone/FileDropzone.js +138 -0
- package/esm/FileUpload/FileDropzone/FileDropzone.js.map +1 -0
- package/esm/FileUpload/FileDropzone/fileDropzoneBem.d.ts +2 -0
- package/esm/FileUpload/FileDropzone/fileDropzoneBem.d.ts.map +1 -0
- package/esm/FileUpload/FileDropzone/fileDropzoneBem.js +4 -0
- package/esm/FileUpload/FileDropzone/fileDropzoneBem.js.map +1 -0
- package/esm/FileUpload/FilePickerButton/FilePickerButton.d.ts +18 -0
- package/esm/FileUpload/FilePickerButton/FilePickerButton.d.ts.map +1 -0
- package/esm/FileUpload/FilePickerButton/FilePickerButton.js +21 -0
- package/esm/FileUpload/FilePickerButton/FilePickerButton.js.map +1 -0
- package/esm/FileUpload/UploadFileList/UploadFileList.d.ts +14 -0
- package/esm/FileUpload/UploadFileList/UploadFileList.d.ts.map +1 -0
- package/esm/FileUpload/UploadFileList/UploadFileList.js +55 -0
- package/esm/FileUpload/UploadFileList/UploadFileList.js.map +1 -0
- package/esm/FileUpload/UploadFileList/uploadFileListBem.d.ts +2 -0
- package/esm/FileUpload/UploadFileList/uploadFileListBem.d.ts.map +1 -0
- package/esm/FileUpload/UploadFileList/uploadFileListBem.js +4 -0
- package/esm/FileUpload/UploadFileList/uploadFileListBem.js.map +1 -0
- package/esm/FileUpload/UploadStatusDialog/UploadStatusDialog.d.ts +17 -0
- package/esm/FileUpload/UploadStatusDialog/UploadStatusDialog.d.ts.map +1 -0
- package/esm/FileUpload/UploadStatusDialog/UploadStatusDialog.js +27 -0
- package/esm/FileUpload/UploadStatusDialog/UploadStatusDialog.js.map +1 -0
- package/esm/FileUpload/UploadStatusDialog/uploadStatusDialogBem.d.ts +2 -0
- package/esm/FileUpload/UploadStatusDialog/uploadStatusDialogBem.d.ts.map +1 -0
- package/esm/FileUpload/UploadStatusDialog/uploadStatusDialogBem.js +4 -0
- package/esm/FileUpload/UploadStatusDialog/uploadStatusDialogBem.js.map +1 -0
- package/esm/FileUpload/hooks/useFileInput.d.ts +9 -0
- package/esm/FileUpload/hooks/useFileInput.d.ts.map +1 -0
- package/esm/FileUpload/hooks/useFileInput.js +17 -0
- package/esm/FileUpload/hooks/useFileInput.js.map +1 -0
- package/esm/FileUpload/hooks/useFileSelection.d.ts +28 -0
- package/esm/FileUpload/hooks/useFileSelection.d.ts.map +1 -0
- package/esm/FileUpload/hooks/useFileSelection.js +65 -0
- package/esm/FileUpload/hooks/useFileSelection.js.map +1 -0
- package/esm/FileUpload/hooks/useUploadQueue.d.ts +29 -0
- package/esm/FileUpload/hooks/useUploadQueue.d.ts.map +1 -0
- package/esm/FileUpload/hooks/useUploadQueue.js +98 -0
- package/esm/FileUpload/hooks/useUploadQueue.js.map +1 -0
- package/esm/FileUpload/hooks/validateFile.d.ts +6 -0
- package/esm/FileUpload/hooks/validateFile.d.ts.map +1 -0
- package/esm/FileUpload/hooks/validateFile.js +47 -0
- package/esm/FileUpload/hooks/validateFile.js.map +1 -0
- package/esm/FileUpload/parseAcceptedTypes.d.ts +13 -0
- package/esm/FileUpload/parseAcceptedTypes.d.ts.map +1 -0
- package/esm/FileUpload/parseAcceptedTypes.js +26 -0
- package/esm/FileUpload/parseAcceptedTypes.js.map +1 -0
- package/esm/FileUpload/types.d.ts +67 -0
- package/esm/FileUpload/types.d.ts.map +1 -0
- package/esm/FileUpload/types.js +19 -0
- package/esm/FileUpload/types.js.map +1 -0
- package/esm/index.d.ts +8 -0
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +8 -0
- package/esm/index.js.map +1 -1
- package/esm/sdk-ui-kit.d.ts +231 -1
- package/package.json +11 -11
- package/src/FileUpload/FileDropzone/FileDropzone.scss +57 -0
- package/src/FileUpload/UploadFileList/UploadFileList.scss +54 -0
- package/src/FileUpload/UploadStatusDialog/UploadStatusDialog.scss +61 -0
- package/styles/css/main.css +146 -0
- package/styles/css/main.css.map +1 -1
- package/styles/scss/main.scss +3 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploadStatusDialogBem.js","sourceRoot":"","sources":["../../../src/FileUpload/UploadStatusDialog/uploadStatusDialogBem.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,yBAAyB,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ChangeEvent } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export declare function useFileInput(onFilesSelected: (files: File[]) => void): {
|
|
6
|
+
inputRef: import("react").RefObject<HTMLInputElement | null>;
|
|
7
|
+
handleInputChange: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=useFileInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFileInput.d.ts","sourceRoot":"","sources":["../../../src/FileUpload/hooks/useFileInput.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,WAAW,EAAuB,MAAM,OAAO,CAAC;AAE9D;;GAEG;AACH,wBAAgB,YAAY,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI;;;EAgBpE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
import { useCallback, useRef } from "react";
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export function useFileInput(onFilesSelected) {
|
|
7
|
+
const inputRef = useRef(null);
|
|
8
|
+
const handleInputChange = useCallback((event) => {
|
|
9
|
+
const files = event.target.files ? Array.from(event.target.files) : [];
|
|
10
|
+
if (files.length) {
|
|
11
|
+
onFilesSelected(files);
|
|
12
|
+
}
|
|
13
|
+
event.target.value = "";
|
|
14
|
+
}, [onFilesSelected]);
|
|
15
|
+
return { inputRef, handleInputChange };
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=useFileInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFileInput.js","sourceRoot":"","sources":["../../../src/FileUpload/hooks/useFileInput.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,EAAoB,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE9D;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,eAAwC,EAAE;IACnE,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAEhD,MAAM,iBAAiB,GAAG,WAAW,CACjC,CAAC,KAAoC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACf,eAAe,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;IAAA,CAC3B,EACD,CAAC,eAAe,CAAC,CACpB,CAAC;IAEF,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AAAA,CAC1C"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type Dispatch, type SetStateAction } from "react";
|
|
2
|
+
import { type IFileRejection, type IFileValidationResult, type IFileValidationRules } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export interface IUseFileSelectionConfig {
|
|
7
|
+
rules?: IFileValidationRules;
|
|
8
|
+
multiple?: boolean;
|
|
9
|
+
onValidateFile?: (file: File) => IFileValidationResult;
|
|
10
|
+
onFilesAccepted?: (files: File[]) => void;
|
|
11
|
+
onFilesRejected?: (rejections: IFileRejection[]) => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
export interface IUseFileSelectionResult {
|
|
17
|
+
selectedFiles: File[];
|
|
18
|
+
rejections: IFileRejection[];
|
|
19
|
+
selectFiles: (files: File[] | FileList | null | undefined) => void;
|
|
20
|
+
setSelectedFiles: Dispatch<SetStateAction<File[]>>;
|
|
21
|
+
removeFile: (file: File) => void;
|
|
22
|
+
clearSelection: () => void;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
export declare function useFileSelection({ rules, multiple, onValidateFile, onFilesAccepted, onFilesRejected }?: IUseFileSelectionConfig): IUseFileSelectionResult;
|
|
28
|
+
//# sourceMappingURL=useFileSelection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFileSelection.d.ts","sourceRoot":"","sources":["../../../src/FileUpload/hooks/useFileSelection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAyB,MAAM,OAAO,CAAC;AAElF,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGzG;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACpC,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,qBAAqB,CAAC;IACvD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;CAC5D;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACpC,aAAa,EAAE,IAAI,EAAE,CAAC;IACtB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,GAAG,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;IACnE,gBAAgB,EAAE,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,IAAI,CAAC;CAC9B;AAcD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAC7B,KAAK,EACL,QAAgB,EAChB,cAAc,EACd,eAAe,EACf,eAAe,EAClB,GAAE,uBAA4B,GAAG,uBAAuB,CA2DxD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
import { useCallback, useState } from "react";
|
|
3
|
+
import { validateFile } from "./validateFile.js";
|
|
4
|
+
const toArray = (files) => {
|
|
5
|
+
if (!files) {
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
8
|
+
if (Array.isArray(files)) {
|
|
9
|
+
return files;
|
|
10
|
+
}
|
|
11
|
+
return Array.from(files);
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
export function useFileSelection({ rules, multiple = false, onValidateFile, onFilesAccepted, onFilesRejected, } = {}) {
|
|
17
|
+
const [selectedFiles, setSelectedFiles] = useState([]);
|
|
18
|
+
const [rejections, setRejections] = useState([]);
|
|
19
|
+
const selectFiles = useCallback((files) => {
|
|
20
|
+
const filesToProcess = toArray(files);
|
|
21
|
+
const acceptedFiles = [];
|
|
22
|
+
const rejectedFiles = [];
|
|
23
|
+
filesToProcess.forEach((file) => {
|
|
24
|
+
const validation = onValidateFile ? onValidateFile(file) : validateFile(file, rules);
|
|
25
|
+
if (validation.isValid) {
|
|
26
|
+
acceptedFiles.push(file);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
rejectedFiles.push({
|
|
30
|
+
file,
|
|
31
|
+
validation,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
setRejections(rejectedFiles);
|
|
36
|
+
setSelectedFiles((previousFiles) => {
|
|
37
|
+
if (!acceptedFiles.length) {
|
|
38
|
+
return previousFiles;
|
|
39
|
+
}
|
|
40
|
+
return multiple ? [...previousFiles, ...acceptedFiles] : [acceptedFiles[0]];
|
|
41
|
+
});
|
|
42
|
+
if (acceptedFiles.length) {
|
|
43
|
+
onFilesAccepted?.(multiple ? acceptedFiles : [acceptedFiles[0]]);
|
|
44
|
+
}
|
|
45
|
+
if (rejectedFiles.length) {
|
|
46
|
+
onFilesRejected?.(rejectedFiles);
|
|
47
|
+
}
|
|
48
|
+
}, [multiple, onFilesAccepted, onFilesRejected, onValidateFile, rules]);
|
|
49
|
+
const removeFile = useCallback((file) => {
|
|
50
|
+
setSelectedFiles((previousFiles) => previousFiles.filter((selectedFile) => selectedFile !== file));
|
|
51
|
+
}, []);
|
|
52
|
+
const clearSelection = useCallback(() => {
|
|
53
|
+
setSelectedFiles([]);
|
|
54
|
+
setRejections([]);
|
|
55
|
+
}, []);
|
|
56
|
+
return {
|
|
57
|
+
selectedFiles,
|
|
58
|
+
rejections,
|
|
59
|
+
selectFiles,
|
|
60
|
+
setSelectedFiles,
|
|
61
|
+
removeFile,
|
|
62
|
+
clearSelection,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=useFileSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFileSelection.js","sourceRoot":"","sources":["../../../src/FileUpload/hooks/useFileSelection.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,EAAsC,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGlF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAyBjD,MAAM,OAAO,GAAG,CAAC,KAA2C,EAAU,EAAE,CAAC;IACrE,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAAA,CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC7B,KAAK,EACL,QAAQ,GAAG,KAAK,EAChB,cAAc,EACd,eAAe,EACf,eAAe,GAClB,GAA4B,EAAE,EAA2B;IACtD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAmB,EAAE,CAAC,CAAC;IAEnE,MAAM,WAAW,GAAG,WAAW,CAC3B,CAAC,KAA2C,EAAE,EAAE,CAAC;QAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,aAAa,GAAW,EAAE,CAAC;QACjC,MAAM,aAAa,GAAqB,EAAE,CAAC;QAE3C,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACrF,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACrB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACJ,aAAa,CAAC,IAAI,CAAC;oBACf,IAAI;oBACJ,UAAU;iBACb,CAAC,CAAC;YACP,CAAC;QAAA,CACJ,CAAC,CAAC;QAEH,aAAa,CAAC,aAAa,CAAC,CAAC;QAC7B,gBAAgB,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC;YAChC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;gBACxB,OAAO,aAAa,CAAC;YACzB,CAAC;YAED,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAAA,CAC/E,CAAC,CAAC;QAEH,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YACvB,eAAe,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YACvB,eAAe,EAAE,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;IAAA,CACJ,EACD,CAAC,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,CACtE,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,IAAU,EAAE,EAAE,CAAC;QAC3C,gBAAgB,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC;IAAA,CACtG,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACrC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACrB,aAAa,CAAC,EAAE,CAAC,CAAC;IAAA,CACrB,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACH,aAAa;QACb,UAAU;QACV,WAAW;QACX,gBAAgB;QAChB,UAAU;QACV,cAAc;KACjB,CAAC;AAAA,CACL"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type IUploadFileItem } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export interface IUseUploadQueueConfig {
|
|
6
|
+
uploadFn: (file: File) => Promise<void>;
|
|
7
|
+
onUploadSuccess?: (file: File) => void;
|
|
8
|
+
onUploadError?: (file: File, error: unknown) => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
export interface IUseUploadQueueResult {
|
|
14
|
+
queue: IUploadFileItem[];
|
|
15
|
+
getItemById: (id: string) => IUploadFileItem | undefined;
|
|
16
|
+
requireItemById: (id: string) => IUploadFileItem;
|
|
17
|
+
isUploading: boolean;
|
|
18
|
+
addToQueue: (files: File[]) => void;
|
|
19
|
+
removeFromQueue: (fileId: string) => void;
|
|
20
|
+
updateFileStatus: (fileId: string, status: IUploadFileItem["status"], errorMessage?: string) => void;
|
|
21
|
+
uploadFile: (fileId: string) => Promise<IUploadFileItem>;
|
|
22
|
+
uploadAll: () => Promise<IUploadFileItem[]>;
|
|
23
|
+
clearQueue: () => void;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
export declare function useUploadQueue({ uploadFn, onUploadSuccess, onUploadError }: IUseUploadQueueConfig): IUseUploadQueueResult;
|
|
29
|
+
//# sourceMappingURL=useUploadQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUploadQueue.d.ts","sourceRoot":"","sources":["../../../src/FileUpload/hooks/useUploadQueue.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,aAAa,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACvC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,eAAe,GAAG,SAAS,CAAC;IACzD,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,eAAe,CAAC;IACjD,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACpC,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrG,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IACzD,SAAS,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC5C,UAAU,EAAE,MAAM,IAAI,CAAC;CAC1B;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC3B,QAAQ,EACR,eAAe,EACf,aAAa,EAChB,EAAE,qBAAqB,GAAG,qBAAqB,CAiI/C"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
import { useCallback, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { UploadItemStatus } from "../types.js";
|
|
4
|
+
const createFileId = (file) => `${file.name}-${file.lastModified}-${file.size}`;
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export function useUploadQueue({ uploadFn, onUploadSuccess, onUploadError, }) {
|
|
9
|
+
const [queue, setQueueState] = useState([]);
|
|
10
|
+
// We keep a ref that mirrors the queue state so that functions like uploadAll()
|
|
11
|
+
// can be called immediately after addToQueue() without waiting for a re-render.
|
|
12
|
+
// The ref is updated synchronously (before setQueueState) so it is always current.
|
|
13
|
+
const queueRef = useRef(queue);
|
|
14
|
+
const setQueue = useCallback((updaterFn) => {
|
|
15
|
+
const newQueue = updaterFn(queueRef.current);
|
|
16
|
+
queueRef.current = newQueue;
|
|
17
|
+
setQueueState(newQueue);
|
|
18
|
+
}, []);
|
|
19
|
+
const getItemById = useCallback((id) => {
|
|
20
|
+
return queueRef.current.find((item) => item.id === id);
|
|
21
|
+
}, []);
|
|
22
|
+
const requireItemById = useCallback((id) => {
|
|
23
|
+
const item = getItemById(id);
|
|
24
|
+
if (!item) {
|
|
25
|
+
throw new Error(`File with ID ${id} not found in upload queue`);
|
|
26
|
+
}
|
|
27
|
+
return item;
|
|
28
|
+
}, [getItemById]);
|
|
29
|
+
const addToQueue = useCallback((files) => {
|
|
30
|
+
const newItems = files.map((file) => ({
|
|
31
|
+
id: createFileId(file),
|
|
32
|
+
file,
|
|
33
|
+
status: UploadItemStatus.Idle,
|
|
34
|
+
}));
|
|
35
|
+
setQueue((prev) => {
|
|
36
|
+
const combinedQueue = [...newItems, ...prev];
|
|
37
|
+
const deduplicatedIds = Array.from(new Set(combinedQueue.map((item) => item.id)));
|
|
38
|
+
return deduplicatedIds.map((id) => combinedQueue.find((item) => item.id === id));
|
|
39
|
+
});
|
|
40
|
+
}, [setQueue]);
|
|
41
|
+
const removeFromQueue = useCallback((fileId) => {
|
|
42
|
+
setQueue((prev) => prev.filter((item) => item.id !== fileId));
|
|
43
|
+
}, [setQueue]);
|
|
44
|
+
const updateFileStatus = useCallback((fileId, status, errorMessage) => {
|
|
45
|
+
setQueue((prev) => prev.map((item) => item.id === fileId
|
|
46
|
+
? {
|
|
47
|
+
...item,
|
|
48
|
+
status,
|
|
49
|
+
errorMessage,
|
|
50
|
+
}
|
|
51
|
+
: item));
|
|
52
|
+
}, [setQueue]);
|
|
53
|
+
const uploadFile = useCallback(async (fileId) => {
|
|
54
|
+
const item = requireItemById(fileId);
|
|
55
|
+
updateFileStatus(item.id, UploadItemStatus.Uploading);
|
|
56
|
+
try {
|
|
57
|
+
await uploadFn(item.file);
|
|
58
|
+
updateFileStatus(item.id, UploadItemStatus.Success);
|
|
59
|
+
onUploadSuccess?.(item.file);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
const errorMessage = error instanceof Error ? error.message : undefined;
|
|
63
|
+
updateFileStatus(item.id, UploadItemStatus.Error, errorMessage);
|
|
64
|
+
onUploadError?.(item.file, error);
|
|
65
|
+
}
|
|
66
|
+
return requireItemById(item.id);
|
|
67
|
+
}, [onUploadError, onUploadSuccess, requireItemById, updateFileStatus, uploadFn]);
|
|
68
|
+
const uploadAll = useCallback(async () => {
|
|
69
|
+
const retryableItems = queueRef.current.filter((item) => item.status === UploadItemStatus.Idle || item.status === UploadItemStatus.Error);
|
|
70
|
+
const processedItems = [];
|
|
71
|
+
if (retryableItems.length === 0) {
|
|
72
|
+
return processedItems;
|
|
73
|
+
}
|
|
74
|
+
for (const item of retryableItems) {
|
|
75
|
+
processedItems.push(await uploadFile(item.id));
|
|
76
|
+
}
|
|
77
|
+
return processedItems;
|
|
78
|
+
}, [uploadFile]);
|
|
79
|
+
const clearQueue = useCallback(() => {
|
|
80
|
+
setQueue(() => []);
|
|
81
|
+
}, [setQueue]);
|
|
82
|
+
const isUploading = useMemo(() => {
|
|
83
|
+
return queue.some((item) => item.status === UploadItemStatus.Uploading);
|
|
84
|
+
}, [queue]);
|
|
85
|
+
return {
|
|
86
|
+
queue,
|
|
87
|
+
requireItemById,
|
|
88
|
+
getItemById,
|
|
89
|
+
isUploading,
|
|
90
|
+
addToQueue,
|
|
91
|
+
removeFromQueue,
|
|
92
|
+
updateFileStatus,
|
|
93
|
+
uploadAll,
|
|
94
|
+
uploadFile,
|
|
95
|
+
clearQueue,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=useUploadQueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUploadQueue.js","sourceRoot":"","sources":["../../../src/FileUpload/hooks/useUploadQueue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateFile.d.ts","sourceRoot":"","sources":["../../../src/FileUpload/hooks/validateFile.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAW7G;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,oBAAoB,GAAG,qBAAqB,CA0C5F"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
import { parseAcceptedTypes } from "../parseAcceptedTypes.js";
|
|
3
|
+
import { FileValidationErrorCode } from "../types.js";
|
|
4
|
+
const getFileExtension = (fileName) => {
|
|
5
|
+
const extension = fileName.split(".").pop();
|
|
6
|
+
if (!extension || extension === fileName) {
|
|
7
|
+
return "";
|
|
8
|
+
}
|
|
9
|
+
return `.${extension.toLowerCase().trim()}`;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export function validateFile(file, rules) {
|
|
15
|
+
if (!rules) {
|
|
16
|
+
return { isValid: true };
|
|
17
|
+
}
|
|
18
|
+
const { allowedFileTypes, maxFileSizeInBytes } = rules;
|
|
19
|
+
const { wildcardMimePrefixes, exactMimeTypes, extensions } = parseAcceptedTypes(allowedFileTypes ?? "");
|
|
20
|
+
const hasTypeRestrictions = extensions.length > 0 || exactMimeTypes.length > 0 || wildcardMimePrefixes.length > 0;
|
|
21
|
+
if (hasTypeRestrictions) {
|
|
22
|
+
const fileExtension = getFileExtension(file.name);
|
|
23
|
+
const mimeType = file.type?.toLowerCase();
|
|
24
|
+
const hasMimeRestrictions = exactMimeTypes.length > 0 || wildcardMimePrefixes.length > 0;
|
|
25
|
+
const isValidByExtension = extensions.length > 0 && extensions.includes(fileExtension);
|
|
26
|
+
const isValidByExactMime = exactMimeTypes.length > 0 && !!mimeType && exactMimeTypes.includes(mimeType);
|
|
27
|
+
const isValidByWildcard = wildcardMimePrefixes.length > 0 &&
|
|
28
|
+
!!mimeType &&
|
|
29
|
+
wildcardMimePrefixes.some((prefix) => mimeType.startsWith(prefix));
|
|
30
|
+
const isMissingMimeTypeWithMimeRestrictions = !mimeType && hasMimeRestrictions;
|
|
31
|
+
const shouldAllowUnknownMimeType = isMissingMimeTypeWithMimeRestrictions;
|
|
32
|
+
if (!isValidByExtension && !isValidByExactMime && !isValidByWildcard && !shouldAllowUnknownMimeType) {
|
|
33
|
+
return {
|
|
34
|
+
isValid: false,
|
|
35
|
+
errorCode: FileValidationErrorCode.InvalidFileType,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (maxFileSizeInBytes !== undefined && file.size > maxFileSizeInBytes) {
|
|
40
|
+
return {
|
|
41
|
+
isValid: false,
|
|
42
|
+
errorCode: FileValidationErrorCode.FileTooLarge,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return { isValid: true };
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=validateFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateFile.js","sourceRoot":"","sources":["../../../src/FileUpload/hooks/validateFile.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAyD,MAAM,aAAa,CAAC;AAE7G,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC;IACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAC5C,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;AAAA,CAC/C,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAU,EAAE,KAA4B,EAAyB;IAC1F,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAC;IACvD,MAAM,EAAE,oBAAoB,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,kBAAkB,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAExG,MAAM,mBAAmB,GACrB,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;IAE1F,IAAI,mBAAmB,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;QAC1C,MAAM,mBAAmB,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;QAEzF,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACvF,MAAM,kBAAkB,GACpB,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjF,MAAM,iBAAiB,GACnB,oBAAoB,CAAC,MAAM,GAAG,CAAC;YAC/B,CAAC,CAAC,QAAQ;YACV,oBAAoB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACvE,MAAM,qCAAqC,GAAG,CAAC,QAAQ,IAAI,mBAAmB,CAAC;QAC/E,MAAM,0BAA0B,GAAG,qCAAqC,CAAC;QAEzE,IAAI,CAAC,kBAAkB,IAAI,CAAC,kBAAkB,IAAI,CAAC,iBAAiB,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAClG,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,uBAAuB,CAAC,eAAe;aACrD,CAAC;QACN,CAAC;IACL,CAAC;IAED,IAAI,kBAAkB,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,GAAG,kBAAkB,EAAE,CAAC;QACrE,OAAO;YACH,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,uBAAuB,CAAC,YAAY;SAClD,CAAC;IACN,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAAA,CAC5B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @internal
|
|
3
|
+
*/
|
|
4
|
+
export interface IParsedAcceptedTypes {
|
|
5
|
+
extensions: string[];
|
|
6
|
+
exactMimeTypes: string[];
|
|
7
|
+
wildcardMimePrefixes: string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export declare const parseAcceptedTypes: (acceptedFileTypes: string) => IParsedAcceptedTypes;
|
|
13
|
+
//# sourceMappingURL=parseAcceptedTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseAcceptedTypes.d.ts","sourceRoot":"","sources":["../../src/FileUpload/parseAcceptedTypes.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,qDAoB9B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export const parseAcceptedTypes = (acceptedFileTypes) => {
|
|
6
|
+
const extensions = [];
|
|
7
|
+
const exactMimeTypes = [];
|
|
8
|
+
const wildcardMimePrefixes = [];
|
|
9
|
+
acceptedFileTypes.split(",").forEach((token) => {
|
|
10
|
+
const type = token.trim().toLowerCase();
|
|
11
|
+
if (!type) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (type.startsWith(".")) {
|
|
15
|
+
extensions.push(type);
|
|
16
|
+
}
|
|
17
|
+
else if (type.endsWith("/*")) {
|
|
18
|
+
wildcardMimePrefixes.push(type.slice(0, -1)); // e.g. "image/" from "image/*"
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
exactMimeTypes.push(type);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
return { extensions, exactMimeTypes, wildcardMimePrefixes };
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=parseAcceptedTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseAcceptedTypes.js","sourceRoot":"","sources":["../../src/FileUpload/parseAcceptedTypes.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAWhC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,iBAAyB,EAAwB,EAAE,CAAC;IACnF,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,oBAAoB,GAAa,EAAE,CAAC;IAE1C,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B;QACjF,CAAC;aAAM,CAAC;YACJ,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IAAA,CACJ,CAAC,CAAC;IAEH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,oBAAoB,EAAE,CAAC;AAAA,CAC/D,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @internal
|
|
3
|
+
*/
|
|
4
|
+
export declare const UploadItemStatus: {
|
|
5
|
+
readonly Idle: "idle";
|
|
6
|
+
readonly Uploading: "uploading";
|
|
7
|
+
readonly Success: "success";
|
|
8
|
+
readonly Error: "error";
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
export type UploadItemStatus = (typeof UploadItemStatus)[keyof typeof UploadItemStatus];
|
|
14
|
+
/**
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export declare const FileValidationErrorCode: {
|
|
18
|
+
readonly InvalidFileType: "invalidFileType";
|
|
19
|
+
readonly TooManyFiles: "tooManyFiles";
|
|
20
|
+
readonly FileTooLarge: "fileTooLarge";
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
export type FileValidationErrorCode = (typeof FileValidationErrorCode)[keyof typeof FileValidationErrorCode];
|
|
26
|
+
/**
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
export interface IFileValidationRules {
|
|
30
|
+
/**
|
|
31
|
+
* Comma separated list of allowed file types.
|
|
32
|
+
* For example: ".txt,image/*,text/csv"
|
|
33
|
+
*/
|
|
34
|
+
allowedFileTypes?: string;
|
|
35
|
+
maxFileSizeInBytes?: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
export interface IFileValidationResult {
|
|
41
|
+
isValid: boolean;
|
|
42
|
+
errorCode?: FileValidationErrorCode;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
export interface IFileRejection {
|
|
48
|
+
file: File;
|
|
49
|
+
validation: IFileValidationResult;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* @internal
|
|
53
|
+
*/
|
|
54
|
+
export interface IUploadFileItem {
|
|
55
|
+
id: string;
|
|
56
|
+
file: File;
|
|
57
|
+
status: UploadItemStatus;
|
|
58
|
+
errorMessage?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* @internal
|
|
62
|
+
*/
|
|
63
|
+
export interface IUploadActionCallbacks {
|
|
64
|
+
onRemoveFile?: (fileId: string) => void;
|
|
65
|
+
onRetryFile?: (fileId: string) => void;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/FileUpload/types.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;CAKnB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAExF;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;CAI1B,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,OAAO,uBAAuB,CAAC,CAAC;AAE7G;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,uBAAuB,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,qBAAqB,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,gBAAgB,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export const UploadItemStatus = {
|
|
6
|
+
Idle: "idle",
|
|
7
|
+
Uploading: "uploading",
|
|
8
|
+
Success: "success",
|
|
9
|
+
Error: "error",
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export const FileValidationErrorCode = {
|
|
15
|
+
InvalidFileType: "invalidFileType",
|
|
16
|
+
TooManyFiles: "tooManyFiles",
|
|
17
|
+
FileTooLarge: "fileTooLarge",
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/FileUpload/types.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC5B,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;CACR,CAAC;AAOX;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACnC,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,cAAc;IAC5B,YAAY,EAAE,cAAc;CACtB,CAAC"}
|
package/esm/index.d.ts
CHANGED
|
@@ -150,6 +150,14 @@ export { LoadingDots, type ILoadingDotsProps } from "./LoadingDots/LoadingDots.j
|
|
|
150
150
|
export { CustomizableCheckmark, type ICustomizableCheckmarkProps, } from "./CustomizableCheckmark/CustomizableCheckmark.js";
|
|
151
151
|
export { AutoSize, type IAutoSizeProps, type IAutoSizeChildren } from "./AutoSize/AutoSize.js";
|
|
152
152
|
export { type SpinnerSize, type ILoadingMaskProps, LoadingMask } from "./LoadingMask/LoadingMask.js";
|
|
153
|
+
export { FileDropzone, type IFileDropzoneHandle, type IFileDropzoneProps, } from "./FileUpload/FileDropzone/FileDropzone.js";
|
|
154
|
+
export { FilePickerButton, type IFilePickerButtonProps, } from "./FileUpload/FilePickerButton/FilePickerButton.js";
|
|
155
|
+
export { UploadFileList, type IUploadFileListProps } from "./FileUpload/UploadFileList/UploadFileList.js";
|
|
156
|
+
export { UploadStatusDialog, type IUploadStatusDialogProps, } from "./FileUpload/UploadStatusDialog/UploadStatusDialog.js";
|
|
157
|
+
export { useFileSelection, type IUseFileSelectionConfig, type IUseFileSelectionResult, } from "./FileUpload/hooks/useFileSelection.js";
|
|
158
|
+
export { useUploadQueue, type IUseUploadQueueConfig, type IUseUploadQueueResult, } from "./FileUpload/hooks/useUploadQueue.js";
|
|
159
|
+
export { validateFile } from "./FileUpload/hooks/validateFile.js";
|
|
160
|
+
export { UploadItemStatus, FileValidationErrorCode, type IFileValidationResult, type IFileValidationRules, type IFileRejection, type IUploadActionCallbacks, type IUploadFileItem, } from "./FileUpload/types.js";
|
|
153
161
|
export { type INoDataProps, NoData } from "./NoData/NoData.js";
|
|
154
162
|
export { DocumentHeader, type IDocumentHeaderProps } from "./DocumentHeader/DocumentHeader.js";
|
|
155
163
|
export { Dropdown, type IDropdownProps, type IDropdownButtonRenderProps, type IDropdownBodyRenderProps, } from "./Dropdown/Dropdown.js";
|