@patternfly/react-core 4.227.3 → 4.227.4
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 +8 -0
- package/package.json +5 -5
- package/src/components/Menu/examples/Menu.md +19 -1290
- package/src/components/Menu/examples/MenuBasic.tsx +51 -0
- package/src/components/Menu/examples/MenuFilteringWithTextInput.tsx +52 -0
- package/src/components/Menu/examples/MenuOptionMultiSelect.tsx +30 -0
- package/src/components/Menu/examples/MenuOptionSingleSelect.tsx +27 -0
- package/src/components/Menu/examples/MenuScrollable.tsx +48 -0
- package/src/components/Menu/examples/MenuScrollableCustomMenuHeight.tsx +48 -0
- package/src/components/Menu/examples/MenuWithActions.tsx +75 -0
- package/src/components/Menu/examples/MenuWithCheckbox.tsx +2 -2
- package/src/components/Menu/examples/MenuWithDescription.tsx +35 -0
- package/src/components/Menu/examples/{MenuDrilldown.tsx → MenuWithDrilldown.tsx} +1 -1
- package/src/components/Menu/examples/MenuWithDrilldownBreadcrumbs.tsx +331 -0
- package/src/components/Menu/examples/{MenuDrilldownInitialState.tsx → MenuWithDrilldownInitialState.tsx} +0 -0
- package/src/components/Menu/examples/{MenuDrilldownSubmenuFunctions.tsx → MenuWithDrilldownSubmenuFunctions.tsx} +1 -1
- package/src/components/Menu/examples/MenuWithFavorites.tsx +104 -0
- package/src/components/Menu/examples/MenuWithFooter.tsx +40 -0
- package/src/components/Menu/examples/MenuWithIcons.tsx +33 -0
- package/src/components/Menu/examples/MenuWithLinks.tsx +30 -0
- package/src/components/Menu/examples/MenuWithSeparators.tsx +26 -0
- package/src/components/Menu/examples/MenuWithTitledGroups.tsx +46 -0
- package/src/components/Menu/examples/MenuWithViewMore.tsx +118 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Menu, MenuList, MenuItem, MenuContent, Spinner } from '@patternfly/react-core';
|
|
3
|
+
|
|
4
|
+
export const MenuWithViewMore: React.FunctionComponent = () => {
|
|
5
|
+
const [activeItem, setActiveItem] = React.useState<number | string>(0);
|
|
6
|
+
const [isLoading, setIsLoading] = React.useState(false);
|
|
7
|
+
const [numOptions, setNumOptions] = React.useState(3);
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
9
|
+
const [menuOptions, setMenuOptions] = React.useState([
|
|
10
|
+
<MenuItem key={0} itemId={'view-more-0'}>
|
|
11
|
+
Action
|
|
12
|
+
</MenuItem>,
|
|
13
|
+
<MenuItem
|
|
14
|
+
key={1}
|
|
15
|
+
itemId={'view-more-1'}
|
|
16
|
+
to="#default-link2"
|
|
17
|
+
// just for demo so that navigation is not triggered
|
|
18
|
+
onClick={event => event.preventDefault()}
|
|
19
|
+
>
|
|
20
|
+
Link
|
|
21
|
+
</MenuItem>,
|
|
22
|
+
<MenuItem key={2} itemId="view-more-2" isDisabled>
|
|
23
|
+
Disabled action
|
|
24
|
+
</MenuItem>,
|
|
25
|
+
<MenuItem key={3} itemId="view-more-3" isDisabled to="#default-link4">
|
|
26
|
+
Disabled link
|
|
27
|
+
</MenuItem>,
|
|
28
|
+
<MenuItem key={4} itemId="view-more-4">
|
|
29
|
+
Action 2
|
|
30
|
+
</MenuItem>,
|
|
31
|
+
<MenuItem key={5} itemId="view-more-5">
|
|
32
|
+
Action 3
|
|
33
|
+
</MenuItem>,
|
|
34
|
+
<MenuItem key={6} itemId="view-more-6">
|
|
35
|
+
Action 4
|
|
36
|
+
</MenuItem>,
|
|
37
|
+
<MenuItem key={7} itemId="view-more-7">
|
|
38
|
+
Action 5
|
|
39
|
+
</MenuItem>,
|
|
40
|
+
<MenuItem key={8} itemId="view-more-8">
|
|
41
|
+
Final option
|
|
42
|
+
</MenuItem>
|
|
43
|
+
]);
|
|
44
|
+
const [visibleOptions, setVisibleOptions] = React.useState(menuOptions.slice(0, numOptions));
|
|
45
|
+
|
|
46
|
+
const activeItemRef = React.useRef<HTMLElement>(null);
|
|
47
|
+
const viewMoreRef = React.useRef<HTMLElement>(null);
|
|
48
|
+
|
|
49
|
+
React.useEffect(() => {
|
|
50
|
+
activeItemRef.current?.focus();
|
|
51
|
+
}, [visibleOptions]);
|
|
52
|
+
|
|
53
|
+
const onSelect = (_event: React.MouseEvent<Element, MouseEvent> | undefined, itemId: number | string | undefined) => {
|
|
54
|
+
// eslint-disable-next-line no-console
|
|
55
|
+
console.log(`clicked ${itemId}`);
|
|
56
|
+
setActiveItem(itemId as string);
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const simulateNetworkCall = (networkCallback: () => void) => {
|
|
60
|
+
setTimeout(networkCallback, 2000);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const getNextValidItem = (startingIndex: number, maxLength: number) => {
|
|
64
|
+
let validItem;
|
|
65
|
+
for (let i = startingIndex; i < maxLength; i++) {
|
|
66
|
+
if (menuOptions[i].props.isDisabled) {
|
|
67
|
+
continue;
|
|
68
|
+
} else {
|
|
69
|
+
validItem = menuOptions[i];
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return validItem;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const loadMoreOptions = () => {
|
|
77
|
+
const newLength = numOptions + 3 <= menuOptions.length ? numOptions + 3 : menuOptions.length;
|
|
78
|
+
const prevPosition = numOptions;
|
|
79
|
+
const nextValidItem = getNextValidItem(prevPosition, newLength);
|
|
80
|
+
|
|
81
|
+
setNumOptions(newLength);
|
|
82
|
+
setIsLoading(false);
|
|
83
|
+
setActiveItem(nextValidItem.props.itemId);
|
|
84
|
+
setVisibleOptions(menuOptions.slice(0, newLength));
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const onViewMoreClick = () => {
|
|
88
|
+
setIsLoading(true);
|
|
89
|
+
simulateNetworkCall(() => {
|
|
90
|
+
loadMoreOptions();
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
return (
|
|
95
|
+
<Menu activeItemId={activeItem} onSelect={onSelect}>
|
|
96
|
+
<MenuContent>
|
|
97
|
+
<MenuList>
|
|
98
|
+
{visibleOptions.map(option => {
|
|
99
|
+
const props = option.props;
|
|
100
|
+
|
|
101
|
+
return <MenuItem key={option.key} ref={props.itemId === activeItem ? activeItemRef : null} {...props} />;
|
|
102
|
+
})}
|
|
103
|
+
{numOptions !== menuOptions.length && (
|
|
104
|
+
<MenuItem
|
|
105
|
+
{...(!isLoading && { isLoadButton: true })}
|
|
106
|
+
{...(isLoading && { isLoading: true })}
|
|
107
|
+
onClick={onViewMoreClick}
|
|
108
|
+
itemId="loader"
|
|
109
|
+
ref={viewMoreRef}
|
|
110
|
+
>
|
|
111
|
+
{isLoading ? <Spinner size="lg" /> : 'View more'}
|
|
112
|
+
</MenuItem>
|
|
113
|
+
)}
|
|
114
|
+
</MenuList>
|
|
115
|
+
</MenuContent>
|
|
116
|
+
</Menu>
|
|
117
|
+
);
|
|
118
|
+
};
|