UNPKG

@mskcc/carbon-react

Version:

Carbon react components for the MSKCC DSM

155 lines (147 loc) 5.42 kB
/** * MSKCC 2021, 2024 */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelpers.js'); var React = require('react'); var PropTypes = require('prop-types'); var cx = require('classnames'); var iconsReact = require('@carbon/icons-react'); var Button = require('../Button/Button.js'); require('../Button/Button.Skeleton.js'); var IconButton = require('../IconButton/IconButton.js'); var Menu = require('../Menu/Menu.js'); var useAttachedMenu = require('../../internal/useAttachedMenu.js'); var useId = require('../../internal/useId.js'); var useMergedRefs = require('../../internal/useMergedRefs.js'); var usePrefix = require('../../internal/usePrefix.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var React__default = /*#__PURE__*/_interopDefaultLegacy(React); var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes); var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx); var _ChevronDown; const spacing = 4; // top and bottom spacing between the button and the menu. in px const defaultTranslations = { 'carbon.combo-button.additional-actions': 'Additional actions' }; function defaultTranslateWithId(messageId) { return defaultTranslations[messageId]; } const ComboButton = /*#__PURE__*/React__default["default"].forwardRef(function ComboButton(_ref, forwardRef) { let { children, className, disabled, label, onClick, size = 'lg', tooltipAlignment, translateWithId: t = defaultTranslateWithId, ...rest } = _ref; const id = useId.useId('combobutton'); const prefix = usePrefix.usePrefix(); const containerRef = React.useRef(null); const menuRef = React.useRef(null); const ref = useMergedRefs.useMergedRefs([forwardRef, containerRef]); const [width, setWidth] = React.useState(0); const { open, x, y, handleClick: hookOnClick, handleMousedown: handleTriggerMousedown, handleClose } = useAttachedMenu.useAttachedMenu(containerRef); function handleTriggerClick() { if (containerRef.current) { const { width: w } = containerRef.current.getBoundingClientRect(); setWidth(w); hookOnClick(); } } function handlePrimaryActionClick(e) { if (onClick) { onClick(e); } } function handleOpen() { menuRef.current.style.width = `${width}px`; } const containerClasses = cx__default["default"](`${prefix}--combo-button__container`, `${prefix}--combo-button__container--${size}`, { [`${prefix}--combo-button__container--open`]: open }, className); const primaryActionClasses = cx__default["default"](`${prefix}--combo-button__primary-action`); const triggerClasses = cx__default["default"](`${prefix}--combo-button__trigger`); return /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({}, rest, { className: containerClasses, ref: ref, "aria-owns": open ? id : null }), /*#__PURE__*/React__default["default"].createElement("div", { className: primaryActionClasses }, /*#__PURE__*/React__default["default"].createElement(Button["default"], { size: size, disabled: disabled, onClick: handlePrimaryActionClick }, label)), /*#__PURE__*/React__default["default"].createElement(IconButton.IconButton, { className: triggerClasses, label: t('carbon.combo-button.additional-actions'), size: size, disabled: disabled, align: tooltipAlignment, "aria-haspopup": true, "aria-expanded": open, onClick: handleTriggerClick, onMouseDown: handleTriggerMousedown, "aria-controls": open ? id : null }, _ChevronDown || (_ChevronDown = /*#__PURE__*/React__default["default"].createElement(iconsReact.ChevronDown, null))), /*#__PURE__*/React__default["default"].createElement(Menu.Menu, { ref: menuRef, id: id, label: t('carbon.combo-button.additional-actions'), size: size, open: open, onClose: handleClose, onOpen: handleOpen, x: x, y: [y[0] - spacing, y[1] + spacing] }, children)); }); ComboButton.propTypes = { /** * A collection of MenuItems to be rendered as additional actions for this ComboButton. */ children: PropTypes__default["default"].node.isRequired, /** * Additional CSS class names. */ className: PropTypes__default["default"].string, /** * Specify whether the ComboButton should be disabled, or not. */ disabled: PropTypes__default["default"].bool, /** * Provide the label to be renderd on the primary action button. */ label: PropTypes__default["default"].string.isRequired, /** * Provide an optional function to be called when the primary action element is clicked. */ onClick: PropTypes__default["default"].func, /** * Specify the size of the buttons and menu. */ size: PropTypes__default["default"].oneOf(['sm', 'md', 'lg']), /** * Specify how the trigger tooltip should be aligned. */ tooltipAlignment: PropTypes__default["default"].oneOf(['top', 'top-left', 'top-right', 'bottom', 'bottom-left', 'bottom-right', 'left', 'right']), /** * Optional method that takes in a message id and returns an * internationalized string. */ translateWithId: PropTypes__default["default"].func }; exports.ComboButton = ComboButton;