You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
423 lines
13 KiB
423 lines
13 KiB
"use strict";
|
|
|
|
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
|
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
|
|
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 React = _interopRequireWildcard(require("react"));
|
|
|
|
var _miniStore = require("mini-store");
|
|
|
|
var _omit = _interopRequireDefault(require("omit.js"));
|
|
|
|
var _SubPopupMenu = _interopRequireWildcard(require("./SubPopupMenu"));
|
|
|
|
var _util = require("./util");
|
|
|
|
var _legacyUtil = require("./utils/legacyUtil");
|
|
|
|
var Menu = /*#__PURE__*/function (_React$Component) {
|
|
(0, _inherits2.default)(Menu, _React$Component);
|
|
|
|
var _super = (0, _createSuper2.default)(Menu);
|
|
|
|
function Menu(props) {
|
|
var _this;
|
|
|
|
(0, _classCallCheck2.default)(this, Menu);
|
|
_this = _super.call(this, props);
|
|
_this.inlineOpenKeys = [];
|
|
|
|
_this.onSelect = function (selectInfo) {
|
|
var _assertThisInitialize = (0, _assertThisInitialized2.default)(_this),
|
|
props = _assertThisInitialize.props;
|
|
|
|
if (props.selectable) {
|
|
// root menu
|
|
var _this$store$getState = _this.store.getState(),
|
|
_selectedKeys = _this$store$getState.selectedKeys;
|
|
|
|
var selectedKey = selectInfo.key;
|
|
|
|
if (props.multiple) {
|
|
_selectedKeys = _selectedKeys.concat([selectedKey]);
|
|
} else {
|
|
_selectedKeys = [selectedKey];
|
|
}
|
|
|
|
if (!('selectedKeys' in props)) {
|
|
_this.store.setState({
|
|
selectedKeys: _selectedKeys
|
|
});
|
|
}
|
|
|
|
props.onSelect((0, _objectSpread2.default)((0, _objectSpread2.default)({}, selectInfo), {}, {
|
|
selectedKeys: _selectedKeys
|
|
}));
|
|
}
|
|
};
|
|
|
|
_this.onClick = function (e) {
|
|
var mode = _this.getRealMenuMode();
|
|
|
|
var _assertThisInitialize2 = (0, _assertThisInitialized2.default)(_this),
|
|
store = _assertThisInitialize2.store,
|
|
onOpenChange = _assertThisInitialize2.props.onOpenChange;
|
|
|
|
if (mode !== 'inline' && !('openKeys' in _this.props)) {
|
|
// closing vertical popup submenu after click it
|
|
store.setState({
|
|
openKeys: []
|
|
});
|
|
onOpenChange([]);
|
|
}
|
|
|
|
_this.props.onClick(e);
|
|
}; // onKeyDown needs to be exposed as a instance method
|
|
// e.g., in rc-select, we need to navigate menu item while
|
|
// current active item is rc-select input box rather than the menu itself
|
|
|
|
|
|
_this.onKeyDown = function (e, callback) {
|
|
_this.innerMenu.getWrappedInstance().onKeyDown(e, callback);
|
|
};
|
|
|
|
_this.onOpenChange = function (event) {
|
|
var _assertThisInitialize3 = (0, _assertThisInitialized2.default)(_this),
|
|
props = _assertThisInitialize3.props;
|
|
|
|
var openKeys = _this.store.getState().openKeys.concat();
|
|
|
|
var changed = false;
|
|
|
|
var processSingle = function processSingle(e) {
|
|
var oneChanged = false;
|
|
|
|
if (e.open) {
|
|
oneChanged = openKeys.indexOf(e.key) === -1;
|
|
|
|
if (oneChanged) {
|
|
openKeys.push(e.key);
|
|
}
|
|
} else {
|
|
var index = openKeys.indexOf(e.key);
|
|
oneChanged = index !== -1;
|
|
|
|
if (oneChanged) {
|
|
openKeys.splice(index, 1);
|
|
}
|
|
}
|
|
|
|
changed = changed || oneChanged;
|
|
};
|
|
|
|
if (Array.isArray(event)) {
|
|
// batch change call
|
|
event.forEach(processSingle);
|
|
} else {
|
|
processSingle(event);
|
|
}
|
|
|
|
if (changed) {
|
|
if (!('openKeys' in _this.props)) {
|
|
_this.store.setState({
|
|
openKeys: openKeys
|
|
});
|
|
}
|
|
|
|
props.onOpenChange(openKeys);
|
|
}
|
|
};
|
|
|
|
_this.onDeselect = function (selectInfo) {
|
|
var _assertThisInitialize4 = (0, _assertThisInitialized2.default)(_this),
|
|
props = _assertThisInitialize4.props;
|
|
|
|
if (props.selectable) {
|
|
var _selectedKeys2 = _this.store.getState().selectedKeys.concat();
|
|
|
|
var selectedKey = selectInfo.key;
|
|
|
|
var index = _selectedKeys2.indexOf(selectedKey);
|
|
|
|
if (index !== -1) {
|
|
_selectedKeys2.splice(index, 1);
|
|
}
|
|
|
|
if (!('selectedKeys' in props)) {
|
|
_this.store.setState({
|
|
selectedKeys: _selectedKeys2
|
|
});
|
|
}
|
|
|
|
props.onDeselect((0, _objectSpread2.default)((0, _objectSpread2.default)({}, selectInfo), {}, {
|
|
selectedKeys: _selectedKeys2
|
|
}));
|
|
}
|
|
}; // Restore vertical mode when menu is collapsed responsively when mounted
|
|
// https://github.com/ant-design/ant-design/issues/13104
|
|
// TODO: not a perfect solution,
|
|
// looking a new way to avoid setting switchingModeFromInline in this situation
|
|
|
|
|
|
_this.onMouseEnter = function (e) {
|
|
_this.restoreModeVerticalFromInline();
|
|
|
|
var onMouseEnter = _this.props.onMouseEnter;
|
|
|
|
if (onMouseEnter) {
|
|
onMouseEnter(e);
|
|
}
|
|
};
|
|
|
|
_this.onTransitionEnd = function (e) {
|
|
// when inlineCollapsed menu width animation finished
|
|
// https://github.com/ant-design/ant-design/issues/12864
|
|
var widthCollapsed = e.propertyName === 'width' && e.target === e.currentTarget; // Fix SVGElement e.target.className.indexOf is not a function
|
|
// https://github.com/ant-design/ant-design/issues/15699
|
|
|
|
var className = e.target.className; // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal,
|
|
// unless during an animation.
|
|
|
|
var classNameValue = Object.prototype.toString.call(className) === '[object SVGAnimatedString]' ? className.animVal : className; // Fix for <Menu style={{ width: '100%' }} />,
|
|
// the width transition won't trigger when menu is collapsed
|
|
// https://github.com/ant-design/ant-design-pro/issues/2783
|
|
|
|
var iconScaled = e.propertyName === 'font-size' && classNameValue.indexOf('anticon') >= 0;
|
|
|
|
if (widthCollapsed || iconScaled) {
|
|
_this.restoreModeVerticalFromInline();
|
|
}
|
|
};
|
|
|
|
_this.setInnerMenu = function (node) {
|
|
_this.innerMenu = node;
|
|
};
|
|
|
|
_this.isRootMenu = true;
|
|
var selectedKeys = props.defaultSelectedKeys;
|
|
var openKeys = props.defaultOpenKeys;
|
|
|
|
if ('selectedKeys' in props) {
|
|
selectedKeys = props.selectedKeys || [];
|
|
}
|
|
|
|
if ('openKeys' in props) {
|
|
openKeys = props.openKeys || [];
|
|
}
|
|
|
|
_this.store = (0, _miniStore.create)({
|
|
selectedKeys: selectedKeys,
|
|
openKeys: openKeys,
|
|
activeKey: {
|
|
'0-menu-': (0, _SubPopupMenu.getActiveKey)(props, props.activeKey)
|
|
}
|
|
});
|
|
_this.state = {
|
|
switchingModeFromInline: false
|
|
};
|
|
return _this;
|
|
}
|
|
|
|
(0, _createClass2.default)(Menu, [{
|
|
key: "componentDidMount",
|
|
value: function componentDidMount() {
|
|
this.updateMiniStore();
|
|
this.updateMenuDisplay();
|
|
}
|
|
}, {
|
|
key: "componentDidUpdate",
|
|
value: function componentDidUpdate(prevProps) {
|
|
this.updateOpentKeysWhenSwitchMode(prevProps);
|
|
this.updateMiniStore();
|
|
var _this$props = this.props,
|
|
siderCollapsed = _this$props.siderCollapsed,
|
|
inlineCollapsed = _this$props.inlineCollapsed,
|
|
onOpenChange = _this$props.onOpenChange;
|
|
|
|
if (!prevProps.inlineCollapsed && inlineCollapsed || !prevProps.siderCollapsed && siderCollapsed) {
|
|
onOpenChange([]);
|
|
}
|
|
|
|
this.updateMenuDisplay();
|
|
}
|
|
}, {
|
|
key: "updateOpentKeysWhenSwitchMode",
|
|
value: function updateOpentKeysWhenSwitchMode(prevProps) {
|
|
var nextProps = this.props,
|
|
store = this.store,
|
|
inlineOpenKeys = this.inlineOpenKeys;
|
|
var prevState = store.getState();
|
|
var newState = {};
|
|
|
|
if (prevProps.mode === 'inline' && nextProps.mode !== 'inline') {
|
|
this.setState({
|
|
switchingModeFromInline: true
|
|
});
|
|
}
|
|
|
|
if (!('openKeys' in nextProps)) {
|
|
// [Legacy] Old code will return after `openKeys` changed.
|
|
// Not sure the reason, we should keep this logic still.
|
|
if (nextProps.inlineCollapsed && !prevProps.inlineCollapsed || nextProps.siderCollapsed && !prevProps.siderCollapsed) {
|
|
this.setState({
|
|
switchingModeFromInline: true
|
|
});
|
|
this.inlineOpenKeys = prevState.openKeys.concat();
|
|
newState.openKeys = [];
|
|
}
|
|
|
|
if (!nextProps.inlineCollapsed && prevProps.inlineCollapsed || !nextProps.siderCollapsed && prevProps.siderCollapsed) {
|
|
newState.openKeys = inlineOpenKeys;
|
|
this.inlineOpenKeys = [];
|
|
}
|
|
}
|
|
|
|
if (Object.keys(newState).length) {
|
|
store.setState(newState);
|
|
}
|
|
}
|
|
}, {
|
|
key: "updateMenuDisplay",
|
|
value: function updateMenuDisplay() {
|
|
var collapsedWidth = this.props.collapsedWidth,
|
|
store = this.store,
|
|
prevOpenKeys = this.prevOpenKeys; // https://github.com/ant-design/ant-design/issues/8587
|
|
|
|
var hideMenu = this.getInlineCollapsed() && (collapsedWidth === 0 || collapsedWidth === '0' || collapsedWidth === '0px');
|
|
|
|
if (hideMenu) {
|
|
this.prevOpenKeys = store.getState().openKeys.concat();
|
|
this.store.setState({
|
|
openKeys: []
|
|
});
|
|
} else if (prevOpenKeys) {
|
|
this.store.setState({
|
|
openKeys: prevOpenKeys
|
|
});
|
|
this.prevOpenKeys = null;
|
|
}
|
|
}
|
|
}, {
|
|
key: "getRealMenuMode",
|
|
value: function getRealMenuMode() {
|
|
var mode = this.props.mode;
|
|
var switchingModeFromInline = this.state.switchingModeFromInline;
|
|
var inlineCollapsed = this.getInlineCollapsed();
|
|
|
|
if (switchingModeFromInline && inlineCollapsed) {
|
|
return 'inline';
|
|
}
|
|
|
|
return inlineCollapsed ? 'vertical' : mode;
|
|
}
|
|
}, {
|
|
key: "getInlineCollapsed",
|
|
value: function getInlineCollapsed() {
|
|
var _this$props2 = this.props,
|
|
inlineCollapsed = _this$props2.inlineCollapsed,
|
|
siderCollapsed = _this$props2.siderCollapsed;
|
|
|
|
if (siderCollapsed !== undefined) {
|
|
return siderCollapsed;
|
|
}
|
|
|
|
return inlineCollapsed;
|
|
}
|
|
}, {
|
|
key: "restoreModeVerticalFromInline",
|
|
value: function restoreModeVerticalFromInline() {
|
|
var switchingModeFromInline = this.state.switchingModeFromInline;
|
|
|
|
if (switchingModeFromInline) {
|
|
this.setState({
|
|
switchingModeFromInline: false
|
|
});
|
|
}
|
|
}
|
|
}, {
|
|
key: "updateMiniStore",
|
|
value: function updateMiniStore() {
|
|
if ('selectedKeys' in this.props) {
|
|
this.store.setState({
|
|
selectedKeys: this.props.selectedKeys || []
|
|
});
|
|
}
|
|
|
|
if ('openKeys' in this.props) {
|
|
this.store.setState({
|
|
openKeys: this.props.openKeys || []
|
|
});
|
|
}
|
|
}
|
|
}, {
|
|
key: "render",
|
|
value: function render() {
|
|
var props = (0, _objectSpread2.default)({}, (0, _omit.default)(this.props, ['collapsedWidth', 'siderCollapsed', 'defaultMotions']));
|
|
var mode = this.getRealMenuMode();
|
|
props.className += " ".concat(props.prefixCls, "-root");
|
|
|
|
if (props.direction === 'rtl') {
|
|
props.className += " ".concat(props.prefixCls, "-rtl");
|
|
}
|
|
|
|
props = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
|
|
mode: mode,
|
|
onClick: this.onClick,
|
|
onOpenChange: this.onOpenChange,
|
|
onDeselect: this.onDeselect,
|
|
onSelect: this.onSelect,
|
|
onMouseEnter: this.onMouseEnter,
|
|
onTransitionEnd: this.onTransitionEnd,
|
|
parentMenu: this,
|
|
motion: (0, _legacyUtil.getMotion)(this.props, this.state, mode)
|
|
});
|
|
delete props.openAnimation;
|
|
delete props.openTransitionName;
|
|
return React.createElement(_miniStore.Provider, {
|
|
store: this.store
|
|
}, React.createElement(_SubPopupMenu.default, Object.assign({}, props, {
|
|
ref: this.setInnerMenu
|
|
}), this.props.children));
|
|
}
|
|
}]);
|
|
return Menu;
|
|
}(React.Component);
|
|
|
|
Menu.defaultProps = {
|
|
selectable: true,
|
|
onClick: _util.noop,
|
|
onSelect: _util.noop,
|
|
onOpenChange: _util.noop,
|
|
onDeselect: _util.noop,
|
|
defaultSelectedKeys: [],
|
|
defaultOpenKeys: [],
|
|
subMenuOpenDelay: 0.1,
|
|
subMenuCloseDelay: 0.1,
|
|
triggerSubMenuAction: 'hover',
|
|
prefixCls: 'rc-menu',
|
|
className: '',
|
|
mode: 'vertical',
|
|
style: {},
|
|
builtinPlacements: {},
|
|
overflowedIndicator: React.createElement("span", null, "\xB7\xB7\xB7")
|
|
};
|
|
var _default = Menu;
|
|
exports.default = _default; |