@patternfly/react-core 4.198.16 → 4.198.17

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 (64) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.d.ts +10 -2
  3. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.d.ts.map +1 -1
  4. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.js +9 -2
  5. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.js.map +1 -1
  6. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts +1 -1
  7. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts.map +1 -1
  8. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.js +21 -2
  9. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.js.map +1 -1
  10. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatusItem.js.map +1 -1
  11. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts +6 -2
  12. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts.map +1 -1
  13. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.js +9 -2
  14. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.js.map +1 -1
  15. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts +2 -0
  16. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts.map +1 -1
  17. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js +2 -4
  18. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js.map +1 -1
  19. package/dist/esm/components/MultipleFileUpload/index.d.ts +0 -6
  20. package/dist/esm/components/MultipleFileUpload/index.d.ts.map +1 -1
  21. package/dist/esm/components/MultipleFileUpload/index.js +0 -6
  22. package/dist/esm/components/MultipleFileUpload/index.js.map +1 -1
  23. package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.d.ts +10 -2
  24. package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.d.ts.map +1 -1
  25. package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.js +9 -2
  26. package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.js.map +1 -1
  27. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts +1 -1
  28. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts.map +1 -1
  29. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.js +21 -2
  30. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.js.map +1 -1
  31. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatusItem.js.map +1 -1
  32. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts +6 -2
  33. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts.map +1 -1
  34. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.js +9 -2
  35. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.js.map +1 -1
  36. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts +2 -0
  37. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts.map +1 -1
  38. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js +2 -4
  39. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js.map +1 -1
  40. package/dist/js/components/MultipleFileUpload/index.d.ts +0 -6
  41. package/dist/js/components/MultipleFileUpload/index.d.ts.map +1 -1
  42. package/dist/js/components/MultipleFileUpload/index.js +0 -6
  43. package/dist/js/components/MultipleFileUpload/index.js.map +1 -1
  44. package/dist/umd/react-core.css +10 -10
  45. package/dist/umd/react-core.js +59 -42
  46. package/dist/umd/react-core.min.css +82 -82
  47. package/dist/umd/react-core.min.js +4 -4
  48. package/package.json +5 -5
  49. package/src/components/MultipleFileUpload/MultipleFileUploadMain.tsx +29 -8
  50. package/src/components/MultipleFileUpload/MultipleFileUploadStatus.tsx +24 -4
  51. package/src/components/MultipleFileUpload/MultipleFileUploadStatusItem.tsx +1 -1
  52. package/src/components/MultipleFileUpload/MultipleFileUploadTitle.tsx +19 -5
  53. package/src/components/MultipleFileUpload/MultipleFileUploadTitleIcon.tsx +4 -3
  54. package/src/components/MultipleFileUpload/__tests__/MultipleFileUploadMain.test.tsx +19 -2
  55. package/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitle.test.tsx +17 -2
  56. package/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleIcon.test.tsx +1 -1
  57. package/src/components/MultipleFileUpload/__tests__/__snapshots__/MultipleFileUploadMain.test.tsx.snap +198 -2
  58. package/src/components/MultipleFileUpload/__tests__/__snapshots__/MultipleFileUploadTitle.test.tsx.snap +62 -4
  59. package/src/components/MultipleFileUpload/__tests__/__snapshots__/MultipleFileUploadTitleIcon.test.tsx.snap +2 -50
  60. package/src/components/MultipleFileUpload/examples/MultipleFileUpload.md +7 -60
  61. package/src/components/MultipleFileUpload/examples/MultipleFileUploadBasic.tsx +48 -74
  62. package/src/components/MultipleFileUpload/index.ts +0 -6
  63. package/src/demos/MultipleFileUploadDemos.md +16 -0
  64. package/src/{components/MultipleFileUpload/examples/MultipleFileUploadHorizontal.tsx → demos/examples/MultipleFileUpload/MultipleFileUploadRejectedFile.tsx} +60 -64
@@ -6,70 +6,22 @@ propComponents:
6
6
  [
7
7
  'MultipleFileUpload',
8
8
  'MultipleFileUploadMain',
9
- 'MultipleFileUploadTitle',
10
- 'MultipleFileUploadTitleIcon',
11
- 'MultipleFileUploadTitleText',
12
- 'MultipleFileUploadTitleTextSeparator',
13
- 'MultipleFileUploadButton',
14
- 'MultipleFileUploadInfo',
15
9
  'MultipleFileUploadStatus',
16
10
  'MultipleFileUploadStatusItem',
17
11
  ]
18
12
  beta: true
19
13
  ---
20
14
 
21
- import InProgressIcon from '@patternfly/react-icons/dist/esm/icons/in-progress-icon';
22
- import CheckCircleIcon from '@patternfly/react-icons/dist/esm/icons/check-circle-icon';
23
- import TimesCircleIcon from '@patternfly/react-icons/dist/esm/icons/times-circle-icon';
15
+ import UploadIcon from '@patternfly/react-icons/dist/esm/icons/upload-icon';
24
16
 
25
17
  File upload - multiple is able to:
26
18
 
27
- - accept one or more files via browse or drag-and-drop
28
- - provide their data to you using file objects via the `onFileDrop` callback prop
29
- - read files as dataURLs, calling provided callbacks as needed when files start/finish being read, as well as when the read succeeds or fails
30
- - display (in real time) the upload progress/status of each file
31
- - uploaded files are represented by the `MultipleFileUploadStatusItem` component, this component includes the aforementioned built-in file reading logic
32
- - if you prefer to supply your own file reading logic and strictly use `MultipleFileUploadStatusItem` as a display component, the `customFileHandler`, `fileName`, `fileSize`, `progressValue`, and `progressVariant` props exist to allow you to do that
33
-
34
- ### General intended structure
35
-
36
- File upload - multiple is designed in a composable manner to maximize flexibility. The general intended component relationships are arranged similarly to:
37
-
38
- ```js noLive
39
- import {
40
- MultipleFileUpload,
41
- MultipleFileUploadInfo,
42
- MultipleFileUploadMain,
43
- MultipleFileUploadTitle,
44
- MultipleFileUploadTitleIcon,
45
- MultipleFileUploadTitleText,
46
- MultipleFileUploadTitleTextSeparator,
47
- MultipleFileUploadButton,
48
- MultipleFileUploadStatus,
49
- MultipleFileUploadStatusItem
50
- } from '@patternfly/react-core';
51
-
52
- <MultipleFileUpload>
53
- <MultipleFileUploadMain>
54
- <MultipleFileUploadTitle>
55
- <MultipleFileUploadTitleIcon />
56
-
57
- <MultipleFileUploadTitleText>
58
- main title text
59
- <MultipleFileUploadTitleTextSeparator>title text separator</MultipleFileUploadTitleTextSeparator>
60
- </MultipleFileUploadTitleText>
61
- </MultipleFileUploadTitle>
62
-
63
- <MultipleFileUploadButton />
64
-
65
- <MultipleFileUploadInfo>Accepted file types: x, y, z</MultipleFileUploadInfo>
66
- </MultipleFileUploadMain>
67
-
68
- <MultipleFileUploadStatus>
69
- <MultipleFileUploadStatusItem />
70
- </MultipleFileUploadStatus>
71
- </MultipleFileUpload>
72
- ```
19
+ - Accept one or more files via browse or drag-and-drop
20
+ - Provide their data to you using file objects via the `onFileDrop` callback prop
21
+ - Read files as dataURLs, calling provided callbacks as needed when files start/finish being read, as well as when the read succeeds or fails
22
+ - Display (in real time) the upload progress/status of each file
23
+ - Uploaded files are represented by the multiple file upload status item component, this component includes the aforementioned built-in file reading logic
24
+ - If you prefer to supply your own file reading logic and strictly use multiple file upload status item as a display component, the `customFileHandler`, `fileName`, `fileSize`, `progressValue`, and `progressVariant` props exist to allow you to do that
73
25
 
74
26
  ### Restricting file size and type
75
27
 
@@ -85,8 +37,3 @@ Restricting file sizes and types in this way is for user convenience only, and i
85
37
 
86
38
  ```ts file="./MultipleFileUploadBasic.tsx"
87
39
  ```
88
-
89
- ### Horizontal
90
-
91
- ```ts file="./MultipleFileUploadHorizontal.tsx"
92
- ```
@@ -1,20 +1,12 @@
1
1
  import React from 'react';
2
2
  import {
3
3
  MultipleFileUpload,
4
- MultipleFileUploadInfo,
5
4
  MultipleFileUploadMain,
6
- MultipleFileUploadTitle,
7
- MultipleFileUploadTitleIcon,
8
- MultipleFileUploadTitleText,
9
- MultipleFileUploadTitleTextSeparator,
10
- MultipleFileUploadButton,
11
5
  MultipleFileUploadStatus,
12
6
  MultipleFileUploadStatusItem,
13
- Modal
7
+ Checkbox
14
8
  } from '@patternfly/react-core';
15
- import InProgressIcon from '@patternfly/react-icons/dist/esm/icons/in-progress-icon';
16
- import CheckCircleIcon from '@patternfly/react-icons/dist/esm/icons/check-circle-icon';
17
- import TimesCircleIcon from '@patternfly/react-icons/dist/esm/icons/times-circle-icon';
9
+ import UploadIcon from '@patternfly/react-icons/dist/esm/icons/upload-icon';
18
10
 
19
11
  interface readFile {
20
12
  fileName: string;
@@ -24,10 +16,11 @@ interface readFile {
24
16
  }
25
17
 
26
18
  export const MultipleFileUploadBasic: React.FunctionComponent = () => {
19
+ const [isHorizontal, setIsHorizontal] = React.useState(false);
27
20
  const [currentFiles, setCurrentFiles] = React.useState<File[]>([]);
28
21
  const [readFileData, setReadFileData] = React.useState<readFile[]>([]);
29
22
  const [showStatus, setShowStatus] = React.useState(false);
30
- const [modalText, setModalText] = React.useState('');
23
+ const [statusIcon, setStatusIcon] = React.useState('inProgress');
31
24
 
32
25
  // only show the status component once a file has been uploaded, but keep the status list component itself even if all files are removed
33
26
  if (!showStatus && currentFiles.length > 0) {
@@ -35,17 +28,15 @@ export const MultipleFileUploadBasic: React.FunctionComponent = () => {
35
28
  }
36
29
 
37
30
  // determine the icon that should be shown for the overall status list
38
- const getStatusIcon = () => {
31
+ React.useEffect(() => {
39
32
  if (readFileData.length < currentFiles.length) {
40
- return <InProgressIcon />;
41
- }
42
-
43
- if (readFileData.every(file => file.loadResult === 'success')) {
44
- return <CheckCircleIcon />;
33
+ setStatusIcon('inProgress');
34
+ } else if (readFileData.every(file => file.loadResult === 'success')) {
35
+ setStatusIcon('success');
36
+ } else {
37
+ setStatusIcon('danger');
45
38
  }
46
-
47
- return <TimesCircleIcon />;
48
- };
39
+ }, [readFileData, currentFiles]);
49
40
 
50
41
  // remove files from both state arrays based on their name
51
42
  const removeFiles = (namesOfFilesToRemove: string[]) => {
@@ -88,63 +79,46 @@ export const MultipleFileUploadBasic: React.FunctionComponent = () => {
88
79
  ]);
89
80
  };
90
81
 
91
- // dropzone prop that communicates to the user that files they've attempted to upload are not an appropriate type
92
- const handleDropRejected = (files: File[], _event: React.DragEvent<HTMLElement>) => {
93
- if (files.length === 1) {
94
- setModalText(`${files[0].name} is not an accepted file type`);
95
- } else {
96
- const rejectedMessages = files.reduce((acc, file) => (acc += `${file.name}, `), '');
97
- setModalText(`${rejectedMessages}are not accepted file types`);
98
- }
99
- };
100
-
101
82
  const successfullyReadFileCount = readFileData.filter(fileData => fileData.loadResult === 'success').length;
102
83
 
103
84
  return (
104
- <MultipleFileUpload
105
- onFileDrop={handleFileDrop}
106
- dropzoneProps={{
107
- accept: 'image/jpeg, application/msword, application/pdf, image/png',
108
- onDropRejected: handleDropRejected
109
- }}
110
- >
111
- <MultipleFileUploadMain>
112
- <MultipleFileUploadTitle>
113
- <MultipleFileUploadTitleIcon />
114
- <MultipleFileUploadTitleText>
115
- Drag and drop files here
116
- <MultipleFileUploadTitleTextSeparator>or</MultipleFileUploadTitleTextSeparator>
117
- </MultipleFileUploadTitleText>
118
- </MultipleFileUploadTitle>
119
- <MultipleFileUploadButton />
120
- <MultipleFileUploadInfo>Accepted file types: JPEG, Doc, PDF, PNG</MultipleFileUploadInfo>
121
- </MultipleFileUploadMain>
122
- {showStatus && (
123
- <MultipleFileUploadStatus
124
- statusToggleText={`${successfullyReadFileCount} of ${currentFiles.length} files uploaded`}
125
- statusToggleIcon={getStatusIcon()}
126
- >
127
- {currentFiles.map(file => (
128
- <MultipleFileUploadStatusItem
129
- file={file}
130
- key={file.name}
131
- onClearClick={() => removeFiles([file.name])}
132
- onReadSuccess={handleReadSuccess}
133
- onReadFail={handleReadFail}
134
- />
135
- ))}
136
- </MultipleFileUploadStatus>
137
- )}
138
- <Modal
139
- isOpen={!!modalText}
140
- title="Unsupported file"
141
- titleIconVariant="warning"
142
- showClose
143
- aria-label="unsupported file upload attempted"
144
- onClose={() => setModalText('')}
85
+ <>
86
+ <MultipleFileUpload
87
+ onFileDrop={handleFileDrop}
88
+ dropzoneProps={{
89
+ accept: 'image/jpeg, application/msword, application/pdf, image/png'
90
+ }}
91
+ isHorizontal={isHorizontal}
145
92
  >
146
- {modalText}
147
- </Modal>
148
- </MultipleFileUpload>
93
+ <MultipleFileUploadMain
94
+ titleIcon={<UploadIcon />}
95
+ titleText="Drag and drop files here"
96
+ titleTextSeparator="or"
97
+ infoText="Accepted file types: JPEG, Doc, PDF, PNG"
98
+ />
99
+ {showStatus && (
100
+ <MultipleFileUploadStatus
101
+ statusToggleText={`${successfullyReadFileCount} of ${currentFiles.length} files uploaded`}
102
+ statusToggleIcon={statusIcon}
103
+ >
104
+ {currentFiles.map(file => (
105
+ <MultipleFileUploadStatusItem
106
+ file={file}
107
+ key={file.name}
108
+ onClearClick={() => removeFiles([file.name])}
109
+ onReadSuccess={handleReadSuccess}
110
+ onReadFail={handleReadFail}
111
+ />
112
+ ))}
113
+ </MultipleFileUploadStatus>
114
+ )}
115
+ </MultipleFileUpload>
116
+ <Checkbox
117
+ id="horizontal-checkbox"
118
+ label="Show as horizontal"
119
+ isChecked={isHorizontal}
120
+ onChange={() => setIsHorizontal(!isHorizontal)}
121
+ />
122
+ </>
149
123
  );
150
124
  };
@@ -1,10 +1,4 @@
1
1
  export * from './MultipleFileUpload';
2
- export * from './MultipleFileUploadInfo';
3
2
  export * from './MultipleFileUploadMain';
4
- export * from './MultipleFileUploadTitle';
5
- export * from './MultipleFileUploadTitleIcon';
6
- export * from './MultipleFileUploadTitleText';
7
- export * from './MultipleFileUploadTitleTextSeparator';
8
- export * from './MultipleFileUploadButton';
9
3
  export * from './MultipleFileUploadStatus';
10
4
  export * from './MultipleFileUploadStatusItem';
@@ -0,0 +1,16 @@
1
+ ---
2
+ id: File upload - multiple
3
+ section: components
4
+ beta: true
5
+ ---
6
+
7
+ import UploadIcon from '@patternfly/react-icons/dist/esm/icons/upload-icon';
8
+
9
+ ## Demos
10
+
11
+ ### Rejected file handling
12
+
13
+ This demo shows how to add a modal to alert users that the file(s) they attempted to drop was of a non-acceptable type.
14
+
15
+ ```ts file="./examples/MultipleFileUpload/MultipleFileUploadRejectedFile.tsx"
16
+ ```
@@ -1,20 +1,13 @@
1
1
  import React from 'react';
2
2
  import {
3
3
  MultipleFileUpload,
4
- MultipleFileUploadInfo,
5
4
  MultipleFileUploadMain,
6
- MultipleFileUploadTitle,
7
- MultipleFileUploadTitleIcon,
8
- MultipleFileUploadTitleText,
9
- MultipleFileUploadTitleTextSeparator,
10
- MultipleFileUploadButton,
11
5
  MultipleFileUploadStatus,
12
6
  MultipleFileUploadStatusItem,
13
- Modal
7
+ Modal,
8
+ Checkbox
14
9
  } from '@patternfly/react-core';
15
- import InProgressIcon from '@patternfly/react-icons/dist/esm/icons/in-progress-icon';
16
- import CheckCircleIcon from '@patternfly/react-icons/dist/esm/icons/check-circle-icon';
17
- import TimesCircleIcon from '@patternfly/react-icons/dist/esm/icons/times-circle-icon';
10
+ import UploadIcon from '@patternfly/react-icons/dist/esm/icons/upload-icon';
18
11
 
19
12
  interface readFile {
20
13
  fileName: string;
@@ -24,9 +17,11 @@ interface readFile {
24
17
  }
25
18
 
26
19
  export const MultipleFileUploadBasic: React.FunctionComponent = () => {
20
+ const [isHorizontal, setIsHorizontal] = React.useState(false);
27
21
  const [currentFiles, setCurrentFiles] = React.useState<File[]>([]);
28
22
  const [readFileData, setReadFileData] = React.useState<readFile[]>([]);
29
23
  const [showStatus, setShowStatus] = React.useState(false);
24
+ const [statusIcon, setStatusIcon] = React.useState('inProgress');
30
25
  const [modalText, setModalText] = React.useState('');
31
26
 
32
27
  // only show the status component once a file has been uploaded, but keep the status list component itself even if all files are removed
@@ -35,17 +30,15 @@ export const MultipleFileUploadBasic: React.FunctionComponent = () => {
35
30
  }
36
31
 
37
32
  // determine the icon that should be shown for the overall status list
38
- const getStatusIcon = () => {
33
+ React.useEffect(() => {
39
34
  if (readFileData.length < currentFiles.length) {
40
- return <InProgressIcon />;
41
- }
42
-
43
- if (readFileData.every(file => file.loadResult === 'success')) {
44
- return <CheckCircleIcon />;
35
+ setStatusIcon('inProgress');
36
+ } else if (readFileData.every(file => file.loadResult === 'success')) {
37
+ setStatusIcon('success');
38
+ } else {
39
+ setStatusIcon('danger');
45
40
  }
46
-
47
- return <TimesCircleIcon />;
48
- };
41
+ }, [readFileData, currentFiles]);
49
42
 
50
43
  // remove files from both state arrays based on their name
51
44
  const removeFiles = (namesOfFilesToRemove: string[]) => {
@@ -101,51 +94,54 @@ export const MultipleFileUploadBasic: React.FunctionComponent = () => {
101
94
  const successfullyReadFileCount = readFileData.filter(fileData => fileData.loadResult === 'success').length;
102
95
 
103
96
  return (
104
- <MultipleFileUpload
105
- onFileDrop={handleFileDrop}
106
- dropzoneProps={{
107
- accept: 'image/jpeg, application/msword, application/pdf, image/png',
108
- onDropRejected: handleDropRejected
109
- }}
110
- isHorizontal
111
- >
112
- <MultipleFileUploadMain>
113
- <MultipleFileUploadTitle>
114
- <MultipleFileUploadTitleIcon />
115
- <MultipleFileUploadTitleText>
116
- Drag and drop files here
117
- <MultipleFileUploadTitleTextSeparator>or</MultipleFileUploadTitleTextSeparator>
118
- </MultipleFileUploadTitleText>
119
- </MultipleFileUploadTitle>
120
- <MultipleFileUploadButton />
121
- <MultipleFileUploadInfo>Accepted file types: JPEG, Doc, PDF, PNG</MultipleFileUploadInfo>
122
- </MultipleFileUploadMain>
123
- {showStatus && (
124
- <MultipleFileUploadStatus
125
- statusToggleText={`${successfullyReadFileCount} of ${currentFiles.length} files uploaded`}
126
- statusToggleIcon={getStatusIcon()}
127
- >
128
- {currentFiles.map(file => (
129
- <MultipleFileUploadStatusItem
130
- file={file}
131
- key={file.name}
132
- onClearClick={() => removeFiles([file.name])}
133
- onReadSuccess={handleReadSuccess}
134
- onReadFail={handleReadFail}
135
- />
136
- ))}
137
- </MultipleFileUploadStatus>
138
- )}
139
- <Modal
140
- isOpen={!!modalText}
141
- title="Unsupported file"
142
- titleIconVariant="warning"
143
- showClose
144
- aria-label="unsupported file upload attempted"
145
- onClose={() => setModalText('')}
97
+ <>
98
+ <MultipleFileUpload
99
+ onFileDrop={handleFileDrop}
100
+ dropzoneProps={{
101
+ accept: 'image/jpeg, application/msword, application/pdf, image/png',
102
+ onDropRejected: handleDropRejected
103
+ }}
104
+ isHorizontal={isHorizontal}
146
105
  >
147
- {modalText}
148
- </Modal>
149
- </MultipleFileUpload>
106
+ <MultipleFileUploadMain
107
+ titleIcon={<UploadIcon />}
108
+ titleText="Drag and drop files here"
109
+ titleTextSeparator="or"
110
+ infoText="Accepted file types: JPEG, Doc, PDF, PNG"
111
+ />
112
+ {showStatus && (
113
+ <MultipleFileUploadStatus
114
+ statusToggleText={`${successfullyReadFileCount} of ${currentFiles.length} files uploaded`}
115
+ statusToggleIcon={statusIcon}
116
+ >
117
+ {currentFiles.map(file => (
118
+ <MultipleFileUploadStatusItem
119
+ file={file}
120
+ key={file.name}
121
+ onClearClick={() => removeFiles([file.name])}
122
+ onReadSuccess={handleReadSuccess}
123
+ onReadFail={handleReadFail}
124
+ />
125
+ ))}
126
+ </MultipleFileUploadStatus>
127
+ )}
128
+ <Modal
129
+ isOpen={!!modalText}
130
+ title="Unsupported file"
131
+ titleIconVariant="warning"
132
+ showClose
133
+ aria-label="unsupported file upload attempted"
134
+ onClose={() => setModalText('')}
135
+ >
136
+ {modalText}
137
+ </Modal>
138
+ </MultipleFileUpload>
139
+ <Checkbox
140
+ id="horizontal-checkbox"
141
+ label="Show as horizontal"
142
+ isChecked={isHorizontal}
143
+ onChange={() => setIsHorizontal(!isHorizontal)}
144
+ />
145
+ </>
150
146
  );
151
147
  };