@patternfly/react-core 6.0.0-alpha.46 → 6.0.0-alpha.47

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 (142) 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/ClipboardCopy/package.json +1 -1
  21. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  22. package/dist/dynamic/components/DataList/package.json +1 -1
  23. package/dist/dynamic/components/DatePicker/package.json +1 -1
  24. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  25. package/dist/dynamic/components/Divider/package.json +1 -1
  26. package/dist/dynamic/components/Drawer/package.json +1 -1
  27. package/dist/dynamic/components/Dropdown/package.json +1 -1
  28. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  29. package/dist/dynamic/components/EmptyState/package.json +1 -1
  30. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  31. package/dist/dynamic/components/FileUpload/package.json +1 -1
  32. package/dist/dynamic/components/Form/package.json +1 -1
  33. package/dist/dynamic/components/FormSelect/package.json +1 -1
  34. package/dist/dynamic/components/HelperText/package.json +1 -1
  35. package/dist/dynamic/components/Hint/package.json +1 -1
  36. package/dist/dynamic/components/Icon/package.json +1 -1
  37. package/dist/dynamic/components/InputGroup/package.json +1 -1
  38. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  39. package/dist/dynamic/components/Label/package.json +1 -1
  40. package/dist/dynamic/components/List/package.json +1 -1
  41. package/dist/dynamic/components/LoginPage/package.json +1 -1
  42. package/dist/dynamic/components/Masthead/package.json +1 -1
  43. package/dist/dynamic/components/Menu/package.json +1 -1
  44. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  45. package/dist/dynamic/components/Modal/package.json +1 -1
  46. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  47. package/dist/dynamic/components/Nav/package.json +1 -1
  48. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  49. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  50. package/dist/dynamic/components/NumberInput/package.json +1 -1
  51. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  52. package/dist/dynamic/components/Page/package.json +1 -1
  53. package/dist/dynamic/components/Pagination/package.json +1 -1
  54. package/dist/dynamic/components/Panel/package.json +1 -1
  55. package/dist/dynamic/components/Popover/package.json +1 -1
  56. package/dist/dynamic/components/Progress/package.json +1 -1
  57. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  58. package/dist/dynamic/components/Radio/package.json +1 -1
  59. package/dist/dynamic/components/SearchInput/package.json +1 -1
  60. package/dist/dynamic/components/Select/package.json +1 -1
  61. package/dist/dynamic/components/Sidebar/package.json +1 -1
  62. package/dist/dynamic/components/SimpleList/package.json +1 -1
  63. package/dist/dynamic/components/Skeleton/package.json +1 -1
  64. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  65. package/dist/dynamic/components/Slider/package.json +1 -1
  66. package/dist/dynamic/components/Spinner/package.json +1 -1
  67. package/dist/dynamic/components/Switch/package.json +1 -1
  68. package/dist/dynamic/components/Tabs/package.json +1 -1
  69. package/dist/dynamic/components/Text/package.json +1 -1
  70. package/dist/dynamic/components/TextArea/package.json +1 -1
  71. package/dist/dynamic/components/TextInput/package.json +1 -1
  72. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  73. package/dist/dynamic/components/Tile/package.json +1 -1
  74. package/dist/dynamic/components/TimePicker/package.json +1 -1
  75. package/dist/dynamic/components/Timestamp/package.json +1 -1
  76. package/dist/dynamic/components/Title/package.json +1 -1
  77. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  78. package/dist/dynamic/components/Toolbar/package.json +1 -1
  79. package/dist/dynamic/components/Tooltip/package.json +1 -1
  80. package/dist/dynamic/components/TreeView/package.json +1 -1
  81. package/dist/dynamic/components/Truncate/package.json +1 -1
  82. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  83. package/dist/dynamic/components/Wizard/package.json +1 -1
  84. package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -1
  85. package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/DragDrop/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/DualListSelector/package.json +1 -1
  119. package/dist/dynamic/next/components/Modal/package.json +1 -1
  120. package/dist/dynamic/next/components/package.json +1 -1
  121. package/dist/dynamic/styles/package.json +1 -1
  122. package/dist/esm/components/Badge/Badge.d.ts +0 -2
  123. package/dist/esm/components/Badge/Badge.d.ts.map +1 -1
  124. package/dist/esm/components/Badge/Badge.js +2 -5
  125. package/dist/esm/components/Badge/Badge.js.map +1 -1
  126. package/dist/js/components/Badge/Badge.d.ts +0 -2
  127. package/dist/js/components/Badge/Badge.d.ts.map +1 -1
  128. package/dist/js/components/Badge/Badge.js +2 -5
  129. package/dist/js/components/Badge/Badge.js.map +1 -1
  130. package/dist/umd/react-core.min.js +1 -1
  131. package/helpers/package.json +1 -1
  132. package/layouts/package.json +1 -1
  133. package/next/package.json +1 -1
  134. package/package.json +2 -2
  135. package/src/components/Badge/Badge.tsx +0 -9
  136. package/src/components/Badge/__tests__/Badge.test.tsx +0 -9
  137. package/src/components/Badge/examples/Badge.md +0 -5
  138. package/src/components/Breadcrumb/examples/BreadcrumbDropdown.tsx +11 -9
  139. package/src/components/Menu/examples/MenuWithDrilldownBreadcrumbs.tsx +40 -34
  140. package/src/components/MenuToggle/examples/MenuToggle.md +5 -3
  141. package/src/components/Badge/examples/BadgeToggle.tsx +0 -13
  142. package/src/demos/CustomMenus/examples/ComposableDropdwnVariants.tsx +0 -235
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.0.0-alpha.45","private":true}
1
+ {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.0.0-alpha.46","private":true}
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.0.0-alpha.45","private":true}
1
+ {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.0.0-alpha.46","private":true}
package/next/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.0.0-alpha.45","private":true}
1
+ {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.0.0-alpha.46","private":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "6.0.0-alpha.46",
3
+ "version": "6.0.0-alpha.47",
4
4
  "description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
5
5
  "main": "dist/js/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -74,5 +74,5 @@
74
74
  "react": "^17 || ^18",
75
75
  "react-dom": "^17 || ^18"
76
76
  },
77
- "gitHead": "c3f0ac633b7bca82d53f146a0844cdef0851096b"
77
+ "gitHead": "eb6848fd5f74a7f4fe20b7d2bb449ece2eeff354"
78
78
  }
@@ -1,15 +1,12 @@
1
1
  import * as React from 'react';
2
2
  import { css } from '@patternfly/react-styles';
3
3
  import styles from '@patternfly/react-styles/css/components/Badge/badge';
4
- import CaretDownIcon from '@patternfly/react-icons/dist/esm/icons/caret-down-icon';
5
4
 
6
5
  export interface BadgeProps extends React.HTMLProps<HTMLSpanElement> {
7
6
  /** Text announced by screen readers to indicate the current content/status of the badge. */
8
7
  screenReaderText?: string;
9
8
  /** Adds styling to the badge to indicate it has been read */
10
9
  isRead?: boolean;
11
- /** Adds styling to the badge to indicate it has a toggle. A badge with a toggle must be passed to a MenuToggle component. */
12
- isToggle?: boolean;
13
10
  /** content rendered inside the Badge */
14
11
  children?: React.ReactNode;
15
12
  /** additional classes added to the Badge */
@@ -18,7 +15,6 @@ export interface BadgeProps extends React.HTMLProps<HTMLSpanElement> {
18
15
 
19
16
  export const Badge: React.FunctionComponent<BadgeProps> = ({
20
17
  isRead = false,
21
- isToggle = false,
22
18
  className = '',
23
19
  children = '',
24
20
  screenReaderText,
@@ -30,11 +26,6 @@ export const Badge: React.FunctionComponent<BadgeProps> = ({
30
26
  >
31
27
  {children}
32
28
  {screenReaderText && <span className="pf-v6-screen-reader">{screenReaderText}</span>}
33
- {isToggle && (
34
- <span className={css(styles.badgeToggleIcon)}>
35
- <CaretDownIcon />
36
- </span>
37
- )}
38
29
  </span>
39
30
  );
40
31
  Badge.displayName = 'Badge';
@@ -32,15 +32,6 @@ test('Renders with class name pf-m-read when isRead prop is true', () => {
32
32
  expect(screen.getByText('Test')).toHaveClass('pf-m-read');
33
33
  });
34
34
 
35
- test('Renders with toggle styles and icon when isToggle prop is true', () => {
36
- render(
37
- <Badge isRead={true} isToggle={true}>
38
- Test
39
- </Badge>
40
- );
41
- expect(screen.getByText('Test').lastChild).toHaveClass(styles.badgeToggleIcon);
42
- });
43
-
44
35
  test('Does not render pf-v6-screen-reader class by default', () => {
45
36
  render(<Badge>Test</Badge>);
46
37
  expect(screen.getByText('Test')).not.toContainHTML('<span class="pf-v6-screen-reader"></span>');
@@ -18,8 +18,3 @@ import './Badge.css';
18
18
 
19
19
  ```ts file="./BadgeUnread.tsx"
20
20
  ```
21
-
22
- ### Badge as toggle
23
-
24
- ```ts file="./BadgeToggle.tsx"
25
- ```
@@ -12,7 +12,6 @@ import {
12
12
  MenuToggleElement
13
13
  } from '@patternfly/react-core';
14
14
  import AngleLeftIcon from '@patternfly/react-icons/dist/esm/icons/angle-left-icon';
15
- import CaretDownIcon from '@patternfly/react-icons/dist/esm/icons/caret-down-icon';
16
15
 
17
16
  const dropdownItems = [
18
17
  <DropdownItem
@@ -66,14 +65,17 @@ export const BreadcrumbDropdown: React.FunctionComponent = () => {
66
65
  onSelect={onSelect}
67
66
  onOpenChange={(isOpen: boolean) => setIsOpen(isOpen)}
68
67
  toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
69
- <MenuToggle ref={toggleRef} onClick={onToggle} isExpanded={isOpen} variant="plain">
70
- <Badge isRead screenReaderText="additional items">
71
- {dropdownItems.length}{' '}
72
- <span>
73
- <CaretDownIcon />
74
- </span>
75
- </Badge>
76
- </MenuToggle>
68
+ <MenuToggle
69
+ badge={
70
+ <Badge isRead screenReaderText="additional items">
71
+ {dropdownItems.length}
72
+ </Badge>
73
+ }
74
+ ref={toggleRef}
75
+ onClick={onToggle}
76
+ isExpanded={isOpen}
77
+ variant="plainText"
78
+ />
77
79
  )}
78
80
  isOpen={isOpen}
79
81
  >
@@ -24,7 +24,6 @@ import CodeBranchIcon from '@patternfly/react-icons/dist/esm/icons/code-branch-i
24
24
  import LayerGroupIcon from '@patternfly/react-icons/dist/esm/icons/layer-group-icon';
25
25
  import AngleLeftIcon from '@patternfly/react-icons/dist/esm/icons/angle-left-icon';
26
26
  import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
27
- import CaretDownIcon from '@patternfly/react-icons/dist/esm/icons/caret-down-icon';
28
27
 
29
28
  export const MenuWithDrilldownBreadcrumbs: React.FunctionComponent = () => {
30
29
  const [menuDrilledIn, setMenuDrilledIn] = React.useState<string[]>([]);
@@ -117,14 +116,17 @@ export const MenuWithDrilldownBreadcrumbs: React.FunctionComponent = () => {
117
116
  isOpen={isOpen}
118
117
  onOpenChange={(isOpen: boolean) => onToggle(isOpen, 'app')}
119
118
  toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
120
- <MenuToggle ref={toggleRef} onClick={() => onToggle(true, 'app')} isExpanded={isOpen} variant="plain">
121
- <Badge isRead screenReaderText="additional item">
122
- 1{' '}
123
- <span>
124
- <CaretDownIcon />
125
- </span>
126
- </Badge>
127
- </MenuToggle>
119
+ <MenuToggle
120
+ badge={
121
+ <Badge isRead screenReaderText="additional item">
122
+ 1
123
+ </Badge>
124
+ }
125
+ ref={toggleRef}
126
+ onClick={() => onToggle(true, 'app')}
127
+ isExpanded={isOpen}
128
+ variant="plainText"
129
+ />
128
130
  )}
129
131
  >
130
132
  <DropdownList>
@@ -161,14 +163,17 @@ export const MenuWithDrilldownBreadcrumbs: React.FunctionComponent = () => {
161
163
  isOpen={isOpen}
162
164
  onOpenChange={(isOpen: boolean) => onToggle(isOpen, 'label')}
163
165
  toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
164
- <MenuToggle ref={toggleRef} onClick={() => onToggle(true, 'label')} isExpanded={isOpen} variant="plain">
165
- <Badge isRead screenReaderText="additional item">
166
- 1{' '}
167
- <span>
168
- <CaretDownIcon />
169
- </span>
170
- </Badge>
171
- </MenuToggle>
166
+ <MenuToggle
167
+ badge={
168
+ <Badge isRead screenReaderText="additional item">
169
+ 1
170
+ </Badge>
171
+ }
172
+ ref={toggleRef}
173
+ onClick={() => onToggle(true, 'label')}
174
+ isExpanded={isOpen}
175
+ variant="plainText"
176
+ />
172
177
  )}
173
178
  >
174
179
  <DropdownList>
@@ -217,14 +222,17 @@ export const MenuWithDrilldownBreadcrumbs: React.FunctionComponent = () => {
217
222
  isOpen={isOpen}
218
223
  onOpenChange={(isOpen: boolean) => onToggle(isOpen, 'pause-app')}
219
224
  toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
220
- <MenuToggle ref={toggleRef} onClick={() => onToggle(true, 'pause-app')} isExpanded={isOpen} variant="plain">
221
- <Badge isRead screenReaderText="additional item">
222
- 1{' '}
223
- <span>
224
- <CaretDownIcon />
225
- </span>
226
- </Badge>
227
- </MenuToggle>
225
+ <MenuToggle
226
+ badge={
227
+ <Badge isRead screenReaderText="additional item">
228
+ 1
229
+ </Badge>
230
+ }
231
+ ref={toggleRef}
232
+ onClick={() => onToggle(true, 'pause-app')}
233
+ isExpanded={isOpen}
234
+ variant="plainText"
235
+ />
228
236
  )}
229
237
  >
230
238
  <DropdownList>
@@ -262,18 +270,16 @@ export const MenuWithDrilldownBreadcrumbs: React.FunctionComponent = () => {
262
270
  onOpenChange={(isOpen: boolean) => onToggle(isOpen, 'pause-label')}
263
271
  toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
264
272
  <MenuToggle
273
+ badge={
274
+ <Badge isRead screenReaderText="additional item">
275
+ 1
276
+ </Badge>
277
+ }
265
278
  ref={toggleRef}
266
279
  onClick={() => onToggle(true, 'pause-label')}
267
280
  isExpanded={isOpen}
268
- variant="plain"
269
- >
270
- <Badge isRead screenReaderText="additional item">
271
- 1{' '}
272
- <span>
273
- <CaretDownIcon />
274
- </span>
275
- </Badge>
276
- </MenuToggle>
281
+ variant="plainText"
282
+ />
277
283
  )}
278
284
  >
279
285
  <DropdownList>
@@ -53,14 +53,16 @@ import { MenuToggle } from '@patternfly/react-core';
53
53
 
54
54
  ### With a badge
55
55
 
56
- To display a count of selected items in a toggle, use the `badge` property.
56
+ To display a count of selected items in a toggle, use the `badge` property. You can also pass in `variant="plainText"` for a badge only toggle.
57
57
 
58
58
  ```ts
59
59
  import React from 'react';
60
60
  import { MenuToggle, Badge } from '@patternfly/react-core';
61
61
 
62
- <MenuToggle badge={<Badge>4 selected</Badge>}>Count</MenuToggle>
63
-
62
+ <React.Fragment>
63
+ <MenuToggle badge={<Badge>4 selected</Badge>}>Count</MenuToggle>
64
+ <MenuToggle variant="plainText" badge={<Badge screenReaderText="additional items">4</Badge>} />
65
+ </React.Fragment>
64
66
  ```
65
67
 
66
68
  ### With icons
@@ -1,13 +0,0 @@
1
- import React from 'react';
2
- import { Badge } from '@patternfly/react-core';
3
-
4
- export const BadgeToggle: React.FunctionComponent = () => (
5
- <React.Fragment>
6
- <Badge key={1} screenReaderText="Unread Messages" isToggle>
7
- 7
8
- </Badge>
9
- <Badge key={2} screenReaderText="Read Messages" isRead isToggle>
10
- 7
11
- </Badge>
12
- </React.Fragment>
13
- );
@@ -1,235 +0,0 @@
1
- import React from 'react';
2
- import {
3
- Badge,
4
- MenuToggle,
5
- Menu,
6
- MenuContent,
7
- MenuList,
8
- MenuItem,
9
- MenuGroup,
10
- Popper,
11
- Divider,
12
- ToggleGroup,
13
- ToggleGroupItem,
14
- Avatar,
15
- MenuSearch,
16
- MenuSearchInput
17
- } from '@patternfly/react-core';
18
- import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
19
- import CaretDownIcon from '@patternfly/react-icons/dist/esm/icons/caret-down-icon';
20
- import avatarImg from 'avatarImg.svg';
21
-
22
- export const ComposableDropdwnVariants: React.FunctionComponent = () => {
23
- const [isOpen, setIsOpen] = React.useState<boolean>(false);
24
- const [toggleSelected, setToggleSelected] = React.useState<string>('basic');
25
- const menuRef = React.useRef<HTMLDivElement>();
26
- const toggleRef = React.useRef<HTMLButtonElement>();
27
-
28
- const handleToggleSwitch = (e, _selected: boolean) => {
29
- setToggleSelected(e.currentTarget.id);
30
- };
31
-
32
- const handleMenuKeys = (event: KeyboardEvent) => {
33
- if (isOpen && menuRef && menuRef.current && menuRef.current.contains(event.target as Node)) {
34
- if (event.key === 'Escape' || event.key === 'Tab') {
35
- setIsOpen(!isOpen);
36
- toggleRef?.current?.focus();
37
- }
38
- }
39
- };
40
-
41
- const handleClickOutside = (event: MouseEvent) => {
42
- if (isOpen && menuRef && menuRef.current && !menuRef.current.contains(event.target as Node)) {
43
- setIsOpen(false);
44
- }
45
- };
46
-
47
- React.useEffect(() => {
48
- window.addEventListener('keydown', handleMenuKeys);
49
- window.addEventListener('click', handleClickOutside);
50
-
51
- return () => {
52
- window.removeEventListener('keydown', handleMenuKeys);
53
- window.removeEventListener('click', handleClickOutside);
54
- };
55
- }, [isOpen, menuRef]);
56
-
57
- const onToggleClick = (ev: React.MouseEvent) => {
58
- ev.stopPropagation(); // Stop handleClickOutside from handling
59
- setTimeout(() => {
60
- if (menuRef.current) {
61
- const firstElement = menuRef.current.querySelector(
62
- 'li > button:not(:disabled), li > a:not(:disabled), input:not(:disabled)'
63
- );
64
- firstElement && (firstElement as HTMLElement).focus();
65
- }
66
- }, 0);
67
- setIsOpen(!isOpen);
68
- };
69
-
70
- const onSelect = (ev: React.MouseEvent<Element, MouseEvent>, itemId: string) => {
71
- // eslint-disable-next-line no-console
72
- console.log(`Menu item ${itemId} selected`);
73
- setIsOpen(false);
74
- };
75
-
76
- const buildToggle = () => {
77
- switch (toggleSelected) {
78
- case 'basic':
79
- return (
80
- <MenuToggle ref={toggleRef} onClick={onToggleClick} isExpanded={isOpen}>
81
- Dropdown
82
- </MenuToggle>
83
- );
84
- case 'kebab':
85
- return (
86
- <MenuToggle
87
- ref={toggleRef}
88
- onClick={onToggleClick}
89
- isExpanded={isOpen}
90
- variant="plain"
91
- aria-label="plain kebab"
92
- >
93
- <EllipsisVIcon />
94
- </MenuToggle>
95
- );
96
- case 'badge':
97
- return (
98
- <MenuToggle
99
- ref={toggleRef}
100
- onClick={onToggleClick}
101
- isExpanded={isOpen}
102
- variant="plain"
103
- aria-label="plain badge"
104
- >
105
- <Badge>
106
- 4
107
- <span>
108
- <CaretDownIcon />
109
- </span>
110
- </Badge>
111
- </MenuToggle>
112
- );
113
- case 'image':
114
- return (
115
- <MenuToggle
116
- ref={toggleRef}
117
- icon={<Avatar src={avatarImg} alt="avatar" />}
118
- onClick={onToggleClick}
119
- isExpanded={isOpen}
120
- >
121
- Ned Username
122
- </MenuToggle>
123
- );
124
- }
125
- };
126
-
127
- const menu =
128
- toggleSelected === 'image' ? (
129
- <Menu ref={menuRef} id="dropdown-menu" onSelect={onSelect}>
130
- <MenuSearch>
131
- <MenuSearchInput>Unselectable text displayed at the top of the menu</MenuSearchInput>
132
- </MenuSearch>
133
- <Divider />
134
- <MenuContent>
135
- <MenuItem
136
- itemId={0}
137
- to="#default-link0"
138
- // just for demo so that navigation is not triggered
139
- onClick={(event) => event.preventDefault()}
140
- >
141
- My profile
142
- </MenuItem>
143
- <MenuItem
144
- itemId={1}
145
- to="#default-link1"
146
- // just for demo so that navigation is not triggered
147
- onClick={(event) => event.preventDefault()}
148
- >
149
- User management
150
- </MenuItem>
151
- <MenuItem
152
- itemId={2}
153
- to="#default-link2"
154
- // just for demo so that navigation is not triggered
155
- onClick={(event) => event.preventDefault()}
156
- >
157
- Logout
158
- </MenuItem>
159
- </MenuContent>
160
- </Menu>
161
- ) : (
162
- <Menu ref={menuRef} id="dropdown-menu" onSelect={onSelect}>
163
- <MenuContent>
164
- <MenuList>
165
- <MenuItem
166
- itemId={0}
167
- to="#default-link0"
168
- // just for demo so that navigation is not triggered
169
- onClick={(event) => event.preventDefault()}
170
- >
171
- Link
172
- </MenuItem>
173
- <MenuItem itemId={1}>Action</MenuItem>
174
- <MenuItem
175
- itemId={2}
176
- isDisabled
177
- to="#default-link2"
178
- // just for demo so that navigation is not triggered
179
- onClick={(event) => event.preventDefault()}
180
- >
181
- Disabled link
182
- </MenuItem>
183
- <Divider key="group1-divider" />
184
- <MenuGroup label="Group 1">
185
- <MenuList>
186
- <MenuItem itemId={3}>Group 1 action</MenuItem>
187
- <MenuItem itemId={4} isDisabled>
188
- Group 1 disabled action
189
- </MenuItem>
190
- </MenuList>
191
- </MenuGroup>
192
- <Divider key="group2-divider" />
193
- <MenuGroup label="Group 2">
194
- <MenuList>
195
- <MenuItem itemId={5}>Option 1</MenuItem>
196
- <MenuItem itemId={6}>Option 2</MenuItem>
197
- </MenuList>
198
- </MenuGroup>
199
- </MenuList>
200
- </MenuContent>
201
- </Menu>
202
- );
203
- return (
204
- <React.Fragment>
205
- <ToggleGroup aria-label="Default with single selectable">
206
- <ToggleGroupItem
207
- text="Basic toggle"
208
- buttonId="basic"
209
- isSelected={toggleSelected === 'basic'}
210
- onChange={handleToggleSwitch}
211
- />
212
- <ToggleGroupItem
213
- text="Kebab toggle"
214
- buttonId="kebab"
215
- isSelected={toggleSelected === 'kebab'}
216
- onChange={handleToggleSwitch}
217
- />
218
- <ToggleGroupItem
219
- text="Badge toggle"
220
- buttonId="badge"
221
- isSelected={toggleSelected === 'badge'}
222
- onChange={handleToggleSwitch}
223
- />
224
- <ToggleGroupItem
225
- text="Toggle with image"
226
- buttonId="image"
227
- isSelected={toggleSelected === 'image'}
228
- onChange={handleToggleSwitch}
229
- />
230
- </ToggleGroup>
231
- <br />
232
- <Popper trigger={buildToggle()} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />
233
- </React.Fragment>
234
- );
235
- };