@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.
Files changed (23) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/package.json +5 -5
  3. package/src/components/Menu/examples/Menu.md +19 -1290
  4. package/src/components/Menu/examples/MenuBasic.tsx +51 -0
  5. package/src/components/Menu/examples/MenuFilteringWithTextInput.tsx +52 -0
  6. package/src/components/Menu/examples/MenuOptionMultiSelect.tsx +30 -0
  7. package/src/components/Menu/examples/MenuOptionSingleSelect.tsx +27 -0
  8. package/src/components/Menu/examples/MenuScrollable.tsx +48 -0
  9. package/src/components/Menu/examples/MenuScrollableCustomMenuHeight.tsx +48 -0
  10. package/src/components/Menu/examples/MenuWithActions.tsx +75 -0
  11. package/src/components/Menu/examples/MenuWithCheckbox.tsx +2 -2
  12. package/src/components/Menu/examples/MenuWithDescription.tsx +35 -0
  13. package/src/components/Menu/examples/{MenuDrilldown.tsx → MenuWithDrilldown.tsx} +1 -1
  14. package/src/components/Menu/examples/MenuWithDrilldownBreadcrumbs.tsx +331 -0
  15. package/src/components/Menu/examples/{MenuDrilldownInitialState.tsx → MenuWithDrilldownInitialState.tsx} +0 -0
  16. package/src/components/Menu/examples/{MenuDrilldownSubmenuFunctions.tsx → MenuWithDrilldownSubmenuFunctions.tsx} +1 -1
  17. package/src/components/Menu/examples/MenuWithFavorites.tsx +104 -0
  18. package/src/components/Menu/examples/MenuWithFooter.tsx +40 -0
  19. package/src/components/Menu/examples/MenuWithIcons.tsx +33 -0
  20. package/src/components/Menu/examples/MenuWithLinks.tsx +30 -0
  21. package/src/components/Menu/examples/MenuWithSeparators.tsx +26 -0
  22. package/src/components/Menu/examples/MenuWithTitledGroups.tsx +46 -0
  23. 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
+ };