252 lines
7.6 KiB
JavaScript
252 lines
7.6 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _extends2 = require('babel-runtime/helpers/extends');
|
|
|
|
var _extends3 = _interopRequireDefault(_extends2);
|
|
|
|
var _propTypes = require('prop-types');
|
|
|
|
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
|
|
var _createReactClass = require('create-react-class');
|
|
|
|
var _createReactClass2 = _interopRequireDefault(_createReactClass);
|
|
|
|
var _MenuMixin = require('./MenuMixin');
|
|
|
|
var _MenuMixin2 = _interopRequireDefault(_MenuMixin);
|
|
|
|
var _util = require('./util');
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
|
// import React from 'react';
|
|
var Menu = (0, _createReactClass2['default'])({
|
|
displayName: 'Menu',
|
|
|
|
propTypes: {
|
|
openSubMenuOnMouseEnter: _propTypes2['default'].bool,
|
|
closeSubMenuOnMouseLeave: _propTypes2['default'].bool,
|
|
selectedKeys: _propTypes2['default'].arrayOf(_propTypes2['default'].string),
|
|
defaultSelectedKeys: _propTypes2['default'].arrayOf(_propTypes2['default'].string),
|
|
defaultOpenKeys: _propTypes2['default'].arrayOf(_propTypes2['default'].string),
|
|
openKeys: _propTypes2['default'].arrayOf(_propTypes2['default'].string),
|
|
mode: _propTypes2['default'].string,
|
|
onClick: _propTypes2['default'].func,
|
|
onSelect: _propTypes2['default'].func,
|
|
onDeselect: _propTypes2['default'].func,
|
|
onDestroy: _propTypes2['default'].func,
|
|
openTransitionName: _propTypes2['default'].string,
|
|
openAnimation: _propTypes2['default'].oneOfType([_propTypes2['default'].string, _propTypes2['default'].object]),
|
|
level: _propTypes2['default'].number,
|
|
eventKey: _propTypes2['default'].string,
|
|
selectable: _propTypes2['default'].bool,
|
|
children: _propTypes2['default'].any
|
|
},
|
|
|
|
mixins: [_MenuMixin2['default']],
|
|
|
|
getDefaultProps: function getDefaultProps() {
|
|
return {
|
|
openSubMenuOnMouseEnter: true,
|
|
closeSubMenuOnMouseLeave: true,
|
|
selectable: true,
|
|
onClick: _util.noop,
|
|
onSelect: _util.noop,
|
|
onOpenChange: _util.noop,
|
|
onDeselect: _util.noop,
|
|
defaultSelectedKeys: [],
|
|
defaultOpenKeys: []
|
|
};
|
|
},
|
|
getInitialState: function getInitialState() {
|
|
var props = this.props;
|
|
var selectedKeys = props.defaultSelectedKeys;
|
|
var openKeys = props.defaultOpenKeys;
|
|
if ('selectedKeys' in props) {
|
|
selectedKeys = props.selectedKeys || [];
|
|
}
|
|
if ('openKeys' in props) {
|
|
openKeys = props.openKeys || [];
|
|
}
|
|
return {
|
|
selectedKeys: selectedKeys,
|
|
openKeys: openKeys
|
|
};
|
|
},
|
|
componentWillReceiveProps: function componentWillReceiveProps(nextProps) {
|
|
var props = {};
|
|
if ('selectedKeys' in nextProps) {
|
|
props.selectedKeys = nextProps.selectedKeys || [];
|
|
}
|
|
if ('openKeys' in nextProps) {
|
|
props.openKeys = nextProps.openKeys || [];
|
|
}
|
|
this.setState(props);
|
|
},
|
|
onDestroy: function onDestroy(key) {
|
|
var state = this.state;
|
|
var props = this.props;
|
|
var selectedKeys = state.selectedKeys;
|
|
var openKeys = state.openKeys;
|
|
var index = selectedKeys.indexOf(key);
|
|
if (!('selectedKeys' in props) && index !== -1) {
|
|
selectedKeys.splice(index, 1);
|
|
}
|
|
index = openKeys.indexOf(key);
|
|
if (!('openKeys' in props) && index !== -1) {
|
|
openKeys.splice(index, 1);
|
|
}
|
|
},
|
|
onItemHover: function onItemHover(e) {
|
|
var item = e.item;
|
|
var _props = this.props,
|
|
mode = _props.mode,
|
|
closeSubMenuOnMouseLeave = _props.closeSubMenuOnMouseLeave;
|
|
var _e$openChanges = e.openChanges,
|
|
openChanges = _e$openChanges === undefined ? [] : _e$openChanges;
|
|
// special for top sub menu
|
|
|
|
if (mode !== 'inline' && !closeSubMenuOnMouseLeave && item.isSubMenu) {
|
|
var activeKey = this.state.activeKey;
|
|
var activeItem = this.getFlatInstanceArray().filter(function (c) {
|
|
return c && c.props.eventKey === activeKey;
|
|
})[0];
|
|
if (activeItem && activeItem.props.open) {
|
|
openChanges = openChanges.concat({
|
|
key: item.props.eventKey,
|
|
item: item,
|
|
originalEvent: e,
|
|
open: true
|
|
});
|
|
}
|
|
}
|
|
openChanges = openChanges.concat(this.getOpenChangesOnItemHover(e));
|
|
if (openChanges.length) {
|
|
this.onOpenChange(openChanges);
|
|
}
|
|
},
|
|
onSelect: function onSelect(selectInfo) {
|
|
var props = this.props;
|
|
if (props.selectable) {
|
|
// root menu
|
|
var selectedKeys = this.state.selectedKeys;
|
|
var selectedKey = selectInfo.key;
|
|
if (props.multiple) {
|
|
selectedKeys = selectedKeys.concat([selectedKey]);
|
|
} else {
|
|
selectedKeys = [selectedKey];
|
|
}
|
|
if (!('selectedKeys' in props)) {
|
|
this.setState({
|
|
selectedKeys: selectedKeys
|
|
});
|
|
}
|
|
props.onSelect((0, _extends3['default'])({}, selectInfo, {
|
|
selectedKeys: selectedKeys
|
|
}));
|
|
}
|
|
},
|
|
onClick: function onClick(e) {
|
|
this.props.onClick(e);
|
|
},
|
|
onOpenChange: function onOpenChange(e_) {
|
|
var props = this.props;
|
|
var openKeys = this.state.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(e_)) {
|
|
// batch change call
|
|
e_.forEach(processSingle);
|
|
} else {
|
|
processSingle(e_);
|
|
}
|
|
if (changed) {
|
|
if (!('openKeys' in this.props)) {
|
|
this.setState({ openKeys: openKeys });
|
|
}
|
|
props.onOpenChange(openKeys);
|
|
}
|
|
},
|
|
onDeselect: function onDeselect(selectInfo) {
|
|
var props = this.props;
|
|
if (props.selectable) {
|
|
var selectedKeys = this.state.selectedKeys.concat();
|
|
var selectedKey = selectInfo.key;
|
|
var index = selectedKeys.indexOf(selectedKey);
|
|
if (index !== -1) {
|
|
selectedKeys.splice(index, 1);
|
|
}
|
|
if (!('selectedKeys' in props)) {
|
|
this.setState({
|
|
selectedKeys: selectedKeys
|
|
});
|
|
}
|
|
props.onDeselect((0, _extends3['default'])({}, selectInfo, {
|
|
selectedKeys: selectedKeys
|
|
}));
|
|
}
|
|
},
|
|
getOpenTransitionName: function getOpenTransitionName() {
|
|
var props = this.props;
|
|
var transitionName = props.openTransitionName;
|
|
var animationName = props.openAnimation;
|
|
if (!transitionName && typeof animationName === 'string') {
|
|
transitionName = props.prefixCls + '-open-' + animationName;
|
|
}
|
|
return transitionName;
|
|
},
|
|
isInlineMode: function isInlineMode() {
|
|
return this.props.mode === 'inline';
|
|
},
|
|
lastOpenSubMenu: function lastOpenSubMenu() {
|
|
var lastOpen = [];
|
|
var openKeys = this.state.openKeys;
|
|
|
|
if (openKeys.length) {
|
|
lastOpen = this.getFlatInstanceArray().filter(function (c) {
|
|
return c && openKeys.indexOf(c.props.eventKey) !== -1;
|
|
});
|
|
}
|
|
return lastOpen[0];
|
|
},
|
|
renderMenuItem: function renderMenuItem(c, i, subIndex) {
|
|
if (!c) {
|
|
return null;
|
|
}
|
|
var state = this.state;
|
|
var extraProps = {
|
|
openKeys: state.openKeys,
|
|
selectedKeys: state.selectedKeys,
|
|
openSubMenuOnMouseEnter: this.props.openSubMenuOnMouseEnter
|
|
};
|
|
return this.renderCommonMenuItem(c, i, subIndex, extraProps);
|
|
},
|
|
render: function render() {
|
|
var props = (0, _extends3['default'])({}, this.props);
|
|
props.className += ' ' + props.prefixCls + '-root';
|
|
return this.renderRoot(props);
|
|
}
|
|
});
|
|
|
|
exports['default'] = Menu;
|
|
module.exports = exports['default']; |