@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.
Files changed (69) hide show
  1. package/esm/@ui/@types/icon.d.ts +1 -1
  2. package/esm/@ui/@types/icon.d.ts.map +1 -1
  3. package/esm/@ui/UiIcon/icons.d.ts.map +1 -1
  4. package/esm/@ui/UiIcon/icons.js +3 -0
  5. package/esm/@ui/UiIcon/icons.js.map +1 -1
  6. package/esm/FileUpload/FileDropzone/FileDropzone.d.ts +45 -0
  7. package/esm/FileUpload/FileDropzone/FileDropzone.d.ts.map +1 -0
  8. package/esm/FileUpload/FileDropzone/FileDropzone.js +138 -0
  9. package/esm/FileUpload/FileDropzone/FileDropzone.js.map +1 -0
  10. package/esm/FileUpload/FileDropzone/fileDropzoneBem.d.ts +2 -0
  11. package/esm/FileUpload/FileDropzone/fileDropzoneBem.d.ts.map +1 -0
  12. package/esm/FileUpload/FileDropzone/fileDropzoneBem.js +4 -0
  13. package/esm/FileUpload/FileDropzone/fileDropzoneBem.js.map +1 -0
  14. package/esm/FileUpload/FilePickerButton/FilePickerButton.d.ts +18 -0
  15. package/esm/FileUpload/FilePickerButton/FilePickerButton.d.ts.map +1 -0
  16. package/esm/FileUpload/FilePickerButton/FilePickerButton.js +21 -0
  17. package/esm/FileUpload/FilePickerButton/FilePickerButton.js.map +1 -0
  18. package/esm/FileUpload/UploadFileList/UploadFileList.d.ts +14 -0
  19. package/esm/FileUpload/UploadFileList/UploadFileList.d.ts.map +1 -0
  20. package/esm/FileUpload/UploadFileList/UploadFileList.js +55 -0
  21. package/esm/FileUpload/UploadFileList/UploadFileList.js.map +1 -0
  22. package/esm/FileUpload/UploadFileList/uploadFileListBem.d.ts +2 -0
  23. package/esm/FileUpload/UploadFileList/uploadFileListBem.d.ts.map +1 -0
  24. package/esm/FileUpload/UploadFileList/uploadFileListBem.js +4 -0
  25. package/esm/FileUpload/UploadFileList/uploadFileListBem.js.map +1 -0
  26. package/esm/FileUpload/UploadStatusDialog/UploadStatusDialog.d.ts +17 -0
  27. package/esm/FileUpload/UploadStatusDialog/UploadStatusDialog.d.ts.map +1 -0
  28. package/esm/FileUpload/UploadStatusDialog/UploadStatusDialog.js +27 -0
  29. package/esm/FileUpload/UploadStatusDialog/UploadStatusDialog.js.map +1 -0
  30. package/esm/FileUpload/UploadStatusDialog/uploadStatusDialogBem.d.ts +2 -0
  31. package/esm/FileUpload/UploadStatusDialog/uploadStatusDialogBem.d.ts.map +1 -0
  32. package/esm/FileUpload/UploadStatusDialog/uploadStatusDialogBem.js +4 -0
  33. package/esm/FileUpload/UploadStatusDialog/uploadStatusDialogBem.js.map +1 -0
  34. package/esm/FileUpload/hooks/useFileInput.d.ts +9 -0
  35. package/esm/FileUpload/hooks/useFileInput.d.ts.map +1 -0
  36. package/esm/FileUpload/hooks/useFileInput.js +17 -0
  37. package/esm/FileUpload/hooks/useFileInput.js.map +1 -0
  38. package/esm/FileUpload/hooks/useFileSelection.d.ts +28 -0
  39. package/esm/FileUpload/hooks/useFileSelection.d.ts.map +1 -0
  40. package/esm/FileUpload/hooks/useFileSelection.js +65 -0
  41. package/esm/FileUpload/hooks/useFileSelection.js.map +1 -0
  42. package/esm/FileUpload/hooks/useUploadQueue.d.ts +29 -0
  43. package/esm/FileUpload/hooks/useUploadQueue.d.ts.map +1 -0
  44. package/esm/FileUpload/hooks/useUploadQueue.js +98 -0
  45. package/esm/FileUpload/hooks/useUploadQueue.js.map +1 -0
  46. package/esm/FileUpload/hooks/validateFile.d.ts +6 -0
  47. package/esm/FileUpload/hooks/validateFile.d.ts.map +1 -0
  48. package/esm/FileUpload/hooks/validateFile.js +47 -0
  49. package/esm/FileUpload/hooks/validateFile.js.map +1 -0
  50. package/esm/FileUpload/parseAcceptedTypes.d.ts +13 -0
  51. package/esm/FileUpload/parseAcceptedTypes.d.ts.map +1 -0
  52. package/esm/FileUpload/parseAcceptedTypes.js +26 -0
  53. package/esm/FileUpload/parseAcceptedTypes.js.map +1 -0
  54. package/esm/FileUpload/types.d.ts +67 -0
  55. package/esm/FileUpload/types.d.ts.map +1 -0
  56. package/esm/FileUpload/types.js +19 -0
  57. package/esm/FileUpload/types.js.map +1 -0
  58. package/esm/index.d.ts +8 -0
  59. package/esm/index.d.ts.map +1 -1
  60. package/esm/index.js +8 -0
  61. package/esm/index.js.map +1 -1
  62. package/esm/sdk-ui-kit.d.ts +231 -1
  63. package/package.json +11 -11
  64. package/src/FileUpload/FileDropzone/FileDropzone.scss +57 -0
  65. package/src/FileUpload/UploadFileList/UploadFileList.scss +54 -0
  66. package/src/FileUpload/UploadStatusDialog/UploadStatusDialog.scss +61 -0
  67. package/styles/css/main.css +146 -0
  68. package/styles/css/main.css.map +1 -1
  69. package/styles/scss/main.scss +3 -0
@@ -0,0 +1,4 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { bemFactory } from "../../@ui/@utils/bem.js";
3
+ export const { b, e } = bemFactory("gd-upload-status-dialog");
4
+ //# sourceMappingURL=uploadStatusDialogBem.js.map
@@ -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":"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"}
@@ -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,6 @@
1
+ import { type IFileValidationResult, type IFileValidationRules } from "../types.js";
2
+ /**
3
+ * @internal
4
+ */
5
+ export declare function validateFile(file: File, rules?: IFileValidationRules): IFileValidationResult;
6
+ //# sourceMappingURL=validateFile.d.ts.map
@@ -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";