@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.
Files changed (87) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/esm/components/AlertGroup/AlertGroup.d.ts +4 -0
  3. package/dist/esm/components/AlertGroup/AlertGroup.d.ts.map +1 -1
  4. package/dist/esm/components/AlertGroup/AlertGroup.js +2 -2
  5. package/dist/esm/components/AlertGroup/AlertGroup.js.map +1 -1
  6. package/dist/esm/components/AlertGroup/AlertGroupInline.d.ts.map +1 -1
  7. package/dist/esm/components/AlertGroup/AlertGroupInline.js +5 -2
  8. package/dist/esm/components/AlertGroup/AlertGroupInline.js.map +1 -1
  9. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.d.ts +10 -2
  10. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.d.ts.map +1 -1
  11. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.js +9 -2
  12. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.js.map +1 -1
  13. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts +1 -1
  14. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts.map +1 -1
  15. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.js +21 -2
  16. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.js.map +1 -1
  17. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatusItem.js.map +1 -1
  18. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts +6 -2
  19. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts.map +1 -1
  20. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.js +9 -2
  21. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.js.map +1 -1
  22. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts +2 -0
  23. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts.map +1 -1
  24. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js +2 -4
  25. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js.map +1 -1
  26. package/dist/esm/components/MultipleFileUpload/index.d.ts +0 -6
  27. package/dist/esm/components/MultipleFileUpload/index.d.ts.map +1 -1
  28. package/dist/esm/components/MultipleFileUpload/index.js +0 -6
  29. package/dist/esm/components/MultipleFileUpload/index.js.map +1 -1
  30. package/dist/js/components/AlertGroup/AlertGroup.d.ts +4 -0
  31. package/dist/js/components/AlertGroup/AlertGroup.d.ts.map +1 -1
  32. package/dist/js/components/AlertGroup/AlertGroup.js +2 -2
  33. package/dist/js/components/AlertGroup/AlertGroup.js.map +1 -1
  34. package/dist/js/components/AlertGroup/AlertGroupInline.d.ts.map +1 -1
  35. package/dist/js/components/AlertGroup/AlertGroupInline.js +5 -2
  36. package/dist/js/components/AlertGroup/AlertGroupInline.js.map +1 -1
  37. package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.d.ts +10 -2
  38. package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.d.ts.map +1 -1
  39. package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.js +9 -2
  40. package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.js.map +1 -1
  41. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts +1 -1
  42. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts.map +1 -1
  43. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.js +21 -2
  44. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.js.map +1 -1
  45. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatusItem.js.map +1 -1
  46. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts +6 -2
  47. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts.map +1 -1
  48. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.js +9 -2
  49. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.js.map +1 -1
  50. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts +2 -0
  51. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts.map +1 -1
  52. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js +2 -4
  53. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js.map +1 -1
  54. package/dist/js/components/MultipleFileUpload/index.d.ts +0 -6
  55. package/dist/js/components/MultipleFileUpload/index.d.ts.map +1 -1
  56. package/dist/js/components/MultipleFileUpload/index.js +0 -6
  57. package/dist/js/components/MultipleFileUpload/index.js.map +1 -1
  58. package/dist/styles/assets/images/img_pie-chart-with-legend.png +0 -0
  59. package/dist/styles/assets/images/status-icon-sprite.svg +38 -0
  60. package/dist/umd/react-core.css +244 -47
  61. package/dist/umd/react-core.js +75 -47
  62. package/dist/umd/react-core.min.css +244 -47
  63. package/dist/umd/react-core.min.js +4 -4
  64. package/package.json +6 -6
  65. package/src/components/AlertGroup/AlertGroup.tsx +13 -2
  66. package/src/components/AlertGroup/AlertGroupInline.tsx +9 -0
  67. package/src/components/AlertGroup/__tests__/AlertGroup.test.tsx +15 -0
  68. package/src/components/AlertGroup/__tests__/__snapshots__/AlertGroup.test.tsx.snap +93 -1
  69. package/src/components/AlertGroup/examples/AlertGroup.md +147 -0
  70. package/src/components/MultipleFileUpload/MultipleFileUploadMain.tsx +29 -8
  71. package/src/components/MultipleFileUpload/MultipleFileUploadStatus.tsx +24 -4
  72. package/src/components/MultipleFileUpload/MultipleFileUploadStatusItem.tsx +1 -1
  73. package/src/components/MultipleFileUpload/MultipleFileUploadTitle.tsx +19 -5
  74. package/src/components/MultipleFileUpload/MultipleFileUploadTitleIcon.tsx +4 -3
  75. package/src/components/MultipleFileUpload/__tests__/MultipleFileUploadMain.test.tsx +19 -2
  76. package/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitle.test.tsx +17 -2
  77. package/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleIcon.test.tsx +1 -1
  78. package/src/components/MultipleFileUpload/__tests__/__snapshots__/MultipleFileUploadMain.test.tsx.snap +198 -2
  79. package/src/components/MultipleFileUpload/__tests__/__snapshots__/MultipleFileUploadTitle.test.tsx.snap +62 -4
  80. package/src/components/MultipleFileUpload/__tests__/__snapshots__/MultipleFileUploadTitleIcon.test.tsx.snap +2 -50
  81. package/src/components/MultipleFileUpload/examples/MultipleFileUpload.md +7 -60
  82. package/src/components/MultipleFileUpload/examples/MultipleFileUploadBasic.tsx +48 -74
  83. package/src/components/MultipleFileUpload/index.ts +0 -6
  84. package/src/demos/ComposableMenu/ComposableMenu.md +4 -9
  85. package/src/demos/ComposableMenu/examples/ComposableDateSelect.tsx +113 -0
  86. package/src/demos/MultipleFileUploadDemos.md +16 -0
  87. 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 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
  };