@patternfly/react-core 5.1.1-prerelease.2 → 5.1.1-prerelease.3

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 (125) hide show
  1. package/CHANGELOG.md +4 -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/helpers/package.json +1 -1
  120. package/layouts/package.json +1 -1
  121. package/next/package.json +1 -1
  122. package/package.json +2 -2
  123. package/src/demos/NotificationDrawer/NotificationDrawer.md +2 -1435
  124. package/src/demos/NotificationDrawer/examples/NotificationDrawerBasic.tsx +557 -0
  125. package/src/demos/NotificationDrawer/examples/NotificationDrawerGrouped.tsx +796 -0
@@ -0,0 +1,557 @@
1
+ import React from 'react';
2
+ import {
3
+ Avatar,
4
+ Brand,
5
+ Breadcrumb,
6
+ BreadcrumbItem,
7
+ Button,
8
+ ButtonVariant,
9
+ Divider,
10
+ Dropdown,
11
+ DropdownItem,
12
+ DropdownList,
13
+ EmptyState,
14
+ EmptyStateActions,
15
+ EmptyStateBody,
16
+ EmptyStateIcon,
17
+ EmptyStateHeader,
18
+ EmptyStateFooter,
19
+ EmptyStateVariant,
20
+ MenuToggle,
21
+ Nav,
22
+ NavItem,
23
+ NavList,
24
+ NotificationBadge,
25
+ NotificationDrawer,
26
+ NotificationDrawerBody,
27
+ NotificationDrawerHeader,
28
+ NotificationDrawerList,
29
+ NotificationDrawerListItem,
30
+ NotificationDrawerListItemBody,
31
+ NotificationDrawerListItemHeader,
32
+ Page,
33
+ PageSection,
34
+ PageSectionVariants,
35
+ PageSidebar,
36
+ PageSidebarBody,
37
+ SkipToContent,
38
+ TextContent,
39
+ Text,
40
+ PageToggleButton,
41
+ Masthead,
42
+ MastheadMain,
43
+ MastheadToggle,
44
+ MastheadContent,
45
+ MastheadBrand,
46
+ Toolbar,
47
+ ToolbarItem,
48
+ ToolbarGroup,
49
+ ToolbarContent
50
+ } from '@patternfly/react-core';
51
+ import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
52
+ import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
53
+ import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
54
+ import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
55
+ import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
56
+ import BarsIcon from '@patternfly/react-icons/dist/js/icons/bars-icon';
57
+ import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
58
+ import SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';
59
+ import pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg';
60
+
61
+ export const NotificationDrawerBasic: React.FunctionComponent = () => {
62
+ const drawerRef = React.useRef<HTMLElement | null>(null);
63
+
64
+ const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
65
+ const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false);
66
+ const [isDrawerExpanded, setIsDrawerExpanded] = React.useState(false);
67
+
68
+ interface UnreadMap {
69
+ [notificationId: string]: boolean;
70
+ }
71
+
72
+ const [activeItem, setActiveItem] = React.useState<number | string>(0);
73
+ const [isUnreadMap, setIsUnreadMap] = React.useState<UnreadMap | null>({
74
+ 'notification-1': true,
75
+ 'notification-2': true,
76
+ 'notification-3': false,
77
+ 'notification-4': false
78
+ });
79
+
80
+ const [shouldShowNotifications, setShouldShowNotifications] = React.useState(true);
81
+
82
+ interface ActionsMenu {
83
+ [toggleId: string]: boolean;
84
+ }
85
+
86
+ const [isActionsMenuOpen, setIsActionsMenuOpen] = React.useState<ActionsMenu | {}>({});
87
+
88
+ const onNavSelect = (
89
+ _event: React.FormEvent<HTMLInputElement>,
90
+ selectedItem: {
91
+ groupId: number | string;
92
+ itemId: number | string;
93
+ to: string;
94
+ }
95
+ ) => setActiveItem(selectedItem.itemId);
96
+
97
+ const onDropdownToggle = () => setIsDropdownOpen((prevState) => !prevState);
98
+ const onDropdownSelect = () => setIsDropdownOpen(false);
99
+ const onKebabDropdownToggle = () => setIsKebabDropdownOpen((prevState) => !prevState);
100
+ const onKebabDropdownSelect = () => setIsKebabDropdownOpen(false);
101
+ const onCloseNotificationDrawer = (_event: any) => setIsDrawerExpanded((prevState) => !prevState);
102
+
103
+ const onToggle = (id: string) => {
104
+ setIsActionsMenuOpen({ [id]: !isActionsMenuOpen[id] });
105
+ };
106
+
107
+ const closeActionsMenu = () => setIsActionsMenuOpen({});
108
+
109
+ const onListItemClick = (id: string) => {
110
+ if (!isUnreadMap) {
111
+ return;
112
+ }
113
+ setIsUnreadMap({ ...isUnreadMap, [id]: false });
114
+ };
115
+
116
+ const getNumberUnread: () => number = () => {
117
+ if (!isUnreadMap) {
118
+ return 0;
119
+ }
120
+ return Object.values(isUnreadMap).reduce((count, value) => count + (value ? 1 : 0), 0);
121
+ };
122
+
123
+ const markAllRead = () => setIsUnreadMap(null);
124
+
125
+ const showNotifications = (showNotifications: boolean) => {
126
+ setIsUnreadMap(null);
127
+ setShouldShowNotifications(showNotifications);
128
+ };
129
+
130
+ const focusDrawer = (_event: any) => {
131
+ if (drawerRef.current === null) {
132
+ return;
133
+ }
134
+ const firstTabbableItem = drawerRef.current.querySelector('a, button') as
135
+ | HTMLAnchorElement
136
+ | HTMLButtonElement
137
+ | null;
138
+ firstTabbableItem?.focus();
139
+ };
140
+
141
+ const PageNav = (
142
+ <Nav onSelect={onNavSelect} aria-label="Nav">
143
+ <NavList>
144
+ <NavItem itemId={0} isActive={activeItem === 0}>
145
+ System Panel
146
+ </NavItem>
147
+ <NavItem itemId={1} isActive={activeItem === 1}>
148
+ Policy
149
+ </NavItem>
150
+ <NavItem itemId={2} isActive={activeItem === 2}>
151
+ Authentication
152
+ </NavItem>
153
+ <NavItem itemId={3} isActive={activeItem === 3}>
154
+ Network Services
155
+ </NavItem>
156
+ <NavItem itemId={4} isActive={activeItem === 4}>
157
+ Server
158
+ </NavItem>
159
+ </NavList>
160
+ </Nav>
161
+ );
162
+ const kebabDropdownItems = (
163
+ <>
164
+ <DropdownItem>
165
+ <CogIcon /> Settings
166
+ </DropdownItem>
167
+ <DropdownItem>
168
+ <HelpIcon /> Help
169
+ </DropdownItem>
170
+ </>
171
+ );
172
+ const userDropdownItems = (
173
+ <>
174
+ <DropdownItem key="group 2 profile">My profile</DropdownItem>
175
+ <DropdownItem key="group 2 user">User management</DropdownItem>
176
+ <DropdownItem key="group 2 logout">Logout</DropdownItem>
177
+ </>
178
+ );
179
+ const headerToolbar = (
180
+ <Toolbar isFullHeight>
181
+ <ToolbarContent>
182
+ <ToolbarGroup spaceItems={{ default: 'spaceItemsNone' }} align={{ default: 'alignRight' }}>
183
+ <ToolbarGroup variant="icon-button-group">
184
+ <ToolbarItem visibility={{ default: 'visible' }} selected={isDrawerExpanded}>
185
+ <NotificationBadge
186
+ variant={getNumberUnread() === 0 ? 'read' : 'unread'}
187
+ onClick={(event: any) => onCloseNotificationDrawer(event)}
188
+ aria-label="Notifications"
189
+ isExpanded={isDrawerExpanded}
190
+ >
191
+ <BellIcon />
192
+ </NotificationBadge>
193
+ </ToolbarItem>
194
+ <ToolbarGroup
195
+ variant="icon-button-group"
196
+ visibility={{
197
+ default: 'hidden',
198
+ lg: 'visible'
199
+ }} /** the settings and help icon buttons are only visible on desktop sizes and replaced by a kebab dropdown for other sizes */
200
+ >
201
+ <ToolbarItem>
202
+ <Button aria-label="Settings actions" variant={ButtonVariant.plain}>
203
+ <CogIcon />
204
+ </Button>
205
+ </ToolbarItem>
206
+ <ToolbarItem>
207
+ <Button aria-label="Help actions" variant={ButtonVariant.plain}>
208
+ <QuestionCircleIcon />
209
+ </Button>
210
+ </ToolbarItem>
211
+ </ToolbarGroup>
212
+ </ToolbarGroup>
213
+ <ToolbarGroup>
214
+ <ToolbarItem
215
+ visibility={{
216
+ lg: 'hidden'
217
+ }} /** this kebab dropdown replaces the icon buttons and is hidden for desktop sizes */
218
+ >
219
+ <Dropdown
220
+ isOpen={isKebabDropdownOpen}
221
+ onSelect={onKebabDropdownSelect}
222
+ onOpenChange={setIsKebabDropdownOpen}
223
+ popperProps={{ position: 'right' }}
224
+ toggle={(toggleRef: React.RefObject<any>) => (
225
+ <MenuToggle
226
+ ref={toggleRef}
227
+ isExpanded={isKebabDropdownOpen}
228
+ onClick={onKebabDropdownToggle}
229
+ variant="plain"
230
+ aria-label="Settings and help"
231
+ >
232
+ <EllipsisVIcon aria-hidden="true" />
233
+ </MenuToggle>
234
+ )}
235
+ >
236
+ <DropdownList>{kebabDropdownItems}</DropdownList>
237
+ </Dropdown>
238
+ </ToolbarItem>
239
+ <ToolbarItem
240
+ visibility={{ default: 'hidden', md: 'visible' }} /** this user dropdown is hidden on mobile sizes */
241
+ >
242
+ <Dropdown
243
+ isOpen={isDropdownOpen}
244
+ onSelect={onDropdownSelect}
245
+ onOpenChange={setIsDropdownOpen}
246
+ popperProps={{ position: 'right' }}
247
+ toggle={(toggleRef: React.RefObject<any>) => (
248
+ <MenuToggle
249
+ ref={toggleRef}
250
+ isExpanded={isDropdownOpen}
251
+ onClick={onDropdownToggle}
252
+ icon={<Avatar src={imgAvatar} alt="" />}
253
+ isFullHeight
254
+ >
255
+ John Smith
256
+ </MenuToggle>
257
+ )}
258
+ >
259
+ <DropdownList>{userDropdownItems}</DropdownList>
260
+ </Dropdown>
261
+ </ToolbarItem>
262
+ </ToolbarGroup>
263
+ </ToolbarGroup>
264
+ </ToolbarContent>
265
+ </Toolbar>
266
+ );
267
+
268
+ const Header = (
269
+ <Masthead>
270
+ <MastheadToggle>
271
+ <PageToggleButton variant="plain" aria-label="Global navigation">
272
+ <BarsIcon />
273
+ </PageToggleButton>
274
+ </MastheadToggle>
275
+ <MastheadMain>
276
+ <MastheadBrand>
277
+ <Brand src={pfLogo} alt="PatternFly" heights={{ default: '36px' }} />
278
+ </MastheadBrand>
279
+ </MastheadMain>
280
+ <MastheadContent>{headerToolbar}</MastheadContent>
281
+ </Masthead>
282
+ );
283
+ const Sidebar = (
284
+ <PageSidebar>
285
+ <PageSidebarBody>{PageNav}</PageSidebarBody>
286
+ </PageSidebar>
287
+ );
288
+ const pageId = 'main-content-page-layout-default-nav';
289
+ const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to content</SkipToContent>;
290
+
291
+ const PageBreadcrumb = (
292
+ <Breadcrumb>
293
+ <BreadcrumbItem>Section home</BreadcrumbItem>
294
+ <BreadcrumbItem to="#">Section title</BreadcrumbItem>
295
+ <BreadcrumbItem to="#">Section title</BreadcrumbItem>
296
+ <BreadcrumbItem to="#" isActive>
297
+ Section landing
298
+ </BreadcrumbItem>
299
+ </Breadcrumb>
300
+ );
301
+
302
+ const notificationDrawerActions = (
303
+ <>
304
+ <DropdownItem key="markAllRead" onClick={markAllRead}>
305
+ Mark all read
306
+ </DropdownItem>
307
+ <DropdownItem key="clearAll" onClick={() => showNotifications(false)}>
308
+ Clear all
309
+ </DropdownItem>
310
+ <DropdownItem key="unclearLast" onClick={() => showNotifications(true)}>
311
+ Unclear last
312
+ </DropdownItem>
313
+ <DropdownItem key="settings">Settings</DropdownItem>
314
+ </>
315
+ );
316
+ const notificationDrawerDropdownItems = (
317
+ <>
318
+ <DropdownItem
319
+ key="link"
320
+ to="#"
321
+ // Prevent default onClick behavior for demo purposes
322
+ onClick={(ev: any) => ev.preventDefault()}
323
+ >
324
+ Link
325
+ </DropdownItem>
326
+ <DropdownItem key="action">Action</DropdownItem>
327
+ <Divider component="li" key="separator" />
328
+ <DropdownItem key="disabled link" isDisabled>
329
+ Disabled Link
330
+ </DropdownItem>
331
+ </>
332
+ );
333
+ const notificationDrawer = (
334
+ <NotificationDrawer ref={drawerRef}>
335
+ <NotificationDrawerHeader count={getNumberUnread()} onClose={onCloseNotificationDrawer}>
336
+ <Dropdown
337
+ onSelect={closeActionsMenu}
338
+ isOpen={isActionsMenuOpen['toggle-id-0'] || false}
339
+ id="notification-0"
340
+ onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}
341
+ popperProps={{ position: 'right' }}
342
+ toggle={(toggleRef: React.RefObject<any>) => (
343
+ <MenuToggle
344
+ ref={toggleRef}
345
+ id="toggle-id-0"
346
+ aria-label="Notification drawer actions"
347
+ variant="plain"
348
+ onClick={() => onToggle('toggle-id-0')}
349
+ isExpanded={isActionsMenuOpen['toggle-id-0'] || false}
350
+ >
351
+ <EllipsisVIcon aria-hidden="true" />
352
+ </MenuToggle>
353
+ )}
354
+ >
355
+ <DropdownList>{notificationDrawerActions}</DropdownList>
356
+ </Dropdown>
357
+ </NotificationDrawerHeader>
358
+ <NotificationDrawerBody>
359
+ {shouldShowNotifications && (
360
+ <NotificationDrawerList>
361
+ <NotificationDrawerListItem
362
+ variant="info"
363
+ onClick={() => onListItemClick('notification-1')}
364
+ isRead={isUnreadMap === null || !isUnreadMap['notification-1']}
365
+ >
366
+ <NotificationDrawerListItemHeader
367
+ variant="info"
368
+ title="Unread info notification title"
369
+ srTitle="Info notification:"
370
+ >
371
+ <Dropdown
372
+ onSelect={closeActionsMenu}
373
+ isOpen={isActionsMenuOpen['toggle-id-1'] || false}
374
+ id="notification-1"
375
+ onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}
376
+ popperProps={{ position: 'right' }}
377
+ toggle={(toggleRef: React.RefObject<any>) => (
378
+ <MenuToggle
379
+ ref={toggleRef}
380
+ id="toggle-id-1"
381
+ aria-label="Notification drawer actions"
382
+ variant="plain"
383
+ onClick={() => onToggle('toggle-id-1')}
384
+ isExpanded={isActionsMenuOpen['toggle-id-1'] || false}
385
+ >
386
+ <EllipsisVIcon aria-hidden="true" />
387
+ </MenuToggle>
388
+ )}
389
+ >
390
+ <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
391
+ </Dropdown>
392
+ </NotificationDrawerListItemHeader>
393
+ <NotificationDrawerListItemBody timestamp="5 minutes ago">
394
+ This is an info notification description.
395
+ </NotificationDrawerListItemBody>
396
+ </NotificationDrawerListItem>
397
+ <NotificationDrawerListItem
398
+ variant="danger"
399
+ onClick={() => onListItemClick('notification-2')}
400
+ isRead={isUnreadMap === null || !isUnreadMap['notification-2']}
401
+ >
402
+ <NotificationDrawerListItemHeader
403
+ variant="danger"
404
+ 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."
405
+ srTitle="Danger notification:"
406
+ >
407
+ <Dropdown
408
+ onSelect={closeActionsMenu}
409
+ isOpen={isActionsMenuOpen['toggle-id-2'] || false}
410
+ id="notification-2"
411
+ onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}
412
+ popperProps={{ position: 'right' }}
413
+ toggle={(toggleRef: React.RefObject<any>) => (
414
+ <MenuToggle
415
+ ref={toggleRef}
416
+ id="toggle-id-2"
417
+ aria-label="Notification drawer actions"
418
+ variant="plain"
419
+ onClick={() => onToggle('toggle-id-2')}
420
+ isExpanded={isActionsMenuOpen['toggle-id-2'] || false}
421
+ >
422
+ <EllipsisVIcon aria-hidden="true" />
423
+ </MenuToggle>
424
+ )}
425
+ >
426
+ <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
427
+ </Dropdown>
428
+ </NotificationDrawerListItemHeader>
429
+ <NotificationDrawerListItemBody timestamp="10 minutes ago">
430
+ This is a danger notification description. This is a long description to show how the title will wrap if
431
+ it is long and wraps to multiple lines.
432
+ </NotificationDrawerListItemBody>
433
+ </NotificationDrawerListItem>
434
+ <NotificationDrawerListItem
435
+ variant="warning"
436
+ onClick={() => onListItemClick('notification-3')}
437
+ isRead={isUnreadMap === null || !isUnreadMap['notification-3']}
438
+ >
439
+ <NotificationDrawerListItemHeader
440
+ variant="warning"
441
+ title="Read warning notification title"
442
+ srTitle="Warning notification:"
443
+ >
444
+ <Dropdown
445
+ onSelect={closeActionsMenu}
446
+ isOpen={isActionsMenuOpen['toggle-id-3'] || false}
447
+ id="notification-3"
448
+ onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}
449
+ popperProps={{ position: 'right' }}
450
+ toggle={(toggleRef: React.RefObject<any>) => (
451
+ <MenuToggle
452
+ ref={toggleRef}
453
+ id="toggle-id-3"
454
+ aria-label="Notification drawer actions"
455
+ variant="plain"
456
+ onClick={() => onToggle('toggle-id-3')}
457
+ isExpanded={isActionsMenuOpen['toggle-id-3'] || false}
458
+ >
459
+ <EllipsisVIcon aria-hidden="true" />
460
+ </MenuToggle>
461
+ )}
462
+ >
463
+ <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
464
+ </Dropdown>
465
+ </NotificationDrawerListItemHeader>
466
+ <NotificationDrawerListItemBody timestamp="20 minutes ago">
467
+ This is a warning notification description.
468
+ </NotificationDrawerListItemBody>
469
+ </NotificationDrawerListItem>
470
+ <NotificationDrawerListItem
471
+ variant="success"
472
+ onClick={() => onListItemClick('notification-4')}
473
+ isRead={isUnreadMap === null || !isUnreadMap['notification-4']}
474
+ >
475
+ <NotificationDrawerListItemHeader
476
+ variant="success"
477
+ title="Read success notification title"
478
+ srTitle="Success notification:"
479
+ >
480
+ <Dropdown
481
+ onSelect={closeActionsMenu}
482
+ isOpen={isActionsMenuOpen['toggle-id-4'] || false}
483
+ id="notification-4"
484
+ onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}
485
+ popperProps={{ position: 'right' }}
486
+ toggle={(toggleRef: React.RefObject<any>) => (
487
+ <MenuToggle
488
+ ref={toggleRef}
489
+ id="toggle-id-4"
490
+ aria-label="Notification drawer actions"
491
+ variant="plain"
492
+ onClick={() => onToggle('toggle-id-4')}
493
+ isExpanded={isActionsMenuOpen['toggle-id-4'] || false}
494
+ >
495
+ <EllipsisVIcon aria-hidden="true" />
496
+ </MenuToggle>
497
+ )}
498
+ >
499
+ <DropdownList>{notificationDrawerDropdownItems}</DropdownList>
500
+ </Dropdown>
501
+ </NotificationDrawerListItemHeader>
502
+ <NotificationDrawerListItemBody timestamp="30 minutes ago">
503
+ This is a success notification description.
504
+ </NotificationDrawerListItemBody>
505
+ </NotificationDrawerListItem>
506
+ </NotificationDrawerList>
507
+ )}
508
+ {!shouldShowNotifications && (
509
+ <EmptyState variant={EmptyStateVariant.full}>
510
+ <EmptyStateHeader
511
+ headingLevel="h2"
512
+ titleText="No alerts found"
513
+ icon={<EmptyStateIcon icon={SearchIcon} />}
514
+ />
515
+ <EmptyStateBody>
516
+ There are currently no alerts. There may be silenced critical alerts however.
517
+ </EmptyStateBody>
518
+ <EmptyStateFooter>
519
+ <EmptyStateActions>
520
+ <Button variant="link">Action</Button>
521
+ </EmptyStateActions>
522
+ </EmptyStateFooter>
523
+ </EmptyState>
524
+ )}
525
+ </NotificationDrawerBody>
526
+ </NotificationDrawer>
527
+ );
528
+
529
+ return (
530
+ <React.Fragment>
531
+ <Page
532
+ header={Header}
533
+ sidebar={Sidebar}
534
+ isManagedSidebar
535
+ notificationDrawer={notificationDrawer}
536
+ onNotificationDrawerExpand={(
537
+ event: React.MouseEvent<Element, MouseEvent> | KeyboardEvent | React.TransitionEvent<Element>
538
+ ) => focusDrawer(event)}
539
+ isNotificationDrawerExpanded={isDrawerExpanded}
540
+ skipToContent={PageSkipToContent}
541
+ breadcrumb={PageBreadcrumb}
542
+ mainContainerId={pageId}
543
+ >
544
+ <PageSection variant={PageSectionVariants.light}>
545
+ <TextContent>
546
+ <Text component="h1">Main title</Text>
547
+ <Text component="p">
548
+ Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
549
+ of its relative line height of 1.5.
550
+ </Text>
551
+ </TextContent>
552
+ </PageSection>
553
+ <PageSection variant={PageSectionVariants.light}>Panel section content</PageSection>
554
+ </Page>
555
+ </React.Fragment>
556
+ );
557
+ };