import React from 'react'; import { MenuToggle, Menu, MenuList, MenuItem, MenuGroup, MenuItemAction, Popper } from '@patternfly/react-core'; import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon'; import ClipboardIcon from '@patternfly/react-icons/dist/esm/icons/clipboard-icon'; import CodeBranchIcon from '@patternfly/react-icons/dist/esm/icons/code-branch-icon'; import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon'; export const ComposableActionsMenu: React.FunctionComponent = () => { const [isOpen, setIsOpen] = React.useState(false); const [selectedItems, setSelectedItems] = React.useState([]); const toggleRef = React.useRef(null); const menuRef = React.useRef(null); const containerRef = React.useRef(null); const handleMenuKeys = (event: KeyboardEvent) => { if (isOpen && menuRef.current?.contains(event.target as Node)) { if (event.key === 'Escape' || event.key === 'Tab') { setIsOpen(!isOpen); toggleRef.current?.focus(); } } }; const handleClickOutside = (event: MouseEvent) => { if (isOpen && !menuRef.current?.contains(event.target as Node)) { setIsOpen(false); } }; React.useEffect(() => { window.addEventListener('keydown', handleMenuKeys); window.addEventListener('click', handleClickOutside); return () => { window.removeEventListener('keydown', handleMenuKeys); window.removeEventListener('click', handleClickOutside); }; }, [isOpen, menuRef]); const onSelect = (event: React.MouseEvent | undefined, itemId: string | number | undefined) => { if (typeof itemId === 'string' || typeof itemId === 'undefined') { return; } if (selectedItems.includes(itemId)) { setSelectedItems(selectedItems.filter(id => id !== itemId)); } else { setSelectedItems([...selectedItems, itemId]); } }; const onToggleClick = (ev: React.MouseEvent) => { ev.stopPropagation(); // Stop handleClickOutside from handling setTimeout(() => { if (menuRef.current) { const firstElement = menuRef.current.querySelector('li > button:not(:disabled), li > a:not(:disabled)'); firstElement && (firstElement as HTMLElement).focus(); } }, 0); setIsOpen(!isOpen); }; const toggle = ( {isOpen ? 'Expanded' : 'Collapsed'} ); const menu = ( console.log(`clicked on ${itemId} - ${actionId}`)} onSelect={onSelect} style={ { '--pf-c-menu--Width': '300px' } as React.CSSProperties } > } actionId="code" // eslint-disable-next-line no-console onClick={() => console.log('clicked on code icon')} aria-label="Code" /> } description="This is a description" itemId={0} > Item 1 } actionId="alert" aria-label="Alert" />} description="This is a description" itemId={1} > Item 2 } actionId="copy" aria-label="Copy" />} itemId={2} > Item 3 } actionId="expand" aria-label="Expand" />} description="This is a description" itemId={3} > Item 4 ); return (
); };