import React from 'react'; import { Icon, Popover, Tooltip } from 'UI'; import { Dropdown, Menu, Button } from 'antd'; import { EllipsisVertical } from 'lucide-react'; import styles from './itemMenu.module.css'; import cn from 'classnames'; interface Item { icon?: string; text: string; onClick: (args: any) => void; hidden?: boolean; disabled?: boolean; tooltipTitle?: string; } interface Props { bold?: boolean; flat?: boolean; items: Item[]; label?: React.ReactNode; sm?: boolean; onToggle?: (args: any) => void; customTrigger?: React.ReactElement; } export default class ItemMenu extends React.PureComponent { menuBtnRef: HTMLDivElement = null; state = { displayed: false, }; handleEsc = (e: KeyboardEvent) => e.key === 'Escape' && this.closeMenu(); componentDidMount() { document.addEventListener('keydown', this.handleEsc, false); } componentWillUnmount() { document.removeEventListener('keydown', this.handleEsc, false); } onClick = (callback: Function) => (e: React.MouseEvent) => { e.stopPropagation(); callback(e); }; toggleMenu = () => { const shouldDisplay = !this.state.displayed; this.setState({ displayed: shouldDisplay }); this.props.onToggle?.(shouldDisplay); }; closeMenu = () => { this.setState({ displayed: false }); this.props.onToggle?.(false); }; render() { const { items, label, bold, sm } = this.props; const { displayed } = this.state; const parentStyles = label ? 'hover:bg-gray-light' : ''; return ( (
{items .filter(({ hidden }) => !hidden) .map( ({ onClick, text, icon, disabled = false, tooltipTitle = '', }) => (
{}} className={`${disabled ? 'cursor-not-allowed' : ''}`} role="menuitem" >
{icon && (
)}
{text}
) )}
)} > {this.props.customTrigger ? ( this.props.customTrigger ) : ( <> )}
); } }