@patternfly/react-docs 7.6.0-prerelease.6 → 7.6.0-prerelease.8
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.
- package/CHANGELOG.md +4 -0
- package/package.json +12 -13
- package/patternfly-docs/generated/components/about-modal/react.js +149 -0
- package/patternfly-docs/generated/components/accordion/react.js +262 -0
- package/patternfly-docs/generated/components/action-list/react.js +144 -0
- package/patternfly-docs/generated/components/alert/react-demos.js +56 -0
- package/patternfly-docs/generated/components/alert/react.js +1433 -0
- package/patternfly-docs/generated/components/avatar/react.js +166 -0
- package/patternfly-docs/generated/components/back-to-top/react-demos.js +60 -0
- package/patternfly-docs/generated/components/back-to-top/react.js +77 -0
- package/patternfly-docs/generated/components/backdrop/react.js +64 -0
- package/patternfly-docs/generated/components/background-image/react.js +62 -0
- package/patternfly-docs/generated/components/badge/react.js +97 -0
- package/patternfly-docs/generated/components/banner/react-demos.js +57 -0
- package/patternfly-docs/generated/components/banner/react.js +148 -0
- package/patternfly-docs/generated/components/brand/react.js +142 -0
- package/patternfly-docs/generated/components/breadcrumb/react.js +206 -0
- package/patternfly-docs/generated/components/button/react-demos.js +57 -0
- package/patternfly-docs/generated/components/button/react.js +826 -0
- package/patternfly-docs/generated/components/card/react-demos.js +201 -0
- package/patternfly-docs/generated/components/card/react.js +1015 -0
- package/patternfly-docs/generated/components/charts/area-chart/-Victory.js +1350 -0
- package/patternfly-docs/generated/components/charts/bar-chart/-Victory.js +1334 -0
- package/patternfly-docs/generated/components/charts/box-plot-chart/-Victory.js +1282 -0
- package/patternfly-docs/generated/components/charts/bullet-chart/-Victory.js +848 -0
- package/patternfly-docs/generated/components/charts/colors-for-charts/-Victory.js +192 -0
- package/patternfly-docs/generated/components/charts/donut-chart/-Victory.js +426 -0
- package/patternfly-docs/generated/components/charts/donut-utilization-chart/-Victory.js +804 -0
- package/patternfly-docs/generated/components/charts/legends/-Victory.js +3230 -0
- package/patternfly-docs/generated/components/charts/line-chart/-Victory.js +1178 -0
- package/patternfly-docs/generated/components/charts/line-chart/ECharts.js +525 -0
- package/patternfly-docs/generated/components/charts/patterns/-Victory.js +3382 -0
- package/patternfly-docs/generated/components/charts/pie-chart/-Victory.js +377 -0
- package/patternfly-docs/generated/components/charts/resize-observer/-Victory.js +2475 -0
- package/patternfly-docs/generated/components/charts/sankey-chart/ECharts.js +538 -0
- package/patternfly-docs/generated/components/charts/scatter-chart/-Victory.js +1551 -0
- package/patternfly-docs/generated/components/charts/skeletons/-Victory.js +4115 -0
- package/patternfly-docs/generated/components/charts/sparkline-chart/-Victory.js +955 -0
- package/patternfly-docs/generated/components/charts/stack-chart/-Victory.js +1173 -0
- package/patternfly-docs/generated/components/charts/threshold-chart/-Victory.js +1166 -0
- package/patternfly-docs/generated/components/charts/tooltips/-Victory.js +413 -0
- package/patternfly-docs/generated/components/chip/react-deprecated.js +323 -0
- package/patternfly-docs/generated/components/clipboard-copy/react.js +373 -0
- package/patternfly-docs/generated/components/code-block/react.js +148 -0
- package/patternfly-docs/generated/components/code-editor/react.js +659 -0
- package/patternfly-docs/generated/components/compass/react-demos.js +147 -0
- package/patternfly-docs/generated/components/compass/react.js +440 -0
- package/patternfly-docs/generated/components/content/react.js +248 -0
- package/patternfly-docs/generated/components/data-list/react-demos.js +90 -0
- package/patternfly-docs/generated/components/data-list/react.js +709 -0
- package/patternfly-docs/generated/components/date-and-time/calendar-month/react.js +283 -0
- package/patternfly-docs/generated/components/date-and-time/date-and-time-picker/react-demos.js +64 -0
- package/patternfly-docs/generated/components/date-and-time/date-picker/react-demos.js +83 -0
- package/patternfly-docs/generated/components/date-and-time/date-picker/react.js +395 -0
- package/patternfly-docs/generated/components/date-and-time/time-picker/react.js +241 -0
- package/patternfly-docs/generated/components/description-list/react-demos.js +58 -0
- package/patternfly-docs/generated/components/description-list/react.js +743 -0
- package/patternfly-docs/generated/components/divider/react.js +126 -0
- package/patternfly-docs/generated/components/drag-and-drop/react-demos.js +351 -0
- package/patternfly-docs/generated/components/drag-and-drop/react-deprecated.js +184 -0
- package/patternfly-docs/generated/components/drag-and-drop/react.js +137 -0
- package/patternfly-docs/generated/components/drawer/react.js +598 -0
- package/patternfly-docs/generated/components/dual-list-selector/react-deprecated.js +772 -0
- package/patternfly-docs/generated/components/dual-list-selector/react.js +594 -0
- package/patternfly-docs/generated/components/empty-state/react.js +199 -0
- package/patternfly-docs/generated/components/expandable-section/react-demos.js +65 -0
- package/patternfly-docs/generated/components/expandable-section/react.js +408 -0
- package/patternfly-docs/generated/components/file-upload/multiple-file-upload/react-demos.js +52 -0
- package/patternfly-docs/generated/components/file-upload/multiple-file-upload/react.js +398 -0
- package/patternfly-docs/generated/components/file-upload/simple-file-upload/react.js +749 -0
- package/patternfly-docs/generated/components/forms/checkbox/react.js +222 -0
- package/patternfly-docs/generated/components/forms/form/react.js +1106 -0
- package/patternfly-docs/generated/components/forms/form-select/react.js +208 -0
- package/patternfly-docs/generated/components/forms/radio/react.js +212 -0
- package/patternfly-docs/generated/components/forms/text-area/react.js +160 -0
- package/patternfly-docs/generated/components/forms/text-input/react.js +216 -0
- package/patternfly-docs/generated/components/helper-text/react-demos.js +180 -0
- package/patternfly-docs/generated/components/helper-text/react.js +164 -0
- package/patternfly-docs/generated/components/hero/react.js +88 -0
- package/patternfly-docs/generated/components/hint/react.js +169 -0
- package/patternfly-docs/generated/components/icon/react.js +215 -0
- package/patternfly-docs/generated/components/input-group/react.js +182 -0
- package/patternfly-docs/generated/components/jump-links/react-demos.js +154 -0
- package/patternfly-docs/generated/components/jump-links/react.js +212 -0
- package/patternfly-docs/generated/components/label/react-demos.js +57 -0
- package/patternfly-docs/generated/components/label/react.js +417 -0
- package/patternfly-docs/generated/components/list/react.js +175 -0
- package/patternfly-docs/generated/components/login-page/react.js +587 -0
- package/patternfly-docs/generated/components/masthead/react-demos.js +79 -0
- package/patternfly-docs/generated/components/masthead/react.js +291 -0
- package/patternfly-docs/generated/components/menus/application-launcher/react-demos.js +769 -0
- package/patternfly-docs/generated/components/menus/context-selector/react-demos.js +665 -0
- package/patternfly-docs/generated/components/menus/custom-menus/react-demos.js +187 -0
- package/patternfly-docs/generated/components/menus/dropdown/react-templates.js +163 -0
- package/patternfly-docs/generated/components/menus/dropdown/react.js +998 -0
- package/patternfly-docs/generated/components/menus/menu/react.js +1540 -0
- package/patternfly-docs/generated/components/menus/menu-toggle/react.js +747 -0
- package/patternfly-docs/generated/components/menus/options-menu/react-demos.js +508 -0
- package/patternfly-docs/generated/components/menus/select/react-templates.js +257 -0
- package/patternfly-docs/generated/components/menus/select/react.js +998 -0
- package/patternfly-docs/generated/components/modal/react-deprecated.js +554 -0
- package/patternfly-docs/generated/components/modal/react.js +597 -0
- package/patternfly-docs/generated/components/navigation/react-demos.js +356 -0
- package/patternfly-docs/generated/components/navigation/react.js +409 -0
- package/patternfly-docs/generated/components/notification-badge/react.js +196 -0
- package/patternfly-docs/generated/components/notification-drawer/react-demos.js +107 -0
- package/patternfly-docs/generated/components/notification-drawer/react.js +394 -0
- package/patternfly-docs/generated/components/number-input/react.js +210 -0
- package/patternfly-docs/generated/components/overflow-menu/react.js +274 -0
- package/patternfly-docs/generated/components/page/react-demos.js +149 -0
- package/patternfly-docs/generated/components/page/react.js +1352 -0
- package/patternfly-docs/generated/components/pagination/react.js +492 -0
- package/patternfly-docs/generated/components/panel/react.js +236 -0
- package/patternfly-docs/generated/components/popover/react.js +390 -0
- package/patternfly-docs/generated/components/progress/react-demos.js +59 -0
- package/patternfly-docs/generated/components/progress/react.js +283 -0
- package/patternfly-docs/generated/components/progress-stepper/react-demos.js +45 -0
- package/patternfly-docs/generated/components/progress-stepper/react.js +219 -0
- package/patternfly-docs/generated/components/search-input/react-demos.js +113 -0
- package/patternfly-docs/generated/components/search-input/react.js +263 -0
- package/patternfly-docs/generated/components/sidebar/react.js +236 -0
- package/patternfly-docs/generated/components/simple-list/react.js +200 -0
- package/patternfly-docs/generated/components/skeleton/react-demos.js +44 -0
- package/patternfly-docs/generated/components/skeleton/react.js +122 -0
- package/patternfly-docs/generated/components/skip-to-content/react.js +73 -0
- package/patternfly-docs/generated/components/slider/react.js +309 -0
- package/patternfly-docs/generated/components/spinner/react.js +111 -0
- package/patternfly-docs/generated/components/switch/react.js +163 -0
- package/patternfly-docs/generated/components/table/react-demos.js +355 -0
- package/patternfly-docs/generated/components/table/react-deprecated.js +1350 -0
- package/patternfly-docs/generated/components/table/react.js +3241 -0
- package/patternfly-docs/generated/components/tabs/react-demos.js +108 -0
- package/patternfly-docs/generated/components/tabs/react.js +1359 -0
- package/patternfly-docs/generated/components/text-input-group/react-demos.js +152 -0
- package/patternfly-docs/generated/components/text-input-group/react.js +278 -0
- package/patternfly-docs/generated/components/tile/react-deprecated.js +242 -0
- package/patternfly-docs/generated/components/timestamp/react.js +283 -0
- package/patternfly-docs/generated/components/title/react.js +94 -0
- package/patternfly-docs/generated/components/toggle-group/react.js +299 -0
- package/patternfly-docs/generated/components/toolbar/react-demos.js +66 -0
- package/patternfly-docs/generated/components/toolbar/react.js +932 -0
- package/patternfly-docs/generated/components/tooltip/react.js +241 -0
- package/patternfly-docs/generated/components/tree-view/react.js +429 -0
- package/patternfly-docs/generated/components/truncate/react.js +211 -0
- package/patternfly-docs/generated/components/wizard/react-demos.js +87 -0
- package/patternfly-docs/generated/components/wizard/react-deprecated.js +788 -0
- package/patternfly-docs/generated/components/wizard/react.js +986 -0
- package/patternfly-docs/generated/developer-guides/open-ui-automation/react.js +285 -0
- package/patternfly-docs/generated/foundations-and-styles/layouts/bullseye/react.js +70 -0
- package/patternfly-docs/generated/foundations-and-styles/layouts/flex/react.js +506 -0
- package/patternfly-docs/generated/foundations-and-styles/layouts/gallery/react.js +94 -0
- package/patternfly-docs/generated/foundations-and-styles/layouts/grid/react.js +272 -0
- package/patternfly-docs/generated/foundations-and-styles/layouts/level/react.js +87 -0
- package/patternfly-docs/generated/foundations-and-styles/layouts/split/react.js +124 -0
- package/patternfly-docs/generated/foundations-and-styles/layouts/stack/react.js +112 -0
- package/patternfly-docs/generated/index.js +1769 -0
- package/patternfly-docs/generated/patterns/card-view/react-demos.js +78 -0
- package/patternfly-docs/generated/patterns/filters/react-demos.js +141 -0
- package/patternfly-docs/generated/patterns/password-generator/react-demos.js +51 -0
- package/patternfly-docs/generated/patterns/password-strength/react-demos.js +61 -0
- package/patternfly-docs/generated/patterns/primary-detail/react-demos.js +124 -0
- package/patternfly-docs/generated/patterns/right-to-left/react-demos.js +81 -0
- package/LICENSE +0 -21
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { AutoLinkHeader, Example, Link as PatternflyThemeLink } from '@patternfly/documentation-framework/components';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import RhUiNotificationFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-notification-fill-icon';
|
|
5
|
+
const pageData = {
|
|
6
|
+
"id": "Notification badge",
|
|
7
|
+
"section": "components",
|
|
8
|
+
"subsection": "",
|
|
9
|
+
"deprecated": false,
|
|
10
|
+
"template": false,
|
|
11
|
+
"beta": false,
|
|
12
|
+
"demo": false,
|
|
13
|
+
"newImplementationLink": false,
|
|
14
|
+
"source": "react",
|
|
15
|
+
"tabName": null,
|
|
16
|
+
"slug": "/components/notification-badge/react",
|
|
17
|
+
"sourceLink": "https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/components/NotificationBadge/examples/NotificationBadge.md",
|
|
18
|
+
"relPath": "packages/react-core/src/components/NotificationBadge/examples/NotificationBadge.md",
|
|
19
|
+
"propComponents": [
|
|
20
|
+
{
|
|
21
|
+
"name": "NotificationBadge",
|
|
22
|
+
"description": "",
|
|
23
|
+
"props": [
|
|
24
|
+
{
|
|
25
|
+
"name": "aria-label",
|
|
26
|
+
"type": "string",
|
|
27
|
+
"description": "Adds an accessible label to the notification badge."
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "attentionIcon",
|
|
31
|
+
"type": "React.ReactNode",
|
|
32
|
+
"description": "Icon to display for attention variant.",
|
|
33
|
+
"defaultValue": "<RhUiAttentionBellFillIcon />"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"name": "children",
|
|
37
|
+
"type": "React.ReactNode",
|
|
38
|
+
"description": "Content rendered inside the notification badge."
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"name": "className",
|
|
42
|
+
"type": "string",
|
|
43
|
+
"description": "Additional classes added to the notification badge."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "count",
|
|
47
|
+
"type": "number",
|
|
48
|
+
"description": "A number displayed in the badge alongside the icon.",
|
|
49
|
+
"defaultValue": "0"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"name": "icon",
|
|
53
|
+
"type": "React.ReactNode",
|
|
54
|
+
"description": "Icon to display in the notification badge.",
|
|
55
|
+
"defaultValue": "<RhUiNotificationFillIcon />"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"name": "isExpanded",
|
|
59
|
+
"type": "boolean",
|
|
60
|
+
"description": "Flag for applying expanded styling and setting the aria-expanded attribute on the\nnotification badge.",
|
|
61
|
+
"defaultValue": "false"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"name": "onAnimationEnd",
|
|
65
|
+
"type": "(event: React.AnimationEvent<HTMLButtonElement>) => void",
|
|
66
|
+
"description": "Callback for when the animation of the notification badge icon ends."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"name": "shouldNotify",
|
|
70
|
+
"type": "boolean",
|
|
71
|
+
"description": "Flag indicating whether the notification badge animation should be triggered. Each\ntime this prop is true, the animation will be triggered a single time.",
|
|
72
|
+
"defaultValue": "false"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"name": "variant",
|
|
76
|
+
"type": "NotificationBadgeVariant | 'read' | 'unread' | 'attention' | 'plain'",
|
|
77
|
+
"description": "Determines the variant of the notification badge.",
|
|
78
|
+
"defaultValue": "NotificationBadgeVariant.read"
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
"cssPrefix": [
|
|
84
|
+
"pf-v6-c-notification-badge"
|
|
85
|
+
],
|
|
86
|
+
"examples": [
|
|
87
|
+
"Basic",
|
|
88
|
+
"With count",
|
|
89
|
+
"With animation"
|
|
90
|
+
]
|
|
91
|
+
};
|
|
92
|
+
pageData.liveContext = {
|
|
93
|
+
useEffect,
|
|
94
|
+
useState,
|
|
95
|
+
RhUiNotificationFillIcon
|
|
96
|
+
};
|
|
97
|
+
pageData.examples = {
|
|
98
|
+
'Basic': props =>
|
|
99
|
+
<Example {...pageData} {...props} {...{"code":"import { useState } from 'react';\nimport { NotificationBadge, NotificationBadgeVariant } from '@patternfly/react-core';\n\nexport const NotificationBadgeBasic: React.FunctionComponent = () => {\n const [readExpanded, setReadExpanded] = useState(false);\n const [unreadExpanded, setUnreadExpanded] = useState(false);\n const [attentionExpanded, setAttentionExpanded] = useState(false);\n\n const onReadClick = () => {\n setReadExpanded(!readExpanded);\n };\n\n const onUnreadClick = () => {\n setUnreadExpanded(!unreadExpanded);\n };\n\n const onAttentionClick = () => {\n setAttentionExpanded(!attentionExpanded);\n };\n\n return (\n <>\n <NotificationBadge\n variant={NotificationBadgeVariant.read}\n onClick={onReadClick}\n aria-label=\"Basic notification badge with read variant\"\n isExpanded={readExpanded}\n />\n <NotificationBadge\n variant={NotificationBadgeVariant.unread}\n onClick={onUnreadClick}\n aria-label=\"Basic notification badge with unread variant\"\n isExpanded={unreadExpanded}\n />\n <NotificationBadge\n variant={NotificationBadgeVariant.attention}\n onClick={onAttentionClick}\n aria-label=\"Basic notification badge with attention variant\"\n isExpanded={attentionExpanded}\n />\n </>\n );\n};\n","title":"Basic","lang":"ts","className":""}}>
|
|
100
|
+
|
|
101
|
+
<p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
|
|
102
|
+
{`The following example demonstrates the three variants of notification badge that are available: "read", "unread", and "attention".`}
|
|
103
|
+
</p>
|
|
104
|
+
|
|
105
|
+
<p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
|
|
106
|
+
{`The `}
|
|
107
|
+
|
|
108
|
+
<code {...{"className":"ws-code "}}>
|
|
109
|
+
{`isExpanded`}
|
|
110
|
+
</code>
|
|
111
|
+
{` property is also passed in to:`}
|
|
112
|
+
</p>
|
|
113
|
+
|
|
114
|
+
<ul {...{"className":"pf-v6-c-content--ul pf-m-editorial ws-ul "}}>
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
<li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
|
|
119
|
+
{`set the `}
|
|
120
|
+
|
|
121
|
+
<code {...{"className":"ws-code "}}>
|
|
122
|
+
{`aria-expanded`}
|
|
123
|
+
</code>
|
|
124
|
+
{` attribute on the notification badge,`}
|
|
125
|
+
</li>
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
<li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
|
|
130
|
+
{`apply visual styling on the notification badge, and`}
|
|
131
|
+
</li>
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
<li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
|
|
136
|
+
{`to indicate that a notification drawer is expanded, for use-cases as seen in our `}
|
|
137
|
+
|
|
138
|
+
<PatternflyThemeLink {...{"to":"/components/notification-drawer/react-demos","className":""}}>
|
|
139
|
+
{`notification drawer react demos`}
|
|
140
|
+
</PatternflyThemeLink>
|
|
141
|
+
{`.`}
|
|
142
|
+
</li>
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
</ul>
|
|
146
|
+
</Example>,
|
|
147
|
+
'With count': props =>
|
|
148
|
+
<Example {...pageData} {...props} {...{"code":"import { useState } from 'react';\nimport { NotificationBadge, NotificationBadgeVariant } from '@patternfly/react-core';\n\nexport const NotificationBadgeWithCount: React.FunctionComponent = () => {\n const [readExpanded, setReadExpanded] = useState(false);\n const [unreadExpanded, setUnreadExpanded] = useState(false);\n const [attentionExpanded, setAttentionExpanded] = useState(false);\n\n const onReadClick = () => {\n setReadExpanded(!readExpanded);\n };\n\n const onUnreadClick = () => {\n setUnreadExpanded(!unreadExpanded);\n };\n\n const onAttentionClick = () => {\n setAttentionExpanded(!attentionExpanded);\n };\n\n return (\n <>\n <NotificationBadge\n variant={NotificationBadgeVariant.read}\n onClick={onReadClick}\n aria-label=\"Notification badge with count and read variant\"\n isExpanded={readExpanded}\n count={10}\n />\n <NotificationBadge\n variant={NotificationBadgeVariant.unread}\n onClick={onUnreadClick}\n aria-label=\"Notification badge with count and unread variant\"\n isExpanded={unreadExpanded}\n count={10}\n />\n <NotificationBadge\n variant={NotificationBadgeVariant.attention}\n onClick={onAttentionClick}\n aria-label=\"Notification badge with count and attention variant\"\n isExpanded={attentionExpanded}\n count={10}\n />\n </>\n );\n};\n","title":"With count","lang":"ts","className":""}}>
|
|
149
|
+
|
|
150
|
+
<p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
|
|
151
|
+
{`You can display a number within the notification badge by passing in the `}
|
|
152
|
+
|
|
153
|
+
<code {...{"className":"ws-code "}}>
|
|
154
|
+
{`count`}
|
|
155
|
+
</code>
|
|
156
|
+
{` property, to indicate how many read, unread, or attention notifications there are. The `}
|
|
157
|
+
|
|
158
|
+
<code {...{"className":"ws-code "}}>
|
|
159
|
+
{`isExpanded`}
|
|
160
|
+
</code>
|
|
161
|
+
{` property is also passed in, similar to the `}
|
|
162
|
+
|
|
163
|
+
<PatternflyThemeLink {...{"to":"/components/notification-badge#basic","className":""}}>
|
|
164
|
+
{`notification badge basic example`}
|
|
165
|
+
</PatternflyThemeLink>
|
|
166
|
+
{`.`}
|
|
167
|
+
</p>
|
|
168
|
+
</Example>,
|
|
169
|
+
'With animation': props =>
|
|
170
|
+
<Example {...pageData} {...props} {...{"code":"import { useEffect, useState } from 'react';\nimport { NotificationBadge, NotificationBadgeVariant, Button, Stack, StackItem } from '@patternfly/react-core';\n\nexport const NotificationBadgeWithAnimation: React.FunctionComponent = () => {\n const [count, setCount] = useState(0);\n const [notify, setNotify] = useState(false);\n\n useEffect(() => {\n if (count > 0) {\n setNotify(true);\n }\n }, [count]);\n\n const onAnimationEnd = () => {\n setNotify(false);\n };\n\n return (\n <Stack hasGutter>\n <StackItem>\n <NotificationBadge\n variant={NotificationBadgeVariant.read}\n aria-label=\"Notification badge with read variant and no count\"\n count={count}\n shouldNotify={notify}\n onAnimationEnd={onAnimationEnd}\n />\n <NotificationBadge\n variant={NotificationBadgeVariant.unread}\n aria-label=\"Notification badge animation with unread variant and count\"\n count={count}\n shouldNotify={notify}\n onAnimationEnd={onAnimationEnd}\n />\n <NotificationBadge\n variant={NotificationBadgeVariant.attention}\n aria-label=\"Notification badge animation with attention variant and count\"\n count={count}\n shouldNotify={notify}\n onAnimationEnd={onAnimationEnd}\n />\n </StackItem>\n <StackItem>\n <Button onClick={() => setCount((prevCount) => prevCount + 1)}>Add Notification</Button>\n </StackItem>\n </Stack>\n );\n};\n","title":"With animation","lang":"ts","className":""}}>
|
|
171
|
+
|
|
172
|
+
<p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
|
|
173
|
+
{`To animate the icon within the notification badge, use the `}
|
|
174
|
+
|
|
175
|
+
<code {...{"className":"ws-code "}}>
|
|
176
|
+
{`shouldNotify`}
|
|
177
|
+
</code>
|
|
178
|
+
{` property. In this example, the notification badge icon will only animate if the notification count is greater than 0.`}
|
|
179
|
+
</p>
|
|
180
|
+
</Example>
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
const Component = () => (
|
|
184
|
+
<React.Fragment>
|
|
185
|
+
<AutoLinkHeader {...{"id":"examples","headingLevel":"h2","className":"ws-title ws-h2"}}>
|
|
186
|
+
{`Examples`}
|
|
187
|
+
</AutoLinkHeader>
|
|
188
|
+
{React.createElement(pageData.examples["Basic"])}
|
|
189
|
+
{React.createElement(pageData.examples["With count"])}
|
|
190
|
+
{React.createElement(pageData.examples["With animation"])}
|
|
191
|
+
</React.Fragment>
|
|
192
|
+
);
|
|
193
|
+
Component.displayName = 'ComponentsNotificationBadgeReactDocs';
|
|
194
|
+
Component.pageData = pageData;
|
|
195
|
+
|
|
196
|
+
export default Component;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { AutoLinkHeader, Example, Link as PatternflyThemeLink } from '@patternfly/documentation-framework/components';
|
|
3
|
+
import { Fragment, useRef, useState } from 'react';
|
|
4
|
+
import RhUiNotificationFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-notification-fill-icon';
|
|
5
|
+
import RhUiSettingsFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-settings-fill-icon';
|
|
6
|
+
import RhUiMenuBarsIcon from '@patternfly/react-icons/dist/js/icons/rh-ui-menu-bars-icon';
|
|
7
|
+
import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
|
|
8
|
+
import RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';
|
|
9
|
+
import SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';
|
|
10
|
+
import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
|
|
11
|
+
import RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon';
|
|
12
|
+
import pfLogo from '@patternfly/react-core/src/demos/assets/PF-HorizontalLogo-Color.svg';
|
|
13
|
+
import srcImportbasic from './react-demos/basic.png';
|
|
14
|
+
import srcImportgrouped from './react-demos/grouped.png';
|
|
15
|
+
const pageData = {
|
|
16
|
+
"id": "Notification drawer",
|
|
17
|
+
"section": "components",
|
|
18
|
+
"subsection": "",
|
|
19
|
+
"deprecated": false,
|
|
20
|
+
"template": false,
|
|
21
|
+
"beta": false,
|
|
22
|
+
"demo": false,
|
|
23
|
+
"newImplementationLink": false,
|
|
24
|
+
"source": "react-demos",
|
|
25
|
+
"tabName": null,
|
|
26
|
+
"slug": "/components/notification-drawer/react-demos",
|
|
27
|
+
"sourceLink": "https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/demos/NotificationDrawer/NotificationDrawer.md",
|
|
28
|
+
"relPath": "packages/react-core/src/demos/NotificationDrawer/NotificationDrawer.md",
|
|
29
|
+
"fullscreenExamples": [
|
|
30
|
+
"Basic",
|
|
31
|
+
"Grouped"
|
|
32
|
+
]
|
|
33
|
+
};
|
|
34
|
+
pageData.liveContext = {
|
|
35
|
+
Fragment,
|
|
36
|
+
useRef,
|
|
37
|
+
useState,
|
|
38
|
+
RhUiNotificationFillIcon,
|
|
39
|
+
RhUiSettingsFillIcon,
|
|
40
|
+
RhUiMenuBarsIcon,
|
|
41
|
+
HelpIcon,
|
|
42
|
+
RhUiQuestionMarkCircleFillIcon,
|
|
43
|
+
SearchIcon,
|
|
44
|
+
imgAvatar,
|
|
45
|
+
RhUiEllipsisVerticalFillIcon,
|
|
46
|
+
pfLogo
|
|
47
|
+
};
|
|
48
|
+
pageData.examples = {
|
|
49
|
+
'Basic': props =>
|
|
50
|
+
<Example {...pageData} {...props} thumbnail={srcImportbasic} {...{"code":"import { Fragment, useRef, useState } from 'react';\nimport {\n Avatar,\n Brand,\n Breadcrumb,\n BreadcrumbItem,\n Button,\n ButtonVariant,\n Content,\n Divider,\n Dropdown,\n DropdownItem,\n DropdownList,\n EmptyState,\n EmptyStateActions,\n EmptyStateBody,\n EmptyStateFooter,\n EmptyStateVariant,\n MenuToggle,\n Nav,\n NavItem,\n NavList,\n NotificationBadge,\n NotificationDrawer,\n NotificationDrawerBody,\n NotificationDrawerHeader,\n NotificationDrawerList,\n NotificationDrawerListItem,\n NotificationDrawerListItemBody,\n NotificationDrawerListItemHeader,\n Page,\n PageSection,\n PageSidebar,\n PageSidebarBody,\n SkipToContent,\n PageToggleButton,\n Masthead,\n MastheadMain,\n MastheadBrand,\n MastheadToggle,\n MastheadContent,\n MastheadLogo,\n Toolbar,\n ToolbarItem,\n ToolbarGroup,\n ToolbarContent\n} from '@patternfly/react-core';\nimport RhUiSettingsFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-settings-fill-icon';\nimport HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';\nimport RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';\nimport RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon';\nimport imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';\nimport SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';\nimport pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.PF-HorizontalLogo-Color.svg';\n\nexport const NotificationDrawerBasic: React.FunctionComponent = () => {\n const drawerRef = useRef<HTMLElement | null>(null);\n\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [isKebabDropdownOpen, setIsKebabDropdownOpen] = useState(false);\n const [isDrawerExpanded, setIsDrawerExpanded] = useState(false);\n\n interface UnreadMap {\n [notificationId: string]: boolean;\n }\n\n const [activeItem, setActiveItem] = useState<number | string>(0);\n const [isUnreadMap, setIsUnreadMap] = useState<UnreadMap | null>({\n 'notification-1': true,\n 'notification-2': true,\n 'notification-3': false,\n 'notification-4': false\n });\n\n const [shouldShowNotifications, setShouldShowNotifications] = useState(true);\n\n interface ActionsMenu {\n [toggleId: string]: boolean;\n }\n\n const [isActionsMenuOpen, setIsActionsMenuOpen] = useState<ActionsMenu | {}>({});\n\n const onNavSelect = (\n _event: React.FormEvent<HTMLInputElement>,\n selectedItem: {\n groupId: number | string;\n itemId: number | string;\n to: string;\n }\n ) => setActiveItem(selectedItem.itemId);\n\n const onDropdownToggle = () => setIsDropdownOpen((prevState) => !prevState);\n const onDropdownSelect = () => setIsDropdownOpen(false);\n const onKebabDropdownToggle = () => setIsKebabDropdownOpen((prevState) => !prevState);\n const onKebabDropdownSelect = () => setIsKebabDropdownOpen(false);\n const onCloseNotificationDrawer = (_event: any) => setIsDrawerExpanded((prevState) => !prevState);\n\n const onToggle = (id: string) => {\n setIsActionsMenuOpen({ [id]: !isActionsMenuOpen[id] });\n };\n\n const closeActionsMenu = () => setIsActionsMenuOpen({});\n\n const onListItemClick = (id: string) => {\n if (!isUnreadMap) {\n return;\n }\n setIsUnreadMap({ ...isUnreadMap, [id]: false });\n };\n\n const getNumberUnread: () => number = () => {\n if (!isUnreadMap) {\n return 0;\n }\n return Object.values(isUnreadMap).reduce((count, value) => count + (value ? 1 : 0), 0);\n };\n\n const markAllRead = () => setIsUnreadMap(null);\n\n const showNotifications = (showNotifications: boolean) => {\n setIsUnreadMap(null);\n setShouldShowNotifications(showNotifications);\n };\n\n const focusDrawer = (_event: any) => {\n if (drawerRef.current === null) {\n return;\n }\n const firstTabbableItem = drawerRef.current.querySelector('a, button') as\n | HTMLAnchorElement\n | HTMLButtonElement\n | null;\n firstTabbableItem?.focus();\n };\n\n const PageNav = (\n <Nav onSelect={onNavSelect} aria-label=\"Nav\">\n <NavList>\n <NavItem itemId={0} isActive={activeItem === 0}>\n System Panel\n </NavItem>\n <NavItem itemId={1} isActive={activeItem === 1}>\n Policy\n </NavItem>\n <NavItem itemId={2} isActive={activeItem === 2}>\n Authentication\n </NavItem>\n <NavItem itemId={3} isActive={activeItem === 3}>\n Network Services\n </NavItem>\n <NavItem itemId={4} isActive={activeItem === 4}>\n Server\n </NavItem>\n </NavList>\n </Nav>\n );\n const kebabDropdownItems = (\n <>\n <DropdownItem>\n <RhUiSettingsFillIcon /> Settings\n </DropdownItem>\n <DropdownItem>\n <HelpIcon /> Help\n </DropdownItem>\n </>\n );\n const userDropdownItems = (\n <>\n <DropdownItem key=\"group 2 profile\">My profile</DropdownItem>\n <DropdownItem key=\"group 2 user\">User management</DropdownItem>\n <DropdownItem key=\"group 2 logout\">Logout</DropdownItem>\n </>\n );\n const headerToolbar = (\n <Toolbar>\n <ToolbarContent>\n <ToolbarGroup align={{ default: 'alignEnd' }}>\n <ToolbarGroup variant=\"action-group-plain\">\n <ToolbarItem visibility={{ default: 'visible' }} selected={isDrawerExpanded}>\n <NotificationBadge\n variant={getNumberUnread() === 0 ? 'read' : 'unread'}\n onClick={(event: any) => onCloseNotificationDrawer(event)}\n aria-label=\"Notifications\"\n isExpanded={isDrawerExpanded}\n />\n </ToolbarItem>\n <ToolbarGroup\n variant=\"action-group-plain\"\n visibility={{\n default: 'hidden',\n lg: 'visible'\n }} /** the settings and help icon buttons are only visible on desktop sizes and replaced by a kebab dropdown for other sizes */\n >\n <ToolbarItem>\n <Button aria-label=\"Settings actions\" isSettings variant=\"plain\" />\n </ToolbarItem>\n <ToolbarItem>\n <Button\n aria-label=\"Help actions\"\n variant={ButtonVariant.plain}\n icon={<RhUiQuestionMarkCircleFillIcon />}\n />\n </ToolbarItem>\n </ToolbarGroup>\n </ToolbarGroup>\n <ToolbarGroup>\n <ToolbarItem\n visibility={{\n lg: 'hidden'\n }} /** this kebab dropdown replaces the icon buttons and is hidden for desktop sizes */\n >\n <Dropdown\n isOpen={isKebabDropdownOpen}\n onSelect={onKebabDropdownSelect}\n onOpenChange={setIsKebabDropdownOpen}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n isExpanded={isKebabDropdownOpen}\n onClick={onKebabDropdownToggle}\n variant=\"plain\"\n aria-label=\"Settings and help\"\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{kebabDropdownItems}</DropdownList>\n </Dropdown>\n </ToolbarItem>\n <ToolbarItem\n visibility={{ default: 'hidden', md: 'visible' }} /** this user dropdown is hidden on mobile sizes */\n >\n <Dropdown\n isOpen={isDropdownOpen}\n onSelect={onDropdownSelect}\n onOpenChange={setIsDropdownOpen}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n isExpanded={isDropdownOpen}\n onClick={onDropdownToggle}\n icon={<Avatar src={imgAvatar} alt=\"\" size=\"sm\" />}\n >\n John Smith\n </MenuToggle>\n )}\n >\n <DropdownList>{userDropdownItems}</DropdownList>\n </Dropdown>\n </ToolbarItem>\n </ToolbarGroup>\n </ToolbarGroup>\n </ToolbarContent>\n </Toolbar>\n );\n\n const masthead = (\n <Masthead>\n <MastheadMain>\n <MastheadToggle>\n <PageToggleButton isHamburgerButton aria-label=\"Global navigation\" />\n </MastheadToggle>\n <MastheadBrand>\n <MastheadLogo>\n <Brand src={pfLogo} alt=\"PatternFly\" heights={{ default: '36px' }} />\n </MastheadLogo>\n </MastheadBrand>\n </MastheadMain>\n <MastheadContent>{headerToolbar}</MastheadContent>\n </Masthead>\n );\n const Sidebar = (\n <PageSidebar>\n <PageSidebarBody>{PageNav}</PageSidebarBody>\n </PageSidebar>\n );\n const pageId = 'main-content-page-layout-default-nav';\n\n const handleClick = (event) => {\n event.preventDefault();\n\n const mainContentElement = document.getElementById(pageId);\n if (mainContentElement) {\n mainContentElement.focus();\n }\n };\n\n const PageSkipToContent = (\n <SkipToContent onClick={handleClick} href={`#${pageId}`}>\n Skip to content\n </SkipToContent>\n );\n\n const PageBreadcrumb = (\n <Breadcrumb>\n <BreadcrumbItem>Section home</BreadcrumbItem>\n <BreadcrumbItem to=\"#\">Section title</BreadcrumbItem>\n <BreadcrumbItem to=\"#\">Section title</BreadcrumbItem>\n <BreadcrumbItem to=\"#\" isActive>\n Section landing\n </BreadcrumbItem>\n </Breadcrumb>\n );\n\n const notificationDrawerActions = (\n <>\n <DropdownItem key=\"markAllRead\" onClick={markAllRead}>\n Mark all read\n </DropdownItem>\n <DropdownItem key=\"clearAll\" onClick={() => showNotifications(false)}>\n Clear all\n </DropdownItem>\n <DropdownItem key=\"unclearLast\" onClick={() => showNotifications(true)}>\n Unclear last\n </DropdownItem>\n <DropdownItem key=\"settings\">Settings</DropdownItem>\n </>\n );\n const notificationDrawerDropdownItems = (\n <>\n <DropdownItem\n key=\"link\"\n to=\"#\"\n // Prevent default onClick behavior for demo purposes\n onClick={(ev: any) => ev.preventDefault()}\n >\n Link\n </DropdownItem>\n <DropdownItem key=\"action\">Action</DropdownItem>\n <Divider component=\"li\" key=\"separator\" />\n <DropdownItem key=\"disabled link\" isDisabled>\n Disabled Link\n </DropdownItem>\n </>\n );\n const notificationDrawer = (\n <NotificationDrawer ref={drawerRef}>\n <NotificationDrawerHeader count={getNumberUnread()} onClose={onCloseNotificationDrawer}>\n <Dropdown\n onSelect={closeActionsMenu}\n isOpen={isActionsMenuOpen['toggle-id-0'] || false}\n id=\"notification-0\"\n onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n id=\"toggle-id-0\"\n aria-label=\"Notification drawer actions\"\n variant=\"plain\"\n onClick={() => onToggle('toggle-id-0')}\n isExpanded={isActionsMenuOpen['toggle-id-0'] || false}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{notificationDrawerActions}</DropdownList>\n </Dropdown>\n </NotificationDrawerHeader>\n <NotificationDrawerBody>\n {shouldShowNotifications && (\n <NotificationDrawerList>\n <NotificationDrawerListItem\n variant=\"info\"\n onClick={() => onListItemClick('notification-1')}\n isRead={isUnreadMap === null || !isUnreadMap['notification-1']}\n >\n <NotificationDrawerListItemHeader\n variant=\"info\"\n title=\"Unread info notification title\"\n srTitle=\"Info notification:\"\n >\n <Dropdown\n onSelect={closeActionsMenu}\n isOpen={isActionsMenuOpen['toggle-id-1'] || false}\n id=\"notification-1\"\n onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n id=\"toggle-id-1\"\n aria-label=\"Notification drawer actions\"\n variant=\"plain\"\n onClick={() => onToggle('toggle-id-1')}\n isExpanded={isActionsMenuOpen['toggle-id-1'] || false}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{notificationDrawerDropdownItems}</DropdownList>\n </Dropdown>\n </NotificationDrawerListItemHeader>\n <NotificationDrawerListItemBody timestamp=\"5 minutes ago\">\n This is an info notification description.\n </NotificationDrawerListItemBody>\n </NotificationDrawerListItem>\n <NotificationDrawerListItem\n variant=\"danger\"\n onClick={() => onListItemClick('notification-2')}\n isRead={isUnreadMap === null || !isUnreadMap['notification-2']}\n >\n <NotificationDrawerListItemHeader\n variant=\"danger\"\n 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.\"\n srTitle=\"Danger notification:\"\n >\n <Dropdown\n onSelect={closeActionsMenu}\n isOpen={isActionsMenuOpen['toggle-id-2'] || false}\n id=\"notification-2\"\n onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n id=\"toggle-id-2\"\n aria-label=\"Notification drawer actions\"\n variant=\"plain\"\n onClick={() => onToggle('toggle-id-2')}\n isExpanded={isActionsMenuOpen['toggle-id-2'] || false}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{notificationDrawerDropdownItems}</DropdownList>\n </Dropdown>\n </NotificationDrawerListItemHeader>\n <NotificationDrawerListItemBody timestamp=\"10 minutes ago\">\n This is a danger notification description. This is a long description to show how the title will wrap if\n it is long and wraps to multiple lines.\n </NotificationDrawerListItemBody>\n </NotificationDrawerListItem>\n <NotificationDrawerListItem\n variant=\"warning\"\n onClick={() => onListItemClick('notification-3')}\n isRead={isUnreadMap === null || !isUnreadMap['notification-3']}\n >\n <NotificationDrawerListItemHeader\n variant=\"warning\"\n title=\"Read warning notification title\"\n srTitle=\"Warning notification:\"\n >\n <Dropdown\n onSelect={closeActionsMenu}\n isOpen={isActionsMenuOpen['toggle-id-3'] || false}\n id=\"notification-3\"\n onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n id=\"toggle-id-3\"\n aria-label=\"Notification drawer actions\"\n variant=\"plain\"\n onClick={() => onToggle('toggle-id-3')}\n isExpanded={isActionsMenuOpen['toggle-id-3'] || false}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{notificationDrawerDropdownItems}</DropdownList>\n </Dropdown>\n </NotificationDrawerListItemHeader>\n <NotificationDrawerListItemBody timestamp=\"20 minutes ago\">\n This is a warning notification description.\n </NotificationDrawerListItemBody>\n </NotificationDrawerListItem>\n <NotificationDrawerListItem\n variant=\"success\"\n onClick={() => onListItemClick('notification-4')}\n isRead={isUnreadMap === null || !isUnreadMap['notification-4']}\n >\n <NotificationDrawerListItemHeader\n variant=\"success\"\n title=\"Read success notification title\"\n srTitle=\"Success notification:\"\n >\n <Dropdown\n onSelect={closeActionsMenu}\n isOpen={isActionsMenuOpen['toggle-id-4'] || false}\n id=\"notification-4\"\n onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n id=\"toggle-id-4\"\n aria-label=\"Notification drawer actions\"\n variant=\"plain\"\n onClick={() => onToggle('toggle-id-4')}\n isExpanded={isActionsMenuOpen['toggle-id-4'] || false}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{notificationDrawerDropdownItems}</DropdownList>\n </Dropdown>\n </NotificationDrawerListItemHeader>\n <NotificationDrawerListItemBody timestamp=\"30 minutes ago\">\n This is a success notification description.\n </NotificationDrawerListItemBody>\n </NotificationDrawerListItem>\n </NotificationDrawerList>\n )}\n {!shouldShowNotifications && (\n <EmptyState headingLevel=\"h2\" titleText=\"No alerts found\" icon={SearchIcon} variant={EmptyStateVariant.full}>\n <EmptyStateBody>\n There are currently no alerts. There may be silenced critical alerts however.\n </EmptyStateBody>\n <EmptyStateFooter>\n <EmptyStateActions>\n <Button variant=\"link\">Action</Button>\n </EmptyStateActions>\n </EmptyStateFooter>\n </EmptyState>\n )}\n </NotificationDrawerBody>\n </NotificationDrawer>\n );\n\n return (\n <Fragment>\n <Page\n masthead={masthead}\n sidebar={Sidebar}\n isManagedSidebar\n notificationDrawer={notificationDrawer}\n onNotificationDrawerExpand={(\n event: React.MouseEvent<Element, MouseEvent> | KeyboardEvent | React.TransitionEvent<Element>\n ) => focusDrawer(event)}\n isNotificationDrawerExpanded={isDrawerExpanded}\n skipToContent={PageSkipToContent}\n breadcrumb={PageBreadcrumb}\n mainContainerId={pageId}\n >\n <PageSection aria-labelledby=\"main-title\">\n <Content>\n <h1 id=\"main-title\">Main title</h1>\n <p>\n Body text should be Red Hat Text at 1rem(16px). It should have leading of 1.5rem(24px) because <br />\n of its relative line height of 1.5.\n </p>\n </Content>\n </PageSection>\n <PageSection aria-label=\"Panel section\">Panel section content</PageSection>\n </Page>\n </Fragment>\n );\n};\n","title":"Basic","lang":"ts","isFullscreen":true,"className":""}}>
|
|
51
|
+
|
|
52
|
+
</Example>,
|
|
53
|
+
'Grouped': props =>
|
|
54
|
+
<Example {...pageData} {...props} thumbnail={srcImportgrouped} {...{"code":"import { Fragment, useRef, useState } from 'react';\nimport {\n Avatar,\n Brand,\n Breadcrumb,\n BreadcrumbItem,\n Button,\n ButtonVariant,\n Content,\n Divider,\n Dropdown,\n DropdownItem,\n DropdownList,\n EmptyState,\n EmptyStateActions,\n EmptyStateBody,\n EmptyStateFooter,\n EmptyStateVariant,\n MenuToggle,\n Nav,\n NavItem,\n NavList,\n NotificationBadge,\n NotificationDrawer,\n NotificationDrawerBody,\n NotificationDrawerGroup,\n NotificationDrawerGroupList,\n NotificationDrawerHeader,\n NotificationDrawerList,\n NotificationDrawerListItem,\n NotificationDrawerListItemBody,\n NotificationDrawerListItemHeader,\n Page,\n PageSection,\n PageSidebar,\n PageSidebarBody,\n SkipToContent,\n PageToggleButton,\n Masthead,\n MastheadMain,\n MastheadBrand,\n MastheadToggle,\n MastheadContent,\n MastheadLogo,\n Toolbar,\n ToolbarItem,\n ToolbarGroup,\n ToolbarContent\n} from '@patternfly/react-core';\nimport RhUiSettingsFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-settings-fill-icon';\nimport HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';\nimport SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';\nimport RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';\nimport RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon';\nimport imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';\nimport pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.PF-HorizontalLogo-Color.svg';\n\nexport const NotificationDrawerGrouped: React.FunctionComponent = () => {\n const drawerRef = useRef<HTMLElement | null>(null);\n\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [isKebabDropdownOpen, setIsKebabDropdownOpen] = useState(false);\n const [isDrawerExpanded, setIsDrawerExpanded] = useState(false);\n const [firstDrawerGroupExpanded, setFirstDrawerGroupExpanded] = useState(false);\n const [secondDrawerGroupExpanded, setSecondDrawerGroupExpanded] = useState(true);\n const [thirdDrawerGroupExpanded, setThirdDrawerGroupExpanded] = useState(false);\n\n interface UnreadMap {\n [groupName: string]: {\n [notificationId: string]: boolean;\n } | null;\n }\n\n const [activeItem, setActiveItem] = useState<number | string>(0);\n const [isUnreadMap, setIsUnreadMap] = useState<UnreadMap | null>({\n 'group-1': {\n 'notification-5': true,\n 'notification-6': true\n },\n 'group-2': {\n 'notification-9': true,\n 'notification-10': true\n },\n 'group-3': null\n });\n\n const [shouldShowNotifications, setShouldShowNotifications] = useState(true);\n\n interface ActionsMenu {\n [toggleId: string]: boolean;\n }\n\n const [isActionsMenuOpen, setIsActionsMenuOpen] = useState<ActionsMenu | {}>({});\n\n const onNavSelect = (\n _event: React.FormEvent<HTMLInputElement>,\n selectedItem: {\n groupId: number | string;\n itemId: number | string;\n to: string;\n }\n ) => setActiveItem(selectedItem.itemId);\n\n const onDropdownToggle = () => setIsDropdownOpen((prevState) => !prevState);\n const onDropdownSelect = () => setIsDropdownOpen(false);\n const onKebabDropdownToggle = () => setIsKebabDropdownOpen((prevState) => !prevState);\n const onKebabDropdownSelect = () => setIsKebabDropdownOpen(false);\n const onCloseNotificationDrawer = (_event: any) => setIsDrawerExpanded((prevState) => !prevState);\n\n const onToggle = (id: string) => {\n setIsActionsMenuOpen({ [id]: !isActionsMenuOpen[id] });\n };\n\n const closeActionsMenu = () => setIsActionsMenuOpen({});\n\n const onListItemClick = (groupId: string, id: string) => {\n if (isUnreadMap === null) {\n return;\n }\n if (!isUnreadMap[groupId]) {\n setIsUnreadMap({ ...isUnreadMap, [groupId]: { [id]: false } });\n } else {\n setIsUnreadMap({ ...isUnreadMap, [groupId]: { ...isUnreadMap[groupId], [id]: false } });\n }\n };\n\n const isUnread = (groupId: string, id: string) =>\n isUnreadMap && isUnreadMap[groupId] !== null && isUnreadMap[groupId][id];\n\n const getNumberUnread = (groupId: string | null) => {\n if (!isUnreadMap) {\n return 0;\n }\n\n if (groupId) {\n const group = isUnreadMap[groupId];\n if (!group) {\n return 0;\n }\n return Object.values(group).reduce((count, value) => (value ? count + 1 : count), 0);\n }\n\n return Object.keys(isUnreadMap).reduce((count, groupId) => {\n const group = isUnreadMap[groupId];\n if (!group) {\n return count;\n }\n\n return Object.values(group).reduce((groupCount, value) => (value ? groupCount + 1 : groupCount), count);\n }, 0);\n };\n\n const markAllRead = () => setIsUnreadMap(null);\n\n const showNotifications = (showNotifications: boolean) => {\n setIsUnreadMap(null);\n setShouldShowNotifications(showNotifications);\n };\n\n const toggleFirstDrawer = (_event: any, value: boolean | ((prevState: boolean) => boolean)) => {\n setFirstDrawerGroupExpanded(value);\n };\n\n const toggleSecondDrawer = (_event: any, value: boolean | ((prevState: boolean) => boolean)) => {\n setSecondDrawerGroupExpanded(value);\n };\n\n const toggleThirdDrawer = (_event: any, value: boolean | ((prevState: boolean) => boolean)) => {\n setThirdDrawerGroupExpanded(value);\n };\n\n const focusDrawer = (_event: any) => {\n if (drawerRef.current === null) {\n return;\n }\n // Prevent the NotificationDrawer from receiving focus if a drawer group item is opened\n if (!document.activeElement?.closest(`.${drawerRef.current.className}`)) {\n const firstTabbableItem = drawerRef.current.querySelector('a, button') as\n | HTMLAnchorElement\n | HTMLButtonElement\n | null;\n firstTabbableItem?.focus();\n }\n };\n\n const PageNav = (\n <Nav onSelect={onNavSelect} aria-label=\"Nav\">\n <NavList>\n <NavItem itemId={0} isActive={activeItem === 0}>\n System Panel\n </NavItem>\n <NavItem itemId={1} isActive={activeItem === 1}>\n Policy\n </NavItem>\n <NavItem itemId={2} isActive={activeItem === 2}>\n Authentication\n </NavItem>\n <NavItem itemId={3} isActive={activeItem === 3}>\n Network Services\n </NavItem>\n <NavItem itemId={4} isActive={activeItem === 4}>\n Server\n </NavItem>\n </NavList>\n </Nav>\n );\n const kebabDropdownItems = (\n <>\n <DropdownItem>\n <RhUiSettingsFillIcon /> Settings\n </DropdownItem>\n <DropdownItem>\n <HelpIcon /> Help\n </DropdownItem>\n </>\n );\n const userDropdownItems = (\n <>\n <DropdownItem key=\"group 2 profile\">My profile</DropdownItem>\n <DropdownItem key=\"group 2 user\">User management</DropdownItem>\n <DropdownItem key=\"group 2 logout\">Logout</DropdownItem>\n </>\n );\n const headerToolbar = (\n <Toolbar>\n <ToolbarContent>\n <ToolbarGroup align={{ default: 'alignEnd' }}>\n <ToolbarGroup variant=\"action-group-plain\">\n <ToolbarItem visibility={{ default: 'visible' }} selected={isDrawerExpanded}>\n <NotificationBadge\n variant={getNumberUnread(null) === 0 ? 'read' : 'unread'}\n onClick={(event: any) => onCloseNotificationDrawer(event)}\n aria-label=\"Notifications\"\n isExpanded={isDrawerExpanded}\n />\n </ToolbarItem>\n <ToolbarGroup\n variant=\"action-group-plain\"\n visibility={{\n default: 'hidden',\n lg: 'visible'\n }} /** the settings and help icon buttons are only visible on desktop sizes and replaced by a kebab dropdown for other sizes */\n >\n <ToolbarItem>\n <Button aria-label=\"Settings actions\" isSettings variant=\"plain\" />\n </ToolbarItem>\n <ToolbarItem>\n <Button\n aria-label=\"Help actions\"\n variant={ButtonVariant.plain}\n icon={<RhUiQuestionMarkCircleFillIcon />}\n />\n </ToolbarItem>\n </ToolbarGroup>\n </ToolbarGroup>\n <ToolbarGroup>\n <ToolbarItem\n visibility={{\n lg: 'hidden'\n }} /** this kebab dropdown replaces the icon buttons and is hidden for desktop sizes */\n >\n <Dropdown\n isOpen={isKebabDropdownOpen}\n onSelect={onKebabDropdownSelect}\n onOpenChange={setIsKebabDropdownOpen}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n isExpanded={isKebabDropdownOpen}\n onClick={onKebabDropdownToggle}\n variant=\"plain\"\n aria-label=\"Settings and help\"\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{kebabDropdownItems}</DropdownList>\n </Dropdown>\n </ToolbarItem>\n <ToolbarItem\n visibility={{ default: 'hidden', md: 'visible' }} /** this user dropdown is hidden on mobile sizes */\n >\n <Dropdown\n isOpen={isDropdownOpen}\n onSelect={onDropdownSelect}\n onOpenChange={setIsDropdownOpen}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n isExpanded={isDropdownOpen}\n onClick={onDropdownToggle}\n icon={<Avatar src={imgAvatar} alt=\"\" size=\"sm\" />}\n >\n John Smith\n </MenuToggle>\n )}\n >\n <DropdownList>{userDropdownItems}</DropdownList>\n </Dropdown>\n </ToolbarItem>\n </ToolbarGroup>\n </ToolbarGroup>\n </ToolbarContent>\n </Toolbar>\n );\n\n const masthead = (\n <Masthead>\n <MastheadMain>\n <MastheadToggle>\n <PageToggleButton isHamburgerButton aria-label=\"Global navigation\" />\n </MastheadToggle>\n <MastheadBrand>\n <MastheadLogo>\n <Brand src={pfLogo} alt=\"PatternFly\" heights={{ default: '36px' }} />\n </MastheadLogo>\n </MastheadBrand>\n </MastheadMain>\n <MastheadContent>{headerToolbar}</MastheadContent>\n </Masthead>\n );\n const Sidebar = (\n <PageSidebar>\n <PageSidebarBody>{PageNav}</PageSidebarBody>\n </PageSidebar>\n );\n const pageId = 'main-content-page-layout-default-nav';\n\n const handleClick = (event) => {\n event.preventDefault();\n\n const mainContentElement = document.getElementById(pageId);\n if (mainContentElement) {\n mainContentElement.focus();\n }\n };\n\n const PageSkipToContent = (\n <SkipToContent onClick={handleClick} href={`#${pageId}`}>\n Skip to content\n </SkipToContent>\n );\n\n const PageBreadcrumb = (\n <Breadcrumb>\n <BreadcrumbItem>Section home</BreadcrumbItem>\n <BreadcrumbItem to=\"#\">Section title</BreadcrumbItem>\n <BreadcrumbItem to=\"#\">Section title</BreadcrumbItem>\n <BreadcrumbItem to=\"#\" isActive>\n Section landing\n </BreadcrumbItem>\n </Breadcrumb>\n );\n\n const notificationDrawerActions = (\n <>\n <DropdownItem key=\"markAllRead\" onClick={markAllRead}>\n Mark all read\n </DropdownItem>\n <DropdownItem key=\"clearAll\" onClick={() => showNotifications(false)}>\n Clear all\n </DropdownItem>\n <DropdownItem key=\"unclearLast\" onClick={() => showNotifications(true)}>\n Unclear last\n </DropdownItem>\n <DropdownItem key=\"settings\">Settings</DropdownItem>\n </>\n );\n const notificationDrawerDropdownItems = (\n <>\n <DropdownItem\n key=\"link\"\n to=\"#\"\n // Prevent default onClick behavior for demo purposes\n onClick={(ev: any) => ev.preventDefault()}\n >\n Link\n </DropdownItem>\n <DropdownItem key=\"action\">Action</DropdownItem>\n <Divider component=\"li\" key=\"separator\" />\n <DropdownItem key=\"disabled link\" isDisabled>\n Disabled Link\n </DropdownItem>\n </>\n );\n\n const notificationDrawer = (\n <NotificationDrawer ref={drawerRef}>\n <NotificationDrawerHeader count={getNumberUnread(null)} onClose={onCloseNotificationDrawer}>\n <Dropdown\n onSelect={closeActionsMenu}\n isOpen={isActionsMenuOpen['toggle-id-0'] || false}\n id=\"notification-0\"\n onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n id=\"toggle-id-0\"\n aria-label=\"Notification drawer actions\"\n variant=\"plain\"\n onClick={() => onToggle('toggle-id-0')}\n isExpanded={isActionsMenuOpen['toggle-id-0'] || false}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{notificationDrawerActions}</DropdownList>\n </Dropdown>\n </NotificationDrawerHeader>\n <NotificationDrawerBody>\n {shouldShowNotifications && (\n <NotificationDrawerGroupList>\n <NotificationDrawerGroup\n title=\"First notification group\"\n isExpanded={firstDrawerGroupExpanded}\n count={getNumberUnread('group-1')}\n onExpand={toggleFirstDrawer}\n >\n <NotificationDrawerList isHidden={!firstDrawerGroupExpanded}>\n <NotificationDrawerListItem\n variant=\"info\"\n onClick={() => onListItemClick('group-1', 'notification-5')}\n isRead={!isUnread('group-1', 'notification-5')}\n >\n <NotificationDrawerListItemHeader\n variant=\"info\"\n title=\"Unread info notification title\"\n srTitle=\"Info notification:\"\n >\n <Dropdown\n onSelect={closeActionsMenu}\n isOpen={isActionsMenuOpen['toggle-id-5'] || false}\n id=\"notification-5\"\n onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n id=\"toggle-id-5\"\n aria-label=\"Notification drawer actions\"\n variant=\"plain\"\n onClick={() => onToggle('toggle-id-5')}\n isExpanded={isActionsMenuOpen['toggle-id-5'] || false}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{notificationDrawerDropdownItems}</DropdownList>\n </Dropdown>\n </NotificationDrawerListItemHeader>\n <NotificationDrawerListItemBody timestamp=\"5 minutes ago\">\n This is an info notification description.\n </NotificationDrawerListItemBody>\n </NotificationDrawerListItem>\n <NotificationDrawerListItem\n variant=\"danger\"\n onClick={() => onListItemClick('group-1', 'notification-6')}\n isRead={!isUnread('group-1', 'notification-6')}\n >\n <NotificationDrawerListItemHeader\n variant=\"danger\"\n 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.\"\n srTitle=\"Danger notification:\"\n >\n <Dropdown\n onSelect={closeActionsMenu}\n isOpen={isActionsMenuOpen['toggle-id-6'] || false}\n id=\"notification-6\"\n onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n id=\"toggle-id-6\"\n aria-label=\"Notification drawer actions\"\n variant=\"plain\"\n onClick={() => onToggle('toggle-id-6')}\n isExpanded={isActionsMenuOpen['toggle-id-6'] || false}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{notificationDrawerDropdownItems}</DropdownList>\n </Dropdown>\n </NotificationDrawerListItemHeader>\n <NotificationDrawerListItemBody timestamp=\"10 minutes ago\">\n This is a danger notification description. This is a long description to show how the title will\n wrap if it is long and wraps to multiple lines.\n </NotificationDrawerListItemBody>\n </NotificationDrawerListItem>\n <NotificationDrawerListItem\n variant=\"warning\"\n onClick={() => onListItemClick('group-1', 'notification-7')}\n isRead={!isUnread('group-1', 'notification-7')}\n >\n <NotificationDrawerListItemHeader\n variant=\"warning\"\n title=\"Read warning notification title\"\n srTitle=\"Warning notification:\"\n >\n <Dropdown\n onSelect={closeActionsMenu}\n isOpen={isActionsMenuOpen['toggle-id-7'] || false}\n id=\"notification-7\"\n onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n id=\"toggle-id-7\"\n aria-label=\"Notification drawer actions\"\n variant=\"plain\"\n onClick={() => onToggle('toggle-id-7')}\n isExpanded={isActionsMenuOpen['toggle-id-7'] || false}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{notificationDrawerDropdownItems}</DropdownList>\n </Dropdown>\n </NotificationDrawerListItemHeader>\n <NotificationDrawerListItemBody timestamp=\"20 minutes ago\">\n This is a warning notification description.\n </NotificationDrawerListItemBody>\n </NotificationDrawerListItem>\n <NotificationDrawerListItem\n variant=\"success\"\n onClick={() => onListItemClick('group-1', 'notification-8')}\n isRead={!isUnread('group-1', 'notification-8')}\n >\n <NotificationDrawerListItemHeader\n variant=\"success\"\n title=\"Read success notification title\"\n srTitle=\"Success notification:\"\n >\n <Dropdown\n onSelect={closeActionsMenu}\n isOpen={isActionsMenuOpen['toggle-id-8'] || false}\n id=\"notification-8\"\n onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n id=\"toggle-id-8\"\n aria-label=\"Notification drawer actions\"\n variant=\"plain\"\n onClick={() => onToggle('toggle-id-8')}\n isExpanded={isActionsMenuOpen['toggle-id-8'] || false}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{notificationDrawerDropdownItems}</DropdownList>\n </Dropdown>\n </NotificationDrawerListItemHeader>\n <NotificationDrawerListItemBody timestamp=\"30 minutes ago\">\n This is a success notification description.\n </NotificationDrawerListItemBody>\n </NotificationDrawerListItem>\n </NotificationDrawerList>\n </NotificationDrawerGroup>\n <NotificationDrawerGroup\n title=\"Second notification group\"\n isExpanded={secondDrawerGroupExpanded}\n count={getNumberUnread('group-2')}\n onExpand={toggleSecondDrawer}\n >\n <NotificationDrawerList isHidden={!secondDrawerGroupExpanded}>\n <NotificationDrawerListItem\n variant=\"info\"\n onClick={() => onListItemClick('group-2', 'notification-9')}\n isRead={!isUnread('group-2', 'notification-9')}\n >\n <NotificationDrawerListItemHeader\n variant=\"info\"\n title=\"Unread info notification title\"\n srTitle=\"Info notification:\"\n >\n <Dropdown\n onSelect={closeActionsMenu}\n isOpen={isActionsMenuOpen['toggle-id-9'] || false}\n id=\"notification-9\"\n onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n id=\"toggle-id-9\"\n aria-label=\"Notification drawer actions\"\n variant=\"plain\"\n onClick={() => onToggle('toggle-id-9')}\n isExpanded={isActionsMenuOpen['toggle-id-9'] || false}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{notificationDrawerDropdownItems}</DropdownList>\n </Dropdown>\n </NotificationDrawerListItemHeader>\n <NotificationDrawerListItemBody timestamp=\"5 minutes ago\">\n This is an info notification description.\n </NotificationDrawerListItemBody>\n </NotificationDrawerListItem>\n <NotificationDrawerListItem\n variant=\"danger\"\n onClick={() => onListItemClick('group-2', 'notification-10')}\n isRead={!isUnread('group-2', 'notification-10')}\n >\n <NotificationDrawerListItemHeader\n variant=\"danger\"\n 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.\"\n srTitle=\"Danger notification:\"\n >\n <Dropdown\n onSelect={closeActionsMenu}\n isOpen={isActionsMenuOpen['toggle-id-10'] || false}\n id=\"notification-10\"\n onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n id=\"toggle-id-10\"\n aria-label=\"Notification drawer actions\"\n variant=\"plain\"\n onClick={() => onToggle('toggle-id-10')}\n isExpanded={isActionsMenuOpen['toggle-id-10'] || false}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{notificationDrawerDropdownItems}</DropdownList>\n </Dropdown>\n </NotificationDrawerListItemHeader>\n <NotificationDrawerListItemBody timestamp=\"10 minutes ago\">\n This is a danger notification description. This is a long description to show how the title will\n wrap if it is long and wraps to multiple lines.\n </NotificationDrawerListItemBody>\n </NotificationDrawerListItem>\n <NotificationDrawerListItem\n variant=\"warning\"\n onClick={() => onListItemClick('group-2', 'notification-11')}\n isRead={!isUnread('group-2', 'notification-11')}\n >\n <NotificationDrawerListItemHeader\n variant=\"warning\"\n title=\"Read warning notification title\"\n srTitle=\"Warning notification:\"\n >\n <Dropdown\n onSelect={closeActionsMenu}\n isOpen={isActionsMenuOpen['toggle-id-11'] || false}\n id=\"notification-11\"\n onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n id=\"toggle-id-11\"\n aria-label=\"Notification drawer actions\"\n variant=\"plain\"\n onClick={() => onToggle('toggle-id-11')}\n isExpanded={isActionsMenuOpen['toggle-id-11'] || false}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{notificationDrawerDropdownItems}</DropdownList>\n </Dropdown>\n </NotificationDrawerListItemHeader>\n <NotificationDrawerListItemBody timestamp=\"20 minutes ago\">\n This is a warning notification description.\n </NotificationDrawerListItemBody>\n </NotificationDrawerListItem>\n <NotificationDrawerListItem\n variant=\"success\"\n onClick={() => onListItemClick('group-2', 'notification-12')}\n isRead={!isUnread('group-2', 'notification-12')}\n >\n <NotificationDrawerListItemHeader\n variant=\"success\"\n title=\"Read success notification title\"\n srTitle=\"Success notification:\"\n >\n <Dropdown\n onSelect={closeActionsMenu}\n isOpen={isActionsMenuOpen['toggle-id-12'] || false}\n id=\"notification-12\"\n onOpenChange={(isOpen: boolean) => !isOpen && closeActionsMenu()}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.RefObject<any>) => (\n <MenuToggle\n ref={toggleRef}\n id=\"toggle-id-12\"\n aria-label=\"Notification drawer actions\"\n variant=\"plain\"\n onClick={() => onToggle('toggle-id-12')}\n isExpanded={isActionsMenuOpen['toggle-id-12'] || false}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{notificationDrawerDropdownItems}</DropdownList>\n </Dropdown>\n </NotificationDrawerListItemHeader>\n <NotificationDrawerListItemBody timestamp=\"30 minutes ago\">\n This is a success notification description.\n </NotificationDrawerListItemBody>\n </NotificationDrawerListItem>\n </NotificationDrawerList>\n </NotificationDrawerGroup>\n <NotificationDrawerGroup\n title=\"Third notification group\"\n isExpanded={thirdDrawerGroupExpanded}\n count={getNumberUnread('group-3')}\n onExpand={toggleThirdDrawer}\n >\n <NotificationDrawerList isHidden={!thirdDrawerGroupExpanded}>\n <EmptyState\n headingLevel=\"h2\"\n titleText=\"No alerts found\"\n icon={SearchIcon}\n variant={EmptyStateVariant.full}\n >\n <EmptyStateBody>\n There are currently no critical alerts firing. There may be firing alerts of other severities or\n silenced critical alerts however.\n </EmptyStateBody>\n <EmptyStateFooter>\n <EmptyStateActions>\n <Button variant=\"link\">Action</Button>\n </EmptyStateActions>\n </EmptyStateFooter>\n </EmptyState>\n </NotificationDrawerList>\n </NotificationDrawerGroup>\n </NotificationDrawerGroupList>\n )}\n {!shouldShowNotifications && (\n <EmptyState headingLevel=\"h2\" titleText=\"No alerts found\" icon={SearchIcon} variant={EmptyStateVariant.full}>\n <EmptyStateBody>\n There are currently no alerts. There may be silenced critical alerts however.\n </EmptyStateBody>\n <EmptyStateFooter>\n <EmptyStateActions>\n <Button variant=\"link\">Action</Button>\n </EmptyStateActions>\n </EmptyStateFooter>\n </EmptyState>\n )}\n </NotificationDrawerBody>\n </NotificationDrawer>\n );\n\n return (\n <Fragment>\n <Page\n masthead={masthead}\n sidebar={Sidebar}\n isManagedSidebar\n notificationDrawer={notificationDrawer}\n isNotificationDrawerExpanded={isDrawerExpanded}\n onNotificationDrawerExpand={(\n event: React.MouseEvent<Element, MouseEvent> | KeyboardEvent | React.TransitionEvent<Element>\n ) => focusDrawer(event)}\n skipToContent={PageSkipToContent}\n breadcrumb={PageBreadcrumb}\n mainContainerId={pageId}\n >\n <PageSection aria-labelledby=\"main-title\">\n <Content>\n <h1 id=\"main-title\">Main title</h1>\n <p>\n Body text should be Red Hat Text at 1rem(16px). It should have leading of 1.5rem(24px) because <br />\n of its relative line height of 1.5.\n </p>\n </Content>\n </PageSection>\n <PageSection aria-label=\"Panel section\">Panel section content</PageSection>\n </Page>\n </Fragment>\n );\n};\n","title":"Grouped","lang":"ts","isFullscreen":true,"className":""}}>
|
|
55
|
+
|
|
56
|
+
<p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
|
|
57
|
+
{`When using the NotificationDrawerGroupList and related components, the function that is passed in to the `}
|
|
58
|
+
|
|
59
|
+
<code {...{"className":"ws-code "}}>
|
|
60
|
+
{`onNotificationDrawerExpand`}
|
|
61
|
+
</code>
|
|
62
|
+
{` 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.`}
|
|
63
|
+
</p>
|
|
64
|
+
</Example>
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const Component = () => (
|
|
68
|
+
<React.Fragment>
|
|
69
|
+
<AutoLinkHeader {...{"id":"demos","headingLevel":"h2","className":"ws-title ws-h2"}}>
|
|
70
|
+
{`Demos`}
|
|
71
|
+
</AutoLinkHeader>
|
|
72
|
+
<ul {...{"className":"pf-v6-c-content--ul pf-m-editorial ws-ul "}}>
|
|
73
|
+
<li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
|
|
74
|
+
{`Focus must be manually managed when the NotificationDrawer component is opened:`}
|
|
75
|
+
<ol {...{"className":"pf-v6-c-content--ol pf-m-editorial ws-ol "}}>
|
|
76
|
+
<li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
|
|
77
|
+
{`Create a React `}
|
|
78
|
+
<code {...{"className":"ws-code "}}>
|
|
79
|
+
{`ref`}
|
|
80
|
+
</code>
|
|
81
|
+
{` and pass it into the NotificationDrawer component's `}
|
|
82
|
+
<code {...{"className":"ws-code "}}>
|
|
83
|
+
{`ref`}
|
|
84
|
+
</code>
|
|
85
|
+
{` attribute`}
|
|
86
|
+
</li>
|
|
87
|
+
<li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
|
|
88
|
+
{`Pass in a function to the `}
|
|
89
|
+
<code {...{"className":"ws-code "}}>
|
|
90
|
+
{`onNotificationDrawerExpand`}
|
|
91
|
+
</code>
|
|
92
|
+
{` prop of the Page component that will place focus on the first interact-able element inside the NotificationDrawer component via the previously created `}
|
|
93
|
+
<code {...{"className":"ws-code "}}>
|
|
94
|
+
{`ref`}
|
|
95
|
+
</code>
|
|
96
|
+
</li>
|
|
97
|
+
</ol>
|
|
98
|
+
</li>
|
|
99
|
+
</ul>
|
|
100
|
+
{React.createElement(pageData.examples["Basic"])}
|
|
101
|
+
{React.createElement(pageData.examples["Grouped"])}
|
|
102
|
+
</React.Fragment>
|
|
103
|
+
);
|
|
104
|
+
Component.displayName = 'ComponentsNotificationDrawerReactDemosDocs';
|
|
105
|
+
Component.pageData = pageData;
|
|
106
|
+
|
|
107
|
+
export default Component;
|