@patternfly/react-core 4.238.0 → 4.239.1
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 +19 -0
- package/dist/esm/next/components/Dropdown/Dropdown.d.ts +25 -0
- package/dist/esm/next/components/Dropdown/Dropdown.d.ts.map +1 -0
- package/dist/esm/next/components/Dropdown/Dropdown.js +59 -0
- package/dist/esm/next/components/Dropdown/Dropdown.js.map +1 -0
- package/dist/esm/next/components/Dropdown/DropdownGroup.d.ts +12 -0
- package/dist/esm/next/components/Dropdown/DropdownGroup.d.ts.map +1 -0
- package/dist/esm/next/components/Dropdown/DropdownGroup.js +10 -0
- package/dist/esm/next/components/Dropdown/DropdownGroup.js.map +1 -0
- package/dist/esm/next/components/Dropdown/DropdownItem.d.ts +12 -0
- package/dist/esm/next/components/Dropdown/DropdownItem.d.ts.map +1 -0
- package/dist/esm/next/components/Dropdown/DropdownItem.js +10 -0
- package/dist/esm/next/components/Dropdown/DropdownItem.js.map +1 -0
- package/dist/esm/next/components/Dropdown/DropdownList.d.ts +10 -0
- package/dist/esm/next/components/Dropdown/DropdownList.d.ts.map +1 -0
- package/dist/esm/next/components/Dropdown/DropdownList.js +10 -0
- package/dist/esm/next/components/Dropdown/DropdownList.js.map +1 -0
- package/dist/esm/next/components/Dropdown/index.d.ts +5 -0
- package/dist/esm/next/components/Dropdown/index.d.ts.map +1 -0
- package/dist/esm/next/components/Dropdown/index.js +5 -0
- package/dist/esm/next/components/Dropdown/index.js.map +1 -0
- package/dist/esm/next/components/index.d.ts +1 -0
- package/dist/esm/next/components/index.d.ts.map +1 -1
- package/dist/esm/next/components/index.js +1 -0
- package/dist/esm/next/components/index.js.map +1 -1
- package/dist/js/next/components/Dropdown/Dropdown.d.ts +25 -0
- package/dist/js/next/components/Dropdown/Dropdown.d.ts.map +1 -0
- package/dist/js/next/components/Dropdown/Dropdown.js +63 -0
- package/dist/js/next/components/Dropdown/Dropdown.js.map +1 -0
- package/dist/js/next/components/Dropdown/DropdownGroup.d.ts +12 -0
- package/dist/js/next/components/Dropdown/DropdownGroup.d.ts.map +1 -0
- package/dist/js/next/components/Dropdown/DropdownGroup.js +14 -0
- package/dist/js/next/components/Dropdown/DropdownGroup.js.map +1 -0
- package/dist/js/next/components/Dropdown/DropdownItem.d.ts +12 -0
- package/dist/js/next/components/Dropdown/DropdownItem.d.ts.map +1 -0
- package/dist/js/next/components/Dropdown/DropdownItem.js +14 -0
- package/dist/js/next/components/Dropdown/DropdownItem.js.map +1 -0
- package/dist/js/next/components/Dropdown/DropdownList.d.ts +10 -0
- package/dist/js/next/components/Dropdown/DropdownList.d.ts.map +1 -0
- package/dist/js/next/components/Dropdown/DropdownList.js +14 -0
- package/dist/js/next/components/Dropdown/DropdownList.js.map +1 -0
- package/dist/js/next/components/Dropdown/index.d.ts +5 -0
- package/dist/js/next/components/Dropdown/index.d.ts.map +1 -0
- package/dist/js/next/components/Dropdown/index.js +8 -0
- package/dist/js/next/components/Dropdown/index.js.map +1 -0
- package/dist/js/next/components/index.d.ts +1 -0
- package/dist/js/next/components/index.d.ts.map +1 -1
- package/dist/js/next/components/index.js +1 -0
- package/dist/js/next/components/index.js.map +1 -1
- package/dist/umd/react-core.min.css +12305 -12305
- package/package.json +5 -5
- package/src/next/components/Dropdown/Dropdown.tsx +115 -0
- package/src/next/components/Dropdown/DropdownGroup.tsx +25 -0
- package/src/next/components/Dropdown/DropdownItem.tsx +24 -0
- package/src/next/components/Dropdown/DropdownList.tsx +21 -0
- package/src/next/components/Dropdown/examples/Dropdown.md +31 -0
- package/src/next/components/Dropdown/examples/DropdownBasic.tsx +54 -0
- package/src/next/components/Dropdown/examples/DropdownWithDescriptions.tsx +60 -0
- package/src/next/components/Dropdown/examples/DropdownWithGroups.tsx +65 -0
- package/src/next/components/Dropdown/examples/DropdownWithKebabToggle.tsx +62 -0
- package/src/next/components/Dropdown/index.ts +4 -0
- package/src/next/components/index.ts +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@patternfly/react-core",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.239.1",
|
|
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",
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
"generate": "node scripts/copyStyles.js"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@patternfly/react-icons": "^4.
|
|
48
|
-
"@patternfly/react-styles": "^4.
|
|
49
|
-
"@patternfly/react-tokens": "^4.
|
|
47
|
+
"@patternfly/react-icons": "^4.90.1",
|
|
48
|
+
"@patternfly/react-styles": "^4.89.1",
|
|
49
|
+
"@patternfly/react-tokens": "^4.91.1",
|
|
50
50
|
"focus-trap": "6.9.2",
|
|
51
51
|
"react-dropzone": "9.0.0",
|
|
52
52
|
"tippy.js": "5.1.2",
|
|
@@ -70,5 +70,5 @@
|
|
|
70
70
|
"react": "^16.8.0 || ^17.0.0",
|
|
71
71
|
"react-dom": "^16.8.0 || ^17.0.0"
|
|
72
72
|
},
|
|
73
|
-
"gitHead": "
|
|
73
|
+
"gitHead": "1e85a2dbd916188d8629b8631f67d1c337bfb456"
|
|
74
74
|
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { css } from '@patternfly/react-styles';
|
|
3
|
+
import { Menu, MenuContent, MenuProps } from '../../../components/Menu';
|
|
4
|
+
import { Popper } from '../../../helpers/Popper/Popper';
|
|
5
|
+
|
|
6
|
+
export interface DropdownProps extends MenuProps {
|
|
7
|
+
/** Anything which can be rendered in a dropdown. */
|
|
8
|
+
children?: React.ReactNode;
|
|
9
|
+
/** Classes applied to root element of dropdown. */
|
|
10
|
+
className?: string;
|
|
11
|
+
/** Renderer for a custom dropdown toggle. Forwards a ref to the toggle. */
|
|
12
|
+
toggle: (toggleRef: React.RefObject<any>) => React.ReactNode;
|
|
13
|
+
/** Flag to indicate if menu is opened.*/
|
|
14
|
+
isOpen?: boolean;
|
|
15
|
+
/** Function callback called when user selects item. */
|
|
16
|
+
onSelect?: (event?: React.MouseEvent<Element, MouseEvent>, itemId?: string | number) => void;
|
|
17
|
+
/** Callback to allow the dropdown component to change the open state of the menu.
|
|
18
|
+
* Triggered by clicking outside of the menu, or by pressing either tab or escape. */
|
|
19
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
20
|
+
/** Indicates if the menu should be without the outer box-shadow. */
|
|
21
|
+
isPlain?: boolean;
|
|
22
|
+
/** Indicates if the menu should be scrollable. */
|
|
23
|
+
isScrollable?: boolean;
|
|
24
|
+
/** Min width of the menu. */
|
|
25
|
+
minWidth?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const Dropdown: React.FunctionComponent<DropdownProps> = ({
|
|
29
|
+
children,
|
|
30
|
+
className,
|
|
31
|
+
onSelect,
|
|
32
|
+
isOpen,
|
|
33
|
+
toggle,
|
|
34
|
+
onOpenChange,
|
|
35
|
+
isPlain,
|
|
36
|
+
isScrollable,
|
|
37
|
+
minWidth,
|
|
38
|
+
...props
|
|
39
|
+
}: DropdownProps) => {
|
|
40
|
+
const localMenuRef = React.useRef<HTMLDivElement>();
|
|
41
|
+
const toggleRef = React.useRef<HTMLButtonElement>();
|
|
42
|
+
const containerRef = React.useRef<HTMLDivElement>();
|
|
43
|
+
|
|
44
|
+
const menuRef = (props.innerRef as React.RefObject<HTMLDivElement>) || localMenuRef;
|
|
45
|
+
React.useEffect(() => {
|
|
46
|
+
const handleMenuKeys = (event: KeyboardEvent) => {
|
|
47
|
+
if (!isOpen && toggleRef.current?.contains(event.target as Node)) {
|
|
48
|
+
// toggle was clicked open, focus on first menu item
|
|
49
|
+
if (event.key === 'Enter') {
|
|
50
|
+
setTimeout(() => {
|
|
51
|
+
const firstElement = menuRef.current.querySelector('li > button:not(:disabled)');
|
|
52
|
+
firstElement && (firstElement as HTMLElement).focus();
|
|
53
|
+
}, 0);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Close the menu on tab or escape if onOpenChange is provided
|
|
57
|
+
if (
|
|
58
|
+
(isOpen && onOpenChange && menuRef.current?.contains(event.target as Node)) ||
|
|
59
|
+
toggleRef.current?.contains(event.target as Node)
|
|
60
|
+
) {
|
|
61
|
+
if (event.key === 'Escape' || event.key === 'Tab') {
|
|
62
|
+
onOpenChange(!isOpen);
|
|
63
|
+
toggleRef.current?.focus();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const handleClickOutside = (event: MouseEvent) => {
|
|
69
|
+
// If the event is not on the toggle and onOpenChange callback is provided, close the menu
|
|
70
|
+
if (isOpen && onOpenChange && !toggleRef?.current?.contains(event.target as Node)) {
|
|
71
|
+
if (isOpen && !menuRef.current?.contains(event.target as Node)) {
|
|
72
|
+
onOpenChange(false);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
window.addEventListener('keydown', handleMenuKeys);
|
|
78
|
+
window.addEventListener('click', handleClickOutside);
|
|
79
|
+
|
|
80
|
+
return () => {
|
|
81
|
+
window.removeEventListener('keydown', handleMenuKeys);
|
|
82
|
+
window.removeEventListener('click', handleClickOutside);
|
|
83
|
+
};
|
|
84
|
+
}, [isOpen, menuRef, onOpenChange]);
|
|
85
|
+
|
|
86
|
+
const menu = (
|
|
87
|
+
<Menu
|
|
88
|
+
className={css(className)}
|
|
89
|
+
ref={menuRef}
|
|
90
|
+
onSelect={(event, itemId) => onSelect(event, itemId)}
|
|
91
|
+
isPlain={isPlain}
|
|
92
|
+
isScrollable={isScrollable}
|
|
93
|
+
{...(minWidth && {
|
|
94
|
+
style: {
|
|
95
|
+
'--pf-c-menu--MinWidth': minWidth
|
|
96
|
+
} as React.CSSProperties
|
|
97
|
+
})}
|
|
98
|
+
{...props}
|
|
99
|
+
>
|
|
100
|
+
<MenuContent>{children}</MenuContent>
|
|
101
|
+
</Menu>
|
|
102
|
+
);
|
|
103
|
+
return (
|
|
104
|
+
<div ref={containerRef}>
|
|
105
|
+
<Popper
|
|
106
|
+
trigger={toggle(toggleRef)}
|
|
107
|
+
removeFindDomNode
|
|
108
|
+
popper={menu}
|
|
109
|
+
appendTo={containerRef.current || undefined}
|
|
110
|
+
isVisible={isOpen}
|
|
111
|
+
/>
|
|
112
|
+
</div>
|
|
113
|
+
);
|
|
114
|
+
};
|
|
115
|
+
Dropdown.displayName = 'Dropdown';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { css } from '@patternfly/react-styles';
|
|
3
|
+
import { MenuGroupProps, MenuGroup } from '../../../components/Menu';
|
|
4
|
+
|
|
5
|
+
export interface DropdownGroupProps extends Omit<MenuGroupProps, 'ref'> {
|
|
6
|
+
/** Anything which can be rendered in a dropdown group. */
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
/** Classes applied to root element of dropdown group */
|
|
9
|
+
className?: string;
|
|
10
|
+
/** Label of the dropdown group */
|
|
11
|
+
label?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const DropdownGroup: React.FunctionComponent<DropdownGroupProps> = ({
|
|
15
|
+
children,
|
|
16
|
+
className,
|
|
17
|
+
label,
|
|
18
|
+
labelHeadingLevel = 'h1',
|
|
19
|
+
...props
|
|
20
|
+
}: DropdownGroupProps) => (
|
|
21
|
+
<MenuGroup className={css(className)} label={label} labelHeadingLevel={labelHeadingLevel} {...props}>
|
|
22
|
+
{children}
|
|
23
|
+
</MenuGroup>
|
|
24
|
+
);
|
|
25
|
+
DropdownGroup.displayName = 'DropdownGroup';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { css } from '@patternfly/react-styles';
|
|
3
|
+
import { MenuItemProps, MenuItem } from '../../../components/Menu';
|
|
4
|
+
|
|
5
|
+
export interface DropdownItemProps extends Omit<MenuItemProps, 'ref'> {
|
|
6
|
+
/** Anything which can be rendered in a dropdown item */
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
/** Classes applied to root element of dropdown item */
|
|
9
|
+
className?: string;
|
|
10
|
+
/** Description of the dropdown item */
|
|
11
|
+
description?: React.ReactNode;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const DropdownItem: React.FunctionComponent<MenuItemProps> = ({
|
|
15
|
+
children,
|
|
16
|
+
className,
|
|
17
|
+
description,
|
|
18
|
+
...props
|
|
19
|
+
}: DropdownItemProps) => (
|
|
20
|
+
<MenuItem className={css(className)} description={description} {...props}>
|
|
21
|
+
{children}
|
|
22
|
+
</MenuItem>
|
|
23
|
+
);
|
|
24
|
+
DropdownItem.displayName = 'DropdownItem';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { css } from '@patternfly/react-styles';
|
|
3
|
+
import { MenuListProps, MenuList } from '../../../components/Menu';
|
|
4
|
+
|
|
5
|
+
export interface DropdownListProps extends MenuListProps {
|
|
6
|
+
/** Anything which can be rendered in a dropdown list */
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
/** Classes applied to root element of dropdown list */
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const DropdownList: React.FunctionComponent<MenuListProps> = ({
|
|
13
|
+
children,
|
|
14
|
+
className,
|
|
15
|
+
...props
|
|
16
|
+
}: DropdownListProps) => (
|
|
17
|
+
<MenuList className={css(className)} {...props}>
|
|
18
|
+
{children}
|
|
19
|
+
</MenuList>
|
|
20
|
+
);
|
|
21
|
+
DropdownList.displayName = 'DropdownList';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: Dropdown
|
|
3
|
+
section: components
|
|
4
|
+
cssPrefix: pf-c-dropdown
|
|
5
|
+
propComponents: ['Dropdown', DropdownGroup, 'DropdownItem', 'DropdownList']
|
|
6
|
+
beta: true
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
10
|
+
|
|
11
|
+
## Examples
|
|
12
|
+
|
|
13
|
+
### Basic
|
|
14
|
+
|
|
15
|
+
```ts file="./DropdownBasic.tsx"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### With kebab toggle
|
|
19
|
+
|
|
20
|
+
```ts file="./DropdownWithKebabToggle.tsx"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### With groups
|
|
24
|
+
|
|
25
|
+
```ts file="./DropdownWithGroups.tsx"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### With descriptions
|
|
29
|
+
|
|
30
|
+
```ts file="./DropdownWithDescriptions.tsx"
|
|
31
|
+
```
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Dropdown, DropdownItem, DropdownList } from '@patternfly/react-core/next';
|
|
3
|
+
import { Divider, MenuToggle } from '@patternfly/react-core';
|
|
4
|
+
|
|
5
|
+
export const DropdownBasic: React.FunctionComponent = () => {
|
|
6
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
|
7
|
+
const menuRef = React.useRef<HTMLDivElement>(null);
|
|
8
|
+
|
|
9
|
+
const onToggleClick = () => {
|
|
10
|
+
setIsOpen(!isOpen);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const onSelect = (_event: React.MouseEvent<Element, MouseEvent> | undefined, itemId: string | number | undefined) => {
|
|
14
|
+
// eslint-disable-next-line no-console
|
|
15
|
+
console.log('selected', itemId);
|
|
16
|
+
setIsOpen(false);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<Dropdown
|
|
21
|
+
innerRef={menuRef}
|
|
22
|
+
isOpen={isOpen}
|
|
23
|
+
onSelect={onSelect}
|
|
24
|
+
onOpenChange={isOpen => setIsOpen(isOpen)}
|
|
25
|
+
toggle={toggleRef => (
|
|
26
|
+
<MenuToggle ref={toggleRef} onClick={onToggleClick} isExpanded={isOpen}>
|
|
27
|
+
Dropdown
|
|
28
|
+
</MenuToggle>
|
|
29
|
+
)}
|
|
30
|
+
>
|
|
31
|
+
<DropdownList>
|
|
32
|
+
<DropdownItem itemId={0} key="link">
|
|
33
|
+
Link
|
|
34
|
+
</DropdownItem>
|
|
35
|
+
<DropdownItem itemId={1} key="action" to="#default-link2" onClick={ev => ev.preventDefault()}>
|
|
36
|
+
Action
|
|
37
|
+
</DropdownItem>
|
|
38
|
+
<DropdownItem itemId={2} isDisabled key="disabled link">
|
|
39
|
+
Disabled link
|
|
40
|
+
</DropdownItem>
|
|
41
|
+
<DropdownItem itemId={3} isDisabled key="disabled action" to="#default-link4">
|
|
42
|
+
Disabled action
|
|
43
|
+
</DropdownItem>
|
|
44
|
+
<Divider key="separator" />
|
|
45
|
+
<DropdownItem itemId={4} key="separated link">
|
|
46
|
+
Separated link
|
|
47
|
+
</DropdownItem>
|
|
48
|
+
<DropdownItem itemId={5} key="separated action">
|
|
49
|
+
Separated action
|
|
50
|
+
</DropdownItem>
|
|
51
|
+
</DropdownList>
|
|
52
|
+
</Dropdown>
|
|
53
|
+
);
|
|
54
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Dropdown, DropdownItem, DropdownList } from '@patternfly/react-core/next';
|
|
3
|
+
import { MenuToggle } from '@patternfly/react-core';
|
|
4
|
+
|
|
5
|
+
export const DropdownWithDescriptions: React.FunctionComponent = () => {
|
|
6
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
|
7
|
+
const menuRef = React.useRef<HTMLDivElement>(null);
|
|
8
|
+
|
|
9
|
+
const onToggleClick = () => {
|
|
10
|
+
setIsOpen(!isOpen);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const onSelect = (_event: React.MouseEvent<Element, MouseEvent> | undefined, itemId: string | number | undefined) => {
|
|
14
|
+
// eslint-disable-next-line no-console
|
|
15
|
+
console.log('selected', itemId);
|
|
16
|
+
setIsOpen(false);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<Dropdown
|
|
21
|
+
innerRef={menuRef}
|
|
22
|
+
isOpen={isOpen}
|
|
23
|
+
onSelect={onSelect}
|
|
24
|
+
minWidth="150px"
|
|
25
|
+
onOpenChange={isOpen => setIsOpen(isOpen)}
|
|
26
|
+
toggle={toggleRef => (
|
|
27
|
+
<MenuToggle ref={toggleRef} isFullWidth onClick={onToggleClick} isExpanded={isOpen}>
|
|
28
|
+
Dropdown
|
|
29
|
+
</MenuToggle>
|
|
30
|
+
)}
|
|
31
|
+
>
|
|
32
|
+
<DropdownList>
|
|
33
|
+
<DropdownItem itemId={0} key="link" description="This is a description">
|
|
34
|
+
Link
|
|
35
|
+
</DropdownItem>
|
|
36
|
+
<DropdownItem
|
|
37
|
+
itemId={1}
|
|
38
|
+
key="action"
|
|
39
|
+
description="This is a very long description that describes the menu item"
|
|
40
|
+
to="#default-link2"
|
|
41
|
+
onClick={ev => ev.preventDefault()}
|
|
42
|
+
>
|
|
43
|
+
Action
|
|
44
|
+
</DropdownItem>
|
|
45
|
+
<DropdownItem itemId={2} isDisabled description="Disabled link description" key="disabled link">
|
|
46
|
+
Disabled link
|
|
47
|
+
</DropdownItem>
|
|
48
|
+
<DropdownItem
|
|
49
|
+
itemId={3}
|
|
50
|
+
isDisabled
|
|
51
|
+
description="This is a description"
|
|
52
|
+
key="disabled action"
|
|
53
|
+
to="#default-link4"
|
|
54
|
+
>
|
|
55
|
+
Disabled action
|
|
56
|
+
</DropdownItem>
|
|
57
|
+
</DropdownList>
|
|
58
|
+
</Dropdown>
|
|
59
|
+
);
|
|
60
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Dropdown, DropdownGroup, DropdownItem, DropdownList } from '@patternfly/react-core/next';
|
|
3
|
+
import { MenuToggle, Divider } from '@patternfly/react-core';
|
|
4
|
+
|
|
5
|
+
export const DropdownWithGroups: React.FunctionComponent = () => {
|
|
6
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
|
7
|
+
const menuRef = React.useRef<HTMLDivElement>(null);
|
|
8
|
+
|
|
9
|
+
const onToggleClick = () => {
|
|
10
|
+
setIsOpen(!isOpen);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const onSelect = (_event: React.MouseEvent<Element, MouseEvent> | undefined, itemId: string | number | undefined) => {
|
|
14
|
+
// eslint-disable-next-line no-console
|
|
15
|
+
console.log('selected', itemId);
|
|
16
|
+
setIsOpen(false);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<Dropdown
|
|
21
|
+
innerRef={menuRef}
|
|
22
|
+
isOpen={isOpen}
|
|
23
|
+
onSelect={onSelect}
|
|
24
|
+
onOpenChange={isOpen => setIsOpen(isOpen)}
|
|
25
|
+
toggle={toggleRef => (
|
|
26
|
+
<MenuToggle ref={toggleRef} onClick={onToggleClick} isExpanded={isOpen}>
|
|
27
|
+
Dropdown
|
|
28
|
+
</MenuToggle>
|
|
29
|
+
)}
|
|
30
|
+
>
|
|
31
|
+
<DropdownGroup>
|
|
32
|
+
<DropdownList>
|
|
33
|
+
<DropdownItem itemId={0} key="link">
|
|
34
|
+
Link
|
|
35
|
+
</DropdownItem>
|
|
36
|
+
<DropdownItem itemId={1} key="action" to="#default-link2" onClick={ev => ev.preventDefault()}>
|
|
37
|
+
Action
|
|
38
|
+
</DropdownItem>
|
|
39
|
+
</DropdownList>
|
|
40
|
+
</DropdownGroup>
|
|
41
|
+
<Divider />
|
|
42
|
+
<DropdownGroup label="Group 2" labelHeadingLevel="h3">
|
|
43
|
+
<DropdownList>
|
|
44
|
+
<DropdownItem itemId={2} key="group2 link">
|
|
45
|
+
Group 2 link
|
|
46
|
+
</DropdownItem>
|
|
47
|
+
<DropdownItem itemId={3} key="group2 action" to="#default-link4">
|
|
48
|
+
group 2 action
|
|
49
|
+
</DropdownItem>
|
|
50
|
+
</DropdownList>
|
|
51
|
+
</DropdownGroup>
|
|
52
|
+
<Divider />
|
|
53
|
+
<DropdownGroup label="Group 3" labelHeadingLevel="h3">
|
|
54
|
+
<DropdownList>
|
|
55
|
+
<DropdownItem itemId={4} key="group3 link">
|
|
56
|
+
Group 3 link
|
|
57
|
+
</DropdownItem>
|
|
58
|
+
<DropdownItem itemId={5} key="group3 action">
|
|
59
|
+
Group 3 action
|
|
60
|
+
</DropdownItem>
|
|
61
|
+
</DropdownList>
|
|
62
|
+
</DropdownGroup>
|
|
63
|
+
</Dropdown>
|
|
64
|
+
);
|
|
65
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Dropdown, DropdownItem, DropdownList } from '@patternfly/react-core/next';
|
|
3
|
+
import { Divider, MenuToggle } from '@patternfly/react-core';
|
|
4
|
+
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
5
|
+
|
|
6
|
+
export const DropdownWithKebab: React.FunctionComponent = () => {
|
|
7
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
|
8
|
+
const menuRef = React.useRef<HTMLDivElement>(null);
|
|
9
|
+
|
|
10
|
+
const onToggleClick = () => {
|
|
11
|
+
setIsOpen(!isOpen);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const onSelect = (_event: React.MouseEvent<Element, MouseEvent> | undefined, itemId: string | number | undefined) => {
|
|
15
|
+
// eslint-disable-next-line no-console
|
|
16
|
+
console.log('selected', itemId);
|
|
17
|
+
setIsOpen(false);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<Dropdown
|
|
22
|
+
innerRef={menuRef}
|
|
23
|
+
isOpen={isOpen}
|
|
24
|
+
onSelect={onSelect}
|
|
25
|
+
minWidth="150px"
|
|
26
|
+
onOpenChange={isOpen => setIsOpen(isOpen)}
|
|
27
|
+
toggle={toggleRef => (
|
|
28
|
+
<MenuToggle
|
|
29
|
+
ref={toggleRef}
|
|
30
|
+
aria-label="kebab dropdown toggle"
|
|
31
|
+
variant="plain"
|
|
32
|
+
onClick={onToggleClick}
|
|
33
|
+
isExpanded={isOpen}
|
|
34
|
+
>
|
|
35
|
+
<EllipsisVIcon />
|
|
36
|
+
</MenuToggle>
|
|
37
|
+
)}
|
|
38
|
+
>
|
|
39
|
+
<DropdownList>
|
|
40
|
+
<DropdownItem itemId={0} key="link">
|
|
41
|
+
Link
|
|
42
|
+
</DropdownItem>
|
|
43
|
+
<DropdownItem itemId={1} key="action" to="#default-link2" onClick={ev => ev.preventDefault()}>
|
|
44
|
+
Action
|
|
45
|
+
</DropdownItem>
|
|
46
|
+
<DropdownItem itemId={2} isDisabled key="disabled link">
|
|
47
|
+
Disabled link
|
|
48
|
+
</DropdownItem>
|
|
49
|
+
<DropdownItem itemId={3} isDisabled key="disabled action" to="#default-link4">
|
|
50
|
+
Disabled action
|
|
51
|
+
</DropdownItem>
|
|
52
|
+
<Divider key="separator" />,
|
|
53
|
+
<DropdownItem itemId={4} key="separated link">
|
|
54
|
+
Separated link
|
|
55
|
+
</DropdownItem>
|
|
56
|
+
<DropdownItem itemId={5} key="separated action">
|
|
57
|
+
Separated action
|
|
58
|
+
</DropdownItem>
|
|
59
|
+
</DropdownList>
|
|
60
|
+
</Dropdown>
|
|
61
|
+
);
|
|
62
|
+
};
|