UNPKG

choerodon-ui

Version:

An enterprise-class UI design language and React-based implementation

427 lines (346 loc) 13.9 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"]; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"]; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.SubPopupMenu = void 0; exports.getActiveKey = getActiveKey; exports.getWrappedInstance = getWrappedInstance; exports.saveRef = saveRef; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread4 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _noop = _interopRequireDefault(require("lodash/noop")); var _miniStore = require("mini-store"); var _KeyCode = _interopRequireDefault(require("../../_util/KeyCode")); var _createChainedFunction = _interopRequireDefault(require("../util/createChainedFunction")); var _util = require("./util"); var _DOMWrap = _interopRequireDefault(require("./DOMWrap")); function allDisabled(arr) { if (!arr.length) { return true; } return arr.every(function (c) { return !!c.props.disabled; }); } function updateActiveKey(store, menuId, activeKey) { var state = store.getState(); store.setState({ activeKey: (0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, state.activeKey), {}, (0, _defineProperty2["default"])({}, menuId, activeKey)) }); } function getEventKey(props) { // when eventKey not available ,it's menu and return menu id '0-menu-' return props.eventKey || '0-menu-'; } function getActiveKey(props, originalActiveKey) { var activeKey = originalActiveKey; var children = props.children, eventKey = props.eventKey; if (activeKey) { var found; (0, _util.loopMenuItem)(children, function (c, i) { if (c && !c.props.disabled && activeKey === (0, _util.getKeyFromChildrenIndex)(c, eventKey, i)) { found = true; } }); if (found) { return activeKey; } } activeKey = null; if (props.defaultActiveFirst) { (0, _util.loopMenuItem)(children, function (c, i) { if (!activeKey && c && !c.props.disabled) { activeKey = (0, _util.getKeyFromChildrenIndex)(c, eventKey, i); } }); return activeKey; } return activeKey; } function saveRef(c) { if (c) { var index = this.instanceArray.indexOf(c); if (index !== -1) { // update component if it's already inside instanceArray this.instanceArray[index] = c; } else { // add component if it's not in instanceArray yet; this.instanceArray.push(c); } } } function getWrappedInstance() { return SubPopupMenu; } var SubPopupMenu = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(SubPopupMenu, _Component); var _super = (0, _createSuper2["default"])(SubPopupMenu); function SubPopupMenu(_props) { var _this; (0, _classCallCheck2["default"])(this, SubPopupMenu); _this = _super.call(this, _props); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onKeyDown", function (e, callback) { var keyCode = e.keyCode; var handled; _this.getFlatInstanceArray().forEach(function (obj) { if (obj && obj.props.active && obj.onKeyDown) { handled = obj.onKeyDown(e); } }); if (handled) { return 1; } var activeItem = null; if (keyCode === _KeyCode["default"].UP || keyCode === _KeyCode["default"].DOWN) { activeItem = _this.step(keyCode === _KeyCode["default"].UP ? -1 : 1); } if (activeItem) { e.preventDefault(); updateActiveKey(_this.props.store, getEventKey(_this.props), activeItem.props.eventKey); if (typeof callback === 'function') { callback(activeItem); } return 1; } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onItemHover", function (e) { var key = e.key, hover = e.hover; updateActiveKey(_this.props.store, getEventKey(_this.props), hover ? key : null); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDeselect", function (selectInfo) { _this.props.onDeselect(selectInfo); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onSelect", function (selectInfo) { _this.props.onSelect(selectInfo); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onClick", function (e) { _this.props.onClick(e); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onOpenChange", function (e) { _this.props.onOpenChange(e); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDestroy", function (key) { /* istanbul ignore next */ _this.props.onDestroy(key); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getFlatInstanceArray", function () { return _this.instanceArray; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getOpenTransitionName", function () { return _this.props.openTransitionName; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "step", function (direction) { var children = _this.getFlatInstanceArray(); var activeKey = _this.props.store.getState().activeKey[getEventKey(_this.props)]; var len = children.length; if (!len) { return null; } if (direction < 0) { children = children.concat().reverse(); } // find current activeIndex var activeIndex = -1; children.every(function (c, ci) { if (c && c.props.eventKey === activeKey) { activeIndex = ci; return false; } return true; }); if (!_this.props.defaultActiveFirst && activeIndex !== -1 && allDisabled(children.slice(activeIndex, len - 1))) { return undefined; } var start = (activeIndex + 1) % len; var i = start; do { var child = children[i]; if (!child || child.props.disabled) { i = (i + 1) % len; } else { return child; } } while (i !== start); return null; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "renderCommonMenuItem", function (child, i, extraProps) { var state = _this.props.store.getState(); var props = _this.props; var key = (0, _util.getKeyFromChildrenIndex)(child, props.eventKey, i); var childProps = child.props; var isActive = key === state.activeKey; var newChildProps = (0, _objectSpread4["default"])({ mode: childProps.mode || props.mode, level: props.level, inlineIndent: props.inlineIndent, renderMenuItem: _this.renderMenuItem, rootPrefixCls: props.prefixCls, index: i, parentMenu: props.parentMenu, // customized ref function, need to be invoked manually in child's componentDidMount manualRef: childProps.disabled ? undefined : (0, _createChainedFunction["default"])(child.ref, saveRef.bind((0, _assertThisInitialized2["default"])(_this))), eventKey: key, active: !childProps.disabled && isActive, multiple: props.multiple, rippleDisabled: props.rippleDisabled, onClick: function onClick(e) { (childProps.onClick || _noop["default"])(e); _this.onClick(e); }, onItemHover: _this.onItemHover, openTransitionName: _this.getOpenTransitionName(), openAnimation: props.openAnimation, subMenuOpenDelay: props.subMenuOpenDelay, subMenuCloseDelay: props.subMenuCloseDelay, forceSubMenuRender: props.forceSubMenuRender, onOpenChange: _this.onOpenChange, onDeselect: _this.onDeselect, onSelect: _this.onSelect, builtinPlacements: props.builtinPlacements, itemIcon: childProps.itemIcon || _this.props.itemIcon, expandIcon: childProps.expandIcon || _this.props.expandIcon }, extraProps); if (props.mode === 'inline') { newChildProps.triggerSubMenuAction = 'click'; } return /*#__PURE__*/(0, _react.cloneElement)(child, newChildProps); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "renderMenuItem", function (c, i, subMenuKey) { /* istanbul ignore if */ if (!c) { return null; } var props = _this.props; var extraProps = { openKeys: props.openKeys, selectedKeys: props.selectedKeys, triggerSubMenuAction: props.triggerSubMenuAction, subMenuKey: subMenuKey }; return _this.renderCommonMenuItem(c, i, extraProps); }); _props.store.setState({ activeKey: (0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, _props.store.getState().activeKey), {}, (0, _defineProperty2["default"])({}, _props.eventKey, getActiveKey(_props, _props.activeKey))) }); _this.instanceArray = []; return _this; } (0, _createClass2["default"])(SubPopupMenu, [{ key: "componentDidMount", value: function componentDidMount() { // invoke customized ref to expose component to mixin if (this.props.manualRef) { this.props.manualRef(this); } } }, { key: "shouldComponentUpdate", value: function shouldComponentUpdate(nextProps) { return !this.props.hidden || !nextProps.hidden; } }, { key: "componentDidUpdate", value: function componentDidUpdate() { var props = this.props; var originalActiveKey = 'activeKey' in props ? props.activeKey : props.store.getState().activeKey[getEventKey(props)]; var activeKey = getActiveKey(props, originalActiveKey); if (activeKey !== originalActiveKey) { updateActiveKey(props.store, getEventKey(props), activeKey); } } // all keyboard events callbacks run from here at first }, { key: "render", value: function render() { var _this2 = this; var props = (0, _extends2["default"])({}, this.props); this.instanceArray = []; var className = (0, _classnames["default"])(props.prefixCls, props.className, "".concat(props.prefixCls, "-").concat(props.mode)); var haveRendered = this.haveRendered; this.haveRendered = true; this.haveOpened = this.haveOpened || !props.hidden || props.forceSubMenuRender; if (!this.haveOpened) { return null; } var domProps = { className: className, // role could be 'select' and by default set to menu role: props.role || 'menu' }; if (props.id) { domProps.id = props.id; } if (props.focusable) { domProps.tabIndex = '0'; domProps.onKeyDown = this.onKeyDown; } var prefixCls = props.prefixCls, eventKey = props.eventKey, hidden = props.hidden, level = props.level, mode = props.mode, overflowedIndicator = props.overflowedIndicator, theme = props.theme; _util.menuAllProps.forEach(function (key) { return delete props[key]; }); var transitionAppear = !(!haveRendered && !props.hidden && props.mode === 'inline'); props.className += " ".concat(props.prefixCls, "-sub"); delete props.onClick; var animProps = {}; if (props.openTransitionName) { animProps.transitionName = props.openTransitionName; } else if ((0, _typeof2["default"])(props.openAnimation) === 'object') { animProps.animation = (0, _objectSpread4["default"])({}, props.openAnimation); if (!transitionAppear) { delete animProps.animation.appear; } } return ( /*#__PURE__*/ /* eslint-disable */ _react["default"].createElement(_DOMWrap["default"], (0, _extends2["default"])({}, props, { prefixCls: prefixCls, mode: mode, tag: "ul", level: level, theme: theme, hiddenClassName: "".concat(prefixCls, "-hidden"), hidden: hidden, overflowedIndicator: overflowedIndicator }, domProps), _react.Children.map(props.children, function (c, i) { return _this2.renderMenuItem(c, i, eventKey || '0-menu-'); })) /*eslint-enable */ ); } }]); return SubPopupMenu; }(_react.Component); exports.SubPopupMenu = SubPopupMenu; (0, _defineProperty2["default"])(SubPopupMenu, "defaultProps", { prefixCls: 'rc-menu', className: '', mode: 'vertical', level: 1, inlineIndent: 24, hidden: false, focusable: true, style: {}, manualRef: _noop["default"] }); var connected = (0, _miniStore.connect)()(SubPopupMenu); var _default = connected; exports["default"] = _default; //# sourceMappingURL=SubPopupMenu.js.map