UNPKG

@etsoo/materialui

Version:

TypeScript Material-UI Implementation

65 lines (64 loc) 2.9 kB
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import Button from "@mui/material/Button"; import Menu from "@mui/material/Menu"; import MenuItem from "@mui/material/MenuItem"; import React from "react"; export function MenuButton(props) { // Destruct const { button, items, labelField, anchorOrigin = { vertical: "top", horizontal: "right" }, transformOrigin = { vertical: anchorOrigin.vertical === "center" ? "center" : anchorOrigin.vertical === "top" ? "bottom" : "top", horizontal: anchorOrigin.horizontal }, sx, ...rest } = props; // Top? const isTop = transformOrigin.vertical === "top"; // Menu anchor const [anchorEl, setAnchorEl] = React.useState(); // Menu open or not const isMenuOpen = Boolean(anchorEl); const handleMenuOpen = (event) => { setAnchorEl(event.currentTarget); }; const handleMenuClose = () => { setAnchorEl(undefined); }; const labelFormatter = typeof labelField === "function" ? labelField : (item) => item[labelField]; return (_jsxs(React.Fragment, { children: [typeof button === "function" ? (button(handleMenuOpen)) : (_jsx(Button, { onClick: handleMenuOpen, ...button })), _jsx(Menu, { slotProps: { paper: { elevation: 0, sx: { overflow: "visible", filter: "drop-shadow(0px 2px 8px rgba(0,0,0,0.32))", "& .MuiAvatar-root": { width: 32, height: 32 }, "&:before": { content: '""', display: "block", position: "absolute", top: isTop ? 0 : undefined, bottom: isTop ? undefined : -10, right: 14, width: 10, height: 10, bgcolor: "background.paper", transform: "translateY(-50%) rotate(45deg)", zIndex: 0 }, ...{ sx } } } }, disableScrollLock: true, anchorEl: anchorEl, anchorOrigin: anchorOrigin, keepMounted: true, transformOrigin: transformOrigin, open: isMenuOpen, transitionDuration: 0, onClose: handleMenuClose, ...rest, children: items.map((item) => { const label = labelFormatter(item); return (_jsx(MenuItem, { disabled: true, children: label }, item.id)); }) })] })); }