@canonical/maas-react-components 2.0.2 → 2.0.3
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/dist/@canonical/maas-react-components.es.js +536 -572
- package/dist/@canonical/maas-react-components.umd.js +14 -14
- package/dist/maas-react-components.css +1 -1
- package/dist/src/lib/components/FileUpload/FileUpload.d.ts +64 -8
- package/dist/src/lib/components/FileUpload/FileUpload.stories.d.ts +6 -2
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ReactNode } from 'react';
|
|
1
|
+
import { ReactElement, ReactNode } from 'react';
|
|
2
2
|
import { DropzoneOptions, FileRejection } from 'react-dropzone';
|
|
3
3
|
export type FileUploadFile = File & {
|
|
4
4
|
percentUploaded?: number;
|
|
@@ -6,15 +6,71 @@ export type FileUploadFile = File & {
|
|
|
6
6
|
export interface FileUploadProps {
|
|
7
7
|
accept?: DropzoneOptions["accept"];
|
|
8
8
|
error?: ReactNode;
|
|
9
|
-
files
|
|
9
|
+
files?: FileUploadFile[];
|
|
10
10
|
help?: string;
|
|
11
11
|
label?: string;
|
|
12
12
|
maxFiles?: number;
|
|
13
13
|
maxSize?: number;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
minSize?: number;
|
|
15
|
+
onFileUpload?: NonNullable<DropzoneOptions["onDrop"]>;
|
|
16
|
+
onRemoveFile?: (item: FileUploadFile | FileRejection) => void;
|
|
17
|
+
rejectedFiles?: FileRejection[];
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
/**
|
|
20
|
+
* FileUpload - A controllable file upload input field with internal validation
|
|
21
|
+
*
|
|
22
|
+
* A file upload input field supporting both controlled and uncontrolled modes.
|
|
23
|
+
* Can be used standalone for simple file uploads or with external state management
|
|
24
|
+
* (React state or Formik) for complex forms. Built on React Dropzone with support
|
|
25
|
+
* for file validation and upload progress tracking.
|
|
26
|
+
*
|
|
27
|
+
* @param {Object} props - Component props
|
|
28
|
+
* @param {DropzoneOptions["accept"]} [props.accept] - Allowed file types
|
|
29
|
+
* @param {ReactNode} [props.error] - Externally stored error message to display
|
|
30
|
+
* @param {FileUploadFile[]} [props.files] - Externally stored array of accepted files
|
|
31
|
+
* @param {string} [props.help] - Help text displayed below the label
|
|
32
|
+
* @param {string} [props.label] - Field label text
|
|
33
|
+
* @param {number} [props.maxFiles] - Maximum number of files allowed
|
|
34
|
+
* @param {number} [props.maxSize] - Maximum file size in bytes
|
|
35
|
+
* @param {number} [props.minSize] - Minimum file size in bytes
|
|
36
|
+
* @param {NonNullable<DropzoneOptions["onDrop"]>} [props.onFileUpload] - Callback triggered when files are dropped or selected
|
|
37
|
+
* @param {(item: FileUploadFile | FileRejection) => void} [props.onRemoveFile] - Callback triggered when a file is removed
|
|
38
|
+
* @param {FileRejection[]} [props.rejectedFiles] - Externally stored array of rejected files with error details
|
|
39
|
+
*
|
|
40
|
+
* @returns {ReactElement} - The rendered file upload field component
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* // Simple usage with React state
|
|
44
|
+
* const [files, setFiles] = useState();
|
|
45
|
+
* const [rejected, setRejected] = useState();
|
|
46
|
+
* <FileUpload
|
|
47
|
+
* accept={{"image": [".jpeg", ".png"]}}
|
|
48
|
+
* files={files}
|
|
49
|
+
* rejectedFiles={rejected}
|
|
50
|
+
* maxFiles={1}
|
|
51
|
+
* maxSize={20000}
|
|
52
|
+
* label="Profile Picture"
|
|
53
|
+
* onFileUpload={(accepted) => setFiles(accepted)}
|
|
54
|
+
* onRemoveFile={() => setFiles([])}
|
|
55
|
+
* />
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* // With Formik - simplified usage
|
|
59
|
+
* const formik = useFormik();
|
|
60
|
+
* <FileUpload
|
|
61
|
+
* accept={{"image": [".jpeg", ".png"]}}
|
|
62
|
+
* files={formik.values.file ? [formik.values.file] : []}
|
|
63
|
+
* error={formik.touched.file && formik.errors.file}
|
|
64
|
+
* maxFiles={1}
|
|
65
|
+
* maxSize={20000}
|
|
66
|
+
* label="Profile Picture"
|
|
67
|
+
* onFileUpload={(accepted) => {
|
|
68
|
+
* if (accepted.length) {
|
|
69
|
+
* formik.setFieldValue("file", accepted[0]);
|
|
70
|
+
* formik.setFieldError("file", undefined);
|
|
71
|
+
* }
|
|
72
|
+
* }}
|
|
73
|
+
* onRemoveFile={() => formik.setFieldValue("file", null)}
|
|
74
|
+
* />
|
|
75
|
+
*/
|
|
76
|
+
export declare const FileUpload: ({ accept, error, files, help, label, maxFiles, maxSize, minSize, onFileUpload, onRemoveFile, rejectedFiles, }: FileUploadProps) => ReactElement;
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { Meta } from '@storybook/react';
|
|
2
|
-
import {
|
|
3
|
-
declare const meta: Meta<typeof
|
|
2
|
+
import { FileUpload } from '.';
|
|
3
|
+
declare const meta: Meta<typeof FileUpload>;
|
|
4
4
|
export default meta;
|
|
5
5
|
export declare const Example: {
|
|
6
6
|
args: {
|
|
7
|
+
accept: {
|
|
8
|
+
"application/octet-stream": string[];
|
|
9
|
+
};
|
|
7
10
|
error: string;
|
|
8
11
|
help: string;
|
|
9
12
|
label: string;
|
|
10
13
|
maxFiles: number;
|
|
11
14
|
maxSize: number;
|
|
15
|
+
minSize: number;
|
|
12
16
|
};
|
|
13
17
|
};
|
package/package.json
CHANGED