UNPKG

@craftercms/studio-ui

Version:

Services, components, models & utils to build CrafterCMS authoring extensions.

119 lines (117 loc) 4.29 kB
/* * Copyright (C) 2007-2022 Crafter Software Corporation. All Rights Reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* * Copyright (C) 2007-2022 Crafter Software Corporation. All Rights Reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === 'function') for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; import Button from '@mui/material/Button'; import React, { useRef, useState } from 'react'; import Menu from '@mui/material/Menu'; import { ListItem, ListItemText } from '@mui/material'; import { CheckRounded, KeyboardArrowDownRounded } from '@mui/icons-material'; import { UNDEFINED } from '../../utils/constants'; export function DropDownMenu(props) { const { options, onMenuItemClick: onMenuItemClickProp, onClick, closeOnSelection = true, menuProps, listItemProps, listItemTextProps } = props, buttonProps = __rest(props, [ 'options', 'onMenuItemClick', 'onClick', 'closeOnSelection', 'menuProps', 'listItemProps', 'listItemTextProps' ]); const buttonRef = useRef(); const [open, setOpen] = useState(false); const onClose = () => setOpen(false); const onMenuItemClick = (e, option) => { closeOnSelection && onClose(); onMenuItemClickProp === null || onMenuItemClickProp === void 0 ? void 0 : onMenuItemClickProp(e, option.id); }; return React.createElement( React.Fragment, null, React.createElement( Button, Object.assign({ endIcon: React.createElement(KeyboardArrowDownRounded, null) }, buttonProps, { ref: buttonRef, onClick: (e) => { // @ts-ignore if ((onClick === null || onClick === void 0 ? void 0 : onClick(e)) !== false) { setOpen(true); } } }) ), React.createElement( Menu, Object.assign({}, menuProps, { open: open, anchorEl: buttonRef.current, onClose: onClose }), options === null || options === void 0 ? void 0 : options.map((option) => React.createElement( ListItem, Object.assign( { button: true, key: option.id, component: 'li', selected: option.selected, secondaryAction: option.selected ? React.createElement(CheckRounded, null) : UNDEFINED }, listItemProps, { onClick: (e) => onMenuItemClick(e, option) } ), React.createElement( ListItemText, Object.assign({ primary: option.primaryText, secondary: option.secondaryText }, listItemTextProps) ) ) ) ) ); } export default DropDownMenu;