@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.
@@ -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: FileUploadFile[];
9
+ files?: FileUploadFile[];
10
10
  help?: string;
11
11
  label?: string;
12
12
  maxFiles?: number;
13
13
  maxSize?: number;
14
- onFileUpload: NonNullable<DropzoneOptions["onDrop"]>;
15
- rejectedFiles: FileRejection[];
16
- removeFile: (file: FileUploadFile) => void;
17
- removeRejectedFile: (fileRejection: FileRejection) => void;
14
+ minSize?: number;
15
+ onFileUpload?: NonNullable<DropzoneOptions["onDrop"]>;
16
+ onRemoveFile?: (item: FileUploadFile | FileRejection) => void;
17
+ rejectedFiles?: FileRejection[];
18
18
  }
19
- export declare const FileUpload: React.FC<FileUploadProps>;
20
- export declare const FileUploadContainer: ({ accept, error, help, label, maxFiles, maxSize, }: Pick<FileUploadProps, "accept" | "error" | "help" | "label" | "maxFiles" | "maxSize">) => import("react/jsx-runtime").JSX.Element;
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 { FileUploadContainer } from '.';
3
- declare const meta: Meta<typeof FileUploadContainer>;
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@canonical/maas-react-components",
3
3
  "description": "React components for use in MAAS UI projects.",
4
- "version": "2.0.2",
4
+ "version": "2.0.3",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/canonical/maas-react-components.git"