@patternfly/react-core 5.1.1-prerelease.1 → 5.1.1-prerelease.11

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 (245) hide show
  1. package/CHANGELOG.md +54 -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/package.json +1 -1
  119. package/dist/esm/components/BackToTop/BackToTop.js +1 -1
  120. package/dist/esm/components/BackToTop/BackToTop.js.map +1 -1
  121. package/dist/esm/components/Button/Button.d.ts +2 -2
  122. package/dist/esm/components/Button/Button.d.ts.map +1 -1
  123. package/dist/esm/components/Button/Button.js +3 -3
  124. package/dist/esm/components/Button/Button.js.map +1 -1
  125. package/dist/esm/components/Drawer/DrawerPanelContent.d.ts +16 -0
  126. package/dist/esm/components/Drawer/DrawerPanelContent.d.ts.map +1 -1
  127. package/dist/esm/components/Drawer/DrawerPanelContent.js +55 -15
  128. package/dist/esm/components/Drawer/DrawerPanelContent.js.map +1 -1
  129. package/dist/esm/components/Icon/Icon.d.ts +4 -0
  130. package/dist/esm/components/Icon/Icon.d.ts.map +1 -1
  131. package/dist/esm/components/Icon/Icon.js +2 -2
  132. package/dist/esm/components/Icon/Icon.js.map +1 -1
  133. package/dist/esm/components/Nav/NavItem.d.ts +1 -1
  134. package/dist/esm/components/Nav/NavItem.d.ts.map +1 -1
  135. package/dist/esm/components/Toolbar/ToolbarContent.d.ts.map +1 -1
  136. package/dist/esm/components/Toolbar/ToolbarContent.js +8 -6
  137. package/dist/esm/components/Toolbar/ToolbarContent.js.map +1 -1
  138. package/dist/esm/components/Toolbar/ToolbarExpandableContent.d.ts.map +1 -1
  139. package/dist/esm/components/Toolbar/ToolbarExpandableContent.js +3 -5
  140. package/dist/esm/components/Toolbar/ToolbarExpandableContent.js.map +1 -1
  141. package/dist/esm/components/Toolbar/ToolbarFilter.d.ts +4 -0
  142. package/dist/esm/components/Toolbar/ToolbarFilter.d.ts.map +1 -1
  143. package/dist/esm/components/Toolbar/ToolbarFilter.js +8 -4
  144. package/dist/esm/components/Toolbar/ToolbarFilter.js.map +1 -1
  145. package/dist/esm/components/Toolbar/ToolbarToggleGroup.d.ts +14 -0
  146. package/dist/esm/components/Toolbar/ToolbarToggleGroup.d.ts.map +1 -1
  147. package/dist/esm/components/Toolbar/ToolbarToggleGroup.js +21 -20
  148. package/dist/esm/components/Toolbar/ToolbarToggleGroup.js.map +1 -1
  149. package/dist/esm/components/Toolbar/ToolbarUtils.d.ts +4 -0
  150. package/dist/esm/components/Toolbar/ToolbarUtils.d.ts.map +1 -1
  151. package/dist/esm/components/Toolbar/ToolbarUtils.js +2 -1
  152. package/dist/esm/components/Toolbar/ToolbarUtils.js.map +1 -1
  153. package/dist/esm/components/Toolbar/index.d.ts +1 -0
  154. package/dist/esm/components/Toolbar/index.d.ts.map +1 -1
  155. package/dist/esm/components/Toolbar/index.js +1 -0
  156. package/dist/esm/components/Toolbar/index.js.map +1 -1
  157. package/dist/esm/deprecated/components/Select/Select.d.ts.map +1 -1
  158. package/dist/esm/deprecated/components/Select/Select.js +43 -42
  159. package/dist/esm/deprecated/components/Select/Select.js.map +1 -1
  160. package/dist/js/components/BackToTop/BackToTop.js +1 -1
  161. package/dist/js/components/BackToTop/BackToTop.js.map +1 -1
  162. package/dist/js/components/Button/Button.d.ts +2 -2
  163. package/dist/js/components/Button/Button.d.ts.map +1 -1
  164. package/dist/js/components/Button/Button.js +3 -3
  165. package/dist/js/components/Button/Button.js.map +1 -1
  166. package/dist/js/components/Drawer/DrawerPanelContent.d.ts +16 -0
  167. package/dist/js/components/Drawer/DrawerPanelContent.d.ts.map +1 -1
  168. package/dist/js/components/Drawer/DrawerPanelContent.js +55 -15
  169. package/dist/js/components/Drawer/DrawerPanelContent.js.map +1 -1
  170. package/dist/js/components/Icon/Icon.d.ts +4 -0
  171. package/dist/js/components/Icon/Icon.d.ts.map +1 -1
  172. package/dist/js/components/Icon/Icon.js +2 -2
  173. package/dist/js/components/Icon/Icon.js.map +1 -1
  174. package/dist/js/components/Nav/NavItem.d.ts +1 -1
  175. package/dist/js/components/Nav/NavItem.d.ts.map +1 -1
  176. package/dist/js/components/Toolbar/ToolbarContent.d.ts.map +1 -1
  177. package/dist/js/components/Toolbar/ToolbarContent.js +8 -6
  178. package/dist/js/components/Toolbar/ToolbarContent.js.map +1 -1
  179. package/dist/js/components/Toolbar/ToolbarExpandableContent.d.ts.map +1 -1
  180. package/dist/js/components/Toolbar/ToolbarExpandableContent.js +3 -5
  181. package/dist/js/components/Toolbar/ToolbarExpandableContent.js.map +1 -1
  182. package/dist/js/components/Toolbar/ToolbarFilter.d.ts +4 -0
  183. package/dist/js/components/Toolbar/ToolbarFilter.d.ts.map +1 -1
  184. package/dist/js/components/Toolbar/ToolbarFilter.js +8 -4
  185. package/dist/js/components/Toolbar/ToolbarFilter.js.map +1 -1
  186. package/dist/js/components/Toolbar/ToolbarToggleGroup.d.ts +14 -0
  187. package/dist/js/components/Toolbar/ToolbarToggleGroup.d.ts.map +1 -1
  188. package/dist/js/components/Toolbar/ToolbarToggleGroup.js +21 -20
  189. package/dist/js/components/Toolbar/ToolbarToggleGroup.js.map +1 -1
  190. package/dist/js/components/Toolbar/ToolbarUtils.d.ts +4 -0
  191. package/dist/js/components/Toolbar/ToolbarUtils.d.ts.map +1 -1
  192. package/dist/js/components/Toolbar/ToolbarUtils.js +2 -1
  193. package/dist/js/components/Toolbar/ToolbarUtils.js.map +1 -1
  194. package/dist/js/components/Toolbar/index.d.ts +1 -0
  195. package/dist/js/components/Toolbar/index.d.ts.map +1 -1
  196. package/dist/js/components/Toolbar/index.js +1 -0
  197. package/dist/js/components/Toolbar/index.js.map +1 -1
  198. package/dist/js/deprecated/components/Select/Select.d.ts.map +1 -1
  199. package/dist/js/deprecated/components/Select/Select.js +43 -42
  200. package/dist/js/deprecated/components/Select/Select.js.map +1 -1
  201. package/dist/styles/base-no-reset.css +19 -0
  202. package/dist/styles/base.css +19 -0
  203. package/dist/umd/react-core.min.js +3 -3
  204. package/helpers/package.json +1 -1
  205. package/layouts/package.json +1 -1
  206. package/next/package.json +1 -1
  207. package/package.json +6 -6
  208. package/src/components/Alert/__tests__/AlertGroup.test.tsx +77 -73
  209. package/src/components/BackToTop/BackToTop.tsx +1 -1
  210. package/src/components/BackToTop/__tests__/BackToTop.test.tsx +1 -1
  211. package/src/components/BackToTop/__tests__/__snapshots__/BackToTop.test.tsx.snap +1 -1
  212. package/src/components/Button/Button.tsx +5 -5
  213. package/src/components/Button/examples/ButtonVariations.tsx +1 -1
  214. package/src/components/Drawer/DrawerPanelContent.tsx +120 -55
  215. package/src/components/Drawer/__tests__/DrawerPanelContent.test.tsx +89 -0
  216. package/src/components/Drawer/examples/Drawer.md +31 -0
  217. package/src/components/Drawer/examples/DrawerFocusTrap.tsx +58 -0
  218. package/src/components/Icon/Icon.tsx +15 -1
  219. package/src/components/Icon/__tests__/Icon.test.tsx +16 -0
  220. package/src/components/Nav/NavItem.tsx +1 -1
  221. package/src/components/SearchInput/examples/SearchInputAdvanced.tsx +1 -1
  222. package/src/components/Tile/examples/Tile.md +14 -10
  223. package/src/components/Toolbar/ToolbarContent.tsx +7 -11
  224. package/src/components/Toolbar/ToolbarExpandableContent.tsx +7 -3
  225. package/src/components/Toolbar/ToolbarFilter.tsx +12 -2
  226. package/src/components/Toolbar/ToolbarToggleGroup.tsx +92 -47
  227. package/src/components/Toolbar/ToolbarUtils.tsx +6 -1
  228. package/src/components/Toolbar/__tests__/Generated/__snapshots__/ToolbarContent.test.tsx.snap +0 -8
  229. package/src/components/Toolbar/__tests__/Toolbar.test.tsx +3 -4
  230. package/src/components/Toolbar/__tests__/ToolbarToggleGroup.test.tsx +13 -10
  231. package/src/components/Toolbar/__tests__/__snapshots__/Toolbar.test.tsx.snap +0 -59
  232. package/src/components/Toolbar/examples/Test.tsx +258 -0
  233. package/src/components/Toolbar/examples/Toolbar.md +12 -6
  234. package/src/components/Toolbar/index.ts +1 -0
  235. package/src/demos/Card/Card.md +3 -664
  236. package/src/demos/Card/examples/CardView.tsx +575 -0
  237. package/src/demos/CardDemos.md +4 -4
  238. package/src/demos/NotificationDrawer/NotificationDrawer.md +2 -1435
  239. package/src/demos/NotificationDrawer/examples/NotificationDrawerBasic.tsx +557 -0
  240. package/src/demos/NotificationDrawer/examples/NotificationDrawerGrouped.tsx +796 -0
  241. package/src/demos/PrimaryDetail.md +2 -2
  242. package/src/deprecated/components/Select/Select.tsx +47 -45
  243. package/src/deprecated/components/Select/__tests__/__snapshots__/Select.test.tsx.snap +9 -5
  244. package/src/components/Alert/__tests__/__snapshots__/AlertGroup.test.tsx.snap +0 -10
  245. /package/src/demos/Card/{CardData.jsx → examples/CardData.jsx} +0 -0
@@ -22,1447 +22,14 @@ import pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg';
22
22
 
23
23
  ### Basic
24
24
 
25
- ```js isFullscreen
26
- import React from 'react';
27
- import {
28
- Avatar,
29
- Brand,
30
- Breadcrumb,
31
- BreadcrumbItem,
32
- Button,
33
- ButtonVariant,
34
- Divider,
35
- Dropdown,
36
- DropdownItem,
37
- DropdownList,
38
- EmptyState,
39
- EmptyStateActions,
40
- EmptyStateBody,
41
- EmptyStateIcon,
42
- EmptyStateHeader,
43
- EmptyStateFooter,
44
- EmptyStateVariant,
45
- MenuToggle,
46
- Nav,
47
- NavItem,
48
- NavList,
49
- NotificationBadge,
50
- NotificationDrawer,
51
- NotificationDrawerBody,
52
- NotificationDrawerHeader,
53
- NotificationDrawerList,
54
- NotificationDrawerListItem,
55
- NotificationDrawerListItemBody,
56
- NotificationDrawerListItemHeader,
57
- Page,
58
- PageSection,
59
- PageSectionVariants,
60
- PageSidebar,
61
- PageSidebarBody,
62
- SkipToContent,
63
- TextContent,
64
- Text,
65
- Title,
66
- PageToggleButton,
67
- Masthead,
68
- MastheadMain,
69
- MastheadToggle,
70
- MastheadContent,
71
- MastheadBrand,
72
- Toolbar,
73
- ToolbarItem,
74
- ToolbarGroup,
75
- ToolbarContent
76
- } from '@patternfly/react-core';
77
- import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
78
- import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
79
- import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
80
- import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
81
- import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
82
- import BarsIcon from '@patternfly/react-icons/dist/js/icons/bars-icon';
83
- import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
84
- import SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';
85
- import pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg';
86
-
87
- class BasicNotificationDrawer extends React.Component {
88
- constructor(props) {
89
- super(props);
90
- this.drawerRef = React.createRef();
91
- this.state = {
92
- isDropdownOpen: false,
93
- isKebabDropdownOpen: false,
94
- activeItem: 0,
95
- isDrawerExpanded: false,
96
- isUnreadMap: {
97
- 'notification-1': true,
98
- 'notification-2': true
99
- },
100
- showNotifications: true,
101
- isActionsMenuOpen: {}
102
- };
103
- this.onDropdownToggle = () => {
104
- this.setState((prevState) => ({
105
- isDropdownOpen: !prevState.isDropdownOpen
106
- }));
107
- };
108
-
109
- this.onDropdownSelect = () => {
110
- this.setState({
111
- isDropdownOpen: false
112
- });
113
- };
114
-
115
- this.onKebabDropdownToggle = () => {
116
- this.setState((prevState) => ({
117
- isKebabDropdownOpen: !prevState.isKebabDropdownOpen
118
- }));
119
- };
120
-
121
- this.onKebabDropdownSelect = () => {
122
- this.setState({
123
- isKebabDropdownOpen: false
124
- });
125
- };
126
-
127
- this.onNavSelect = (_event, result) => {
128
- this.setState({
129
- activeItem: result.itemId
130
- });
131
- };
132
-
133
- this.onCloseNotificationDrawer = (_event) => {
134
- this.setState((prevState) => {
135
- return {
136
- isDrawerExpanded: !prevState.isDrawerExpanded
137
- };
138
- });
139
- };
140
-
141
- this.onToggle = (id) => {
142
- this.setState((prevState) => ({
143
- isActionsMenuOpen: { [id]: !prevState.isActionsMenuOpen[id] }
144
- }));
145
- };
25
+ ```ts file='./examples/NotificationDrawerBasic.tsx' isFullscreen
146
26
 
147
- this.onSelect = () => {
148
- this.setState({
149
- isActionsMenuOpen: {}
150
- });
151
- };
152
-
153
- this.onListItemClick = (id) => {
154
- this.setState((prevState) => {
155
- if (!prevState.isUnreadMap) return;
156
- prevState.isUnreadMap[id] = false;
157
- return {
158
- isUnreadMap: prevState.isUnreadMap
159
- };
160
- });
161
- };
162
-
163
- this.getNumberUnread = () => {
164
- const { isUnreadMap } = this.state;
165
- if (isUnreadMap === null) return 0;
166
- return Object.keys(isUnreadMap).reduce((count, id) => {
167
- return isUnreadMap[id] ? count + 1 : count;
168
- }, 0);
169
- };
170
-
171
- this.markAllRead = () => {
172
- this.setState({
173
- isUnreadMap: null
174
- });
175
- };
176
-
177
- this.showNotifications = (showNotifications) => {
178
- this.setState({
179
- isUnreadMap: null,
180
- showNotifications: showNotifications
181
- });
182
- };
183
-
184
- this.focusDrawer = (_event) => {
185
- const firstTabbableItem = this.drawerRef.current.querySelector('a, button');
186
- firstTabbableItem.focus();
187
- };
188
- }
189
-
190
- render() {
191
- const {
192
- isDropdownOpen,
193
- isKebabDropdownOpen,
194
- activeItem,
195
- res,
196
- isDrawerExpanded,
197
- isActionsMenuOpen,
198
- isUnreadMap,
199
- showNotifications
200
- } = this.state;
201
-
202
- const PageNav = (
203
- <Nav onSelect={this.onNavSelect} aria-label="Nav">
204
- <NavList>
205
- <NavItem itemId={0} isActive={activeItem === 0}>
206
- System Panel
207
- </NavItem>
208
- <NavItem itemId={1} isActive={activeItem === 1}>
209
- Policy
210
- </NavItem>
211
- <NavItem itemId={2} isActive={activeItem === 2}>
212
- Authentication
213
- </NavItem>
214
- <NavItem itemId={3} isActive={activeItem === 3}>
215
- Network Services
216
- </NavItem>
217
- <NavItem itemId={4} isActive={activeItem === 4}>
218
- Server
219
- </NavItem>
220
- </NavList>
221
- </Nav>
222
- );
223
- const kebabDropdownItems = (
224
- <>
225
- <DropdownItem>
226
- <CogIcon /> Settings
227
- </DropdownItem>
228
- <DropdownItem>
229
- <HelpIcon /> Help
230
- </DropdownItem>
231
- </>
232
- );
233
- const userDropdownItems = (
234
- <>
235
- <DropdownItem key="group 2 profile">My profile</DropdownItem>
236
- <DropdownItem key="group 2 user">User management</DropdownItem>
237
- <DropdownItem key="group 2 logout">Logout</DropdownItem>
238
- </>
239
- );
240
- const headerToolbar = (
241
- <Toolbar isFullHeight>
242
- <ToolbarContent>
243
- <ToolbarGroup spaceItems={{ default: 'spacerNone' }} align={{ default: 'alignRight' }}>
244
- <ToolbarGroup variant="icon-button-group">
245
- <ToolbarItem visibility={{ default: 'visible' }} isSelected={isDrawerExpanded}>
246
- <NotificationBadge
247
- variant={this.getNumberUnread() === 0 ? 'read' : 'unread'}
248
- onClick={(event) => this.onCloseNotificationDrawer(event)}
249
- aria-label="Notifications"
250
- isExpanded={isDrawerExpanded}
251
- >
252
- <BellIcon />
253
- </NotificationBadge>
254
- </ToolbarItem>
255
- <ToolbarGroup
256
- variant="icon-button-group"
257
- visibility={{
258
- default: 'hidden',
259
- lg: 'visible'
260
- }} /** the settings and help icon buttons are only visible on desktop sizes and replaced by a kebab dropdown for other sizes */
261
- >
262
- <ToolbarItem>
263
- <Button aria-label="Settings actions" variant={ButtonVariant.plain}>
264
- <CogIcon />
265
- </Button>
266
- </ToolbarItem>
267
- <ToolbarItem>
268
- <Button aria-label="Help actions" variant={ButtonVariant.plain}>
269
- <QuestionCircleIcon />
270
- </Button>
271
- </ToolbarItem>
272
- </ToolbarGroup>
273
- </ToolbarGroup>
274
- <ToolbarGroup>
275
- <ToolbarItem
276
- visibility={{
277
- lg: 'hidden'
278
- }} /** this kebab dropdown replaces the icon buttons and is hidden for desktop sizes */
279
- >
280
- <Dropdown
281
- isOpen={isKebabDropdownOpen}
282
- onSelect={this.onKebabDropdownSelect}
283
- onOpenChange={(isOpen) => this.setState({ isKebabDropdownOpen: isOpen })}
284
- popperProps={{ position: 'right' }}
285
- toggle={(toggleRef) => (
286
- <MenuToggle
287
- ref={toggleRef}
288
- isExpanded={isKebabDropdownOpen}
289
- onClick={this.onKebabDropdownToggle}
290
- variant="plain"
291
- aria-label="Settings and help"
292
- >
293
- <EllipsisVIcon aria-hidden="true" />
294
- </MenuToggle>
295
- )}
296
- >
297
- <DropdownList>{kebabDropdownItems}</DropdownList>
298
- </Dropdown>
299
- </ToolbarItem>
300
- <ToolbarItem
301
- visibility={{ default: 'hidden', md: 'visible' }} /** this user dropdown is hidden on mobile sizes */
302
- >
303
- <Dropdown
304
- isOpen={isDropdownOpen}
305
- onSelect={this.onDropdownSelect}
306
- onOpenChange={(isOpen) => this.setState({ isDropdownOpen: isOpen })}
307
- popperProps={{ position: 'right' }}
308
- toggle={(toggleRef) => (
309
- <MenuToggle
310
- ref={toggleRef}
311
- isExpanded={isDropdownOpen}
312
- onClick={this.onDropdownToggle}
313
- icon={<Avatar src={imgAvatar} alt="" />}
314
- isFullHeight
315
- >
316
- John Smith
317
- </MenuToggle>
318
- )}
319
- >
320
- <DropdownList>{userDropdownItems}</DropdownList>
321
- </Dropdown>
322
- </ToolbarItem>
323
- </ToolbarGroup>
324
- </ToolbarGroup>
325
- </ToolbarContent>
326
- </Toolbar>
327
- );
328
-
329
- const Header = (
330
- <Masthead>
331
- <MastheadToggle>
332
- <PageToggleButton variant="plain" aria-label="Global navigation">
333
- <BarsIcon />
334
- </PageToggleButton>
335
- </MastheadToggle>
336
- <MastheadMain>
337
- <MastheadBrand>
338
- <Brand src={pfLogo} alt="PatternFly" heights={{ default: '36px' }} />
339
- </MastheadBrand>
340
- </MastheadMain>
341
- <MastheadContent>{headerToolbar}</MastheadContent>
342
- </Masthead>
343
- );
344
- const Sidebar = (
345
- <PageSidebar>
346
- <PageSidebarBody>{PageNav}</PageSidebarBody>
347
- </PageSidebar>
348
- );
349
- const pageId = 'main-content-page-layout-default-nav';
350
- const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to content</SkipToContent>;
351
-
352
- const PageBreadcrumb = (
353
- <Breadcrumb>
354
- <BreadcrumbItem>Section home</BreadcrumbItem>
355
- <BreadcrumbItem to="#">Section title</BreadcrumbItem>
356
- <BreadcrumbItem to="#">Section title</BreadcrumbItem>
357
- <BreadcrumbItem to="#" isActive>
358
- Section landing
359
- </BreadcrumbItem>
360
- </Breadcrumb>
361
- );
362
-
363
- const drawerContent = 'Panel content';
364
-
365
- const notificationDrawerActions = (
366
- <>
367
- <DropdownItem key="markAllRead" onClick={this.markAllRead}>
368
- Mark all read
369
- </DropdownItem>
370
- <DropdownItem key="clearAll" onClick={() => this.showNotifications(false)}>
371
- Clear all
372
- </DropdownItem>
373
- <DropdownItem key="unclearLast" onClick={() => this.showNotifications(true)}>
374
- Unclear last
375
- </DropdownItem>
376
- <DropdownItem key="settings">Settings</DropdownItem>
377
- </>
378
- );
379
- const notificationDrawerDropdownItems = (
380
- <>
381
- <DropdownItem
382
- key="link"
383
- to="#"
384
- // Prevent default onClick behavior for demo purposes
385
- onClick={(ev) => ev.preventDefault()}
386
- >
387
- Link
388
- </DropdownItem>
389
- <DropdownItem key="action">Action</DropdownItem>
390
- <Divider component="li" key="separator" />
391
- <DropdownItem key="disabled link" isDisabled>
392
- Disabled Link
393
- </DropdownItem>
394
- </>
395
- );
396
- const notificationDrawer = (
397
- <NotificationDrawer ref={this.drawerRef}>
398
- <NotificationDrawerHeader count={this.getNumberUnread()} onClose={this.onCloseNotificationDrawer}>
399
- <Dropdown
400
- onSelect={this.onSelect}
401
- isOpen={isActionsMenuOpen['toggle-id-0'] || false}
402
- id="notification-0"
403
- onOpenChange={(isOpen) => !isOpen && this.setState({ isActionsMenuOpen: {} })}
404
- popperProps={{ position: 'right' }}
405
- toggle={(toggleRef) => (
406
- <MenuToggle
407
- ref={toggleRef}
408
- id="toggle-id-0"
409
- aria-label="Notification drawer actions"
410
- variant="plain"
411
- onClick={() => this.onToggle('toggle-id-0')}
412
- isExpanded={isActionsMenuOpen['toggle-id-0'] || false}
413
- >
414
- <EllipsisVIcon aria-hidden="true" />
415
- </MenuToggle>
416
- )}
417
- >
418
- <DropdownList>{notificationDrawerActions}</DropdownList>
419
- </Dropdown>
420
- </NotificationDrawerHeader>
421
- <NotificationDrawerBody>
422
- {showNotifications && (
423
- <NotificationDrawerList>
424
- <NotificationDrawerListItem
425
- variant="info"
426
- onClick={() => this.onListItemClick('notification-1')}
427
- isRead={isUnreadMap === null || !isUnreadMap['notification-1']}
428
- >
429
- <NotificationDrawerListItemHeader
430
- variant="info"
431
- title="Unread info notification title"
432
- srTitle="Info notification:"
433
- >
434
- <Dropdown
435
- onSelect={this.onSelect}
436
- isOpen={isActionsMenuOpen['toggle-id-1'] || false}
437
- id="notification-1"
438
- onOpenChange={(isOpen) => !isOpen && this.setState({ isActionsMenuOpen: {} })}
439
- popperProps={{ position: 'right' }}
440
- toggle={(toggleRef) => (
441
- <MenuToggle
442
- ref={toggleRef}
443
- id="toggle-id-1"
444
- aria-label="Notification drawer actions"
445
- variant="plain"
446
- onClick={() => this.onToggle('toggle-id-1')}
447
- isExpanded={isActionsMenuOpen['toggle-id-1'] || false}
448
- >
449
- <EllipsisVIcon aria-hidden="true" />
450
- </MenuToggle>
451
- )}
452
- >
453
- <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
454
- </Dropdown>
455
- </NotificationDrawerListItemHeader>
456
- <NotificationDrawerListItemBody timestamp="5 minutes ago">
457
- This is an info notification description.
458
- </NotificationDrawerListItemBody>
459
- </NotificationDrawerListItem>
460
- <NotificationDrawerListItem
461
- variant="danger"
462
- onClick={() => this.onListItemClick('notification-2')}
463
- isRead={isUnreadMap === null || !isUnreadMap['notification-2']}
464
- >
465
- <NotificationDrawerListItemHeader
466
- variant="danger"
467
- title="Unread danger notification title. This is a long title to show how the title will wrap if it is long and wraps to multiple lines."
468
- srTitle="Danger notification:"
469
- >
470
- <Dropdown
471
- onSelect={this.onSelect}
472
- isOpen={isActionsMenuOpen['toggle-id-2'] || false}
473
- id="notification-2"
474
- onOpenChange={(isOpen) => !isOpen && this.setState({ isActionsMenuOpen: {} })}
475
- popperProps={{ position: 'right' }}
476
- toggle={(toggleRef) => (
477
- <MenuToggle
478
- ref={toggleRef}
479
- id="toggle-id-2"
480
- aria-label="Notification drawer actions"
481
- variant="plain"
482
- onClick={() => this.onToggle('toggle-id-2')}
483
- isExpanded={isActionsMenuOpen['toggle-id-2'] || false}
484
- >
485
- <EllipsisVIcon aria-hidden="true" />
486
- </MenuToggle>
487
- )}
488
- >
489
- <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
490
- </Dropdown>
491
- </NotificationDrawerListItemHeader>
492
- <NotificationDrawerListItemBody timestamp="10 minutes ago">
493
- This is a danger notification description. This is a long description to show how the title will wrap
494
- if it is long and wraps to multiple lines.
495
- </NotificationDrawerListItemBody>
496
- </NotificationDrawerListItem>
497
- <NotificationDrawerListItem
498
- variant="warning"
499
- onClick={() => this.onListItemClick('notification-3')}
500
- isRead={isUnreadMap === null || !isUnreadMap['notification-3']}
501
- >
502
- <NotificationDrawerListItemHeader
503
- variant="warning"
504
- title="Read warning notification title"
505
- srTitle="Warning notification:"
506
- >
507
- <Dropdown
508
- onSelect={this.onSelect}
509
- isOpen={isActionsMenuOpen['toggle-id-3'] || false}
510
- id="notification-3"
511
- onOpenChange={(isOpen) => !isOpen && this.setState({ isActionsMenuOpen: {} })}
512
- popperProps={{ position: 'right' }}
513
- toggle={(toggleRef) => (
514
- <MenuToggle
515
- ref={toggleRef}
516
- id="toggle-id-3"
517
- aria-label="Notification drawer actions"
518
- variant="plain"
519
- onClick={() => this.onToggle('toggle-id-3')}
520
- isExpanded={isActionsMenuOpen['toggle-id-3'] || false}
521
- >
522
- <EllipsisVIcon aria-hidden="true" />
523
- </MenuToggle>
524
- )}
525
- >
526
- <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
527
- </Dropdown>
528
- </NotificationDrawerListItemHeader>
529
- <NotificationDrawerListItemBody timestamp="20 minutes ago">
530
- This is a warning notification description.
531
- </NotificationDrawerListItemBody>
532
- </NotificationDrawerListItem>
533
- <NotificationDrawerListItem
534
- variant="success"
535
- onClick={() => this.onListItemClick('notification-4')}
536
- isRead={isUnreadMap === null || !isUnreadMap['notification-4']}
537
- >
538
- <NotificationDrawerListItemHeader
539
- variant="success"
540
- title="Read success notification title"
541
- srTitle="Success notification:"
542
- >
543
- <Dropdown
544
- onSelect={this.onSelect}
545
- isOpen={isActionsMenuOpen['toggle-id-4'] || false}
546
- id="notification-4"
547
- onOpenChange={(isOpen) => !isOpen && this.setState({ isActionsMenuOpen: {} })}
548
- popperProps={{ position: 'right' }}
549
- toggle={(toggleRef) => (
550
- <MenuToggle
551
- ref={toggleRef}
552
- id="toggle-id-4"
553
- aria-label="Notification drawer actions"
554
- variant="plain"
555
- onClick={() => this.onToggle('toggle-id-4')}
556
- isExpanded={isActionsMenuOpen['toggle-id-4'] || false}
557
- >
558
- <EllipsisVIcon aria-hidden="true" />
559
- </MenuToggle>
560
- )}
561
- >
562
- <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
563
- </Dropdown>
564
- </NotificationDrawerListItemHeader>
565
- <NotificationDrawerListItemBody timestamp="30 minutes ago">
566
- This is a success notification description.
567
- </NotificationDrawerListItemBody>
568
- </NotificationDrawerListItem>
569
- </NotificationDrawerList>
570
- )}
571
- {!showNotifications && (
572
- <EmptyState variant={EmptyStateVariant.full}>
573
- <EmptyStateHeader
574
- headingLevel="h2"
575
- titleText="No results found"
576
- icon={<EmptyStateIcon icon={SearchIcon} />}
577
- />
578
- <EmptyStateBody>
579
- There are currently no alerts. There may be silenced critical alerts however.
580
- </EmptyStateBody>
581
- <EmptyStateFooter>
582
- <EmptyStateActions>
583
- <Button variant="link">Action</Button>
584
- </EmptyStateActions>
585
- </EmptyStateFooter>
586
- </EmptyState>
587
- )}
588
- </NotificationDrawerBody>
589
- </NotificationDrawer>
590
- );
591
-
592
- return (
593
- <React.Fragment>
594
- <Page
595
- header={Header}
596
- sidebar={Sidebar}
597
- isManagedSidebar
598
- notificationDrawer={notificationDrawer}
599
- onNotificationDrawerExpand={(event) => this.focusDrawer(event)}
600
- isNotificationDrawerExpanded={isDrawerExpanded}
601
- skipToContent={PageSkipToContent}
602
- breadcrumb={PageBreadcrumb}
603
- mainContainerId={pageId}
604
- >
605
- <PageSection variant={PageSectionVariants.light}>
606
- <TextContent>
607
- <Text component="h1">Main title</Text>
608
- <Text component="p">
609
- Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
610
- of its relative line height of 1.5.
611
- </Text>
612
- </TextContent>
613
- </PageSection>
614
- <PageSection variant={PageSectionVariants.light} noPadding={true}>
615
- Panel section content
616
- </PageSection>
617
- </Page>
618
- </React.Fragment>
619
- );
620
- }
621
- }
622
27
  ```
623
28
 
624
29
  ### Grouped
625
30
 
626
31
  When using the NotificationDrawerGroupList and related components, the function that is passed in to the `onNotificationDrawerExpand` prop on the Page component must also ensure the NotificationDrawer component only receives focus when it is initially opened. Otherwise any time a drawer group item is opened the NotificationDrawer component will receive focus, which would be unexpected behavior for users.
627
32
 
628
- ```js isFullscreen
629
- import React from 'react';
630
- import {
631
- Avatar,
632
- Brand,
633
- Breadcrumb,
634
- BreadcrumbItem,
635
- Button,
636
- ButtonVariant,
637
- Divider,
638
- Dropdown,
639
- DropdownItem,
640
- DropdownList,
641
- EmptyState,
642
- EmptyStateActions,
643
- EmptyStateBody,
644
- EmptyStateIcon,
645
- EmptyStateHeader,
646
- EmptyStateFooter,
647
- EmptyStateVariant,
648
- MenuToggle,
649
- Nav,
650
- NavItem,
651
- NavList,
652
- NotificationBadge,
653
- NotificationDrawer,
654
- NotificationDrawerBody,
655
- NotificationDrawerGroup,
656
- NotificationDrawerGroupList,
657
- NotificationDrawerHeader,
658
- NotificationDrawerList,
659
- NotificationDrawerListItem,
660
- NotificationDrawerListItemBody,
661
- NotificationDrawerListItemHeader,
662
- Page,
663
- PageSection,
664
- PageSectionVariants,
665
- PageSidebar,
666
- PageSidebarBody,
667
- SkipToContent,
668
- Title,
669
- TextContent,
670
- Text,
671
- PageToggleButton,
672
- Masthead,
673
- MastheadMain,
674
- MastheadToggle,
675
- MastheadContent,
676
- MastheadBrand,
677
- Toolbar,
678
- ToolbarItem,
679
- ToolbarGroup,
680
- ToolbarContent
681
- } from '@patternfly/react-core';
682
- import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
683
- import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
684
- import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon';
685
- import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
686
- import SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';
687
- import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
688
- import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
689
- import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
690
- import pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg';
691
-
692
- class GroupedNotificationDrawer extends React.Component {
693
- constructor(props) {
694
- super(props);
695
- this.drawerRef = React.createRef();
696
- this.state = {
697
- isDropdownOpen: false,
698
- isKebabDropdownOpen: false,
699
- activeItem: 0,
700
- isDrawerExpanded: false,
701
- firstDrawerGroupExpanded: false,
702
- secondDrawerGroupExpanded: true,
703
- thirdDrawerGroupExpanded: false,
704
- isActionsMenuOpen: {},
705
- showNotifications: true,
706
- isUnreadMap: {
707
- 'group-1': {
708
- 'notification-5': true,
709
- 'notification-6': true
710
- },
711
- 'group-2': {
712
- 'notification-9': true,
713
- 'notification-10': true
714
- },
715
- 'group-3': null
716
- }
717
- };
718
- this.onDropdownToggle = () => {
719
- this.setState((prevState) => ({
720
- isDropdownOpen: !prevState.isDropdownOpen
721
- }));
722
- };
723
-
724
- this.onDropdownSelect = () => {
725
- this.setState({
726
- isDropdownOpen: false
727
- });
728
- };
729
-
730
- this.onKebabDropdownToggle = () => {
731
- this.setState((prevState) => ({
732
- isKebabDropdownOpen: !prevState.isKebabDropdownOpen
733
- }));
734
- };
735
-
736
- this.onKebabDropdownSelect = () => {
737
- this.setState({
738
- isKebabDropdownOpen: false
739
- });
740
- };
741
-
742
- this.onNavSelect = (_event, result) => {
743
- this.setState({
744
- activeItem: result.itemId
745
- });
746
- };
747
-
748
- this.onCloseNotificationDrawer = (_event) => {
749
- this.setState((prevState) => {
750
- return {
751
- isDrawerExpanded: !prevState.isDrawerExpanded
752
- };
753
- });
754
- };
755
-
756
- this.onToggle = (id) => {
757
- this.setState((prevState) => ({
758
- isActionsMenuOpen: { [id]: !prevState.isActionsMenuOpen[id] }
759
- }));
760
- };
761
-
762
- this.onSelect = () => {
763
- this.setState({
764
- isActionsMenuOpen: {}
765
- });
766
- };
767
-
768
- this.onListItemClick = (groupId, id) => {
769
- this.setState((prevState) => {
770
- if (!prevState.isUnreadMap || !prevState.isUnreadMap[groupId]) return;
771
- console.log(prevState.isUnreadMap);
772
- prevState.isUnreadMap[groupId][id] = false;
773
- return {
774
- isUnreadMap: prevState.isUnreadMap
775
- };
776
- });
777
- };
778
-
779
- this.isUnread = (groupId, id) => {
780
- const { isUnreadMap } = this.state;
781
- return isUnreadMap && isUnreadMap[groupId] && isUnreadMap[groupId][id];
782
- };
783
-
784
- this.getNumberUnread = (groupId) => {
785
- const { isUnreadMap } = this.state;
786
- if (isUnreadMap === null) return 0;
787
-
788
- if (groupId) {
789
- if (isUnreadMap[groupId] === null) return 0;
790
-
791
- return Object.keys(isUnreadMap[groupId]).reduce((count, id) => {
792
- return isUnreadMap[groupId][id] ? count + 1 : count;
793
- }, 0);
794
- }
795
-
796
- return Object.keys(isUnreadMap).reduce((count, groupId) => {
797
- if (isUnreadMap[groupId] === null) return count;
798
-
799
- return Object.keys(isUnreadMap[groupId]).reduce((groupCount, id) => {
800
- return isUnreadMap[groupId][id] ? groupCount + 1 : groupCount;
801
- }, count);
802
- }, 0);
803
- };
804
-
805
- this.markAllRead = () => {
806
- this.setState({
807
- isUnreadMap: null
808
- });
809
- };
810
-
811
- this.showNotifications = (showNotifications) => {
812
- this.setState({
813
- isUnreadMap: null,
814
- showNotifications: showNotifications
815
- });
816
- };
817
-
818
- this.toggleFirstDrawer = (event, value) => {
819
- this.setState({
820
- firstDrawerGroupExpanded: value
821
- });
822
- };
823
-
824
- this.toggleSecondDrawer = (event, value) => {
825
- this.setState({
826
- secondDrawerGroupExpanded: value
827
- });
828
- };
829
-
830
- this.toggleThirdDrawer = (event, value) => {
831
- this.setState({
832
- thirdDrawerGroupExpanded: value
833
- });
834
- };
835
-
836
- this.focusDrawer = (_event) => {
837
- // Prevent the NotificationDrawer from receiving focus if a drawer group item is opened
838
- if (!document.activeElement.closest(`.${this.drawerRef.current.className}`)) {
839
- const firstTabbableItem = this.drawerRef.current.querySelector('a, button');
840
- firstTabbableItem.focus();
841
- }
842
- };
843
- }
844
-
845
- render() {
846
- const {
847
- isDropdownOpen,
848
- isKebabDropdownOpen,
849
- activeItem,
850
- res,
851
- isDrawerExpanded,
852
- isActionsMenuOpen,
853
- isUnreadMap,
854
- showNotifications,
855
- firstDrawerGroupExpanded,
856
- secondDrawerGroupExpanded,
857
- thirdDrawerGroupExpanded
858
- } = this.state;
859
-
860
- const PageNav = (
861
- <Nav onSelect={this.onNavSelect} aria-label="Nav">
862
- <NavList>
863
- <NavItem itemId={0} isActive={activeItem === 0}>
864
- System Panel
865
- </NavItem>
866
- <NavItem itemId={1} isActive={activeItem === 1}>
867
- Policy
868
- </NavItem>
869
- <NavItem itemId={2} isActive={activeItem === 2}>
870
- Authentication
871
- </NavItem>
872
- <NavItem itemId={3} isActive={activeItem === 3}>
873
- Network Services
874
- </NavItem>
875
- <NavItem itemId={4} isActive={activeItem === 4}>
876
- Server
877
- </NavItem>
878
- </NavList>
879
- </Nav>
880
- );
881
- const kebabDropdownItems = (
882
- <>
883
- <DropdownItem>
884
- <CogIcon /> Settings
885
- </DropdownItem>
886
- <DropdownItem>
887
- <HelpIcon /> Help
888
- </DropdownItem>
889
- </>
890
- );
891
- const userDropdownItems = (
892
- <>
893
- <DropdownItem key="group 2 profile">My profile</DropdownItem>
894
- <DropdownItem key="group 2 user">User management</DropdownItem>
895
- <DropdownItem key="group 2 logout">Logout</DropdownItem>
896
- </>
897
- );
898
- const headerToolbar = (
899
- <Toolbar isFullHeight>
900
- <ToolbarContent>
901
- <ToolbarGroup spaceItems={{ default: 'spacerNone' }} align={{ default: 'alignRight' }}>
902
- <ToolbarGroup variant="icon-button-group">
903
- <ToolbarItem visibility={{ default: 'visible' }} isSelected={isDrawerExpanded}>
904
- <NotificationBadge
905
- variant={this.getNumberUnread() === 0 ? 'read' : 'unread'}
906
- onClick={(event) => this.onCloseNotificationDrawer(event)}
907
- aria-label="Notifications"
908
- isExpanded={isDrawerExpanded}
909
- >
910
- <BellIcon />
911
- </NotificationBadge>
912
- </ToolbarItem>
913
- <ToolbarGroup
914
- variant="icon-button-group"
915
- visibility={{
916
- default: 'hidden',
917
- lg: 'visible'
918
- }} /** the settings and help icon buttons are only visible on desktop sizes and replaced by a kebab dropdown for other sizes */
919
- >
920
- <ToolbarItem>
921
- <Button aria-label="Settings actions" variant={ButtonVariant.plain}>
922
- <CogIcon />
923
- </Button>
924
- </ToolbarItem>
925
- <ToolbarItem>
926
- <Button aria-label="Help actions" variant={ButtonVariant.plain}>
927
- <QuestionCircleIcon />
928
- </Button>
929
- </ToolbarItem>
930
- </ToolbarGroup>
931
- </ToolbarGroup>
932
- <ToolbarGroup>
933
- <ToolbarItem
934
- visibility={{
935
- lg: 'hidden'
936
- }} /** this kebab dropdown replaces the icon buttons and is hidden for desktop sizes */
937
- >
938
- <Dropdown
939
- isOpen={isKebabDropdownOpen}
940
- onSelect={this.onKebabDropdownSelect}
941
- onOpenChange={(isOpen) => this.setState({ isKebabDropdownOpen: isOpen })}
942
- popperProps={{ position: 'right' }}
943
- toggle={(toggleRef) => (
944
- <MenuToggle
945
- ref={toggleRef}
946
- isExpanded={isKebabDropdownOpen}
947
- onClick={this.onKebabDropdownToggle}
948
- variant="plain"
949
- aria-label="Settings and help"
950
- >
951
- <EllipsisVIcon aria-hidden="true" />
952
- </MenuToggle>
953
- )}
954
- >
955
- <DropdownList>{kebabDropdownItems}</DropdownList>
956
- </Dropdown>
957
- </ToolbarItem>
958
- <ToolbarItem
959
- visibility={{ default: 'hidden', md: 'visible' }} /** this user dropdown is hidden on mobile sizes */
960
- >
961
- <Dropdown
962
- isOpen={isDropdownOpen}
963
- onSelect={this.onDropdownSelect}
964
- onOpenChange={(isOpen) => this.setState({ isDropdownOpen: isOpen })}
965
- popperProps={{ position: 'right' }}
966
- toggle={(toggleRef) => (
967
- <MenuToggle
968
- ref={toggleRef}
969
- isExpanded={isDropdownOpen}
970
- onClick={this.onDropdownToggle}
971
- icon={<Avatar src={imgAvatar} alt="" />}
972
- isFullHeight
973
- >
974
- John Smith
975
- </MenuToggle>
976
- )}
977
- >
978
- <DropdownList>{userDropdownItems}</DropdownList>
979
- </Dropdown>
980
- </ToolbarItem>
981
- </ToolbarGroup>
982
- </ToolbarGroup>
983
- </ToolbarContent>
984
- </Toolbar>
985
- );
986
-
987
- const Header = (
988
- <Masthead>
989
- <MastheadToggle>
990
- <PageToggleButton variant="plain" aria-label="Global navigation">
991
- <BarsIcon />
992
- </PageToggleButton>
993
- </MastheadToggle>
994
- <MastheadMain>
995
- <MastheadBrand>
996
- <Brand src={pfLogo} alt="PatternFly" heights={{ default: '36px' }} />
997
- </MastheadBrand>
998
- </MastheadMain>
999
- <MastheadContent>{headerToolbar}</MastheadContent>
1000
- </Masthead>
1001
- );
1002
- const Sidebar = (
1003
- <PageSidebar>
1004
- <PageSidebarBody>{PageNav}</PageSidebarBody>
1005
- </PageSidebar>
1006
- );
1007
- const pageId = 'main-content-page-layout-default-nav';
1008
- const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to content</SkipToContent>;
1009
-
1010
- const PageBreadcrumb = (
1011
- <Breadcrumb>
1012
- <BreadcrumbItem>Section home</BreadcrumbItem>
1013
- <BreadcrumbItem to="#">Section title</BreadcrumbItem>
1014
- <BreadcrumbItem to="#">Section title</BreadcrumbItem>
1015
- <BreadcrumbItem to="#" isActive>
1016
- Section landing
1017
- </BreadcrumbItem>
1018
- </Breadcrumb>
1019
- );
1020
-
1021
- const drawerContent = 'Panel content';
1022
- const notificationDrawerActions = (
1023
- <>
1024
- <DropdownItem key="markAllRead" onClick={this.markAllRead}>
1025
- Mark all read
1026
- </DropdownItem>
1027
- <DropdownItem key="clearAll" onClick={() => this.showNotifications(false)}>
1028
- Clear all
1029
- </DropdownItem>
1030
- <DropdownItem key="unclearLast" onClick={() => this.showNotifications(true)}>
1031
- Unclear last
1032
- </DropdownItem>
1033
- <DropdownItem key="settings">Settings</DropdownItem>
1034
- </>
1035
- );
1036
- const notificationDrawerDropdownItems = (
1037
- <>
1038
- <DropdownItem
1039
- key="link"
1040
- to="#"
1041
- // Prevent default onClick behavior for demo purposes
1042
- onClick={(ev) => ev.preventDefault()}
1043
- >
1044
- Link
1045
- </DropdownItem>
1046
- <DropdownItem key="action">Action</DropdownItem>
1047
- <Divider component="li" key="separator" />
1048
- <DropdownItem key="disabled link" isDisabled>
1049
- Disabled Link
1050
- </DropdownItem>
1051
- </>
1052
- );
1053
-
1054
- const notificationDrawer = (
1055
- <NotificationDrawer ref={this.drawerRef}>
1056
- <NotificationDrawerHeader count={this.getNumberUnread()} onClose={this.onCloseNotificationDrawer}>
1057
- <Dropdown
1058
- onSelect={this.onSelect}
1059
- isOpen={isActionsMenuOpen['toggle-id-0'] || false}
1060
- id="notification-0"
1061
- onOpenChange={(isOpen) => !isOpen && this.setState({ isActionsMenuOpen: {} })}
1062
- popperProps={{ position: 'right' }}
1063
- toggle={(toggleRef) => (
1064
- <MenuToggle
1065
- ref={toggleRef}
1066
- id="toggle-id-0"
1067
- aria-label="Notification drawer actions"
1068
- variant="plain"
1069
- onClick={() => this.onToggle('toggle-id-0')}
1070
- isExpanded={isActionsMenuOpen['toggle-id-0'] || false}
1071
- >
1072
- <EllipsisVIcon aria-hidden="true" />
1073
- </MenuToggle>
1074
- )}
1075
- >
1076
- <DropdownList>{notificationDrawerActions}</DropdownList>
1077
- </Dropdown>
1078
- </NotificationDrawerHeader>
1079
- <NotificationDrawerBody>
1080
- {showNotifications && (
1081
- <NotificationDrawerGroupList>
1082
- <NotificationDrawerGroup
1083
- title="First notification group"
1084
- isExpanded={firstDrawerGroupExpanded}
1085
- count={this.getNumberUnread('group-1')}
1086
- onExpand={this.toggleFirstDrawer}
1087
- >
1088
- <NotificationDrawerList isHidden={!firstDrawerGroupExpanded}>
1089
- <NotificationDrawerListItem
1090
- variant="info"
1091
- onClick={() => this.onListItemClick('group-1', 'notification-5')}
1092
- isRead={!this.isUnread('group-1', 'notification-5')}
1093
- >
1094
- <NotificationDrawerListItemHeader
1095
- variant="info"
1096
- title="Unread info notification title"
1097
- srTitle="Info notification:"
1098
- >
1099
- <Dropdown
1100
- onSelect={this.onSelect}
1101
- isOpen={isActionsMenuOpen['toggle-id-5'] || false}
1102
- id="notification-5"
1103
- onOpenChange={(isOpen) => !isOpen && this.setState({ isActionsMenuOpen: {} })}
1104
- popperProps={{ position: 'right' }}
1105
- toggle={(toggleRef) => (
1106
- <MenuToggle
1107
- ref={toggleRef}
1108
- id="toggle-id-5"
1109
- aria-label="Notification drawer actions"
1110
- variant="plain"
1111
- onClick={() => this.onToggle('toggle-id-5')}
1112
- isExpanded={isActionsMenuOpen['toggle-id-5'] || false}
1113
- >
1114
- <EllipsisVIcon aria-hidden="true" />
1115
- </MenuToggle>
1116
- )}
1117
- >
1118
- <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
1119
- </Dropdown>
1120
- </NotificationDrawerListItemHeader>
1121
- <NotificationDrawerListItemBody timestamp="5 minutes ago">
1122
- This is an info notification description.
1123
- </NotificationDrawerListItemBody>
1124
- </NotificationDrawerListItem>
1125
- <NotificationDrawerListItem
1126
- variant="danger"
1127
- onClick={() => this.onListItemClick('group-1', 'notification-6')}
1128
- isRead={!this.isUnread('group-1', 'notification-6')}
1129
- >
1130
- <NotificationDrawerListItemHeader
1131
- variant="danger"
1132
- title="Unread danger notification title. This is a long title to show how the title will wrap if it is long and wraps to multiple lines."
1133
- srTitle="Danger notification:"
1134
- >
1135
- <Dropdown
1136
- onSelect={this.onSelect}
1137
- isOpen={isActionsMenuOpen['toggle-id-6'] || false}
1138
- id="notification-6"
1139
- onOpenChange={(isOpen) => !isOpen && this.setState({ isActionsMenuOpen: {} })}
1140
- popperProps={{ position: 'right' }}
1141
- toggle={(toggleRef) => (
1142
- <MenuToggle
1143
- ref={toggleRef}
1144
- id="toggle-id-6"
1145
- aria-label="Notification drawer actions"
1146
- variant="plain"
1147
- onClick={() => this.onToggle('toggle-id-6')}
1148
- isExpanded={isActionsMenuOpen['toggle-id-6'] || false}
1149
- >
1150
- <EllipsisVIcon aria-hidden="true" />
1151
- </MenuToggle>
1152
- )}
1153
- >
1154
- <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
1155
- </Dropdown>
1156
- </NotificationDrawerListItemHeader>
1157
- <NotificationDrawerListItemBody timestamp="10 minutes ago">
1158
- This is a danger notification description. This is a long description to show how the title will
1159
- wrap if it is long and wraps to multiple lines.
1160
- </NotificationDrawerListItemBody>
1161
- </NotificationDrawerListItem>
1162
- <NotificationDrawerListItem
1163
- variant="warning"
1164
- onClick={() => this.onListItemClick('group-1', 'notification-7')}
1165
- isRead={!this.isUnread('group-1', 'notification-7')}
1166
- >
1167
- <NotificationDrawerListItemHeader
1168
- variant="warning"
1169
- title="Read warning notification title"
1170
- srTitle="Warning notification:"
1171
- >
1172
- <Dropdown
1173
- onSelect={this.onSelect}
1174
- isOpen={isActionsMenuOpen['toggle-id-7'] || false}
1175
- id="notification-7"
1176
- onOpenChange={(isOpen) => !isOpen && this.setState({ isActionsMenuOpen: {} })}
1177
- popperProps={{ position: 'right' }}
1178
- toggle={(toggleRef) => (
1179
- <MenuToggle
1180
- ref={toggleRef}
1181
- id="toggle-id-7"
1182
- aria-label="Notification drawer actions"
1183
- variant="plain"
1184
- onClick={() => this.onToggle('toggle-id-7')}
1185
- isExpanded={isActionsMenuOpen['toggle-id-7'] || false}
1186
- >
1187
- <EllipsisVIcon aria-hidden="true" />
1188
- </MenuToggle>
1189
- )}
1190
- >
1191
- <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
1192
- </Dropdown>
1193
- </NotificationDrawerListItemHeader>
1194
- <NotificationDrawerListItemBody timestamp="20 minutes ago">
1195
- This is a warning notification description.
1196
- </NotificationDrawerListItemBody>
1197
- </NotificationDrawerListItem>
1198
- <NotificationDrawerListItem
1199
- variant="success"
1200
- onClick={() => this.onListItemClick('group-1', 'notification-8')}
1201
- isRead={!this.isUnread('group-1', 'notification-8')}
1202
- >
1203
- <NotificationDrawerListItemHeader
1204
- variant="success"
1205
- title="Read success notification title"
1206
- srTitle="Success notification:"
1207
- >
1208
- <Dropdown
1209
- onSelect={this.onSelect}
1210
- isOpen={isActionsMenuOpen['toggle-id-8'] || false}
1211
- id="notification-8"
1212
- onOpenChange={(isOpen) => !isOpen && this.setState({ isActionsMenuOpen: {} })}
1213
- popperProps={{ position: 'right' }}
1214
- toggle={(toggleRef) => (
1215
- <MenuToggle
1216
- ref={toggleRef}
1217
- id="toggle-id-8"
1218
- aria-label="Notification drawer actions"
1219
- variant="plain"
1220
- onClick={() => this.onToggle('toggle-id-8')}
1221
- isExpanded={isActionsMenuOpen['toggle-id-8'] || false}
1222
- >
1223
- <EllipsisVIcon aria-hidden="true" />
1224
- </MenuToggle>
1225
- )}
1226
- >
1227
- <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
1228
- </Dropdown>
1229
- </NotificationDrawerListItemHeader>
1230
- <NotificationDrawerListItemBody timestamp="30 minutes ago">
1231
- This is a success notification description.
1232
- </NotificationDrawerListItemBody>
1233
- </NotificationDrawerListItem>
1234
- </NotificationDrawerList>
1235
- </NotificationDrawerGroup>
1236
- <NotificationDrawerGroup
1237
- title="Second notification group"
1238
- isExpanded={secondDrawerGroupExpanded}
1239
- count={this.getNumberUnread('group-2')}
1240
- onExpand={this.toggleSecondDrawer}
1241
- >
1242
- <NotificationDrawerList isHidden={!secondDrawerGroupExpanded}>
1243
- <NotificationDrawerListItem
1244
- variant="info"
1245
- onClick={() => this.onListItemClick('group-2', 'notification-9')}
1246
- isRead={!this.isUnread('group-2', 'notification-9')}
1247
- >
1248
- <NotificationDrawerListItemHeader
1249
- variant="info"
1250
- title="Unread info notification title"
1251
- srTitle="Info notification:"
1252
- >
1253
- <Dropdown
1254
- onSelect={this.onSelect}
1255
- isOpen={isActionsMenuOpen['toggle-id-9'] || false}
1256
- id="notification-9"
1257
- onOpenChange={(isOpen) => !isOpen && this.setState({ isActionsMenuOpen: {} })}
1258
- popperProps={{ position: 'right' }}
1259
- toggle={(toggleRef) => (
1260
- <MenuToggle
1261
- ref={toggleRef}
1262
- id="toggle-id-9"
1263
- aria-label="Notification drawer actions"
1264
- variant="plain"
1265
- onClick={() => this.onToggle('toggle-id-9')}
1266
- isExpanded={isActionsMenuOpen['toggle-id-9'] || false}
1267
- >
1268
- <EllipsisVIcon aria-hidden="true" />
1269
- </MenuToggle>
1270
- )}
1271
- >
1272
- <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
1273
- </Dropdown>
1274
- </NotificationDrawerListItemHeader>
1275
- <NotificationDrawerListItemBody timestamp="5 minutes ago">
1276
- This is an info notification description.
1277
- </NotificationDrawerListItemBody>
1278
- </NotificationDrawerListItem>
1279
- <NotificationDrawerListItem
1280
- variant="danger"
1281
- onClick={() => this.onListItemClick('group-2', 'notification-10')}
1282
- isRead={!this.isUnread('group-2', 'notification-10')}
1283
- >
1284
- <NotificationDrawerListItemHeader
1285
- variant="danger"
1286
- title="Unread danger notification title. This is a long title to show how the title will wrap if it is long and wraps to multiple lines."
1287
- srTitle="Danger notification:"
1288
- >
1289
- <Dropdown
1290
- onSelect={this.onSelect}
1291
- isOpen={isActionsMenuOpen['toggle-id-10'] || false}
1292
- id="notification-10"
1293
- onOpenChange={(isOpen) => !isOpen && this.setState({ isActionsMenuOpen: {} })}
1294
- popperProps={{ position: 'right' }}
1295
- toggle={(toggleRef) => (
1296
- <MenuToggle
1297
- ref={toggleRef}
1298
- id="toggle-id-10"
1299
- aria-label="Notification drawer actions"
1300
- variant="plain"
1301
- onClick={() => this.onToggle('toggle-id-10')}
1302
- isExpanded={isActionsMenuOpen['toggle-id-10'] || false}
1303
- >
1304
- <EllipsisVIcon aria-hidden="true" />
1305
- </MenuToggle>
1306
- )}
1307
- >
1308
- <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
1309
- </Dropdown>
1310
- </NotificationDrawerListItemHeader>
1311
- <NotificationDrawerListItemBody timestamp="10 minutes ago">
1312
- This is a danger notification description. This is a long description to show how the title will
1313
- wrap if it is long and wraps to multiple lines.
1314
- </NotificationDrawerListItemBody>
1315
- </NotificationDrawerListItem>
1316
- <NotificationDrawerListItem
1317
- variant="warning"
1318
- onClick={() => this.onListItemClick('group-2', 'notification-11')}
1319
- isRead={!this.isUnread('group-2', 'notification-11')}
1320
- >
1321
- <NotificationDrawerListItemHeader
1322
- variant="warning"
1323
- title="Read warning notification title"
1324
- srTitle="Warning notification:"
1325
- >
1326
- <Dropdown
1327
- onSelect={this.onSelect}
1328
- isOpen={isActionsMenuOpen['toggle-id-11'] || false}
1329
- id="notification-11"
1330
- onOpenChange={(isOpen) => !isOpen && this.setState({ isActionsMenuOpen: {} })}
1331
- popperProps={{ position: 'right' }}
1332
- toggle={(toggleRef) => (
1333
- <MenuToggle
1334
- ref={toggleRef}
1335
- id="toggle-id-11"
1336
- aria-label="Notification drawer actions"
1337
- variant="plain"
1338
- onClick={() => this.onToggle('toggle-id-11')}
1339
- isExpanded={isActionsMenuOpen['toggle-id-11'] || false}
1340
- >
1341
- <EllipsisVIcon aria-hidden="true" />
1342
- </MenuToggle>
1343
- )}
1344
- >
1345
- <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
1346
- </Dropdown>
1347
- </NotificationDrawerListItemHeader>
1348
- <NotificationDrawerListItemBody timestamp="20 minutes ago">
1349
- This is a warning notification description.
1350
- </NotificationDrawerListItemBody>
1351
- </NotificationDrawerListItem>
1352
- <NotificationDrawerListItem
1353
- variant="success"
1354
- onClick={() => this.onListItemClick('group-2', 'notification-12')}
1355
- isRead={!this.isUnread('group-2', 'notification-12')}
1356
- >
1357
- <NotificationDrawerListItemHeader
1358
- variant="success"
1359
- title="Read success notification title"
1360
- srTitle="Success notification:"
1361
- >
1362
- <Dropdown
1363
- onSelect={this.onSelect}
1364
- isOpen={isActionsMenuOpen['toggle-id-12'] || false}
1365
- id="notification-12"
1366
- onOpenChange={(isOpen) => !isOpen && this.setState({ isActionsMenuOpen: {} })}
1367
- popperProps={{ position: 'right' }}
1368
- toggle={(toggleRef) => (
1369
- <MenuToggle
1370
- ref={toggleRef}
1371
- id="toggle-id-12"
1372
- aria-label="Notification drawer actions"
1373
- variant="plain"
1374
- onClick={() => this.onToggle('toggle-id-12')}
1375
- isExpanded={isActionsMenuOpen['toggle-id-12'] || false}
1376
- >
1377
- <EllipsisVIcon aria-hidden="true" />
1378
- </MenuToggle>
1379
- )}
1380
- >
1381
- <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
1382
- </Dropdown>
1383
- </NotificationDrawerListItemHeader>
1384
- <NotificationDrawerListItemBody timestamp="30 minutes ago">
1385
- This is a success notification description.
1386
- </NotificationDrawerListItemBody>
1387
- </NotificationDrawerListItem>
1388
- </NotificationDrawerList>
1389
- </NotificationDrawerGroup>
1390
- <NotificationDrawerGroup
1391
- title="Third notification group"
1392
- isExpanded={thirdDrawerGroupExpanded}
1393
- count={this.getNumberUnread('group-3')}
1394
- onExpand={this.toggleThirdDrawer}
1395
- >
1396
- <NotificationDrawerList isHidden={!thirdDrawerGroupExpanded}>
1397
- <EmptyState variant={EmptyStateVariant.full}>
1398
- <EmptyStateHeader
1399
- headingLevel="h2"
1400
- titleText="No alerts found"
1401
- icon={<EmptyStateIcon icon={SearchIcon} />}
1402
- />
1403
- <EmptyStateBody>
1404
- There are currently no critical alerts firing. There may be firing alerts of other severities or
1405
- silenced critical alerts however.
1406
- </EmptyStateBody>
1407
- <EmptyStateFooter>
1408
- <EmptyStateActions>
1409
- <Button variant="link">Action</Button>
1410
- </EmptyStateActions>
1411
- </EmptyStateFooter>
1412
- </EmptyState>
1413
- </NotificationDrawerList>
1414
- </NotificationDrawerGroup>
1415
- </NotificationDrawerGroupList>
1416
- )}
1417
- {!showNotifications && (
1418
- <EmptyState variant={EmptyStateVariant.full}>
1419
- <EmptyStateHeader
1420
- headingLevel="h2"
1421
- titleText="No alerts found"
1422
- icon={<EmptyStateIcon icon={SearchIcon} />}
1423
- />
1424
- <EmptyStateBody>
1425
- There are currently no alerts. There may be silenced critical alerts however.
1426
- </EmptyStateBody>
1427
- <EmptyStateFooter>
1428
- <EmptyStateActions>
1429
- <Button variant="link">Action</Button>
1430
- </EmptyStateActions>
1431
- </EmptyStateFooter>
1432
- </EmptyState>
1433
- )}
1434
- </NotificationDrawerBody>
1435
- </NotificationDrawer>
1436
- );
33
+ ```ts file='./examples/NotificationDrawerGrouped.tsx' isFullscreen
1437
34
 
1438
- return (
1439
- <React.Fragment>
1440
- <Page
1441
- header={Header}
1442
- sidebar={Sidebar}
1443
- isManagedSidebar
1444
- notificationDrawer={notificationDrawer}
1445
- isNotificationDrawerExpanded={isDrawerExpanded}
1446
- onNotificationDrawerExpand={(event) => this.focusDrawer(event)}
1447
- skipToContent={PageSkipToContent}
1448
- breadcrumb={PageBreadcrumb}
1449
- mainContainerId={pageId}
1450
- >
1451
- <PageSection variant={PageSectionVariants.light}>
1452
- <TextContent>
1453
- <Text component="h1">Main title</Text>
1454
- <Text component="p">
1455
- Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
1456
- of its relative line height of 1.5.
1457
- </Text>
1458
- </TextContent>
1459
- </PageSection>
1460
- <PageSection variant={PageSectionVariants.light} noPadding={true}>
1461
- Panel section content
1462
- </PageSection>
1463
- </Page>
1464
- </React.Fragment>
1465
- );
1466
- }
1467
- }
1468
35
  ```