@patternfly/react-core 4.198.15 → 4.198.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/dist/esm/components/AlertGroup/AlertGroup.d.ts +4 -0
- package/dist/esm/components/AlertGroup/AlertGroup.d.ts.map +1 -1
- package/dist/esm/components/AlertGroup/AlertGroup.js +2 -2
- package/dist/esm/components/AlertGroup/AlertGroup.js.map +1 -1
- package/dist/esm/components/AlertGroup/AlertGroupInline.d.ts.map +1 -1
- package/dist/esm/components/AlertGroup/AlertGroupInline.js +5 -2
- package/dist/esm/components/AlertGroup/AlertGroupInline.js.map +1 -1
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.d.ts +10 -2
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.d.ts.map +1 -1
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.js +9 -2
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.js.map +1 -1
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts +1 -1
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts.map +1 -1
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.js +21 -2
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.js.map +1 -1
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatusItem.js.map +1 -1
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts +6 -2
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts.map +1 -1
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.js +9 -2
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.js.map +1 -1
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts +2 -0
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts.map +1 -1
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js +2 -4
- package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js.map +1 -1
- package/dist/esm/components/MultipleFileUpload/index.d.ts +0 -6
- package/dist/esm/components/MultipleFileUpload/index.d.ts.map +1 -1
- package/dist/esm/components/MultipleFileUpload/index.js +0 -6
- package/dist/esm/components/MultipleFileUpload/index.js.map +1 -1
- package/dist/js/components/AlertGroup/AlertGroup.d.ts +4 -0
- package/dist/js/components/AlertGroup/AlertGroup.d.ts.map +1 -1
- package/dist/js/components/AlertGroup/AlertGroup.js +2 -2
- package/dist/js/components/AlertGroup/AlertGroup.js.map +1 -1
- package/dist/js/components/AlertGroup/AlertGroupInline.d.ts.map +1 -1
- package/dist/js/components/AlertGroup/AlertGroupInline.js +5 -2
- package/dist/js/components/AlertGroup/AlertGroupInline.js.map +1 -1
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.d.ts +10 -2
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.d.ts.map +1 -1
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.js +9 -2
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.js.map +1 -1
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts +1 -1
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts.map +1 -1
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.js +21 -2
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.js.map +1 -1
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatusItem.js.map +1 -1
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts +6 -2
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts.map +1 -1
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.js +9 -2
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.js.map +1 -1
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts +2 -0
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts.map +1 -1
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js +2 -4
- package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js.map +1 -1
- package/dist/js/components/MultipleFileUpload/index.d.ts +0 -6
- package/dist/js/components/MultipleFileUpload/index.d.ts.map +1 -1
- package/dist/js/components/MultipleFileUpload/index.js +0 -6
- package/dist/js/components/MultipleFileUpload/index.js.map +1 -1
- package/dist/styles/assets/images/img_pie-chart-with-legend.png +0 -0
- package/dist/styles/assets/images/status-icon-sprite.svg +38 -0
- package/dist/umd/react-core.css +244 -47
- package/dist/umd/react-core.js +75 -47
- package/dist/umd/react-core.min.css +244 -47
- package/dist/umd/react-core.min.js +4 -4
- package/package.json +6 -6
- package/src/components/AlertGroup/AlertGroup.tsx +13 -2
- package/src/components/AlertGroup/AlertGroupInline.tsx +9 -0
- package/src/components/AlertGroup/__tests__/AlertGroup.test.tsx +15 -0
- package/src/components/AlertGroup/__tests__/__snapshots__/AlertGroup.test.tsx.snap +93 -1
- package/src/components/AlertGroup/examples/AlertGroup.md +147 -0
- package/src/components/MultipleFileUpload/MultipleFileUploadMain.tsx +29 -8
- package/src/components/MultipleFileUpload/MultipleFileUploadStatus.tsx +24 -4
- package/src/components/MultipleFileUpload/MultipleFileUploadStatusItem.tsx +1 -1
- package/src/components/MultipleFileUpload/MultipleFileUploadTitle.tsx +19 -5
- package/src/components/MultipleFileUpload/MultipleFileUploadTitleIcon.tsx +4 -3
- package/src/components/MultipleFileUpload/__tests__/MultipleFileUploadMain.test.tsx +19 -2
- package/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitle.test.tsx +17 -2
- package/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleIcon.test.tsx +1 -1
- package/src/components/MultipleFileUpload/__tests__/__snapshots__/MultipleFileUploadMain.test.tsx.snap +198 -2
- package/src/components/MultipleFileUpload/__tests__/__snapshots__/MultipleFileUploadTitle.test.tsx.snap +62 -4
- package/src/components/MultipleFileUpload/__tests__/__snapshots__/MultipleFileUploadTitleIcon.test.tsx.snap +2 -50
- package/src/components/MultipleFileUpload/examples/MultipleFileUpload.md +7 -60
- package/src/components/MultipleFileUpload/examples/MultipleFileUploadBasic.tsx +48 -74
- package/src/components/MultipleFileUpload/index.ts +0 -6
- package/src/demos/ComposableMenu/ComposableMenu.md +4 -9
- package/src/demos/ComposableMenu/examples/ComposableDateSelect.tsx +113 -0
- package/src/demos/MultipleFileUploadDemos.md +16 -0
- package/src/{components/MultipleFileUpload/examples/MultipleFileUploadHorizontal.tsx → demos/examples/MultipleFileUpload/MultipleFileUploadRejectedFile.tsx} +60 -64
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { MenuToggle, Menu, MenuContent, MenuList, MenuItem, Popper } from '@patternfly/react-core';
|
|
3
|
+
|
|
4
|
+
export const ComposableSimpleDropdown: React.FunctionComponent = () => {
|
|
5
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
|
6
|
+
const toggleRef = React.useRef<HTMLButtonElement>();
|
|
7
|
+
const menuRef = React.useRef<HTMLDivElement>();
|
|
8
|
+
const [selected, setSelected] = React.useState<number>(0);
|
|
9
|
+
|
|
10
|
+
const handleMenuKeys = (event: KeyboardEvent) => {
|
|
11
|
+
if (!isOpen) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (menuRef.current.contains(event.target as Node) || toggleRef.current.contains(event.target as Node)) {
|
|
15
|
+
if (event.key === 'Escape' || event.key === 'Tab') {
|
|
16
|
+
setIsOpen(!isOpen);
|
|
17
|
+
toggleRef.current.focus();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const handleClickOutside = (event: MouseEvent) => {
|
|
23
|
+
if (isOpen && !menuRef.current.contains(event.target as Node)) {
|
|
24
|
+
setIsOpen(false);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
React.useEffect(() => {
|
|
29
|
+
window.addEventListener('keydown', handleMenuKeys);
|
|
30
|
+
window.addEventListener('click', handleClickOutside);
|
|
31
|
+
return () => {
|
|
32
|
+
window.removeEventListener('keydown', handleMenuKeys);
|
|
33
|
+
window.removeEventListener('click', handleClickOutside);
|
|
34
|
+
};
|
|
35
|
+
}, [isOpen, menuRef]);
|
|
36
|
+
|
|
37
|
+
const onToggleClick = (ev: React.MouseEvent) => {
|
|
38
|
+
ev.stopPropagation(); // Stop handleClickOutside from handling
|
|
39
|
+
setTimeout(() => {
|
|
40
|
+
if (menuRef.current) {
|
|
41
|
+
const firstElement = menuRef.current.querySelector('li > button:not(:disabled)');
|
|
42
|
+
firstElement && (firstElement as HTMLElement).focus();
|
|
43
|
+
}
|
|
44
|
+
}, 0);
|
|
45
|
+
setIsOpen(!isOpen);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const monthStrings = [
|
|
49
|
+
'January',
|
|
50
|
+
'February',
|
|
51
|
+
'March',
|
|
52
|
+
'April',
|
|
53
|
+
'May',
|
|
54
|
+
'June',
|
|
55
|
+
'July',
|
|
56
|
+
'August',
|
|
57
|
+
'September',
|
|
58
|
+
'October',
|
|
59
|
+
'November',
|
|
60
|
+
'December'
|
|
61
|
+
];
|
|
62
|
+
|
|
63
|
+
const dateString = (date: Date) => `${monthStrings[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`;
|
|
64
|
+
|
|
65
|
+
const date = new Date();
|
|
66
|
+
|
|
67
|
+
const toggleText = {
|
|
68
|
+
0: 'Today ',
|
|
69
|
+
1: 'Yesterday ',
|
|
70
|
+
2: 'Last 7 days ',
|
|
71
|
+
3: 'Last 14 days '
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const dateText = {
|
|
75
|
+
0: <small className="pf-u-color-200">({dateString(date)})</small>,
|
|
76
|
+
1: (
|
|
77
|
+
<small className="pf-u-color-200">
|
|
78
|
+
({dateString(new Date(new Date().setDate(date.getDate() - 1)))} - {dateString(date)})
|
|
79
|
+
</small>
|
|
80
|
+
),
|
|
81
|
+
2: (
|
|
82
|
+
<small className="pf-u-color-200">
|
|
83
|
+
({dateString(new Date(new Date().setDate(date.getDate() - 7)))} - {dateString(date)})
|
|
84
|
+
</small>
|
|
85
|
+
),
|
|
86
|
+
3: (
|
|
87
|
+
<small className="pf-u-color-200">
|
|
88
|
+
({dateString(new Date(new Date().setDate(date.getDate() - 14)))} - {dateString(date)})
|
|
89
|
+
</small>
|
|
90
|
+
)
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const toggle = (
|
|
94
|
+
<MenuToggle ref={toggleRef} onClick={onToggleClick} isExpanded={isOpen} style={{ minWidth: '250px' }}>
|
|
95
|
+
<span style={{ verticalAlign: 'middle', marginRight: '8px' }}>{toggleText[selected]}</span>
|
|
96
|
+
{dateText[selected]}
|
|
97
|
+
</MenuToggle>
|
|
98
|
+
);
|
|
99
|
+
const menu = (
|
|
100
|
+
// eslint-disable-next-line no-console
|
|
101
|
+
<Menu ref={menuRef} onSelect={(_ev, itemId) => setSelected(itemId as number)} selected={selected}>
|
|
102
|
+
<MenuContent>
|
|
103
|
+
<MenuList>
|
|
104
|
+
<MenuItem itemId={0}>Today</MenuItem>
|
|
105
|
+
<MenuItem itemId={1}>Yesterday</MenuItem>
|
|
106
|
+
<MenuItem itemId={2}>Last 7 days</MenuItem>
|
|
107
|
+
<MenuItem itemId={3}>Last 14 days</MenuItem>
|
|
108
|
+
</MenuList>
|
|
109
|
+
</MenuContent>
|
|
110
|
+
</Menu>
|
|
111
|
+
);
|
|
112
|
+
return <Popper trigger={toggle} popper={menu} isVisible={isOpen} popperMatchesTriggerWidth={false} />;
|
|
113
|
+
};
|
|
@@ -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
|
|
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
|
-
|
|
33
|
+
React.useEffect(() => {
|
|
39
34
|
if (readFileData.length < currentFiles.length) {
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
};
|