@patternfly/react-docs 7.6.0-prerelease.6 → 7.6.0-prerelease.8

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 (163) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/package.json +12 -13
  3. package/patternfly-docs/generated/components/about-modal/react.js +149 -0
  4. package/patternfly-docs/generated/components/accordion/react.js +262 -0
  5. package/patternfly-docs/generated/components/action-list/react.js +144 -0
  6. package/patternfly-docs/generated/components/alert/react-demos.js +56 -0
  7. package/patternfly-docs/generated/components/alert/react.js +1433 -0
  8. package/patternfly-docs/generated/components/avatar/react.js +166 -0
  9. package/patternfly-docs/generated/components/back-to-top/react-demos.js +60 -0
  10. package/patternfly-docs/generated/components/back-to-top/react.js +77 -0
  11. package/patternfly-docs/generated/components/backdrop/react.js +64 -0
  12. package/patternfly-docs/generated/components/background-image/react.js +62 -0
  13. package/patternfly-docs/generated/components/badge/react.js +97 -0
  14. package/patternfly-docs/generated/components/banner/react-demos.js +57 -0
  15. package/patternfly-docs/generated/components/banner/react.js +148 -0
  16. package/patternfly-docs/generated/components/brand/react.js +142 -0
  17. package/patternfly-docs/generated/components/breadcrumb/react.js +206 -0
  18. package/patternfly-docs/generated/components/button/react-demos.js +57 -0
  19. package/patternfly-docs/generated/components/button/react.js +826 -0
  20. package/patternfly-docs/generated/components/card/react-demos.js +201 -0
  21. package/patternfly-docs/generated/components/card/react.js +1015 -0
  22. package/patternfly-docs/generated/components/charts/area-chart/-Victory.js +1350 -0
  23. package/patternfly-docs/generated/components/charts/bar-chart/-Victory.js +1334 -0
  24. package/patternfly-docs/generated/components/charts/box-plot-chart/-Victory.js +1282 -0
  25. package/patternfly-docs/generated/components/charts/bullet-chart/-Victory.js +848 -0
  26. package/patternfly-docs/generated/components/charts/colors-for-charts/-Victory.js +192 -0
  27. package/patternfly-docs/generated/components/charts/donut-chart/-Victory.js +426 -0
  28. package/patternfly-docs/generated/components/charts/donut-utilization-chart/-Victory.js +804 -0
  29. package/patternfly-docs/generated/components/charts/legends/-Victory.js +3230 -0
  30. package/patternfly-docs/generated/components/charts/line-chart/-Victory.js +1178 -0
  31. package/patternfly-docs/generated/components/charts/line-chart/ECharts.js +525 -0
  32. package/patternfly-docs/generated/components/charts/patterns/-Victory.js +3382 -0
  33. package/patternfly-docs/generated/components/charts/pie-chart/-Victory.js +377 -0
  34. package/patternfly-docs/generated/components/charts/resize-observer/-Victory.js +2475 -0
  35. package/patternfly-docs/generated/components/charts/sankey-chart/ECharts.js +538 -0
  36. package/patternfly-docs/generated/components/charts/scatter-chart/-Victory.js +1551 -0
  37. package/patternfly-docs/generated/components/charts/skeletons/-Victory.js +4115 -0
  38. package/patternfly-docs/generated/components/charts/sparkline-chart/-Victory.js +955 -0
  39. package/patternfly-docs/generated/components/charts/stack-chart/-Victory.js +1173 -0
  40. package/patternfly-docs/generated/components/charts/threshold-chart/-Victory.js +1166 -0
  41. package/patternfly-docs/generated/components/charts/tooltips/-Victory.js +413 -0
  42. package/patternfly-docs/generated/components/chip/react-deprecated.js +323 -0
  43. package/patternfly-docs/generated/components/clipboard-copy/react.js +373 -0
  44. package/patternfly-docs/generated/components/code-block/react.js +148 -0
  45. package/patternfly-docs/generated/components/code-editor/react.js +659 -0
  46. package/patternfly-docs/generated/components/compass/react-demos.js +147 -0
  47. package/patternfly-docs/generated/components/compass/react.js +440 -0
  48. package/patternfly-docs/generated/components/content/react.js +248 -0
  49. package/patternfly-docs/generated/components/data-list/react-demos.js +90 -0
  50. package/patternfly-docs/generated/components/data-list/react.js +709 -0
  51. package/patternfly-docs/generated/components/date-and-time/calendar-month/react.js +283 -0
  52. package/patternfly-docs/generated/components/date-and-time/date-and-time-picker/react-demos.js +64 -0
  53. package/patternfly-docs/generated/components/date-and-time/date-picker/react-demos.js +83 -0
  54. package/patternfly-docs/generated/components/date-and-time/date-picker/react.js +395 -0
  55. package/patternfly-docs/generated/components/date-and-time/time-picker/react.js +241 -0
  56. package/patternfly-docs/generated/components/description-list/react-demos.js +58 -0
  57. package/patternfly-docs/generated/components/description-list/react.js +743 -0
  58. package/patternfly-docs/generated/components/divider/react.js +126 -0
  59. package/patternfly-docs/generated/components/drag-and-drop/react-demos.js +351 -0
  60. package/patternfly-docs/generated/components/drag-and-drop/react-deprecated.js +184 -0
  61. package/patternfly-docs/generated/components/drag-and-drop/react.js +137 -0
  62. package/patternfly-docs/generated/components/drawer/react.js +598 -0
  63. package/patternfly-docs/generated/components/dual-list-selector/react-deprecated.js +772 -0
  64. package/patternfly-docs/generated/components/dual-list-selector/react.js +594 -0
  65. package/patternfly-docs/generated/components/empty-state/react.js +199 -0
  66. package/patternfly-docs/generated/components/expandable-section/react-demos.js +65 -0
  67. package/patternfly-docs/generated/components/expandable-section/react.js +408 -0
  68. package/patternfly-docs/generated/components/file-upload/multiple-file-upload/react-demos.js +52 -0
  69. package/patternfly-docs/generated/components/file-upload/multiple-file-upload/react.js +398 -0
  70. package/patternfly-docs/generated/components/file-upload/simple-file-upload/react.js +749 -0
  71. package/patternfly-docs/generated/components/forms/checkbox/react.js +222 -0
  72. package/patternfly-docs/generated/components/forms/form/react.js +1106 -0
  73. package/patternfly-docs/generated/components/forms/form-select/react.js +208 -0
  74. package/patternfly-docs/generated/components/forms/radio/react.js +212 -0
  75. package/patternfly-docs/generated/components/forms/text-area/react.js +160 -0
  76. package/patternfly-docs/generated/components/forms/text-input/react.js +216 -0
  77. package/patternfly-docs/generated/components/helper-text/react-demos.js +180 -0
  78. package/patternfly-docs/generated/components/helper-text/react.js +164 -0
  79. package/patternfly-docs/generated/components/hero/react.js +88 -0
  80. package/patternfly-docs/generated/components/hint/react.js +169 -0
  81. package/patternfly-docs/generated/components/icon/react.js +215 -0
  82. package/patternfly-docs/generated/components/input-group/react.js +182 -0
  83. package/patternfly-docs/generated/components/jump-links/react-demos.js +154 -0
  84. package/patternfly-docs/generated/components/jump-links/react.js +212 -0
  85. package/patternfly-docs/generated/components/label/react-demos.js +57 -0
  86. package/patternfly-docs/generated/components/label/react.js +417 -0
  87. package/patternfly-docs/generated/components/list/react.js +175 -0
  88. package/patternfly-docs/generated/components/login-page/react.js +587 -0
  89. package/patternfly-docs/generated/components/masthead/react-demos.js +79 -0
  90. package/patternfly-docs/generated/components/masthead/react.js +291 -0
  91. package/patternfly-docs/generated/components/menus/application-launcher/react-demos.js +769 -0
  92. package/patternfly-docs/generated/components/menus/context-selector/react-demos.js +665 -0
  93. package/patternfly-docs/generated/components/menus/custom-menus/react-demos.js +187 -0
  94. package/patternfly-docs/generated/components/menus/dropdown/react-templates.js +163 -0
  95. package/patternfly-docs/generated/components/menus/dropdown/react.js +998 -0
  96. package/patternfly-docs/generated/components/menus/menu/react.js +1540 -0
  97. package/patternfly-docs/generated/components/menus/menu-toggle/react.js +747 -0
  98. package/patternfly-docs/generated/components/menus/options-menu/react-demos.js +508 -0
  99. package/patternfly-docs/generated/components/menus/select/react-templates.js +257 -0
  100. package/patternfly-docs/generated/components/menus/select/react.js +998 -0
  101. package/patternfly-docs/generated/components/modal/react-deprecated.js +554 -0
  102. package/patternfly-docs/generated/components/modal/react.js +597 -0
  103. package/patternfly-docs/generated/components/navigation/react-demos.js +356 -0
  104. package/patternfly-docs/generated/components/navigation/react.js +409 -0
  105. package/patternfly-docs/generated/components/notification-badge/react.js +196 -0
  106. package/patternfly-docs/generated/components/notification-drawer/react-demos.js +107 -0
  107. package/patternfly-docs/generated/components/notification-drawer/react.js +394 -0
  108. package/patternfly-docs/generated/components/number-input/react.js +210 -0
  109. package/patternfly-docs/generated/components/overflow-menu/react.js +274 -0
  110. package/patternfly-docs/generated/components/page/react-demos.js +149 -0
  111. package/patternfly-docs/generated/components/page/react.js +1352 -0
  112. package/patternfly-docs/generated/components/pagination/react.js +492 -0
  113. package/patternfly-docs/generated/components/panel/react.js +236 -0
  114. package/patternfly-docs/generated/components/popover/react.js +390 -0
  115. package/patternfly-docs/generated/components/progress/react-demos.js +59 -0
  116. package/patternfly-docs/generated/components/progress/react.js +283 -0
  117. package/patternfly-docs/generated/components/progress-stepper/react-demos.js +45 -0
  118. package/patternfly-docs/generated/components/progress-stepper/react.js +219 -0
  119. package/patternfly-docs/generated/components/search-input/react-demos.js +113 -0
  120. package/patternfly-docs/generated/components/search-input/react.js +263 -0
  121. package/patternfly-docs/generated/components/sidebar/react.js +236 -0
  122. package/patternfly-docs/generated/components/simple-list/react.js +200 -0
  123. package/patternfly-docs/generated/components/skeleton/react-demos.js +44 -0
  124. package/patternfly-docs/generated/components/skeleton/react.js +122 -0
  125. package/patternfly-docs/generated/components/skip-to-content/react.js +73 -0
  126. package/patternfly-docs/generated/components/slider/react.js +309 -0
  127. package/patternfly-docs/generated/components/spinner/react.js +111 -0
  128. package/patternfly-docs/generated/components/switch/react.js +163 -0
  129. package/patternfly-docs/generated/components/table/react-demos.js +355 -0
  130. package/patternfly-docs/generated/components/table/react-deprecated.js +1350 -0
  131. package/patternfly-docs/generated/components/table/react.js +3241 -0
  132. package/patternfly-docs/generated/components/tabs/react-demos.js +108 -0
  133. package/patternfly-docs/generated/components/tabs/react.js +1359 -0
  134. package/patternfly-docs/generated/components/text-input-group/react-demos.js +152 -0
  135. package/patternfly-docs/generated/components/text-input-group/react.js +278 -0
  136. package/patternfly-docs/generated/components/tile/react-deprecated.js +242 -0
  137. package/patternfly-docs/generated/components/timestamp/react.js +283 -0
  138. package/patternfly-docs/generated/components/title/react.js +94 -0
  139. package/patternfly-docs/generated/components/toggle-group/react.js +299 -0
  140. package/patternfly-docs/generated/components/toolbar/react-demos.js +66 -0
  141. package/patternfly-docs/generated/components/toolbar/react.js +932 -0
  142. package/patternfly-docs/generated/components/tooltip/react.js +241 -0
  143. package/patternfly-docs/generated/components/tree-view/react.js +429 -0
  144. package/patternfly-docs/generated/components/truncate/react.js +211 -0
  145. package/patternfly-docs/generated/components/wizard/react-demos.js +87 -0
  146. package/patternfly-docs/generated/components/wizard/react-deprecated.js +788 -0
  147. package/patternfly-docs/generated/components/wizard/react.js +986 -0
  148. package/patternfly-docs/generated/developer-guides/open-ui-automation/react.js +285 -0
  149. package/patternfly-docs/generated/foundations-and-styles/layouts/bullseye/react.js +70 -0
  150. package/patternfly-docs/generated/foundations-and-styles/layouts/flex/react.js +506 -0
  151. package/patternfly-docs/generated/foundations-and-styles/layouts/gallery/react.js +94 -0
  152. package/patternfly-docs/generated/foundations-and-styles/layouts/grid/react.js +272 -0
  153. package/patternfly-docs/generated/foundations-and-styles/layouts/level/react.js +87 -0
  154. package/patternfly-docs/generated/foundations-and-styles/layouts/split/react.js +124 -0
  155. package/patternfly-docs/generated/foundations-and-styles/layouts/stack/react.js +112 -0
  156. package/patternfly-docs/generated/index.js +1769 -0
  157. package/patternfly-docs/generated/patterns/card-view/react-demos.js +78 -0
  158. package/patternfly-docs/generated/patterns/filters/react-demos.js +141 -0
  159. package/patternfly-docs/generated/patterns/password-generator/react-demos.js +51 -0
  160. package/patternfly-docs/generated/patterns/password-strength/react-demos.js +61 -0
  161. package/patternfly-docs/generated/patterns/primary-detail/react-demos.js +124 -0
  162. package/patternfly-docs/generated/patterns/right-to-left/react-demos.js +81 -0
  163. package/LICENSE +0 -21
@@ -0,0 +1,398 @@
1
+ import React from 'react';
2
+ import { AutoLinkHeader, Example, Link as PatternflyThemeLink } from '@patternfly/documentation-framework/components';
3
+ import { useEffect, useState } from 'react';
4
+ import UploadIcon from '@patternfly/react-icons/dist/esm/icons/upload-icon';
5
+ const pageData = {
6
+ "id": "Multiple file upload",
7
+ "section": "components",
8
+ "subsection": "file-upload",
9
+ "deprecated": false,
10
+ "template": false,
11
+ "beta": false,
12
+ "demo": false,
13
+ "newImplementationLink": false,
14
+ "source": "react",
15
+ "tabName": null,
16
+ "slug": "/components/file-upload/multiple-file-upload/react",
17
+ "sourceLink": "https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/components/MultipleFileUpload/examples/MultipleFileUpload.md",
18
+ "relPath": "packages/react-core/src/components/MultipleFileUpload/examples/MultipleFileUpload.md",
19
+ "propComponents": [
20
+ {
21
+ "name": "MultipleFileUpload",
22
+ "description": "Acts as a container for all other MultipleFileUpload sub-components. This sub-component\nalso provides the functionality for file uploads, and access to the uploaded files via\na callback.",
23
+ "props": [
24
+ {
25
+ "name": "children",
26
+ "type": "React.ReactNode",
27
+ "description": "Content rendered inside the multi upload field"
28
+ },
29
+ {
30
+ "name": "className",
31
+ "type": "string",
32
+ "description": "Class to add to outer div"
33
+ },
34
+ {
35
+ "name": "dropzoneProps",
36
+ "type": "DropzoneOptions",
37
+ "description": "Optional extra props to customize react-dropzone.",
38
+ "defaultValue": "{}"
39
+ },
40
+ {
41
+ "name": "isHorizontal",
42
+ "type": "boolean",
43
+ "description": "Flag setting the component to horizontal styling mode"
44
+ },
45
+ {
46
+ "name": "onFileDrop",
47
+ "type": "(event: DropEvent, data: File[]) => void",
48
+ "description": "When files are dropped or uploaded this callback will be called with all accepted files",
49
+ "defaultValue": "() => {}"
50
+ }
51
+ ]
52
+ },
53
+ {
54
+ "name": "MultipleFileUploadMain",
55
+ "description": "Creates the visual upload interface, including the area to drag and drop files,\nan optional upload button, and descriptive instructions.",
56
+ "props": [
57
+ {
58
+ "name": "browseButtonText",
59
+ "type": "string",
60
+ "description": "Visible text label for the upload button",
61
+ "defaultValue": "'Upload'"
62
+ },
63
+ {
64
+ "name": "className",
65
+ "type": "string",
66
+ "description": "Class to add to outer div"
67
+ },
68
+ {
69
+ "name": "infoText",
70
+ "type": "React.ReactNode",
71
+ "description": "Content rendered inside the info div"
72
+ },
73
+ {
74
+ "name": "isUploadButtonHidden",
75
+ "type": "boolean",
76
+ "description": "Flag to prevent the upload button from being rendered"
77
+ },
78
+ {
79
+ "name": "titleIcon",
80
+ "type": "React.ReactNode",
81
+ "description": "Content rendered inside the title icon div"
82
+ },
83
+ {
84
+ "name": "titleText",
85
+ "type": "React.ReactNode",
86
+ "description": "Content rendered inside the title text div"
87
+ },
88
+ {
89
+ "name": "titleTextSeparator",
90
+ "type": "React.ReactNode",
91
+ "description": "Content rendered inside the title text separator div"
92
+ }
93
+ ]
94
+ },
95
+ {
96
+ "name": "MultipleFileUploadStatus",
97
+ "description": "Acts as an expandable container for all uploaded file statuses.\nAn optional text and/or icon can also be passed into this sub-component.\nThis sub-component can be conditionally rendered when at least 1 file has been\nattempted to be uploaded.",
98
+ "props": [
99
+ {
100
+ "name": "aria-label",
101
+ "type": "string",
102
+ "description": "Adds an accessible label to the list of status items."
103
+ },
104
+ {
105
+ "name": "children",
106
+ "type": "React.ReactNode",
107
+ "description": "Content rendered inside multi file upload status list"
108
+ },
109
+ {
110
+ "name": "className",
111
+ "type": "string",
112
+ "description": "Class to add to outer div"
113
+ },
114
+ {
115
+ "name": "statusToggleIcon",
116
+ "type": "'danger' | 'success' | 'inProgress' | React.ReactNode",
117
+ "description": "Icon to show in the status toggle"
118
+ },
119
+ {
120
+ "name": "statusToggleText",
121
+ "type": "string",
122
+ "description": "String to show in the status toggle"
123
+ }
124
+ ]
125
+ },
126
+ {
127
+ "name": "MultipleFileUploadStatusItem",
128
+ "description": "Automatically reads an uploaded file to render a visual representation of it, including\nits name, size, and read status. This sub-component also allows custom reading of files\nvia various callbacks which will override the automatic reading behavior.",
129
+ "props": [
130
+ {
131
+ "name": "buttonAriaLabel",
132
+ "type": "string",
133
+ "description": "Adds accessibility text to the status item deletion button",
134
+ "defaultValue": "'Remove from list'"
135
+ },
136
+ {
137
+ "name": "className",
138
+ "type": "string",
139
+ "description": "Class to add to outer div"
140
+ },
141
+ {
142
+ "name": "customFileHandler",
143
+ "type": "(file: File) => void",
144
+ "description": "A callback to process file reading in a custom way"
145
+ },
146
+ {
147
+ "name": "file",
148
+ "type": "File",
149
+ "description": "The file object being represented by the status item"
150
+ },
151
+ {
152
+ "name": "fileIcon",
153
+ "type": "React.ReactNode",
154
+ "description": "A custom icon to show in place of the generic file icon"
155
+ },
156
+ {
157
+ "name": "fileName",
158
+ "type": "string",
159
+ "description": "A custom name to display for the file rather than using built in functionality to auto-fill it"
160
+ },
161
+ {
162
+ "name": "fileSize",
163
+ "type": "number",
164
+ "description": "A custom file size to display for the file rather than using built in functionality to auto-fill it"
165
+ },
166
+ {
167
+ "name": "onClearClick",
168
+ "type": "React.MouseEventHandler<HTMLButtonElement>",
169
+ "description": "Clear button was clicked",
170
+ "defaultValue": "() => {}"
171
+ },
172
+ {
173
+ "name": "onReadFail",
174
+ "type": "(error: DOMException, onReadFail: File) => void",
175
+ "description": "A callback for when the FileReader API fails",
176
+ "defaultValue": "() => {}"
177
+ },
178
+ {
179
+ "name": "onReadFinished",
180
+ "type": "(fileHandle: File) => void",
181
+ "description": "A callback for when a selected file finishes loading",
182
+ "defaultValue": "() => {}"
183
+ },
184
+ {
185
+ "name": "onReadStarted",
186
+ "type": "(fileHandle: File) => void",
187
+ "description": "A callback for when a selected file starts loading",
188
+ "defaultValue": "() => {}"
189
+ },
190
+ {
191
+ "name": "onReadSuccess",
192
+ "type": "(data: string, file: File) => void",
193
+ "description": "A callback for when the FileReader successfully reads the file",
194
+ "defaultValue": "() => {}"
195
+ },
196
+ {
197
+ "name": "progressAriaDescribedBy",
198
+ "type": "string",
199
+ "description": "Adds an accessible description to the ProgressBar via space separated list of ids. Required when helperText is passed in."
200
+ },
201
+ {
202
+ "name": "progressAriaLabel",
203
+ "type": "string",
204
+ "description": "Adds accessible text to the progress bar. Required when title not used and there is not any label associated with the progress bar"
205
+ },
206
+ {
207
+ "name": "progressAriaLabelledBy",
208
+ "type": "string",
209
+ "description": "Associates the progress bar with it's label for accessibility purposes. Required when title not used"
210
+ },
211
+ {
212
+ "name": "progressAriaLiveMessage",
213
+ "type": "string | ((loadPercentage: number) => string)",
214
+ "description": "Modifies the text announced by assistive technologies when the progress bar updates."
215
+ },
216
+ {
217
+ "name": "progressHelperText",
218
+ "type": "React.ReactNode",
219
+ "description": "Additional content related to the status item."
220
+ },
221
+ {
222
+ "name": "progressId",
223
+ "type": "string",
224
+ "description": "Unique identifier for progress. Generated if not specified."
225
+ },
226
+ {
227
+ "name": "progressValue",
228
+ "type": "number",
229
+ "description": "A custom value to display for the progress component rather than using built in functionality to auto-fill it"
230
+ },
231
+ {
232
+ "name": "progressVariant",
233
+ "type": "'danger' | 'success' | 'warning'",
234
+ "description": "A custom variant to apply to the progress component rather than using built in functionality to auto-fill it"
235
+ }
236
+ ]
237
+ }
238
+ ],
239
+ "cssPrefix": [
240
+ "pf-v6-c-multiple-file-upload"
241
+ ],
242
+ "examples": [
243
+ "Basic"
244
+ ]
245
+ };
246
+ pageData.liveContext = {
247
+ useEffect,
248
+ useState,
249
+ UploadIcon
250
+ };
251
+ pageData.examples = {
252
+ 'Basic': props =>
253
+ <Example {...pageData} {...props} {...{"code":"import { useEffect, useState } from 'react';\nimport {\n MultipleFileUpload,\n MultipleFileUploadMain,\n MultipleFileUploadStatus,\n MultipleFileUploadStatusItem,\n Checkbox,\n HelperText,\n HelperTextItem,\n DropEvent\n} from '@patternfly/react-core';\nimport UploadIcon from '@patternfly/react-icons/dist/esm/icons/upload-icon';\n\ninterface readFile {\n fileName: string;\n data?: string;\n loadResult?: 'danger' | 'success';\n loadError?: DOMException;\n}\n\nexport const MultipleFileUploadBasic: React.FunctionComponent = () => {\n const [isHorizontal, setIsHorizontal] = useState(false);\n const [fileUploadShouldFail, setFileUploadShouldFail] = useState(false);\n const [currentFiles, setCurrentFiles] = useState<File[]>([]);\n const [readFileData, setReadFileData] = useState<readFile[]>([]);\n const [showStatus, setShowStatus] = useState(false);\n const [statusIcon, setStatusIcon] = useState('inProgress');\n\n // only show the status component once a file has been uploaded, but keep the status list component itself even if all files are removed\n if (!showStatus && currentFiles.length > 0) {\n setShowStatus(true);\n }\n\n // determine the icon that should be shown for the overall status list\n useEffect(() => {\n if (readFileData.length < currentFiles.length) {\n setStatusIcon('inProgress');\n } else if (readFileData.every((file) => file.loadResult === 'success')) {\n setStatusIcon('success');\n } else {\n setStatusIcon('danger');\n }\n }, [readFileData, currentFiles]);\n\n // remove files from both state arrays based on their name\n const removeFiles = (namesOfFilesToRemove: string[]) => {\n const newCurrentFiles = currentFiles.filter(\n (currentFile) => !namesOfFilesToRemove.some((fileName) => fileName === currentFile.name)\n );\n\n setCurrentFiles(newCurrentFiles);\n\n const newReadFiles = readFileData.filter(\n (readFile) => !namesOfFilesToRemove.some((fileName) => fileName === readFile.fileName)\n );\n\n setReadFileData(newReadFiles);\n };\n\n /** Forces uploaded files to become corrupted if \"Demonstrate error reporting by forcing uploads to fail\" is selected in the example,\n * only used in this example for demonstration purposes */\n const updateCurrentFiles = (files: File[]) => {\n if (fileUploadShouldFail) {\n const corruptedFiles = files.map((file) => ({ ...file, lastModified: 'foo' as unknown as number }));\n\n setCurrentFiles((prevFiles) => [...prevFiles, ...(corruptedFiles as any)]);\n } else {\n setCurrentFiles((prevFiles) => [...prevFiles, ...files]);\n }\n };\n\n // callback that will be called by the react dropzone with the newly dropped file objects\n const handleFileDrop = (_event: DropEvent, droppedFiles: File[]) => {\n // identify what, if any, files are re-uploads of already uploaded files\n const currentFileNames = currentFiles.map((file) => file.name);\n const reUploads = droppedFiles.filter((droppedFile) => currentFileNames.includes(droppedFile.name));\n\n /** this promise chain is needed because if the file removal is done at the same time as the file adding react\n * won't realize that the status items for the re-uploaded files needs to be re-rendered */\n Promise.resolve()\n .then(() => removeFiles(reUploads.map((file) => file.name)))\n .then(() => updateCurrentFiles(droppedFiles));\n };\n\n // callback called by the status item when a file is successfully read with the built-in file reader\n const handleReadSuccess = (data: string, file: File) => {\n setReadFileData((prevReadFiles) => [...prevReadFiles, { data, fileName: file.name, loadResult: 'success' }]);\n };\n\n // callback called by the status item when a file encounters an error while being read with the built-in file reader\n const handleReadFail = (error: DOMException, file: File) => {\n setReadFileData((prevReadFiles) => [\n ...prevReadFiles,\n { loadError: error, fileName: file.name, loadResult: 'danger' }\n ]);\n };\n\n // add helper text to a status item showing any error encountered during the file reading process\n const createHelperText = (file: File, fileIndex: number) => {\n const fileResult = readFileData.find((readFile) => readFile.fileName === file.name);\n if (fileResult?.loadError) {\n return (\n <HelperText id={`multiple-file-upload-basic-example-help-text-${fileIndex}`} isLiveRegion>\n <HelperTextItem variant=\"error\">{fileResult.loadError.toString()}</HelperTextItem>\n </HelperText>\n );\n }\n };\n\n const successfullyReadFileCount = readFileData.filter((fileData) => fileData.loadResult === 'success').length;\n\n return (\n <>\n <MultipleFileUpload\n onFileDrop={handleFileDrop}\n dropzoneProps={{\n accept: {\n 'image/jpeg': ['.jpg', '.jpeg'],\n 'application/msword': ['.doc'],\n 'application/pdf': ['.pdf'],\n 'image/png': ['.png']\n }\n }}\n isHorizontal={isHorizontal}\n >\n <MultipleFileUploadMain\n titleIcon={<UploadIcon />}\n titleText=\"Drag and drop files here\"\n titleTextSeparator=\"or\"\n infoText=\"Accepted file types: JPEG, Doc, PDF, PNG\"\n />\n {showStatus && (\n <MultipleFileUploadStatus\n statusToggleText={`${successfullyReadFileCount} of ${currentFiles.length} files uploaded`}\n statusToggleIcon={statusIcon}\n aria-label=\"Current uploads\"\n >\n {currentFiles.map((file, index) => (\n <MultipleFileUploadStatusItem\n file={file}\n key={file.name}\n onClearClick={() => removeFiles([file.name])}\n onReadSuccess={handleReadSuccess}\n onReadFail={handleReadFail}\n progressHelperText={createHelperText(file, index)}\n progressAriaDescribedBy={`multiple-file-upload-basic-example-help-text-${index}`}\n />\n ))}\n </MultipleFileUploadStatus>\n )}\n </MultipleFileUpload>\n <Checkbox\n id=\"horizontal-checkbox\"\n label=\"Show as horizontal\"\n isChecked={isHorizontal}\n onChange={() => setIsHorizontal(!isHorizontal)}\n />\n <Checkbox\n id=\"upload-should-fail-checkbox\"\n label=\"Demonstrate error reporting by forcing uploads to fail\"\n isChecked={fileUploadShouldFail}\n onChange={() => setFileUploadShouldFail(!fileUploadShouldFail)}\n />\n </>\n );\n};\n","title":"Basic","lang":"ts","className":""}}>
254
+
255
+ <p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
256
+ {`The below example demonstrates a typical application of file upload - multiple, with a few tweaks from that typical application to enhance the convenience of the example.`}
257
+ </p>
258
+
259
+ <p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
260
+ {`The "Show as horizontal" checkbox can be used to easily toggle the `}
261
+
262
+ <code {...{"className":"ws-code "}}>
263
+ {`isHorizontal`}
264
+ </code>
265
+ {` prop, showing our available styling variations.`}
266
+ </p>
267
+
268
+ <p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
269
+ {`The "Demonstrate error reporting by forcing uploads to fail" checkbox shows how our `}
270
+
271
+ <code {...{"className":"ws-code "}}>
272
+ {`progressHelperText`}
273
+ </code>
274
+ {` prop can be used to provide status messages to users, such as when a file fails to upload. While this checkbox is checked it will cause any file uploaded to automatically fail the file reading process, and helper text will be dynamically rendered which informs the user of that error.`}
275
+ </p>
276
+ </Example>
277
+ };
278
+
279
+ const Component = () => (
280
+ <React.Fragment>
281
+ <p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
282
+ {`Multiple file upload is able to:`}
283
+ </p>
284
+ <ul {...{"className":"pf-v6-c-content--ul pf-m-editorial ws-ul "}}>
285
+ <li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
286
+ {`Accept one or more files via browse or drag-and-drop`}
287
+ </li>
288
+ <li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
289
+ {`Provide their data to you using file objects via the `}
290
+ <code {...{"className":"ws-code "}}>
291
+ {`onFileDrop`}
292
+ </code>
293
+ {` callback prop`}
294
+ </li>
295
+ <li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
296
+ {`Read files as dataURLs, calling provided callbacks as needed when files start/finish being read, as well as when the read succeeds or fails`}
297
+ </li>
298
+ <li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
299
+ {`Display (in real time) the upload progress/status of each file`}
300
+ <ul {...{"className":"pf-v6-c-content--ul pf-m-editorial ws-ul "}}>
301
+ <li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
302
+ {`Uploaded files are represented by the multiple file upload status item component, this component includes the aforementioned built-in file reading logic`}
303
+ </li>
304
+ <li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
305
+ {`If you prefer to supply your own file reading logic and strictly use multiple file upload status item as a display component, the `}
306
+ <code {...{"className":"ws-code "}}>
307
+ {`customFileHandler`}
308
+ </code>
309
+ {`, `}
310
+ <code {...{"className":"ws-code "}}>
311
+ {`fileName`}
312
+ </code>
313
+ {`, `}
314
+ <code {...{"className":"ws-code "}}>
315
+ {`fileSize`}
316
+ </code>
317
+ {`, `}
318
+ <code {...{"className":"ws-code "}}>
319
+ {`progressValue`}
320
+ </code>
321
+ {`, and `}
322
+ <code {...{"className":"ws-code "}}>
323
+ {`progressVariant`}
324
+ </code>
325
+ {` props exist to allow you to do that`}
326
+ </li>
327
+ </ul>
328
+ </li>
329
+ </ul>
330
+ <AutoLinkHeader {...{"id":"restricting-file-size-and-type","headingLevel":"h2","className":"ws-title ws-h2"}}>
331
+ {`Restricting file size and type`}
332
+ </AutoLinkHeader>
333
+ <p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
334
+ {`As with singular file upload, any `}
335
+ <PatternflyThemeLink {...{"to":"https://react-dropzone.js.org/#!/Dropzone","className":""}}>
336
+ {`props accepted by react-dropzone's Dropzone component`}
337
+ </PatternflyThemeLink>
338
+ {` can be passed as a dropzoneProps object in order to customize the behavior of the Dropzone, such as restricting the type of files allowed. The following examples will only accept the files they list as accepted. Note that file type determination is not reliable across platforms (see the note on react-dropzone's docs about the accept prop), so be sure to test the behavior of your file upload restriction on all browsers and operating systems targeted by your application.`}
339
+ </p>
340
+ <AutoLinkHeader {...{"id":"important-a-note-about-security","headingLevel":"h3","className":"ws-title ws-h3"}}>
341
+ {`IMPORTANT: A note about security`}
342
+ </AutoLinkHeader>
343
+ <p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
344
+ {`Restricting file sizes and types in this way is for user convenience only, and it cannot prevent a malicious user from submitting anything to your server. As with any user input, your application should also validate, sanitize and/or reject restricted files on the server side.`}
345
+ </p>
346
+ <AutoLinkHeader {...{"id":"composable-structure","headingLevel":"h2","className":"ws-title ws-h2"}}>
347
+ {`Composable structure`}
348
+ </AutoLinkHeader>
349
+ <p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
350
+ {`File upload - multiple is designed in a composable manner to make customization easier. The standard sub-component relationships are arranged as follows:`}
351
+ </p>
352
+ <Example {...{"code":"<MultipleFileUpload>\n <MultipleFileUploadMain />\n <MultipleFileUploadStatus>\n <MultipleFileUploadStatusItem />\n </MultipleFileUploadStatus>\n</MultipleFileUpload>","lang":"noLive","className":""}}>
353
+ </Example>
354
+ <AutoLinkHeader {...{"id":"examples","headingLevel":"h2","className":"ws-title ws-h2"}}>
355
+ {`Examples`}
356
+ </AutoLinkHeader>
357
+ {React.createElement(pageData.examples["Basic"])}
358
+ <AutoLinkHeader {...{"id":"types","headingLevel":"h2","className":"ws-title ws-h2"}}>
359
+ {`Types`}
360
+ </AutoLinkHeader>
361
+ <p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
362
+ {`Multiple file upload uses the `}
363
+ <code {...{"className":"ws-code "}}>
364
+ {`DropzoneOptions`}
365
+ </code>
366
+ {` type from react-dropzone. It is comprised of additional props with their own types. For more information on using `}
367
+ <code {...{"className":"ws-code "}}>
368
+ {`DropzoneOptions`}
369
+ </code>
370
+ {` visit `}
371
+ <PatternflyThemeLink {...{"to":"https://react-dropzone.js.org/#src","className":""}}>
372
+ {`react-dropzone props and methods`}
373
+ </PatternflyThemeLink>
374
+ {`.`}
375
+ </p>
376
+ <p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
377
+ {`Additionally, it calls the `}
378
+ <code {...{"className":"ws-code "}}>
379
+ {`onFileDrop`}
380
+ </code>
381
+ {` callback with an event of type `}
382
+ <code {...{"className":"ws-code "}}>
383
+ {`DropEvent`}
384
+ </code>
385
+ {`. `}
386
+ <code {...{"className":"ws-code "}}>
387
+ {`DropEvent`}
388
+ </code>
389
+ {` is a union comprised of the following types:`}
390
+ </p>
391
+ <Example {...{"code":"React.DragEvent<HTMLElement>\n | React.ChangeEvent<HTMLInputElement>\n | DragEvent\n | Event","lang":"noLive","className":""}}>
392
+ </Example>
393
+ </React.Fragment>
394
+ );
395
+ Component.displayName = 'ComponentsFileUploadMultipleFileUploadReactDocs';
396
+ Component.pageData = pageData;
397
+
398
+ export default Component;