UNPKG

rsuite

Version:

A suite of react components

255 lines (218 loc) 8.38 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose"; import _inheritsLoose from "@babel/runtime/helpers/esm/inheritsLoose"; import * as React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import _ from 'lodash'; import setStatic from 'recompose/setStatic'; import setDisplayName from 'recompose/setDisplayName'; import { RootCloseWrapper } from 'rsuite-utils/lib/Overlay'; import shallowEqual from 'rsuite-utils/lib/utils/shallowEqual'; import DropdownToggle from './DropdownToggle'; import DropdownMenu from './DropdownMenu'; import DropdownMenuItem from './DropdownMenuItem'; import { createChainedFunction, prefix, isOneOf, getUnhandledProps, defaultProps, placementPolyfill } from '../utils'; import { SidenavContext } from '../Sidenav/Sidenav'; import { PLACEMENT_8 } from '../constants'; var Dropdown = /*#__PURE__*/ function (_React$Component) { _inheritsLoose(Dropdown, _React$Component); function Dropdown(props) { var _this; _this = _React$Component.call(this, props) || this; _this.toggle = function (isOpen) { var _this$props = _this.props, onOpen = _this$props.onOpen, onClose = _this$props.onClose, onToggle = _this$props.onToggle; var open = _.isUndefined(isOpen) ? !_this.getOpen() : isOpen; var handleToggle = open ? onOpen : onClose; _this.setState({ open: open }, function () { handleToggle && handleToggle(); }); onToggle && onToggle(open); }; _this.handleClick = function (event) { event.preventDefault(); if (_this.props.disabled) { return; } _this.toggle(); }; _this.handleOpenChange = function (event) { var eventKey = _this.props.eventKey; var onOpenChange = _.get(_this.context, 'onOpenChange'); onOpenChange && onOpenChange(eventKey, event); }; _this.handleToggleChange = function (eventKey, event) { var onOpenChange = _.get(_this.context, 'onOpenChange'); onOpenChange && onOpenChange(eventKey, event); }; _this.handleMouseEnter = function () { if (!_this.props.disabled) { _this.toggle(true); } }; _this.handleMouseLeave = function () { if (!_this.props.disabled) { _this.toggle(false); } }; _this.handleSelect = function (eventKey, event) { var onSelect = _this.props.onSelect; onSelect && onSelect(eventKey, event); _this.toggle(false); }; _this.state = { title: null, open: props.open }; return _this; } var _proto = Dropdown.prototype; _proto.getOpen = function getOpen() { var open = this.props.open; if (_.isUndefined(open)) { return this.state.open; } return open; }; _proto.render = function render() { var _classNames; var _this$props2 = this.props, title = _this$props2.title, children = _this$props2.children, className = _this$props2.className, menuStyle = _this$props2.menuStyle, disabled = _this$props2.disabled, renderTitle = _this$props2.renderTitle, classPrefix = _this$props2.classPrefix, placement = _this$props2.placement, activeKey = _this$props2.activeKey, tabIndex = _this$props2.tabIndex, toggleClassName = _this$props2.toggleClassName, trigger = _this$props2.trigger, icon = _this$props2.icon, onClick = _this$props2.onClick, onMouseEnter = _this$props2.onMouseEnter, onMouseLeave = _this$props2.onMouseLeave, onContextMenu = _this$props2.onContextMenu, eventKey = _this$props2.eventKey, Component = _this$props2.componentClass, toggleComponentClass = _this$props2.toggleComponentClass, noCaret = _this$props2.noCaret, style = _this$props2.style, props = _objectWithoutPropertiesLoose(_this$props2, ["title", "children", "className", "menuStyle", "disabled", "renderTitle", "classPrefix", "placement", "activeKey", "tabIndex", "toggleClassName", "trigger", "icon", "onClick", "onMouseEnter", "onMouseLeave", "onContextMenu", "eventKey", "componentClass", "toggleComponentClass", "noCaret", "style"]); var _ref = this.context || {}, _ref$openKeys = _ref.openKeys, openKeys = _ref$openKeys === void 0 ? [] : _ref$openKeys, sidenav = _ref.sidenav, expanded = _ref.expanded; var menuExpanded = openKeys.some(function (key) { return shallowEqual(key, eventKey); }); var addPrefix = prefix(classPrefix); var open = this.getOpen(); var collapsible = sidenav && expanded; var unhandled = getUnhandledProps(Dropdown, props); var toggleProps = _extends({}, unhandled, { onClick: createChainedFunction(this.handleOpenChange, onClick), onContextMenu: onContextMenu }); var dropdownProps = { onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave }; /** * Bind event of trigger, * not used in in the expanded state of '<Sidenav>' */ if (!collapsible) { if (isOneOf('click', trigger)) { toggleProps.onClick = createChainedFunction(this.handleClick, toggleProps.onClick); } if (isOneOf('contextMenu', trigger)) { toggleProps.onContextMenu = createChainedFunction(this.handleClick, onContextMenu); } if (isOneOf('hover', trigger)) { dropdownProps.onMouseEnter = createChainedFunction(this.handleMouseEnter, onMouseEnter); dropdownProps.onMouseLeave = createChainedFunction(this.handleMouseLeave, onMouseLeave); } } var Toggle = React.createElement(DropdownToggle, _extends({}, toggleProps, { noCaret: noCaret, tabIndex: tabIndex, className: toggleClassName, renderTitle: renderTitle, icon: icon, componentClass: toggleComponentClass }), this.state.title || title); var Menu = React.createElement(DropdownMenu, { expanded: menuExpanded, collapsible: collapsible, activeKey: activeKey, onSelect: this.handleSelect, style: menuStyle, onToggle: this.handleToggleChange, openKeys: openKeys }, children); if (open) { Menu = React.createElement(RootCloseWrapper, { onRootClose: this.toggle }, Menu); } var classes = classNames(classPrefix, className, (_classNames = {}, _classNames[addPrefix("placement-" + _.kebabCase(placementPolyfill(placement)))] = placement, _classNames[addPrefix('disabled')] = disabled, _classNames[addPrefix('no-caret')] = noCaret, _classNames[addPrefix('open')] = open, _classNames[addPrefix(menuExpanded ? 'expand' : 'collapse')] = sidenav, _classNames)); return React.createElement(Component, _extends({}, dropdownProps, { style: style, className: classes, role: "menu" }), Menu, Toggle); }; return Dropdown; }(React.Component); Dropdown.contextType = SidenavContext; Dropdown.propTypes = { activeKey: PropTypes.any, classPrefix: PropTypes.string, trigger: PropTypes.oneOfType([PropTypes.array, PropTypes.oneOf(['click', 'hover', 'contextMenu'])]), placement: PropTypes.oneOf(PLACEMENT_8), title: PropTypes.node, disabled: PropTypes.bool, icon: PropTypes.node, menuStyle: PropTypes.object, className: PropTypes.string, toggleClassName: PropTypes.string, children: PropTypes.node, tabIndex: PropTypes.number, open: PropTypes.bool, eventKey: PropTypes.any, componentClass: PropTypes.elementType, toggleComponentClass: PropTypes.elementType, noCaret: PropTypes.bool, style: PropTypes.object, onClose: PropTypes.func, onOpen: PropTypes.func, onToggle: PropTypes.func, onSelect: PropTypes.func, onMouseEnter: PropTypes.func, onMouseLeave: PropTypes.func, onContextMenu: PropTypes.func, onClick: PropTypes.func, renderTitle: PropTypes.func }; Dropdown.defaultProps = { placement: 'bottomStart', trigger: 'click', tabIndex: 0 }; var EnhancedDropdown = defaultProps({ componentClass: 'div', classPrefix: 'dropdown' })(Dropdown); setStatic('Item', DropdownMenuItem)(EnhancedDropdown); setStatic('Menu', DropdownMenu)(EnhancedDropdown); export default setDisplayName('Dropdown')(EnhancedDropdown);