UNPKG

rsuite

Version:

A suite of react components

312 lines (252 loc) 11.5 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose")); var _kebabCase2 = _interopRequireDefault(require("lodash/kebabCase")); var _isUndefined2 = _interopRequireDefault(require("lodash/isUndefined")); var React = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _classnames = _interopRequireDefault(require("classnames")); var _recompose = require("recompose"); var _domLib = require("dom-lib"); var _RootCloseWrapper = _interopRequireDefault(require("../Overlay/RootCloseWrapper")); var _shallowEqual = _interopRequireDefault(require("../utils/shallowEqual")); var _DropdownToggle = _interopRequireDefault(require("./DropdownToggle")); var _DropdownMenu = _interopRequireDefault(require("./DropdownMenu")); var _DropdownMenuItem = _interopRequireDefault(require("./DropdownMenuItem")); var _utils = require("../utils"); var _Sidenav = require("../Sidenav/Sidenav"); var _constants = require("../constants"); var Dropdown = /*#__PURE__*/ function (_React$Component) { (0, _inheritsLoose2.default)(Dropdown, _React$Component); function Dropdown(props) { var _this; _this = _React$Component.call(this, props) || this; _this.rootRef = void 0; _this.toggle = function (isOpen) { var _this$props = _this.props, onOpen = _this$props.onOpen, onClose = _this$props.onClose, onToggle = _this$props.onToggle; var open = (0, _isUndefined2.default)(isOpen) ? !_this.getOpen() : isOpen; var handleToggle = open ? onOpen : onClose; _this.setState({ open: open }); handleToggle === null || handleToggle === void 0 ? void 0 : handleToggle(); onToggle === null || onToggle === void 0 ? void 0 : onToggle(open); }; _this.handleRootClose = function (event) { var _this$props$onToggle, _this$props2, _this$props$onClose, _this$props3; // Prevent the event from bubbling when closing the overlay is triggered by its own element. // fix#1435 if ((0, _domLib.contains)((0, _utils.getDOMNode)(_this.rootRef.current), event.target)) { event.preventDefault(); event.stopPropagation(); } _this.setState({ open: false }); (_this$props$onToggle = (_this$props2 = _this.props).onToggle) === null || _this$props$onToggle === void 0 ? void 0 : _this$props$onToggle.call(_this$props2, false); (_this$props$onClose = (_this$props3 = _this.props).onClose) === null || _this$props$onClose === void 0 ? void 0 : _this$props$onClose.call(_this$props3); }; _this.handleClick = function (event) { event.preventDefault(); if (_this.props.disabled) { return; } _this.toggle(); }; _this.handleOpenChange = function (event) { var _this$context, _this$context$onOpenC; var eventKey = _this.props.eventKey; (_this$context = _this.context) === null || _this$context === void 0 ? void 0 : (_this$context$onOpenC = _this$context.onOpenChange) === null || _this$context$onOpenC === void 0 ? void 0 : _this$context$onOpenC.call(_this$context, eventKey, event); }; _this.handleToggleChange = function (eventKey, event) { var _this$context2, _this$context2$onOpen; (_this$context2 = _this.context) === null || _this$context2 === void 0 ? void 0 : (_this$context2$onOpen = _this$context2.onOpenChange) === null || _this$context2$onOpen === void 0 ? void 0 : _this$context2$onOpen.call(_this$context2, 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 _this$props$onSelect, _this$props4; (_this$props$onSelect = (_this$props4 = _this.props).onSelect) === null || _this$props$onSelect === void 0 ? void 0 : _this$props$onSelect.call(_this$props4, eventKey, event); _this.toggle(false); }; _this.state = { open: props.open }; _this.rootRef = React.createRef(); return _this; } var _proto = Dropdown.prototype; _proto.getOpen = function getOpen() { var open = this.props.open; if ((0, _isUndefined2.default)(open)) { return this.state.open; } return open; }; _proto.render = function render() { var _classNames; var _this$props5 = this.props, title = _this$props5.title, children = _this$props5.children, className = _this$props5.className, menuStyle = _this$props5.menuStyle, disabled = _this$props5.disabled, renderTitle = _this$props5.renderTitle, classPrefix = _this$props5.classPrefix, placement = _this$props5.placement, activeKey = _this$props5.activeKey, tabIndex = _this$props5.tabIndex, toggleClassName = _this$props5.toggleClassName, trigger = _this$props5.trigger, icon = _this$props5.icon, onClick = _this$props5.onClick, onMouseEnter = _this$props5.onMouseEnter, onMouseLeave = _this$props5.onMouseLeave, onContextMenu = _this$props5.onContextMenu, eventKey = _this$props5.eventKey, Component = _this$props5.componentClass, toggleComponentClass = _this$props5.toggleComponentClass, noCaret = _this$props5.noCaret, style = _this$props5.style, showHeader = _this$props5.showHeader, props = (0, _objectWithoutPropertiesLoose2.default)(_this$props5, ["title", "children", "className", "menuStyle", "disabled", "renderTitle", "classPrefix", "placement", "activeKey", "tabIndex", "toggleClassName", "trigger", "icon", "onClick", "onMouseEnter", "onMouseLeave", "onContextMenu", "eventKey", "componentClass", "toggleComponentClass", "noCaret", "style", "showHeader"]); 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 (0, _shallowEqual.default)(key, eventKey); }); var addPrefix = (0, _utils.prefix)(classPrefix); var open = this.getOpen(); var collapsible = sidenav && expanded; var unhandled = (0, _utils.getUnhandledProps)(Dropdown, props); var toggleProps = (0, _extends2.default)({}, unhandled, { onClick: (0, _utils.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 ((0, _utils.isOneOf)('click', trigger)) { toggleProps.onClick = (0, _utils.createChainedFunction)(this.handleClick, toggleProps.onClick); } if ((0, _utils.isOneOf)('contextMenu', trigger)) { toggleProps.onContextMenu = (0, _utils.createChainedFunction)(this.handleClick, onContextMenu); } if ((0, _utils.isOneOf)('hover', trigger)) { dropdownProps.onMouseEnter = (0, _utils.createChainedFunction)(this.handleMouseEnter, onMouseEnter); dropdownProps.onMouseLeave = (0, _utils.createChainedFunction)(this.handleMouseLeave, onMouseLeave); } } var menuProps = { collapsible: collapsible, activeKey: activeKey, openKeys: openKeys, expanded: menuExpanded, style: menuStyle, onSelect: this.handleSelect, onToggle: this.handleToggleChange }; var menu = React.createElement(_DropdownMenu.default, menuProps, children); if (open) { menu = React.createElement(_RootCloseWrapper.default, { onRootClose: this.handleRootClose }, function (props, ref) { return React.createElement(_DropdownMenu.default, (0, _extends2.default)({}, props, menuProps, { htmlElementRef: ref }), showHeader && React.createElement("li", { className: addPrefix('header') }, title), children); }); } var toggle = React.createElement(_DropdownToggle.default, (0, _extends2.default)({}, toggleProps, { noCaret: noCaret, tabIndex: tabIndex, className: toggleClassName, renderTitle: renderTitle, icon: icon, componentClass: toggleComponentClass }), title); var classes = (0, _classnames.default)(classPrefix, className, (_classNames = {}, _classNames[addPrefix("placement-" + (0, _kebabCase2.default)((0, _utils.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, (0, _extends2.default)({ ref: this.rootRef }, dropdownProps, { style: style, className: classes, role: "menu" }), menu, toggle); }; return Dropdown; }(React.Component); Dropdown.displayName = 'Dropdown'; Dropdown.contextType = _Sidenav.SidenavContext; Dropdown.propTypes = { activeKey: _propTypes.default.any, classPrefix: _propTypes.default.string, trigger: _propTypes.default.oneOfType([_propTypes.default.array, _propTypes.default.oneOf(['click', 'hover', 'contextMenu'])]), placement: _propTypes.default.oneOf(_constants.PLACEMENT_8), title: _propTypes.default.node, disabled: _propTypes.default.bool, icon: _propTypes.default.node, menuStyle: _propTypes.default.object, className: _propTypes.default.string, toggleClassName: _propTypes.default.string, children: _propTypes.default.node, tabIndex: _propTypes.default.number, open: _propTypes.default.bool, eventKey: _propTypes.default.any, componentClass: _propTypes.default.elementType, toggleComponentClass: _propTypes.default.elementType, noCaret: _propTypes.default.bool, showHeader: _propTypes.default.bool, style: _propTypes.default.object, onClose: _propTypes.default.func, onOpen: _propTypes.default.func, onToggle: _propTypes.default.func, onSelect: _propTypes.default.func, onMouseEnter: _propTypes.default.func, onMouseLeave: _propTypes.default.func, onContextMenu: _propTypes.default.func, onClick: _propTypes.default.func, renderTitle: _propTypes.default.func }; Dropdown.defaultProps = { placement: 'bottomStart', trigger: 'click', tabIndex: 0 }; var EnhancedDropdown = (0, _utils.defaultProps)({ componentClass: 'div', classPrefix: 'dropdown' })(Dropdown); (0, _recompose.setStatic)('Item', _DropdownMenuItem.default)(EnhancedDropdown); (0, _recompose.setStatic)('Menu', _DropdownMenu.default)(EnhancedDropdown); var _default = EnhancedDropdown; exports.default = _default; module.exports = exports.default;