UNPKG

@alifd/next

Version:

A configurable component library for web built on React.

378 lines (298 loc) 13 kB
'use strict'; exports.__esModule = true; exports.default = undefined; var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties'); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _class, _temp; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _icon = require('../../icon'); var _icon2 = _interopRequireDefault(_icon); var _overlay = require('../../overlay'); var _overlay2 = _interopRequireDefault(_overlay); var _util = require('../../util'); var _item = require('./item'); var _item2 = _interopRequireDefault(_item); var _selectableItem = require('./selectable-item'); var _selectableItem2 = _interopRequireDefault(_selectableItem); var _util2 = require('./util'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var bindCtx = _util.func.bindCtx; var setStyle = _util.dom.setStyle; var Popup = _overlay2.default.Popup; /** * Menu.PopupItem * @order 2 */ var PopupItem = (_temp = _class = function (_Component) { (0, _inherits3.default)(PopupItem, _Component); function PopupItem(props) { (0, _classCallCheck3.default)(this, PopupItem); var _this = (0, _possibleConstructorReturn3.default)(this, _Component.call(this, props)); bindCtx(_this, ['handleOpen', 'handlePopupOpen', 'handlePopupClose', 'getPopup']); return _this; } PopupItem.prototype.getPopup = function getPopup(ref) { this.popup = ref; }; PopupItem.prototype.getOpen = function getOpen() { var _props = this.props, _key = _props._key, root = _props.root; var openKeys = root.state.openKeys; return openKeys.indexOf(_key) > -1; }; PopupItem.prototype.getPopupProps = function getPopupProps() { var popupProps = this.props.root.props.popupProps; if (typeof popupProps === 'function') { popupProps = popupProps(this.props); } return popupProps; }; PopupItem.prototype.handleOpen = function handleOpen(open, triggerType, e) { var _props2 = this.props, _key = _props2._key, root = _props2.root; root.handleOpen(_key, open, triggerType, e); var popupProps = this.popupProps; popupProps.onVisibleChange && popupProps.onVisibleChange(open, triggerType, e); }; PopupItem.prototype.handlePopupOpen = function handlePopupOpen() { var _props3 = this.props, root = _props3.root, level = _props3.level, align = _props3.align, autoWidth = _props3.autoWidth; var _root$props = root.props, rootPopupAutoWidth = _root$props.popupAutoWidth, rootPopupAlign = _root$props.popupAlign, direction = _root$props.direction; var popupAlign = align || rootPopupAlign; var popupAutoWidth = 'autoWidth' in this.props ? autoWidth : rootPopupAutoWidth; try { // avoid errors while dom removed and js executing var itemNode = (0, _reactDom.findDOMNode)(this); var menuNode = itemNode.parentNode; this.popupNode = this.popup.getInstance().overlay.getInstance().getContentNode(); root.popupNodes.push(this.popupNode); if (popupAutoWidth) { var targetNode = direction === 'hoz' && level === 1 ? itemNode : menuNode; if (targetNode.offsetWidth > this.popupNode.offsetWidth) { setStyle(this.popupNode, 'width', targetNode.offsetWidth + 'px'); } } if (popupAlign === 'outside' && !(direction === 'hoz' && level === 1)) { setStyle(this.popupNode, 'height', menuNode.offsetHeight + 'px'); this.popupNode.firstElementChild && setStyle(this.popupNode.firstElementChild, 'overflow-y', 'auto'); } // removeClass(this.popupNode, `${prefix}hide`); var popupProps = this.popupProps; popupProps.onOpen && popupProps.onOpen(); } catch (error) { return null; } }; PopupItem.prototype.handlePopupClose = function handlePopupClose() { var root = this.props.root; var popupNodes = root.popupNodes; var index = popupNodes.indexOf(this.popupNode); index > -1 && popupNodes.splice(index, 1); var popupProps = this.popupProps; popupProps.onClose && popupProps.onClose(); }; PopupItem.prototype.renderItem = function renderItem(selectable, children, others) { var _cx; var _props4 = this.props, _key = _props4._key, root = _props4.root, level = _props4.level, inlineLevel = _props4.inlineLevel, label = _props4.label, className = _props4.className; var _root$props2 = root.props, prefix = _root$props2.prefix, selectMode = _root$props2.selectMode; var NewItem = selectable ? _selectableItem2.default : _item2.default; var open = this.getOpen(); var _root$state = root.state, selectedKeys = _root$state.selectedKeys, _k2n = _root$state._k2n; var isChildSelected = (0, _util2.getChildSelected)({ _key: _key, _k2n: _k2n, selectMode: selectMode, selectedKeys: selectedKeys }); var itemProps = { 'aria-haspopup': true, 'aria-expanded': open, _key: _key, root: root, level: level, inlineLevel: inlineLevel, type: 'submenu' }; itemProps.className = (0, _classnames2.default)((_cx = {}, _cx[prefix + 'opened'] = open, _cx[prefix + 'child-selected'] = isChildSelected, _cx[className] = !!className, _cx)); return _react2.default.createElement( NewItem, (0, _extends3.default)({}, itemProps, others), _react2.default.createElement( 'span', { className: prefix + 'menu-item-text' }, label ), children ); }; PopupItem.prototype.renderPopup = function renderPopup(trigger, triggerType, positionProps, children) { var _this2 = this; var _props5 = this.props, root = _props5.root, level = _props5.level, selectable = _props5.selectable, propCls = _props5.className; var direction = root.props.direction; this.popupProps = this.getPopupProps(); var open = this.getOpen(); if (direction === 'hoz' && level === 1 && selectable) { positionProps.target = function () { return (0, _reactDom.findDOMNode)(_this2); }; } var posCls = positionProps.className, otherPostion = (0, _objectWithoutProperties3.default)(positionProps, ['className']); var className = (0, _classnames2.default)(propCls, posCls); return _react2.default.createElement( Popup, (0, _extends3.default)({ ref: this.getPopup }, otherPostion, this.popupProps, { canCloseByEsc: false, trigger: trigger, triggerType: triggerType, visible: open, pinFollowBaseElementWhenFixed: true, onVisibleChange: this.handleOpen, onOpen: this.handlePopupOpen, onClose: this.handlePopupClose }), _react2.default.createElement( 'div', { className: className }, children ) ); }; PopupItem.prototype.render = function render() { var _this3 = this; var _props6 = this.props, root = _props6.root, level = _props6.level, hasSubMenu = _props6.hasSubMenu, selectableFromProps = _props6.selectable, children = _props6.children, triggerType = _props6.triggerType, align = _props6.align, noIcon = _props6.noIcon, rtl = _props6.rtl; var others = _util.obj.pickOthers(Object.keys(PopupItem.propTypes), this.props); var _root$props3 = root.props, prefix = _root$props3.prefix, selectMode = _root$props3.selectMode, direction = _root$props3.direction, rootPopupAlign = _root$props3.popupAlign, rootTriggerType = _root$props3.triggerType; var popupAlign = align || rootPopupAlign; var newTriggerType = triggerType || (hasSubMenu ? rootTriggerType : 'hover'); var newChildren = Array.isArray(children) ? children[0] : children; // let newChildren = Array.isArray(children) ? children[0] : children; // newChildren = cloneElement(newChildren, { // className: cx({ // [`${prefix}menu-popup-content`]: true, // [newChildren.props.className]: !!newChildren.props.className, // [`${prefix}hide`]: popupAutoWidth || popupAlign === 'outside' // }) // }); var selectable = selectMode && selectableFromProps; var triggerIsIcon = selectable && newTriggerType === 'click'; var open = this.getOpen(); var positionProps = {}; var arrowProps = void 0; if (direction === 'hoz' && level === 1) { var _cx2; positionProps.align = 'tl bl'; positionProps.className = prefix + 'menu-spacing-tb'; arrowProps = { type: 'arrow-down', className: (0, _classnames2.default)((_cx2 = {}, _cx2[prefix + 'menu-hoz-icon-arrow'] = true, _cx2[prefix + 'open'] = open, _cx2)) }; } else { if (popupAlign === 'outside') { positionProps.target = function () { return (0, _reactDom.findDOMNode)(root); }; positionProps.align = 'tl tr'; positionProps.className = prefix + 'menu-spacing-lr ' + prefix + 'menu-outside'; } else { if (triggerIsIcon) { positionProps.target = function () { return (0, _reactDom.findDOMNode)(_this3); }; } positionProps.align = 'tl tr'; positionProps.className = prefix + 'menu-spacing-lr'; } arrowProps = { type: 'arrow-right', className: prefix + 'menu-icon-arrow ' + prefix + 'menu-symbol-popupfold' }; } var arrow = _react2.default.createElement(_icon2.default, arrowProps); var trigger = triggerIsIcon ? arrow : this.renderItem(selectable, noIcon ? null : arrow, others); var popup = this.renderPopup(trigger, newTriggerType, positionProps, newChildren); return triggerIsIcon ? this.renderItem(selectable, popup, others) : popup; }; return PopupItem; }(_react.Component), _class.menuChildType = 'submenu', _class.propTypes = { _key: _propTypes2.default.string, root: _propTypes2.default.object, level: _propTypes2.default.number, hasSubMenu: _propTypes2.default.bool, noIcon: _propTypes2.default.bool, rtl: _propTypes2.default.bool, selectable: _propTypes2.default.bool, /** * 标签内容 */ label: _propTypes2.default.node, /** * 自定义弹层内容 */ children: _propTypes2.default.node, className: _propTypes2.default.string, /** * 子菜单打开的触发行为 */ triggerType: _propTypes2.default.oneOf(['click', 'hover']), align: _propTypes2.default.oneOf(['outside', 'follow']), autoWidth: _propTypes2.default.bool }, _class.defaultProps = { selectable: false, noIcon: false }, _temp); PopupItem.displayName = 'PopupItem'; exports.default = PopupItem; module.exports = exports['default'];