@patternfly/react-core 5.2.0-prerelease.40 → 5.2.0-prerelease.41

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 (254) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/components/package.json +1 -1
  3. package/deprecated/package.json +1 -1
  4. package/dist/dynamic/components/AboutModal/package.json +1 -1
  5. package/dist/dynamic/components/Accordion/package.json +1 -1
  6. package/dist/dynamic/components/ActionList/package.json +1 -1
  7. package/dist/dynamic/components/Alert/package.json +1 -1
  8. package/dist/dynamic/components/Avatar/package.json +1 -1
  9. package/dist/dynamic/components/BackToTop/package.json +1 -1
  10. package/dist/dynamic/components/Backdrop/package.json +1 -1
  11. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  12. package/dist/dynamic/components/Badge/package.json +1 -1
  13. package/dist/dynamic/components/Banner/package.json +1 -1
  14. package/dist/dynamic/components/Brand/package.json +1 -1
  15. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  16. package/dist/dynamic/components/Button/package.json +1 -1
  17. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  18. package/dist/dynamic/components/Card/package.json +1 -1
  19. package/dist/dynamic/components/Checkbox/package.json +1 -1
  20. package/dist/dynamic/components/Chip/package.json +1 -1
  21. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  22. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  23. package/dist/dynamic/components/DataList/package.json +1 -1
  24. package/dist/dynamic/components/DatePicker/package.json +1 -1
  25. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  26. package/dist/dynamic/components/Divider/package.json +1 -1
  27. package/dist/dynamic/components/DragDrop/package.json +1 -1
  28. package/dist/dynamic/components/Drawer/package.json +1 -1
  29. package/dist/dynamic/components/Dropdown/package.json +1 -1
  30. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  31. package/dist/dynamic/components/EmptyState/package.json +1 -1
  32. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  33. package/dist/dynamic/components/FileUpload/package.json +1 -1
  34. package/dist/dynamic/components/Form/package.json +1 -1
  35. package/dist/dynamic/components/FormSelect/package.json +1 -1
  36. package/dist/dynamic/components/HelperText/package.json +1 -1
  37. package/dist/dynamic/components/Hint/package.json +1 -1
  38. package/dist/dynamic/components/Icon/package.json +1 -1
  39. package/dist/dynamic/components/InputGroup/package.json +1 -1
  40. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  41. package/dist/dynamic/components/Label/package.json +1 -1
  42. package/dist/dynamic/components/List/package.json +1 -1
  43. package/dist/dynamic/components/LoginPage/package.json +1 -1
  44. package/dist/dynamic/components/Masthead/package.json +1 -1
  45. package/dist/dynamic/components/Menu/package.json +1 -1
  46. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  47. package/dist/dynamic/components/Modal/package.json +1 -1
  48. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  49. package/dist/dynamic/components/Nav/package.json +1 -1
  50. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  51. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  52. package/dist/dynamic/components/NumberInput/package.json +1 -1
  53. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  54. package/dist/dynamic/components/Page/package.json +1 -1
  55. package/dist/dynamic/components/Pagination/package.json +1 -1
  56. package/dist/dynamic/components/Panel/package.json +1 -1
  57. package/dist/dynamic/components/Popover/package.json +1 -1
  58. package/dist/dynamic/components/Progress/package.json +1 -1
  59. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  60. package/dist/dynamic/components/Radio/package.json +1 -1
  61. package/dist/dynamic/components/SearchInput/package.json +1 -1
  62. package/dist/dynamic/components/Select/package.json +1 -1
  63. package/dist/dynamic/components/Sidebar/package.json +1 -1
  64. package/dist/dynamic/components/SimpleList/package.json +1 -1
  65. package/dist/dynamic/components/Skeleton/package.json +1 -1
  66. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  67. package/dist/dynamic/components/Slider/package.json +1 -1
  68. package/dist/dynamic/components/Spinner/package.json +1 -1
  69. package/dist/dynamic/components/Switch/package.json +1 -1
  70. package/dist/dynamic/components/Tabs/package.json +1 -1
  71. package/dist/dynamic/components/Text/package.json +1 -1
  72. package/dist/dynamic/components/TextArea/package.json +1 -1
  73. package/dist/dynamic/components/TextInput/package.json +1 -1
  74. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  75. package/dist/dynamic/components/Tile/package.json +1 -1
  76. package/dist/dynamic/components/TimePicker/package.json +1 -1
  77. package/dist/dynamic/components/Timestamp/package.json +1 -1
  78. package/dist/dynamic/components/Title/package.json +1 -1
  79. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  80. package/dist/dynamic/components/Toolbar/package.json +1 -1
  81. package/dist/dynamic/components/Tooltip/package.json +1 -1
  82. package/dist/dynamic/components/TreeView/package.json +1 -1
  83. package/dist/dynamic/components/Truncate/package.json +1 -1
  84. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  85. package/dist/dynamic/components/Wizard/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Dropdown/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/OptionsMenu/package.json +1 -1
  90. package/dist/dynamic/deprecated/components/PageHeader/package.json +1 -1
  91. package/dist/dynamic/deprecated/components/Select/package.json +1 -1
  92. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  93. package/dist/dynamic/deprecated/components/package.json +1 -1
  94. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  95. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  96. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  97. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  98. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  99. package/dist/dynamic/helpers/constants/package.json +1 -1
  100. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  101. package/dist/dynamic/helpers/favorites/package.json +1 -1
  102. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  103. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  104. package/dist/dynamic/helpers/package.json +1 -1
  105. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  106. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  107. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  108. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  109. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  110. package/dist/dynamic/helpers/util/package.json +1 -1
  111. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  112. package/dist/dynamic/layouts/Flex/package.json +1 -1
  113. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  114. package/dist/dynamic/layouts/Grid/package.json +1 -1
  115. package/dist/dynamic/layouts/Level/package.json +1 -1
  116. package/dist/dynamic/layouts/Split/package.json +1 -1
  117. package/dist/dynamic/layouts/Stack/package.json +1 -1
  118. package/dist/dynamic/next/components/Modal/package.json +1 -0
  119. package/dist/dynamic/next/components/package.json +1 -1
  120. package/dist/esm/next/components/Modal/Modal.d.ts +73 -0
  121. package/dist/esm/next/components/Modal/Modal.d.ts.map +1 -0
  122. package/dist/esm/next/components/Modal/Modal.js +114 -0
  123. package/dist/esm/next/components/Modal/Modal.js.map +1 -0
  124. package/dist/esm/next/components/Modal/ModalBody.d.ts +19 -0
  125. package/dist/esm/next/components/Modal/ModalBody.d.ts.map +1 -0
  126. package/dist/esm/next/components/Modal/ModalBody.js +11 -0
  127. package/dist/esm/next/components/Modal/ModalBody.js.map +1 -0
  128. package/dist/esm/next/components/Modal/ModalBox.d.ts +21 -0
  129. package/dist/esm/next/components/Modal/ModalBox.d.ts.map +1 -0
  130. package/dist/esm/next/components/Modal/ModalBox.js +15 -0
  131. package/dist/esm/next/components/Modal/ModalBox.js.map +1 -0
  132. package/dist/esm/next/components/Modal/ModalBoxCloseButton.d.ts +14 -0
  133. package/dist/esm/next/components/Modal/ModalBoxCloseButton.d.ts.map +1 -0
  134. package/dist/esm/next/components/Modal/ModalBoxCloseButton.js +14 -0
  135. package/dist/esm/next/components/Modal/ModalBoxCloseButton.js.map +1 -0
  136. package/dist/esm/next/components/Modal/ModalBoxDescription.d.ts +11 -0
  137. package/dist/esm/next/components/Modal/ModalBoxDescription.d.ts.map +1 -0
  138. package/dist/esm/next/components/Modal/ModalBoxDescription.js +10 -0
  139. package/dist/esm/next/components/Modal/ModalBoxDescription.js.map +1 -0
  140. package/dist/esm/next/components/Modal/ModalBoxTitle.d.ts +17 -0
  141. package/dist/esm/next/components/Modal/ModalBoxTitle.d.ts.map +1 -0
  142. package/dist/esm/next/components/Modal/ModalBoxTitle.js +38 -0
  143. package/dist/esm/next/components/Modal/ModalBoxTitle.js.map +1 -0
  144. package/dist/esm/next/components/Modal/ModalContent.d.ts +42 -0
  145. package/dist/esm/next/components/Modal/ModalContent.d.ts.map +1 -0
  146. package/dist/esm/next/components/Modal/ModalContent.js +45 -0
  147. package/dist/esm/next/components/Modal/ModalContent.js.map +1 -0
  148. package/dist/esm/next/components/Modal/ModalFooter.d.ts +10 -0
  149. package/dist/esm/next/components/Modal/ModalFooter.d.ts.map +1 -0
  150. package/dist/esm/next/components/Modal/ModalFooter.js +10 -0
  151. package/dist/esm/next/components/Modal/ModalFooter.js.map +1 -0
  152. package/dist/esm/next/components/Modal/ModalHeader.d.ts +25 -0
  153. package/dist/esm/next/components/Modal/ModalHeader.d.ts.map +1 -0
  154. package/dist/esm/next/components/Modal/ModalHeader.js +21 -0
  155. package/dist/esm/next/components/Modal/ModalHeader.js.map +1 -0
  156. package/dist/esm/next/components/Modal/index.d.ts +5 -0
  157. package/dist/esm/next/components/Modal/index.d.ts.map +1 -0
  158. package/dist/esm/next/components/Modal/index.js +5 -0
  159. package/dist/esm/next/components/Modal/index.js.map +1 -0
  160. package/dist/esm/next/components/index.d.ts +1 -1
  161. package/dist/esm/next/components/index.d.ts.map +1 -1
  162. package/dist/esm/next/components/index.js +1 -1
  163. package/dist/esm/next/components/index.js.map +1 -1
  164. package/dist/js/next/components/Modal/Modal.d.ts +73 -0
  165. package/dist/js/next/components/Modal/Modal.d.ts.map +1 -0
  166. package/dist/js/next/components/Modal/Modal.js +117 -0
  167. package/dist/js/next/components/Modal/Modal.js.map +1 -0
  168. package/dist/js/next/components/Modal/ModalBody.d.ts +19 -0
  169. package/dist/js/next/components/Modal/ModalBody.d.ts.map +1 -0
  170. package/dist/js/next/components/Modal/ModalBody.js +15 -0
  171. package/dist/js/next/components/Modal/ModalBody.js.map +1 -0
  172. package/dist/js/next/components/Modal/ModalBox.d.ts +21 -0
  173. package/dist/js/next/components/Modal/ModalBox.d.ts.map +1 -0
  174. package/dist/js/next/components/Modal/ModalBox.js +19 -0
  175. package/dist/js/next/components/Modal/ModalBox.js.map +1 -0
  176. package/dist/js/next/components/Modal/ModalBoxCloseButton.d.ts +14 -0
  177. package/dist/js/next/components/Modal/ModalBoxCloseButton.d.ts.map +1 -0
  178. package/dist/js/next/components/Modal/ModalBoxCloseButton.js +18 -0
  179. package/dist/js/next/components/Modal/ModalBoxCloseButton.js.map +1 -0
  180. package/dist/js/next/components/Modal/ModalBoxDescription.d.ts +11 -0
  181. package/dist/js/next/components/Modal/ModalBoxDescription.d.ts.map +1 -0
  182. package/dist/js/next/components/Modal/ModalBoxDescription.js +14 -0
  183. package/dist/js/next/components/Modal/ModalBoxDescription.js.map +1 -0
  184. package/dist/js/next/components/Modal/ModalBoxTitle.d.ts +17 -0
  185. package/dist/js/next/components/Modal/ModalBoxTitle.d.ts.map +1 -0
  186. package/dist/js/next/components/Modal/ModalBoxTitle.js +43 -0
  187. package/dist/js/next/components/Modal/ModalBoxTitle.js.map +1 -0
  188. package/dist/js/next/components/Modal/ModalContent.d.ts +42 -0
  189. package/dist/js/next/components/Modal/ModalContent.d.ts.map +1 -0
  190. package/dist/js/next/components/Modal/ModalContent.js +49 -0
  191. package/dist/js/next/components/Modal/ModalContent.js.map +1 -0
  192. package/dist/js/next/components/Modal/ModalFooter.d.ts +10 -0
  193. package/dist/js/next/components/Modal/ModalFooter.d.ts.map +1 -0
  194. package/dist/js/next/components/Modal/ModalFooter.js +14 -0
  195. package/dist/js/next/components/Modal/ModalFooter.js.map +1 -0
  196. package/dist/js/next/components/Modal/ModalHeader.d.ts +25 -0
  197. package/dist/js/next/components/Modal/ModalHeader.d.ts.map +1 -0
  198. package/dist/js/next/components/Modal/ModalHeader.js +25 -0
  199. package/dist/js/next/components/Modal/ModalHeader.js.map +1 -0
  200. package/dist/js/next/components/Modal/index.d.ts +5 -0
  201. package/dist/js/next/components/Modal/index.d.ts.map +1 -0
  202. package/dist/js/next/components/Modal/index.js +8 -0
  203. package/dist/js/next/components/Modal/index.js.map +1 -0
  204. package/dist/js/next/components/index.d.ts +1 -1
  205. package/dist/js/next/components/index.d.ts.map +1 -1
  206. package/dist/js/next/components/index.js +1 -1
  207. package/dist/js/next/components/index.js.map +1 -1
  208. package/helpers/package.json +1 -1
  209. package/layouts/package.json +1 -1
  210. package/next/package.json +1 -1
  211. package/package.json +2 -2
  212. package/src/next/components/Modal/Modal.tsx +202 -0
  213. package/src/next/components/Modal/ModalBody.tsx +42 -0
  214. package/src/next/components/Modal/ModalBox.tsx +63 -0
  215. package/src/next/components/Modal/ModalBoxCloseButton.tsx +38 -0
  216. package/src/next/components/Modal/ModalBoxDescription.tsx +24 -0
  217. package/src/next/components/Modal/ModalBoxTitle.tsx +75 -0
  218. package/src/next/components/Modal/ModalContent.tsx +131 -0
  219. package/src/next/components/Modal/ModalFooter.tsx +23 -0
  220. package/src/next/components/Modal/ModalHeader.tsx +71 -0
  221. package/src/next/components/Modal/__tests__/Modal.test.tsx +145 -0
  222. package/src/next/components/Modal/__tests__/ModalBody.test.tsx +60 -0
  223. package/src/next/components/Modal/__tests__/ModalBox.test.tsx +58 -0
  224. package/src/next/components/Modal/__tests__/ModalBoxCloseButton.test.tsx +18 -0
  225. package/src/next/components/Modal/__tests__/ModalBoxDescription.test.tsx +8 -0
  226. package/src/next/components/Modal/__tests__/ModalBoxHeader.test.tsx +21 -0
  227. package/src/next/components/Modal/__tests__/ModalBoxTitle.test.tsx +37 -0
  228. package/src/next/components/Modal/__tests__/ModalContent.test.tsx +46 -0
  229. package/src/next/components/Modal/__tests__/ModalFooter.test.tsx +8 -0
  230. package/src/next/components/Modal/__tests__/__snapshots__/ModalBody.test.tsx.snap +12 -0
  231. package/src/next/components/Modal/__tests__/__snapshots__/ModalBox.test.tsx.snap +86 -0
  232. package/src/next/components/Modal/__tests__/__snapshots__/ModalBoxDescription.test.tsx.snap +12 -0
  233. package/src/next/components/Modal/__tests__/__snapshots__/ModalBoxHeader.test.tsx.snap +46 -0
  234. package/src/next/components/Modal/__tests__/__snapshots__/ModalBoxTitle.test.tsx.snap +218 -0
  235. package/src/next/components/Modal/__tests__/__snapshots__/ModalContent.test.tsx.snap +128 -0
  236. package/src/next/components/Modal/__tests__/__snapshots__/ModalFooter.test.tsx.snap +11 -0
  237. package/src/next/components/Modal/examples/Modal.md +148 -0
  238. package/src/next/components/Modal/examples/ModalBasic.tsx +43 -0
  239. package/src/next/components/Modal/examples/ModalCustomFocus.tsx +43 -0
  240. package/src/next/components/Modal/examples/ModalCustomHeader.tsx +58 -0
  241. package/src/next/components/Modal/examples/ModalCustomTitleIcon.tsx +54 -0
  242. package/src/next/components/Modal/examples/ModalCustomWidth.tsx +43 -0
  243. package/src/next/components/Modal/examples/ModalNoHeaderFooter.tsx +40 -0
  244. package/src/next/components/Modal/examples/ModalSize.tsx +63 -0
  245. package/src/next/components/Modal/examples/ModalTitleIcon.tsx +48 -0
  246. package/src/next/components/Modal/examples/ModalTopAligned.tsx +43 -0
  247. package/src/next/components/Modal/examples/ModalWithDescription.tsx +80 -0
  248. package/src/next/components/Modal/examples/ModalWithDropdown.tsx +105 -0
  249. package/src/next/components/Modal/examples/ModalWithForm.tsx +211 -0
  250. package/src/next/components/Modal/examples/ModalWithHelp.tsx +63 -0
  251. package/src/next/components/Modal/examples/ModalWithOverflowingContent.tsx +75 -0
  252. package/src/next/components/Modal/examples/ModalWithWizard.tsx +59 -0
  253. package/src/next/components/Modal/index.ts +4 -0
  254. package/src/next/components/index.ts +1 -1
@@ -0,0 +1,48 @@
1
+ import React from 'react';
2
+ import { Button } from '@patternfly/react-core';
3
+ import { Modal, ModalBody, ModalFooter, ModalHeader } from '@patternfly/react-core/next';
4
+
5
+ export const ModalTitleIcon: React.FunctionComponent = () => {
6
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
7
+
8
+ const handleModalToggle = (_event: KeyboardEvent | React.MouseEvent) => {
9
+ setIsModalOpen(!isModalOpen);
10
+ };
11
+
12
+ return (
13
+ <React.Fragment>
14
+ <Button variant="primary" onClick={handleModalToggle}>
15
+ Show title icon modal
16
+ </Button>
17
+ <Modal
18
+ isOpen={isModalOpen}
19
+ aria-describedby="modal-title-icon-description"
20
+ aria-labelledby="title-icon-modal-title"
21
+ onClose={handleModalToggle}
22
+ >
23
+ <ModalHeader title="Title icon modal" titleIconVariant="warning" labelId="title-icon-modal-title" />
24
+ <ModalBody>
25
+ <span id="modal-title-icon-description">
26
+ When static text describing the modal is available outside of the modal header, it can be given an ID that
27
+ is then passed in as the modal's aria-describedby value.
28
+ </span>
29
+ <br />
30
+ <br />
31
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
32
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
33
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
34
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
35
+ est laborum.
36
+ </ModalBody>
37
+ <ModalFooter>
38
+ <Button key="confirm" variant="primary" onClick={handleModalToggle}>
39
+ Confirm
40
+ </Button>
41
+ <Button key="cancel" variant="link" onClick={handleModalToggle}>
42
+ Cancel
43
+ </Button>
44
+ </ModalFooter>
45
+ </Modal>
46
+ </React.Fragment>
47
+ );
48
+ };
@@ -0,0 +1,43 @@
1
+ import React from 'react';
2
+ import { Button } from '@patternfly/react-core';
3
+ import { Modal, ModalBody, ModalFooter, ModalHeader } from '@patternfly/react-core/next';
4
+
5
+ export const ModalTopAligned: React.FunctionComponent = () => {
6
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
7
+
8
+ const handleModalToggle = (_event: KeyboardEvent | React.MouseEvent) => {
9
+ setIsModalOpen(!isModalOpen);
10
+ };
11
+
12
+ return (
13
+ <React.Fragment>
14
+ <Button variant="primary" onClick={handleModalToggle}>
15
+ Show top aligned modal
16
+ </Button>
17
+ <Modal
18
+ position="top"
19
+ isOpen={isModalOpen}
20
+ onClose={handleModalToggle}
21
+ aria-labelledby="top-aligned-modal-title"
22
+ aria-describedby="modal-box-body-top-aligned"
23
+ >
24
+ <ModalHeader title="Top aligned modal" labelId="top-aligned-modal-title" />
25
+ <ModalBody id="modal-box-body-top-aligned">
26
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
27
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
28
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
29
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
30
+ est laborum.
31
+ </ModalBody>
32
+ <ModalFooter>
33
+ <Button key="confirm" variant="primary" onClick={handleModalToggle}>
34
+ Confirm
35
+ </Button>
36
+ <Button key="cancel" variant="link" onClick={handleModalToggle}>
37
+ Cancel
38
+ </Button>
39
+ </ModalFooter>
40
+ </Modal>
41
+ </React.Fragment>
42
+ );
43
+ };
@@ -0,0 +1,80 @@
1
+ import React from 'react';
2
+ import { Button } from '@patternfly/react-core';
3
+ import { Modal, ModalBody, ModalHeader, ModalFooter, ModalVariant } from '@patternfly/react-core/next';
4
+
5
+ export const ModalWithDescription: React.FunctionComponent = () => {
6
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
7
+
8
+ const handleModalToggle = (_event: KeyboardEvent | React.MouseEvent) => {
9
+ setIsModalOpen(!isModalOpen);
10
+ };
11
+
12
+ return (
13
+ <React.Fragment>
14
+ <Button variant="primary" onClick={handleModalToggle}>
15
+ Show modal with description
16
+ </Button>
17
+ <Modal
18
+ variant={ModalVariant.small}
19
+ isOpen={isModalOpen}
20
+ onClose={handleModalToggle}
21
+ aria-labelledby="modal-with-description-title"
22
+ aria-describedby="modal-box-body-with-description"
23
+ >
24
+ <ModalHeader
25
+ title="Modal with description"
26
+ labelId="modal-with-description-title"
27
+ description="A description is used when you want to provide more info about the modal than the title is able to describe. The content in the description is static and will not scroll with the rest of the modal body."
28
+ />
29
+
30
+ <ModalBody tabIndex={0} id="modal-box-body-with-description">
31
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
32
+ magna aliqua. Quis eleifend quam adipiscing vitae proin sagittis nisl rhoncus. Semper auctor neque vitae
33
+ tempus. Diam donec adipiscing tristique risus. Augue eget arcu dictum varius duis. Ut enim blandit volutpat
34
+ maecenas volutpat blandit aliquam. Sit amet mauris commodo quis imperdiet massa tincidunt. Habitant morbi
35
+ tristique senectus et netus. Fames ac turpis egestas sed tempus urna. Neque laoreet suspendisse interdum
36
+ consectetur libero id. Volutpat lacus laoreet non curabitur gravida arcu ac tortor. Porta nibh venenatis cras
37
+ sed felis eget velit. Nullam non nisi est sit amet facilisis. Nunc mi ipsum faucibus vitae. Lorem sed risus
38
+ ultricies tristique nulla aliquet enim tortor at. Egestas sed tempus urna et pharetra pharetra massa massa
39
+ ultricies. Lacinia quis vel eros donec ac odio tempor orci. Malesuada fames ac turpis egestas integer eget
40
+ aliquet.
41
+ <br />
42
+ <br />
43
+ Neque aliquam vestibulum morbi blandit cursus risus at ultrices. Molestie at elementum eu facilisis sed odio
44
+ morbi. Elit pellentesque habitant morbi tristique. Consequat nisl vel pretium lectus quam id leo in vitae.
45
+ Quis varius quam quisque id diam vel quam elementum. Viverra nam libero justo laoreet sit amet cursus.
46
+ Sollicitudin tempor id eu nisl nunc. Orci nulla pellentesque dignissim enim sit amet venenatis. Dignissim enim
47
+ sit amet venenatis urna cursus eget. Iaculis at erat pellentesque adipiscing commodo elit. Faucibus pulvinar
48
+ elementum integer enim neque volutpat. Nullam vehicula ipsum a arcu cursus vitae congue mauris. Nunc mattis
49
+ enim ut tellus elementum sagittis vitae. Blandit cursus risus at ultrices. Tellus mauris a diam maecenas sed
50
+ enim. Non diam phasellus vestibulum lorem sed risus ultricies tristique nulla.
51
+ <br />
52
+ <br />
53
+ Nulla pharetra diam sit amet nisl suscipit adipiscing. Ac tortor vitae purus faucibus ornare suspendisse sed
54
+ nisi. Sed felis eget velit aliquet sagittis id consectetur purus. Tincidunt tortor aliquam nulla facilisi cras
55
+ fermentum. Volutpat est velit egestas dui id ornare arcu odio. Pharetra magna ac placerat vestibulum. Ultrices
56
+ sagittis orci a scelerisque purus semper eget duis at. Nisi est sit amet facilisis magna etiam tempor orci eu.
57
+ Convallis tellus id interdum velit. Facilisis sed odio morbi quis commodo odio aenean sed.
58
+ <br />
59
+ <br />
60
+ Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Facilisi etiam dignissim diam quis enim
61
+ lobortis scelerisque fermentum. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada. Magna
62
+ etiam tempor orci eu lobortis elementum. Quis auctor elit sed vulputate mi sit. Eleifend quam adipiscing vitae
63
+ proin sagittis nisl rhoncus mattis rhoncus. Erat velit scelerisque in dictum non. Sit amet nulla facilisi
64
+ morbi tempus iaculis urna. Enim ut tellus elementum sagittis vitae et leo duis ut. Lectus arcu bibendum at
65
+ varius vel pharetra vel turpis. Morbi tristique senectus et netus et. Eget aliquet nibh praesent tristique
66
+ magna sit amet purus gravida. Nisl purus in mollis nunc sed id semper risus. Id neque aliquam vestibulum
67
+ morbi. Mauris a diam maecenas sed enim ut sem. Egestas tellus rutrum tellus pellentesque.
68
+ </ModalBody>
69
+ <ModalFooter>
70
+ <Button key="confirm" variant="primary" onClick={handleModalToggle}>
71
+ Confirm
72
+ </Button>
73
+ <Button key="cancel" variant="link" onClick={handleModalToggle}>
74
+ Cancel
75
+ </Button>
76
+ </ModalFooter>
77
+ </Modal>
78
+ </React.Fragment>
79
+ );
80
+ };
@@ -0,0 +1,105 @@
1
+ import React from 'react';
2
+ import { Button, Dropdown, DropdownList, DropdownItem, MenuToggle, MenuToggleElement } from '@patternfly/react-core';
3
+
4
+ import { Modal, ModalBody, ModalHeader, ModalFooter, ModalVariant } from '@patternfly/react-core/next';
5
+
6
+ export const ModalWithDropdown: React.FunctionComponent = () => {
7
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
8
+ const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
9
+
10
+ const handleModalToggle = (_event: KeyboardEvent | React.MouseEvent) => {
11
+ setIsModalOpen(!isModalOpen);
12
+ setIsDropdownOpen(false);
13
+ };
14
+
15
+ const handleDropdownToggle = () => {
16
+ setIsDropdownOpen(!isDropdownOpen);
17
+ };
18
+
19
+ const onSelect = () => {
20
+ setIsDropdownOpen(!isDropdownOpen);
21
+ onFocus();
22
+ };
23
+
24
+ const onFocus = () => {
25
+ const element = document.getElementById('modal-dropdown-toggle');
26
+ (element as HTMLElement).focus();
27
+ };
28
+
29
+ const onEscapePress = (event: KeyboardEvent) => {
30
+ if (isDropdownOpen) {
31
+ setIsDropdownOpen(!isDropdownOpen);
32
+ onFocus();
33
+ } else {
34
+ handleModalToggle(event);
35
+ }
36
+ };
37
+
38
+ return (
39
+ <React.Fragment>
40
+ <Button variant="primary" onClick={handleModalToggle}>
41
+ Show dropdown modal
42
+ </Button>
43
+ <Modal
44
+ variant={ModalVariant.small}
45
+ isOpen={isModalOpen}
46
+ onClose={handleModalToggle}
47
+ onEscapePress={onEscapePress}
48
+ aria-labelledby="modal-with-dropdown"
49
+ aria-describedby="modal-box-body-with-dropdown"
50
+ >
51
+ <ModalHeader title="Dropdown modal" labelId="modal-with-dropdown" />
52
+ <ModalBody id="modal-box-body-with-dropdown">
53
+ <div>
54
+ Set the dropdown <strong>menuAppendTo</strong> prop to <em>parent</em> in order to allow the dropdown menu
55
+ break out of the modal container. You'll also want to handle closing of the modal yourself, by listening to
56
+ the <strong>onEscapePress</strong> callback on the Modal component, so you can close the Dropdown first if
57
+ it's open without closing the entire modal.
58
+ </div>
59
+ <br />
60
+ <div>
61
+ <Dropdown
62
+ isOpen={isDropdownOpen}
63
+ onSelect={onSelect}
64
+ onOpenChange={(isOpen: boolean) => setIsDropdownOpen(isOpen)}
65
+ toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
66
+ <MenuToggle ref={toggleRef} onClick={handleDropdownToggle} isExpanded={isDropdownOpen}>
67
+ Dropdown
68
+ </MenuToggle>
69
+ )}
70
+ >
71
+ <DropdownList>
72
+ <DropdownItem value={0} key="action">
73
+ Action
74
+ </DropdownItem>
75
+ <DropdownItem
76
+ value={1}
77
+ key="link"
78
+ to="#default-link2"
79
+ // Prevent the default onClick functionality for example purposes
80
+ onClick={(ev: any) => ev.preventDefault()}
81
+ >
82
+ Link
83
+ </DropdownItem>
84
+ <DropdownItem value={2} isDisabled key="disabled action">
85
+ Disabled Action
86
+ </DropdownItem>
87
+ <DropdownItem value={3} isDisabled key="disabled link" to="#default-link4">
88
+ Disabled Link
89
+ </DropdownItem>
90
+ </DropdownList>
91
+ </Dropdown>
92
+ </div>
93
+ </ModalBody>
94
+ <ModalFooter>
95
+ <Button key="confirm" variant="primary" onClick={handleModalToggle}>
96
+ Confirm
97
+ </Button>
98
+ <Button key="cancel" variant="link" onClick={handleModalToggle}>
99
+ Cancel
100
+ </Button>
101
+ </ModalFooter>
102
+ </Modal>
103
+ </React.Fragment>
104
+ );
105
+ };
@@ -0,0 +1,211 @@
1
+ import React from 'react';
2
+ import { Button, Form, FormGroup, Popover, TextInput } from '@patternfly/react-core';
3
+ import { Modal, ModalBody, ModalFooter, ModalHeader, ModalVariant } from '@patternfly/react-core/next';
4
+ import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
5
+ import formStyles from '@patternfly/react-styles/css/components/Form/form';
6
+
7
+ export const ModalWithForm: React.FunctionComponent = () => {
8
+ const [isModalOpen, setModalOpen] = React.useState(false);
9
+ const [nameValue, setNameValue] = React.useState('');
10
+ const [emailValue, setEmailValue] = React.useState('');
11
+ const [addressValue, setAddressValue] = React.useState('');
12
+
13
+ const handleModalToggle = (_event: KeyboardEvent | React.MouseEvent) => {
14
+ setModalOpen(!isModalOpen);
15
+ };
16
+
17
+ const handleNameInputChange = (_event, value: string) => {
18
+ setNameValue(value);
19
+ };
20
+
21
+ const handleEmailInputChange = (_event, value: string) => {
22
+ setEmailValue(value);
23
+ };
24
+ const handleAddressInputChange = (_event, value: string) => {
25
+ setAddressValue(value);
26
+ };
27
+
28
+ return (
29
+ <React.Fragment>
30
+ <Button variant="primary" onClick={handleModalToggle}>
31
+ Show modal with form
32
+ </Button>
33
+ <Modal
34
+ variant={ModalVariant.small}
35
+ isOpen={isModalOpen}
36
+ onClose={handleModalToggle}
37
+ aria-labelledby="form-modal-title"
38
+ aria-describedby="modal-box-description-form"
39
+ >
40
+ <ModalHeader
41
+ title="Create account"
42
+ description="Enter your personal information below to create an account."
43
+ descriptorId="modal-box-description-form"
44
+ labelId="form-modal-title"
45
+ />
46
+ <ModalBody>
47
+ <Form id="modal-with-form-form">
48
+ <FormGroup
49
+ label="Name"
50
+ labelIcon={
51
+ <Popover
52
+ headerContent={
53
+ <div>
54
+ The
55
+ <a href="https://schema.org/name" target="_blank" rel="noopener noreferrer">
56
+ name
57
+ </a>
58
+ of a
59
+ <a href="https://schema.org/Person" target="_blank" rel="noopener noreferrer">
60
+ Person
61
+ </a>
62
+ </div>
63
+ }
64
+ bodyContent={
65
+ <div>
66
+ Often composed of
67
+ <a href="https://schema.org/givenName" target="_blank" rel="noopener noreferrer">
68
+ givenName
69
+ </a>
70
+ and
71
+ <a href="https://schema.org/familyName" target="_blank" rel="noopener noreferrer">
72
+ familyName
73
+ </a>
74
+ .
75
+ </div>
76
+ }
77
+ >
78
+ <button
79
+ type="button"
80
+ aria-label="More info for name field"
81
+ onClick={(e) => e.preventDefault()}
82
+ aria-describedby="modal-with-form-form-name"
83
+ className={formStyles.formGroupLabelHelp}
84
+ >
85
+ <HelpIcon />
86
+ </button>
87
+ </Popover>
88
+ }
89
+ isRequired
90
+ fieldId="modal-with-form-form-name"
91
+ >
92
+ <TextInput
93
+ isRequired
94
+ type="email"
95
+ id="modal-with-form-form-name"
96
+ name="modal-with-form-form-name"
97
+ value={nameValue}
98
+ onChange={handleNameInputChange}
99
+ />
100
+ </FormGroup>
101
+ <FormGroup
102
+ label="E-mail"
103
+ labelIcon={
104
+ <Popover
105
+ headerContent={
106
+ <div>
107
+ The
108
+ <a href="https://schema.org/email" target="_blank" rel="noopener noreferrer">
109
+ e-mail
110
+ </a>
111
+ of a
112
+ <a href="https://schema.org/Person" target="_blank" rel="noopener noreferrer">
113
+ person
114
+ </a>
115
+ </div>
116
+ }
117
+ bodyContent={
118
+ <div>
119
+ Valid
120
+ <a href="https://schema.org/email" target="_blank" rel="noopener noreferrer">
121
+ e-mail
122
+ </a>
123
+ address.
124
+ </div>
125
+ }
126
+ >
127
+ <button
128
+ type="button"
129
+ aria-label="More info for e-mail field"
130
+ onClick={(e) => e.preventDefault()}
131
+ aria-describedby="modal-with-form-form-email"
132
+ className={formStyles.formGroupLabelHelp}
133
+ >
134
+ <HelpIcon />
135
+ </button>
136
+ </Popover>
137
+ }
138
+ isRequired
139
+ fieldId="modal-with-form-form-email"
140
+ >
141
+ <TextInput
142
+ isRequired
143
+ type="email"
144
+ id="modal-with-form-form-email"
145
+ name="modal-with-form-form-email"
146
+ value={emailValue}
147
+ onChange={handleEmailInputChange}
148
+ />
149
+ </FormGroup>
150
+ <FormGroup
151
+ label="Address"
152
+ labelIcon={
153
+ <Popover
154
+ headerContent={
155
+ <div>
156
+ The
157
+ <a href="https://schema.org/address" target="_blank" rel="noopener noreferrer">
158
+ adress
159
+ </a>
160
+ of a
161
+ <a href="https://schema.org/Person" target="_blank" rel="noopener noreferrer">
162
+ person
163
+ </a>
164
+ </div>
165
+ }
166
+ bodyContent={
167
+ <div>
168
+ Valid
169
+ <a href="https://schema.org/PostalAddress" target="_blank" rel="noopener noreferrer">
170
+ postal address.
171
+ </a>
172
+ </div>
173
+ }
174
+ >
175
+ <button
176
+ type="button"
177
+ aria-label="More info for address field"
178
+ onClick={(e) => e.preventDefault()}
179
+ aria-describedby="modal-with-form-form-address"
180
+ className={formStyles.formGroupLabelHelp}
181
+ >
182
+ <HelpIcon />
183
+ </button>
184
+ </Popover>
185
+ }
186
+ isRequired
187
+ fieldId="modal-with-form-form-address"
188
+ >
189
+ <TextInput
190
+ isRequired
191
+ type="email"
192
+ id="modal-with-form-form-address"
193
+ name="modal-with-form-form-address"
194
+ value={addressValue}
195
+ onChange={handleAddressInputChange}
196
+ />
197
+ </FormGroup>
198
+ </Form>
199
+ </ModalBody>
200
+ <ModalFooter>
201
+ <Button key="create" variant="primary" form="modal-with-form-form" onClick={handleModalToggle}>
202
+ Confirm
203
+ </Button>
204
+ <Button key="cancel" variant="link" onClick={handleModalToggle}>
205
+ Cancel
206
+ </Button>
207
+ </ModalFooter>
208
+ </Modal>
209
+ </React.Fragment>
210
+ );
211
+ };
@@ -0,0 +1,63 @@
1
+ import React from 'react';
2
+ import { Button, Popover } from '@patternfly/react-core';
3
+ import { Modal, ModalBody, ModalFooter, ModalHeader } from '@patternfly/react-core/next';
4
+ import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
5
+
6
+ export const ModalWithHelp: React.FunctionComponent = () => {
7
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
8
+
9
+ const handleModalToggle = (_event: KeyboardEvent | React.MouseEvent) => {
10
+ setIsModalOpen(!isModalOpen);
11
+ };
12
+
13
+ return (
14
+ <React.Fragment>
15
+ <Button variant="primary" onClick={handleModalToggle}>
16
+ Show with help modal
17
+ </Button>
18
+ <Modal
19
+ variant="small"
20
+ isOpen={isModalOpen}
21
+ onClose={handleModalToggle}
22
+ aria-labelledby="with-help-modal-title"
23
+ aria-describedby="modal-box-body-with-help"
24
+ >
25
+ <ModalHeader
26
+ title="With help modal"
27
+ labelId="with-help-modal-title"
28
+ help={
29
+ <Popover
30
+ headerContent={<div>Help Popover</div>}
31
+ bodyContent={
32
+ <div>
33
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id feugiat augue, nec fringilla
34
+ turpis.
35
+ </div>
36
+ }
37
+ footerContent="Popover Footer"
38
+ >
39
+ <Button variant="plain" aria-label="Help">
40
+ <HelpIcon />
41
+ </Button>
42
+ </Popover>
43
+ }
44
+ />
45
+ <ModalBody id="modal-box-body-with-help">
46
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
47
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
48
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
49
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
50
+ est laborum.
51
+ </ModalBody>
52
+ <ModalFooter>
53
+ <Button key="confirm" variant="primary" onClick={handleModalToggle}>
54
+ Confirm
55
+ </Button>
56
+ <Button key="cancel" variant="link" onClick={handleModalToggle}>
57
+ Cancel
58
+ </Button>
59
+ </ModalFooter>
60
+ </Modal>
61
+ </React.Fragment>
62
+ );
63
+ };
@@ -0,0 +1,75 @@
1
+ import React from 'react';
2
+ import { Button } from '@patternfly/react-core';
3
+ import { Modal, ModalBody, ModalHeader, ModalFooter, ModalVariant } from '@patternfly/react-core/next';
4
+
5
+ export const ModalWithOverflowingContent: React.FunctionComponent = () => {
6
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
7
+
8
+ const handleModalToggle = (_event: KeyboardEvent | React.MouseEvent) => {
9
+ setIsModalOpen((prevIsModalOpen) => !prevIsModalOpen);
10
+ };
11
+
12
+ return (
13
+ <React.Fragment>
14
+ <Button variant="primary" onClick={handleModalToggle}>
15
+ Show modal
16
+ </Button>
17
+ <Modal
18
+ variant={ModalVariant.small}
19
+ isOpen={isModalOpen}
20
+ onClose={handleModalToggle}
21
+ aria-labelledby="scrollable-modal-title"
22
+ aria-describedby="modal-box-body-scrollable"
23
+ >
24
+ <ModalHeader title="Modal with overflowing content" labelId="scrollable-modal-title" />
25
+ <ModalBody tabIndex={0} id="modal-box-body-scrollable" aria-label="Scrollable modal content">
26
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
27
+ magna aliqua. Quis eleifend quam adipiscing vitae proin sagittis nisl rhoncus. Semper auctor neque vitae
28
+ tempus. Diam donec adipiscing tristique risus. Augue eget arcu dictum varius duis. Ut enim blandit volutpat
29
+ maecenas volutpat blandit aliquam. Sit amet mauris commodo quis imperdiet massa tincidunt. Habitant morbi
30
+ tristique senectus et netus. Fames ac turpis egestas sed tempus urna. Neque laoreet suspendisse interdum
31
+ consectetur libero id. Volutpat lacus laoreet non curabitur gravida arcu ac tortor. Porta nibh venenatis cras
32
+ sed felis eget velit. Nullam non nisi est sit amet facilisis. Nunc mi ipsum faucibus vitae. Lorem sed risus
33
+ ultricies tristique nulla aliquet enim tortor at. Egestas sed tempus urna et pharetra pharetra massa massa
34
+ ultricies. Lacinia quis vel eros donec ac odio tempor orci. Malesuada fames ac turpis egestas integer eget
35
+ aliquet.
36
+ <br />
37
+ <br />
38
+ Neque aliquam vestibulum morbi blandit cursus risus at ultrices. Molestie at elementum eu facilisis sed odio
39
+ morbi. Elit pellentesque habitant morbi tristique. Consequat nisl vel pretium lectus quam id leo in vitae.
40
+ Quis varius quam quisque id diam vel quam elementum. Viverra nam libero justo laoreet sit amet cursus.
41
+ Sollicitudin tempor id eu nisl nunc. Orci nulla pellentesque dignissim enim sit amet venenatis. Dignissim enim
42
+ sit amet venenatis urna cursus eget. Iaculis at erat pellentesque adipiscing commodo elit. Faucibus pulvinar
43
+ elementum integer enim neque volutpat. Nullam vehicula ipsum a arcu cursus vitae congue mauris. Nunc mattis
44
+ enim ut tellus elementum sagittis vitae. Blandit cursus risus at ultrices. Tellus mauris a diam maecenas sed
45
+ enim. Non diam phasellus vestibulum lorem sed risus ultricies tristique nulla.
46
+ <br />
47
+ <br />
48
+ Nulla pharetra diam sit amet nisl suscipit adipiscing. Ac tortor vitae purus faucibus ornare suspendisse sed
49
+ nisi. Sed felis eget velit aliquet sagittis id consectetur purus. Tincidunt tortor aliquam nulla facilisi cras
50
+ fermentum. Volutpat est velit egestas dui id ornare arcu odio. Pharetra magna ac placerat vestibulum. Ultrices
51
+ sagittis orci a scelerisque purus semper eget duis at. Nisi est sit amet facilisis magna etiam tempor orci eu.
52
+ Convallis tellus id interdum velit. Facilisis sed odio morbi quis commodo odio aenean sed.
53
+ <br />
54
+ <br />
55
+ Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Facilisi etiam dignissim diam quis enim
56
+ lobortis scelerisque fermentum. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada. Magna
57
+ etiam tempor orci eu lobortis elementum. Quis auctor elit sed vulputate mi sit. Eleifend quam adipiscing vitae
58
+ proin sagittis nisl rhoncus mattis rhoncus. Erat velit scelerisque in dictum non. Sit amet nulla facilisi
59
+ morbi tempus iaculis urna. Enim ut tellus elementum sagittis vitae et leo duis ut. Lectus arcu bibendum at
60
+ varius vel pharetra vel turpis. Morbi tristique senectus et netus et. Eget aliquet nibh praesent tristique
61
+ magna sit amet purus gravida. Nisl purus in mollis nunc sed id semper risus. Id neque aliquam vestibulum
62
+ morbi. Mauris a diam maecenas sed enim ut sem. Egestas tellus rutrum tellus pellentesque.
63
+ </ModalBody>
64
+ <ModalFooter>
65
+ <Button key="confirm" variant="primary" onClick={handleModalToggle}>
66
+ Confirm
67
+ </Button>
68
+ <Button key="cancel" variant="link" onClick={handleModalToggle}>
69
+ Cancel
70
+ </Button>
71
+ </ModalFooter>
72
+ </Modal>
73
+ </React.Fragment>
74
+ );
75
+ };