@patternfly/react-core 4.198.14 → 4.198.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/esm/components/Form/FormFieldGroup.d.ts +1 -1
  3. package/dist/esm/components/Form/FormFieldGroupExpandable.d.ts +2 -2
  4. package/dist/esm/components/Form/FormFieldGroupHeader.d.ts +3 -1
  5. package/dist/esm/components/Form/FormFieldGroupHeader.d.ts.map +1 -1
  6. package/dist/esm/components/Form/FormFieldGroupHeader.js.map +1 -1
  7. package/dist/esm/components/Form/InternalFormFieldGroup.d.ts +2 -2
  8. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.d.ts +10 -2
  9. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.d.ts.map +1 -1
  10. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.js +9 -2
  11. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadMain.js.map +1 -1
  12. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts +1 -1
  13. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts.map +1 -1
  14. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.js +21 -2
  15. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatus.js.map +1 -1
  16. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadStatusItem.js.map +1 -1
  17. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts +6 -2
  18. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts.map +1 -1
  19. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.js +9 -2
  20. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitle.js.map +1 -1
  21. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts +2 -0
  22. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts.map +1 -1
  23. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js +2 -4
  24. package/dist/esm/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js.map +1 -1
  25. package/dist/esm/components/MultipleFileUpload/index.d.ts +0 -6
  26. package/dist/esm/components/MultipleFileUpload/index.d.ts.map +1 -1
  27. package/dist/esm/components/MultipleFileUpload/index.js +0 -6
  28. package/dist/esm/components/MultipleFileUpload/index.js.map +1 -1
  29. package/dist/esm/components/Tabs/Tab.d.ts +3 -1
  30. package/dist/esm/components/Tabs/Tab.d.ts.map +1 -1
  31. package/dist/esm/components/Tabs/Tab.js +4 -3
  32. package/dist/esm/components/Tabs/Tab.js.map +1 -1
  33. package/dist/esm/components/Tabs/TabButton.d.ts +2 -0
  34. package/dist/esm/components/Tabs/TabButton.d.ts.map +1 -1
  35. package/dist/esm/components/Tabs/TabButton.js +2 -2
  36. package/dist/esm/components/Tabs/TabButton.js.map +1 -1
  37. package/dist/esm/components/Tile/Tile.d.ts.map +1 -1
  38. package/dist/esm/components/Tile/Tile.js +1 -1
  39. package/dist/esm/components/Tile/Tile.js.map +1 -1
  40. package/dist/js/components/Form/FormFieldGroup.d.ts +1 -1
  41. package/dist/js/components/Form/FormFieldGroupExpandable.d.ts +2 -2
  42. package/dist/js/components/Form/FormFieldGroupHeader.d.ts +3 -1
  43. package/dist/js/components/Form/FormFieldGroupHeader.d.ts.map +1 -1
  44. package/dist/js/components/Form/FormFieldGroupHeader.js.map +1 -1
  45. package/dist/js/components/Form/InternalFormFieldGroup.d.ts +2 -2
  46. package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.d.ts +10 -2
  47. package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.d.ts.map +1 -1
  48. package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.js +9 -2
  49. package/dist/js/components/MultipleFileUpload/MultipleFileUploadMain.js.map +1 -1
  50. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts +1 -1
  51. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.d.ts.map +1 -1
  52. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.js +21 -2
  53. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatus.js.map +1 -1
  54. package/dist/js/components/MultipleFileUpload/MultipleFileUploadStatusItem.js.map +1 -1
  55. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts +6 -2
  56. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.d.ts.map +1 -1
  57. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.js +9 -2
  58. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitle.js.map +1 -1
  59. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts +2 -0
  60. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.d.ts.map +1 -1
  61. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js +2 -4
  62. package/dist/js/components/MultipleFileUpload/MultipleFileUploadTitleIcon.js.map +1 -1
  63. package/dist/js/components/MultipleFileUpload/index.d.ts +0 -6
  64. package/dist/js/components/MultipleFileUpload/index.d.ts.map +1 -1
  65. package/dist/js/components/MultipleFileUpload/index.js +0 -6
  66. package/dist/js/components/MultipleFileUpload/index.js.map +1 -1
  67. package/dist/js/components/Tabs/Tab.d.ts +3 -1
  68. package/dist/js/components/Tabs/Tab.d.ts.map +1 -1
  69. package/dist/js/components/Tabs/Tab.js +4 -3
  70. package/dist/js/components/Tabs/Tab.js.map +1 -1
  71. package/dist/js/components/Tabs/TabButton.d.ts +2 -0
  72. package/dist/js/components/Tabs/TabButton.d.ts.map +1 -1
  73. package/dist/js/components/Tabs/TabButton.js +2 -2
  74. package/dist/js/components/Tabs/TabButton.js.map +1 -1
  75. package/dist/js/components/Tile/Tile.d.ts.map +1 -1
  76. package/dist/js/components/Tile/Tile.js +1 -1
  77. package/dist/js/components/Tile/Tile.js.map +1 -1
  78. package/dist/umd/react-core.css +10 -10
  79. package/dist/umd/react-core.js +65 -48
  80. package/dist/umd/react-core.min.css +10 -10
  81. package/dist/umd/react-core.min.js +4 -4
  82. package/package.json +5 -5
  83. package/src/components/Form/FormFieldGroup.tsx +1 -1
  84. package/src/components/Form/FormFieldGroupExpandable.tsx +2 -2
  85. package/src/components/Form/FormFieldGroupHeader.tsx +5 -1
  86. package/src/components/Form/InternalFormFieldGroup.tsx +2 -2
  87. package/src/components/Form/__tests__/FormFieldGroup.test.tsx +1 -1
  88. package/src/components/Form/__tests__/__snapshots__/FormFieldGroup.test.tsx.snap +1 -1
  89. package/src/components/Form/examples/Form.md +1 -1
  90. package/src/components/MultipleFileUpload/MultipleFileUploadMain.tsx +29 -8
  91. package/src/components/MultipleFileUpload/MultipleFileUploadStatus.tsx +24 -4
  92. package/src/components/MultipleFileUpload/MultipleFileUploadStatusItem.tsx +1 -1
  93. package/src/components/MultipleFileUpload/MultipleFileUploadTitle.tsx +19 -5
  94. package/src/components/MultipleFileUpload/MultipleFileUploadTitleIcon.tsx +4 -3
  95. package/src/components/MultipleFileUpload/__tests__/MultipleFileUploadMain.test.tsx +19 -2
  96. package/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitle.test.tsx +17 -2
  97. package/src/components/MultipleFileUpload/__tests__/MultipleFileUploadTitleIcon.test.tsx +1 -1
  98. package/src/components/MultipleFileUpload/__tests__/__snapshots__/MultipleFileUploadMain.test.tsx.snap +198 -2
  99. package/src/components/MultipleFileUpload/__tests__/__snapshots__/MultipleFileUploadTitle.test.tsx.snap +62 -4
  100. package/src/components/MultipleFileUpload/__tests__/__snapshots__/MultipleFileUploadTitleIcon.test.tsx.snap +2 -50
  101. package/src/components/MultipleFileUpload/examples/MultipleFileUpload.md +7 -60
  102. package/src/components/MultipleFileUpload/examples/MultipleFileUploadBasic.tsx +48 -74
  103. package/src/components/MultipleFileUpload/index.ts +0 -6
  104. package/src/components/Tabs/Tab.tsx +31 -24
  105. package/src/components/Tabs/TabButton.tsx +5 -1
  106. package/src/components/Tabs/examples/Tabs.md +527 -256
  107. package/src/components/Tile/Tile.tsx +3 -0
  108. package/src/components/Tile/__tests__/__snapshots__/Tile.test.tsx.snap +9 -0
  109. package/src/components/Tile/examples/Tile.md +41 -39
  110. package/src/demos/ComposableMenu/ComposableMenu.md +4 -9
  111. package/src/demos/ComposableMenu/examples/ComposableDateSelect.tsx +113 -0
  112. package/src/demos/MultipleFileUploadDemos.md +16 -0
  113. package/src/demos/TileDemo.md +17 -35
  114. package/src/{components/MultipleFileUpload/examples/MultipleFileUploadHorizontal.tsx → demos/examples/MultipleFileUpload/MultipleFileUploadRejectedFile.tsx} +60 -64
@@ -6,18 +6,76 @@ exports[`MultipleFileUploadTitle renders custom class names 1`] = `
6
6
  >
7
7
  <div
8
8
  className="pf-c-multiple-file-upload__title test"
9
- >
10
- Foo
11
- </div>
9
+ />
12
10
  </MultipleFileUploadTitle>
13
11
  `;
14
12
 
15
13
  exports[`MultipleFileUploadTitle renders with expected class names 1`] = `
16
14
  <MultipleFileUploadTitle>
15
+ <div
16
+ className="pf-c-multiple-file-upload__title"
17
+ />
18
+ </MultipleFileUploadTitle>
19
+ `;
20
+
21
+ exports[`MultipleFileUploadTitle renders with title icon 1`] = `
22
+ <MultipleFileUploadTitle
23
+ icon="icon"
24
+ >
25
+ <div
26
+ className="pf-c-multiple-file-upload__title"
27
+ >
28
+ <MultipleFileUploadTitleIcon>
29
+ <div
30
+ className="pf-c-multiple-file-upload__title-icon"
31
+ >
32
+ icon
33
+ </div>
34
+ </MultipleFileUploadTitleIcon>
35
+ </div>
36
+ </MultipleFileUploadTitle>
37
+ `;
38
+
39
+ exports[`MultipleFileUploadTitle renders with title text 1`] = `
40
+ <MultipleFileUploadTitle
41
+ text="text"
42
+ >
43
+ <div
44
+ className="pf-c-multiple-file-upload__title"
45
+ >
46
+ <MultipleFileUploadTitleText>
47
+ <div
48
+ className="pf-c-multiple-file-upload__title-text"
49
+ >
50
+ text
51
+ </div>
52
+ </MultipleFileUploadTitleText>
53
+ </div>
54
+ </MultipleFileUploadTitle>
55
+ `;
56
+
57
+ exports[`MultipleFileUploadTitle renders with title text separator 1`] = `
58
+ <MultipleFileUploadTitle
59
+ text="text"
60
+ textSeparator="text separator"
61
+ >
17
62
  <div
18
63
  className="pf-c-multiple-file-upload__title"
19
64
  >
20
- Foo
65
+ <MultipleFileUploadTitleText>
66
+ <div
67
+ className="pf-c-multiple-file-upload__title-text"
68
+ >
69
+ text
70
+ <MultipleFileUploadTitleTextSeparator>
71
+ <div
72
+ className="pf-c-multiple-file-upload__title-text-separator"
73
+ >
74
+ text separator
75
+ </div>
76
+ </MultipleFileUploadTitleTextSeparator>
77
+ </div>
78
+ </MultipleFileUploadTitleText>
21
79
  </div>
22
80
  </MultipleFileUploadTitle>
23
81
  `;
@@ -6,32 +6,7 @@ exports[`MultipleFileUploadTitleIcon renders custom class names 1`] = `
6
6
  >
7
7
  <div
8
8
  className="pf-c-multiple-file-upload__title-icon test"
9
- >
10
- <UploadIcon
11
- color="currentColor"
12
- noVerticalAlign={false}
13
- size="sm"
14
- >
15
- <svg
16
- aria-hidden={true}
17
- aria-labelledby={null}
18
- fill="currentColor"
19
- height="1em"
20
- role="img"
21
- style={
22
- Object {
23
- "verticalAlign": "-0.125em",
24
- }
25
- }
26
- viewBox="0 0 512 512"
27
- width="1em"
28
- >
29
- <path
30
- d="M296 384h-80c-13.3 0-24-10.7-24-24V192h-87.7c-17.8 0-26.7-21.5-14.1-34.1L242.3 5.7c7.5-7.5 19.8-7.5 27.3 0l152.2 152.2c12.6 12.6 3.7 34.1-14.1 34.1H320v168c0 13.3-10.7 24-24 24zm216-8v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h136v8c0 30.9 25.1 56 56 56h80c30.9 0 56-25.1 56-56v-8h136c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z"
31
- />
32
- </svg>
33
- </UploadIcon>
34
- </div>
9
+ />
35
10
  </MultipleFileUploadTitleIcon>
36
11
  `;
37
12
 
@@ -40,30 +15,7 @@ exports[`MultipleFileUploadTitleIcon renders with expected class names 1`] = `
40
15
  <div
41
16
  className="pf-c-multiple-file-upload__title-icon"
42
17
  >
43
- <UploadIcon
44
- color="currentColor"
45
- noVerticalAlign={false}
46
- size="sm"
47
- >
48
- <svg
49
- aria-hidden={true}
50
- aria-labelledby={null}
51
- fill="currentColor"
52
- height="1em"
53
- role="img"
54
- style={
55
- Object {
56
- "verticalAlign": "-0.125em",
57
- }
58
- }
59
- viewBox="0 0 512 512"
60
- width="1em"
61
- >
62
- <path
63
- d="M296 384h-80c-13.3 0-24-10.7-24-24V192h-87.7c-17.8 0-26.7-21.5-14.1-34.1L242.3 5.7c7.5-7.5 19.8-7.5 27.3 0l152.2 152.2c12.6 12.6 3.7 34.1-14.1 34.1H320v168c0 13.3-10.7 24-24 24zm216-8v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h136v8c0 30.9 25.1 56 56 56h80c30.9 0 56-25.1 56-56v-8h136c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z"
64
- />
65
- </svg>
66
- </UploadIcon>
18
+ Foo
67
19
  </div>
68
20
  </MultipleFileUploadTitleIcon>
69
21
  `;
@@ -6,70 +6,22 @@ propComponents:
6
6
  [
7
7
  'MultipleFileUpload',
8
8
  'MultipleFileUploadMain',
9
- 'MultipleFileUploadTitle',
10
- 'MultipleFileUploadTitleIcon',
11
- 'MultipleFileUploadTitleText',
12
- 'MultipleFileUploadTitleTextSeparator',
13
- 'MultipleFileUploadButton',
14
- 'MultipleFileUploadInfo',
15
9
  'MultipleFileUploadStatus',
16
10
  'MultipleFileUploadStatusItem',
17
11
  ]
18
12
  beta: true
19
13
  ---
20
14
 
21
- import InProgressIcon from '@patternfly/react-icons/dist/esm/icons/in-progress-icon';
22
- import CheckCircleIcon from '@patternfly/react-icons/dist/esm/icons/check-circle-icon';
23
- import TimesCircleIcon from '@patternfly/react-icons/dist/esm/icons/times-circle-icon';
15
+ import UploadIcon from '@patternfly/react-icons/dist/esm/icons/upload-icon';
24
16
 
25
17
  File upload - multiple is able to:
26
18
 
27
- - accept one or more files via browse or drag-and-drop
28
- - provide their data to you using file objects via the `onFileDrop` callback prop
29
- - read files as dataURLs, calling provided callbacks as needed when files start/finish being read, as well as when the read succeeds or fails
30
- - display (in real time) the upload progress/status of each file
31
- - uploaded files are represented by the `MultipleFileUploadStatusItem` component, this component includes the aforementioned built-in file reading logic
32
- - if you prefer to supply your own file reading logic and strictly use `MultipleFileUploadStatusItem` as a display component, the `customFileHandler`, `fileName`, `fileSize`, `progressValue`, and `progressVariant` props exist to allow you to do that
33
-
34
- ### General intended structure
35
-
36
- File upload - multiple is designed in a composable manner to maximize flexibility. The general intended component relationships are arranged similarly to:
37
-
38
- ```js noLive
39
- import {
40
- MultipleFileUpload,
41
- MultipleFileUploadInfo,
42
- MultipleFileUploadMain,
43
- MultipleFileUploadTitle,
44
- MultipleFileUploadTitleIcon,
45
- MultipleFileUploadTitleText,
46
- MultipleFileUploadTitleTextSeparator,
47
- MultipleFileUploadButton,
48
- MultipleFileUploadStatus,
49
- MultipleFileUploadStatusItem
50
- } from '@patternfly/react-core';
51
-
52
- <MultipleFileUpload>
53
- <MultipleFileUploadMain>
54
- <MultipleFileUploadTitle>
55
- <MultipleFileUploadTitleIcon />
56
-
57
- <MultipleFileUploadTitleText>
58
- main title text
59
- <MultipleFileUploadTitleTextSeparator>title text separator</MultipleFileUploadTitleTextSeparator>
60
- </MultipleFileUploadTitleText>
61
- </MultipleFileUploadTitle>
62
-
63
- <MultipleFileUploadButton />
64
-
65
- <MultipleFileUploadInfo>Accepted file types: x, y, z</MultipleFileUploadInfo>
66
- </MultipleFileUploadMain>
67
-
68
- <MultipleFileUploadStatus>
69
- <MultipleFileUploadStatusItem />
70
- </MultipleFileUploadStatus>
71
- </MultipleFileUpload>
72
- ```
19
+ - Accept one or more files via browse or drag-and-drop
20
+ - Provide their data to you using file objects via the `onFileDrop` callback prop
21
+ - Read files as dataURLs, calling provided callbacks as needed when files start/finish being read, as well as when the read succeeds or fails
22
+ - Display (in real time) the upload progress/status of each file
23
+ - Uploaded files are represented by the multiple file upload status item component, this component includes the aforementioned built-in file reading logic
24
+ - If you prefer to supply your own file reading logic and strictly use multiple file upload status item as a display component, the `customFileHandler`, `fileName`, `fileSize`, `progressValue`, and `progressVariant` props exist to allow you to do that
73
25
 
74
26
  ### Restricting file size and type
75
27
 
@@ -85,8 +37,3 @@ Restricting file sizes and types in this way is for user convenience only, and i
85
37
 
86
38
  ```ts file="./MultipleFileUploadBasic.tsx"
87
39
  ```
88
-
89
- ### Horizontal
90
-
91
- ```ts file="./MultipleFileUploadHorizontal.tsx"
92
- ```
@@ -1,20 +1,12 @@
1
1
  import React from 'react';
2
2
  import {
3
3
  MultipleFileUpload,
4
- MultipleFileUploadInfo,
5
4
  MultipleFileUploadMain,
6
- MultipleFileUploadTitle,
7
- MultipleFileUploadTitleIcon,
8
- MultipleFileUploadTitleText,
9
- MultipleFileUploadTitleTextSeparator,
10
- MultipleFileUploadButton,
11
5
  MultipleFileUploadStatus,
12
6
  MultipleFileUploadStatusItem,
13
- Modal
7
+ Checkbox
14
8
  } from '@patternfly/react-core';
15
- import InProgressIcon from '@patternfly/react-icons/dist/esm/icons/in-progress-icon';
16
- import CheckCircleIcon from '@patternfly/react-icons/dist/esm/icons/check-circle-icon';
17
- import TimesCircleIcon from '@patternfly/react-icons/dist/esm/icons/times-circle-icon';
9
+ import UploadIcon from '@patternfly/react-icons/dist/esm/icons/upload-icon';
18
10
 
19
11
  interface readFile {
20
12
  fileName: string;
@@ -24,10 +16,11 @@ interface readFile {
24
16
  }
25
17
 
26
18
  export const MultipleFileUploadBasic: React.FunctionComponent = () => {
19
+ const [isHorizontal, setIsHorizontal] = React.useState(false);
27
20
  const [currentFiles, setCurrentFiles] = React.useState<File[]>([]);
28
21
  const [readFileData, setReadFileData] = React.useState<readFile[]>([]);
29
22
  const [showStatus, setShowStatus] = React.useState(false);
30
- const [modalText, setModalText] = React.useState('');
23
+ const [statusIcon, setStatusIcon] = React.useState('inProgress');
31
24
 
32
25
  // only show the status component once a file has been uploaded, but keep the status list component itself even if all files are removed
33
26
  if (!showStatus && currentFiles.length > 0) {
@@ -35,17 +28,15 @@ export const MultipleFileUploadBasic: React.FunctionComponent = () => {
35
28
  }
36
29
 
37
30
  // determine the icon that should be shown for the overall status list
38
- const getStatusIcon = () => {
31
+ React.useEffect(() => {
39
32
  if (readFileData.length < currentFiles.length) {
40
- return <InProgressIcon />;
41
- }
42
-
43
- if (readFileData.every(file => file.loadResult === 'success')) {
44
- return <CheckCircleIcon />;
33
+ setStatusIcon('inProgress');
34
+ } else if (readFileData.every(file => file.loadResult === 'success')) {
35
+ setStatusIcon('success');
36
+ } else {
37
+ setStatusIcon('danger');
45
38
  }
46
-
47
- return <TimesCircleIcon />;
48
- };
39
+ }, [readFileData, currentFiles]);
49
40
 
50
41
  // remove files from both state arrays based on their name
51
42
  const removeFiles = (namesOfFilesToRemove: string[]) => {
@@ -88,63 +79,46 @@ export const MultipleFileUploadBasic: React.FunctionComponent = () => {
88
79
  ]);
89
80
  };
90
81
 
91
- // dropzone prop that communicates to the user that files they've attempted to upload are not an appropriate type
92
- const handleDropRejected = (files: File[], _event: React.DragEvent<HTMLElement>) => {
93
- if (files.length === 1) {
94
- setModalText(`${files[0].name} is not an accepted file type`);
95
- } else {
96
- const rejectedMessages = files.reduce((acc, file) => (acc += `${file.name}, `), '');
97
- setModalText(`${rejectedMessages}are not accepted file types`);
98
- }
99
- };
100
-
101
82
  const successfullyReadFileCount = readFileData.filter(fileData => fileData.loadResult === 'success').length;
102
83
 
103
84
  return (
104
- <MultipleFileUpload
105
- onFileDrop={handleFileDrop}
106
- dropzoneProps={{
107
- accept: 'image/jpeg, application/msword, application/pdf, image/png',
108
- onDropRejected: handleDropRejected
109
- }}
110
- >
111
- <MultipleFileUploadMain>
112
- <MultipleFileUploadTitle>
113
- <MultipleFileUploadTitleIcon />
114
- <MultipleFileUploadTitleText>
115
- Drag and drop files here
116
- <MultipleFileUploadTitleTextSeparator>or</MultipleFileUploadTitleTextSeparator>
117
- </MultipleFileUploadTitleText>
118
- </MultipleFileUploadTitle>
119
- <MultipleFileUploadButton />
120
- <MultipleFileUploadInfo>Accepted file types: JPEG, Doc, PDF, PNG</MultipleFileUploadInfo>
121
- </MultipleFileUploadMain>
122
- {showStatus && (
123
- <MultipleFileUploadStatus
124
- statusToggleText={`${successfullyReadFileCount} of ${currentFiles.length} files uploaded`}
125
- statusToggleIcon={getStatusIcon()}
126
- >
127
- {currentFiles.map(file => (
128
- <MultipleFileUploadStatusItem
129
- file={file}
130
- key={file.name}
131
- onClearClick={() => removeFiles([file.name])}
132
- onReadSuccess={handleReadSuccess}
133
- onReadFail={handleReadFail}
134
- />
135
- ))}
136
- </MultipleFileUploadStatus>
137
- )}
138
- <Modal
139
- isOpen={!!modalText}
140
- title="Unsupported file"
141
- titleIconVariant="warning"
142
- showClose
143
- aria-label="unsupported file upload attempted"
144
- onClose={() => setModalText('')}
85
+ <>
86
+ <MultipleFileUpload
87
+ onFileDrop={handleFileDrop}
88
+ dropzoneProps={{
89
+ accept: 'image/jpeg, application/msword, application/pdf, image/png'
90
+ }}
91
+ isHorizontal={isHorizontal}
145
92
  >
146
- {modalText}
147
- </Modal>
148
- </MultipleFileUpload>
93
+ <MultipleFileUploadMain
94
+ titleIcon={<UploadIcon />}
95
+ titleText="Drag and drop files here"
96
+ titleTextSeparator="or"
97
+ infoText="Accepted file types: JPEG, Doc, PDF, PNG"
98
+ />
99
+ {showStatus && (
100
+ <MultipleFileUploadStatus
101
+ statusToggleText={`${successfullyReadFileCount} of ${currentFiles.length} files uploaded`}
102
+ statusToggleIcon={statusIcon}
103
+ >
104
+ {currentFiles.map(file => (
105
+ <MultipleFileUploadStatusItem
106
+ file={file}
107
+ key={file.name}
108
+ onClearClick={() => removeFiles([file.name])}
109
+ onReadSuccess={handleReadSuccess}
110
+ onReadFail={handleReadFail}
111
+ />
112
+ ))}
113
+ </MultipleFileUploadStatus>
114
+ )}
115
+ </MultipleFileUpload>
116
+ <Checkbox
117
+ id="horizontal-checkbox"
118
+ label="Show as horizontal"
119
+ isChecked={isHorizontal}
120
+ onChange={() => setIsHorizontal(!isHorizontal)}
121
+ />
122
+ </>
149
123
  );
150
124
  };
@@ -1,10 +1,4 @@
1
1
  export * from './MultipleFileUpload';
2
- export * from './MultipleFileUploadInfo';
3
2
  export * from './MultipleFileUploadMain';
4
- export * from './MultipleFileUploadTitle';
5
- export * from './MultipleFileUploadTitleIcon';
6
- export * from './MultipleFileUploadTitleText';
7
- export * from './MultipleFileUploadTitleTextSeparator';
8
- export * from './MultipleFileUploadButton';
9
3
  export * from './MultipleFileUploadStatus';
10
4
  export * from './MultipleFileUploadStatusItem';
@@ -4,6 +4,7 @@ import { OUIAProps } from '../../helpers';
4
4
  import { TabButton } from './TabButton';
5
5
  import { TabsContext } from './TabsContext';
6
6
  import { css } from '@patternfly/react-styles';
7
+ import { Tooltip } from '../Tooltip';
7
8
 
8
9
  export interface TabProps extends Omit<React.HTMLProps<HTMLAnchorElement | HTMLButtonElement>, 'title'>, OUIAProps {
9
10
  /** content rendered inside the Tab content area. */
@@ -30,6 +31,8 @@ export interface TabProps extends Omit<React.HTMLProps<HTMLAnchorElement | HTMLB
30
31
  inoperableEvents?: string[];
31
32
  /** Forwarded ref */
32
33
  innerRef?: React.Ref<any>;
34
+ /** Optional Tooltip rendered to a Tab. Should be <Tooltip> with appropriate props for proper rendering. */
35
+ tooltip?: React.ReactElement<any>;
33
36
  }
34
37
 
35
38
  const TabBase: React.FunctionComponent<TabProps> = ({
@@ -45,6 +48,7 @@ const TabBase: React.FunctionComponent<TabProps> = ({
45
48
  inoperableEvents = ['onClick', 'onKeyPress'],
46
49
  href,
47
50
  innerRef,
51
+ tooltip,
48
52
  ...props
49
53
  }: TabProps) => {
50
54
  const preventedEvents = inoperableEvents.reduce(
@@ -69,31 +73,34 @@ const TabBase: React.FunctionComponent<TabProps> = ({
69
73
  return null;
70
74
  }
71
75
  };
72
- return (
73
- <li
74
- className={css(styles.tabsItem, eventKey === localActiveKey && styles.modifiers.current, childClassName)}
75
- ref={innerRef}
76
+
77
+ const tabButton = (
78
+ <TabButton
79
+ parentInnerRef={innerRef}
80
+ className={css(
81
+ styles.tabsLink,
82
+ isDisabled && href && styles.modifiers.disabled,
83
+ isAriaDisabled && styles.modifiers.ariaDisabled
84
+ )}
85
+ disabled={isButtonElement ? isDisabled : null}
86
+ aria-disabled={isDisabled || isAriaDisabled}
87
+ tabIndex={getDefaultTabIdx()}
88
+ onClick={(event: any) => handleTabClick(event, eventKey, tabContentRef)}
89
+ {...(isAriaDisabled ? preventedEvents : null)}
90
+ id={`pf-tab-${eventKey}-${childId || uniqueId}`}
91
+ aria-controls={ariaControls}
92
+ tabContentRef={tabContentRef}
93
+ ouiaId={childOuiaId}
94
+ href={href}
95
+ {...props}
76
96
  >
77
- <TabButton
78
- className={css(
79
- styles.tabsLink,
80
- isDisabled && href && styles.modifiers.disabled,
81
- isAriaDisabled && styles.modifiers.ariaDisabled
82
- )}
83
- disabled={isButtonElement ? isDisabled : null}
84
- aria-disabled={isDisabled || isAriaDisabled}
85
- tabIndex={getDefaultTabIdx()}
86
- onClick={(event: any) => handleTabClick(event, eventKey, tabContentRef)}
87
- {...(isAriaDisabled ? preventedEvents : null)}
88
- id={`pf-tab-${eventKey}-${childId || uniqueId}`}
89
- aria-controls={ariaControls}
90
- tabContentRef={tabContentRef}
91
- ouiaId={childOuiaId}
92
- href={href}
93
- {...props}
94
- >
95
- {title}
96
- </TabButton>
97
+ {title}
98
+ </TabButton>
99
+ );
100
+
101
+ return (
102
+ <li className={css(styles.tabsItem, eventKey === localActiveKey && styles.modifiers.current, childClassName)}>
103
+ {tooltip ? <Tooltip {...tooltip.props}>{tabButton}</Tooltip> : tabButton}
97
104
  </li>
98
105
  );
99
106
  };
@@ -10,6 +10,8 @@ export interface TabButtonProps extends Omit<React.HTMLProps<HTMLAnchorElement |
10
10
  href?: string;
11
11
  /** child reference for case in which a TabContent section is defined outside of a Tabs component */
12
12
  tabContentRef?: React.Ref<any>;
13
+ /** Parents' innerRef passed down for properly displaying Tooltips */
14
+ parentInnerRef?: React.Ref<any>;
13
15
  }
14
16
 
15
17
  export const TabButton: React.FunctionComponent<TabButtonProps> = ({
@@ -17,12 +19,14 @@ export const TabButton: React.FunctionComponent<TabButtonProps> = ({
17
19
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
18
20
  tabContentRef,
19
21
  ouiaId,
22
+ parentInnerRef,
20
23
  ouiaSafe,
21
24
  ...props
22
25
  }: TabButtonProps) => {
23
26
  const Component = (props.href ? 'a' : 'button') as any;
27
+
24
28
  return (
25
- <Component {...getOUIAProps(TabButton.displayName, ouiaId, ouiaSafe)} {...props}>
29
+ <Component ref={parentInnerRef} {...getOUIAProps(TabButton.displayName, ouiaId, ouiaSafe)} {...props}>
26
30
  {children}
27
31
  </Component>
28
32
  );