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

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 +6 -0
  2. package/LICENSE +21 -0
  3. package/package.json +12 -11
  4. package/patternfly-docs/generated/components/about-modal/react.js +0 -149
  5. package/patternfly-docs/generated/components/accordion/react.js +0 -262
  6. package/patternfly-docs/generated/components/action-list/react.js +0 -144
  7. package/patternfly-docs/generated/components/alert/react-demos.js +0 -56
  8. package/patternfly-docs/generated/components/alert/react.js +0 -1433
  9. package/patternfly-docs/generated/components/avatar/react.js +0 -166
  10. package/patternfly-docs/generated/components/back-to-top/react-demos.js +0 -60
  11. package/patternfly-docs/generated/components/back-to-top/react.js +0 -77
  12. package/patternfly-docs/generated/components/backdrop/react.js +0 -64
  13. package/patternfly-docs/generated/components/background-image/react.js +0 -62
  14. package/patternfly-docs/generated/components/badge/react.js +0 -97
  15. package/patternfly-docs/generated/components/banner/react-demos.js +0 -57
  16. package/patternfly-docs/generated/components/banner/react.js +0 -148
  17. package/patternfly-docs/generated/components/brand/react.js +0 -142
  18. package/patternfly-docs/generated/components/breadcrumb/react.js +0 -206
  19. package/patternfly-docs/generated/components/button/react-demos.js +0 -57
  20. package/patternfly-docs/generated/components/button/react.js +0 -826
  21. package/patternfly-docs/generated/components/card/react-demos.js +0 -201
  22. package/patternfly-docs/generated/components/card/react.js +0 -1015
  23. package/patternfly-docs/generated/components/charts/area-chart/-Victory.js +0 -1350
  24. package/patternfly-docs/generated/components/charts/bar-chart/-Victory.js +0 -1334
  25. package/patternfly-docs/generated/components/charts/box-plot-chart/-Victory.js +0 -1282
  26. package/patternfly-docs/generated/components/charts/bullet-chart/-Victory.js +0 -848
  27. package/patternfly-docs/generated/components/charts/colors-for-charts/-Victory.js +0 -192
  28. package/patternfly-docs/generated/components/charts/donut-chart/-Victory.js +0 -426
  29. package/patternfly-docs/generated/components/charts/donut-utilization-chart/-Victory.js +0 -804
  30. package/patternfly-docs/generated/components/charts/legends/-Victory.js +0 -3230
  31. package/patternfly-docs/generated/components/charts/line-chart/-Victory.js +0 -1178
  32. package/patternfly-docs/generated/components/charts/line-chart/ECharts.js +0 -525
  33. package/patternfly-docs/generated/components/charts/patterns/-Victory.js +0 -3382
  34. package/patternfly-docs/generated/components/charts/pie-chart/-Victory.js +0 -377
  35. package/patternfly-docs/generated/components/charts/resize-observer/-Victory.js +0 -2475
  36. package/patternfly-docs/generated/components/charts/sankey-chart/ECharts.js +0 -538
  37. package/patternfly-docs/generated/components/charts/scatter-chart/-Victory.js +0 -1551
  38. package/patternfly-docs/generated/components/charts/skeletons/-Victory.js +0 -4115
  39. package/patternfly-docs/generated/components/charts/sparkline-chart/-Victory.js +0 -955
  40. package/patternfly-docs/generated/components/charts/stack-chart/-Victory.js +0 -1173
  41. package/patternfly-docs/generated/components/charts/threshold-chart/-Victory.js +0 -1166
  42. package/patternfly-docs/generated/components/charts/tooltips/-Victory.js +0 -413
  43. package/patternfly-docs/generated/components/chip/react-deprecated.js +0 -323
  44. package/patternfly-docs/generated/components/clipboard-copy/react.js +0 -373
  45. package/patternfly-docs/generated/components/code-block/react.js +0 -148
  46. package/patternfly-docs/generated/components/code-editor/react.js +0 -659
  47. package/patternfly-docs/generated/components/compass/react-demos.js +0 -147
  48. package/patternfly-docs/generated/components/compass/react.js +0 -440
  49. package/patternfly-docs/generated/components/content/react.js +0 -248
  50. package/patternfly-docs/generated/components/data-list/react-demos.js +0 -90
  51. package/patternfly-docs/generated/components/data-list/react.js +0 -709
  52. package/patternfly-docs/generated/components/date-and-time/calendar-month/react.js +0 -283
  53. package/patternfly-docs/generated/components/date-and-time/date-and-time-picker/react-demos.js +0 -64
  54. package/patternfly-docs/generated/components/date-and-time/date-picker/react-demos.js +0 -83
  55. package/patternfly-docs/generated/components/date-and-time/date-picker/react.js +0 -395
  56. package/patternfly-docs/generated/components/date-and-time/time-picker/react.js +0 -241
  57. package/patternfly-docs/generated/components/description-list/react-demos.js +0 -58
  58. package/patternfly-docs/generated/components/description-list/react.js +0 -743
  59. package/patternfly-docs/generated/components/divider/react.js +0 -126
  60. package/patternfly-docs/generated/components/drag-and-drop/react-demos.js +0 -351
  61. package/patternfly-docs/generated/components/drag-and-drop/react-deprecated.js +0 -184
  62. package/patternfly-docs/generated/components/drag-and-drop/react.js +0 -137
  63. package/patternfly-docs/generated/components/drawer/react.js +0 -598
  64. package/patternfly-docs/generated/components/dual-list-selector/react-deprecated.js +0 -772
  65. package/patternfly-docs/generated/components/dual-list-selector/react.js +0 -594
  66. package/patternfly-docs/generated/components/empty-state/react.js +0 -199
  67. package/patternfly-docs/generated/components/expandable-section/react-demos.js +0 -65
  68. package/patternfly-docs/generated/components/expandable-section/react.js +0 -408
  69. package/patternfly-docs/generated/components/file-upload/multiple-file-upload/react-demos.js +0 -52
  70. package/patternfly-docs/generated/components/file-upload/multiple-file-upload/react.js +0 -398
  71. package/patternfly-docs/generated/components/file-upload/simple-file-upload/react.js +0 -749
  72. package/patternfly-docs/generated/components/forms/checkbox/react.js +0 -222
  73. package/patternfly-docs/generated/components/forms/form/react.js +0 -1106
  74. package/patternfly-docs/generated/components/forms/form-select/react.js +0 -208
  75. package/patternfly-docs/generated/components/forms/radio/react.js +0 -212
  76. package/patternfly-docs/generated/components/forms/text-area/react.js +0 -160
  77. package/patternfly-docs/generated/components/forms/text-input/react.js +0 -216
  78. package/patternfly-docs/generated/components/helper-text/react-demos.js +0 -180
  79. package/patternfly-docs/generated/components/helper-text/react.js +0 -164
  80. package/patternfly-docs/generated/components/hero/react.js +0 -88
  81. package/patternfly-docs/generated/components/hint/react.js +0 -169
  82. package/patternfly-docs/generated/components/icon/react.js +0 -215
  83. package/patternfly-docs/generated/components/input-group/react.js +0 -182
  84. package/patternfly-docs/generated/components/jump-links/react-demos.js +0 -154
  85. package/patternfly-docs/generated/components/jump-links/react.js +0 -212
  86. package/patternfly-docs/generated/components/label/react-demos.js +0 -57
  87. package/patternfly-docs/generated/components/label/react.js +0 -417
  88. package/patternfly-docs/generated/components/list/react.js +0 -175
  89. package/patternfly-docs/generated/components/login-page/react.js +0 -587
  90. package/patternfly-docs/generated/components/masthead/react-demos.js +0 -79
  91. package/patternfly-docs/generated/components/masthead/react.js +0 -291
  92. package/patternfly-docs/generated/components/menus/application-launcher/react-demos.js +0 -769
  93. package/patternfly-docs/generated/components/menus/context-selector/react-demos.js +0 -665
  94. package/patternfly-docs/generated/components/menus/custom-menus/react-demos.js +0 -187
  95. package/patternfly-docs/generated/components/menus/dropdown/react-templates.js +0 -163
  96. package/patternfly-docs/generated/components/menus/dropdown/react.js +0 -998
  97. package/patternfly-docs/generated/components/menus/menu/react.js +0 -1540
  98. package/patternfly-docs/generated/components/menus/menu-toggle/react.js +0 -747
  99. package/patternfly-docs/generated/components/menus/options-menu/react-demos.js +0 -508
  100. package/patternfly-docs/generated/components/menus/select/react-templates.js +0 -257
  101. package/patternfly-docs/generated/components/menus/select/react.js +0 -998
  102. package/patternfly-docs/generated/components/modal/react-deprecated.js +0 -554
  103. package/patternfly-docs/generated/components/modal/react.js +0 -597
  104. package/patternfly-docs/generated/components/navigation/react-demos.js +0 -356
  105. package/patternfly-docs/generated/components/navigation/react.js +0 -409
  106. package/patternfly-docs/generated/components/notification-badge/react.js +0 -196
  107. package/patternfly-docs/generated/components/notification-drawer/react-demos.js +0 -107
  108. package/patternfly-docs/generated/components/notification-drawer/react.js +0 -394
  109. package/patternfly-docs/generated/components/number-input/react.js +0 -210
  110. package/patternfly-docs/generated/components/overflow-menu/react.js +0 -274
  111. package/patternfly-docs/generated/components/page/react-demos.js +0 -149
  112. package/patternfly-docs/generated/components/page/react.js +0 -1352
  113. package/patternfly-docs/generated/components/pagination/react.js +0 -492
  114. package/patternfly-docs/generated/components/panel/react.js +0 -236
  115. package/patternfly-docs/generated/components/popover/react.js +0 -390
  116. package/patternfly-docs/generated/components/progress/react-demos.js +0 -59
  117. package/patternfly-docs/generated/components/progress/react.js +0 -283
  118. package/patternfly-docs/generated/components/progress-stepper/react-demos.js +0 -45
  119. package/patternfly-docs/generated/components/progress-stepper/react.js +0 -219
  120. package/patternfly-docs/generated/components/search-input/react-demos.js +0 -113
  121. package/patternfly-docs/generated/components/search-input/react.js +0 -263
  122. package/patternfly-docs/generated/components/sidebar/react.js +0 -236
  123. package/patternfly-docs/generated/components/simple-list/react.js +0 -200
  124. package/patternfly-docs/generated/components/skeleton/react-demos.js +0 -44
  125. package/patternfly-docs/generated/components/skeleton/react.js +0 -122
  126. package/patternfly-docs/generated/components/skip-to-content/react.js +0 -73
  127. package/patternfly-docs/generated/components/slider/react.js +0 -309
  128. package/patternfly-docs/generated/components/spinner/react.js +0 -111
  129. package/patternfly-docs/generated/components/switch/react.js +0 -163
  130. package/patternfly-docs/generated/components/table/react-demos.js +0 -355
  131. package/patternfly-docs/generated/components/table/react-deprecated.js +0 -1350
  132. package/patternfly-docs/generated/components/table/react.js +0 -3241
  133. package/patternfly-docs/generated/components/tabs/react-demos.js +0 -108
  134. package/patternfly-docs/generated/components/tabs/react.js +0 -1359
  135. package/patternfly-docs/generated/components/text-input-group/react-demos.js +0 -152
  136. package/patternfly-docs/generated/components/text-input-group/react.js +0 -278
  137. package/patternfly-docs/generated/components/tile/react-deprecated.js +0 -242
  138. package/patternfly-docs/generated/components/timestamp/react.js +0 -283
  139. package/patternfly-docs/generated/components/title/react.js +0 -94
  140. package/patternfly-docs/generated/components/toggle-group/react.js +0 -299
  141. package/patternfly-docs/generated/components/toolbar/react-demos.js +0 -66
  142. package/patternfly-docs/generated/components/toolbar/react.js +0 -932
  143. package/patternfly-docs/generated/components/tooltip/react.js +0 -241
  144. package/patternfly-docs/generated/components/tree-view/react.js +0 -429
  145. package/patternfly-docs/generated/components/truncate/react.js +0 -211
  146. package/patternfly-docs/generated/components/wizard/react-demos.js +0 -87
  147. package/patternfly-docs/generated/components/wizard/react-deprecated.js +0 -788
  148. package/patternfly-docs/generated/components/wizard/react.js +0 -986
  149. package/patternfly-docs/generated/developer-guides/open-ui-automation/react.js +0 -285
  150. package/patternfly-docs/generated/foundations-and-styles/layouts/bullseye/react.js +0 -70
  151. package/patternfly-docs/generated/foundations-and-styles/layouts/flex/react.js +0 -506
  152. package/patternfly-docs/generated/foundations-and-styles/layouts/gallery/react.js +0 -94
  153. package/patternfly-docs/generated/foundations-and-styles/layouts/grid/react.js +0 -272
  154. package/patternfly-docs/generated/foundations-and-styles/layouts/level/react.js +0 -87
  155. package/patternfly-docs/generated/foundations-and-styles/layouts/split/react.js +0 -124
  156. package/patternfly-docs/generated/foundations-and-styles/layouts/stack/react.js +0 -112
  157. package/patternfly-docs/generated/index.js +0 -1769
  158. package/patternfly-docs/generated/patterns/card-view/react-demos.js +0 -78
  159. package/patternfly-docs/generated/patterns/filters/react-demos.js +0 -141
  160. package/patternfly-docs/generated/patterns/password-generator/react-demos.js +0 -51
  161. package/patternfly-docs/generated/patterns/password-strength/react-demos.js +0 -61
  162. package/patternfly-docs/generated/patterns/primary-detail/react-demos.js +0 -124
  163. package/patternfly-docs/generated/patterns/right-to-left/react-demos.js +0 -81
@@ -1,398 +0,0 @@
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;