123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619 |
- 'use strict';
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- var _babelHelperVueJsxMergeProps = require('babel-helper-vue-jsx-merge-props');
- var _babelHelperVueJsxMergeProps2 = _interopRequireDefault(_babelHelperVueJsxMergeProps);
- var _typeof2 = require('babel-runtime/helpers/typeof');
- var _typeof3 = _interopRequireDefault(_typeof2);
- var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
- var _defineProperty3 = _interopRequireDefault(_defineProperty2);
- var _extends3 = require('babel-runtime/helpers/extends');
- var _extends4 = _interopRequireDefault(_extends3);
- var _omit = require('omit.js');
- var _omit2 = _interopRequireDefault(_omit);
- var _vueTypes = require('../_util/vue-types');
- var _vueTypes2 = _interopRequireDefault(_vueTypes);
- var _vcTrigger = require('../vc-trigger');
- var _vcTrigger2 = _interopRequireDefault(_vcTrigger);
- var _KeyCode = require('../_util/KeyCode');
- var _KeyCode2 = _interopRequireDefault(_KeyCode);
- var _store = require('../_util/store');
- var _SubPopupMenu = require('./SubPopupMenu');
- var _SubPopupMenu2 = _interopRequireDefault(_SubPopupMenu);
- var _placements = require('./placements');
- var _placements2 = _interopRequireDefault(_placements);
- var _BaseMixin = require('../_util/BaseMixin');
- var _BaseMixin2 = _interopRequireDefault(_BaseMixin);
- var _propsUtil = require('../_util/props-util');
- var _requestAnimationTimeout = require('../_util/requestAnimationTimeout');
- var _util = require('./util');
- var _getTransitionProps = require('../_util/getTransitionProps');
- var _getTransitionProps2 = _interopRequireDefault(_getTransitionProps);
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
- var guid = 0;
- var popupPlacementMap = {
- horizontal: 'bottomLeft',
- vertical: 'rightTop',
- 'vertical-left': 'rightTop',
- 'vertical-right': 'leftTop'
- };
- var updateDefaultActiveFirst = function updateDefaultActiveFirst(store, eventKey, defaultActiveFirst) {
- var menuId = (0, _util.getMenuIdFromSubMenuEventKey)(eventKey);
- var state = store.getState();
- store.setState({
- defaultActiveFirst: (0, _extends4['default'])({}, state.defaultActiveFirst, (0, _defineProperty3['default'])({}, menuId, defaultActiveFirst))
- });
- };
- var SubMenu = {
- name: 'SubMenu',
- props: {
- parentMenu: _vueTypes2['default'].object,
- title: _vueTypes2['default'].any,
- selectedKeys: _vueTypes2['default'].array.def([]),
- openKeys: _vueTypes2['default'].array.def([]),
- openChange: _vueTypes2['default'].func.def(_util.noop),
- rootPrefixCls: _vueTypes2['default'].string,
- eventKey: _vueTypes2['default'].oneOfType([_vueTypes2['default'].string, _vueTypes2['default'].number]),
- multiple: _vueTypes2['default'].bool,
- active: _vueTypes2['default'].bool, // TODO: remove
- isRootMenu: _vueTypes2['default'].bool.def(false),
- index: _vueTypes2['default'].number,
- triggerSubMenuAction: _vueTypes2['default'].string,
- popupClassName: _vueTypes2['default'].string,
- getPopupContainer: _vueTypes2['default'].func,
- forceSubMenuRender: _vueTypes2['default'].bool,
- openAnimation: _vueTypes2['default'].oneOfType([_vueTypes2['default'].string, _vueTypes2['default'].object]),
- disabled: _vueTypes2['default'].bool,
- subMenuOpenDelay: _vueTypes2['default'].number.def(0.1),
- subMenuCloseDelay: _vueTypes2['default'].number.def(0.1),
- level: _vueTypes2['default'].number.def(1),
- inlineIndent: _vueTypes2['default'].number.def(24),
- openTransitionName: _vueTypes2['default'].string,
- popupOffset: _vueTypes2['default'].array,
- isOpen: _vueTypes2['default'].bool,
- store: _vueTypes2['default'].object,
- mode: _vueTypes2['default'].oneOf(['horizontal', 'vertical', 'vertical-left', 'vertical-right', 'inline']).def('vertical'),
- manualRef: _vueTypes2['default'].func.def(_util.noop),
- builtinPlacements: _vueTypes2['default'].object.def(function () {
- return {};
- }),
- itemIcon: _vueTypes2['default'].any,
- expandIcon: _vueTypes2['default'].any,
- subMenuKey: _vueTypes2['default'].string
- },
- mixins: [_BaseMixin2['default']],
- isSubMenu: true,
- data: function data() {
- var props = this.$props;
- var store = props.store;
- var eventKey = props.eventKey;
- var defaultActiveFirst = store.getState().defaultActiveFirst;
- var value = false;
- if (defaultActiveFirst) {
- value = defaultActiveFirst[eventKey];
- }
- updateDefaultActiveFirst(store, eventKey, value);
- return {
- // defaultActiveFirst: false,
- };
- },
- mounted: function mounted() {
- var _this = this;
- this.$nextTick(function () {
- _this.handleUpdated();
- });
- },
- updated: function updated() {
- var _this2 = this;
- this.$nextTick(function () {
- _this2.handleUpdated();
- });
- },
- beforeDestroy: function beforeDestroy() {
- var eventKey = this.eventKey;
- this.__emit('destroy', eventKey);
- /* istanbul ignore if */
- if (this.minWidthTimeout) {
- (0, _requestAnimationTimeout.cancelAnimationTimeout)(this.minWidthTimeout);
- this.minWidthTimeout = null;
- }
- /* istanbul ignore if */
- if (this.mouseenterTimeout) {
- (0, _requestAnimationTimeout.cancelAnimationTimeout)(this.mouseenterTimeout);
- this.mouseenterTimeout = null;
- }
- },
- methods: {
- handleUpdated: function handleUpdated() {
- var _this3 = this;
- var _$props = this.$props,
- mode = _$props.mode,
- parentMenu = _$props.parentMenu,
- manualRef = _$props.manualRef;
- // invoke customized ref to expose component to mixin
- if (manualRef) {
- manualRef(this);
- }
- if (mode !== 'horizontal' || !parentMenu.isRootMenu || !this.isOpen) {
- return;
- }
- this.minWidthTimeout = (0, _requestAnimationTimeout.requestAnimationTimeout)(function () {
- return _this3.adjustWidth();
- }, 0);
- },
- onKeyDown: function onKeyDown(e) {
- var keyCode = e.keyCode;
- var menu = this.menuInstance;
- var _$props2 = this.$props,
- store = _$props2.store,
- isOpen = _$props2.isOpen;
- if (keyCode === _KeyCode2['default'].ENTER) {
- this.onTitleClick(e);
- updateDefaultActiveFirst(store, this.eventKey, true);
- return true;
- }
- if (keyCode === _KeyCode2['default'].RIGHT) {
- if (isOpen) {
- menu.onKeyDown(e);
- } else {
- this.triggerOpenChange(true);
- // need to update current menu's defaultActiveFirst value
- updateDefaultActiveFirst(store, this.eventKey, true);
- }
- return true;
- }
- if (keyCode === _KeyCode2['default'].LEFT) {
- var handled = void 0;
- if (isOpen) {
- handled = menu.onKeyDown(e);
- } else {
- return undefined;
- }
- if (!handled) {
- this.triggerOpenChange(false);
- handled = true;
- }
- return handled;
- }
- if (isOpen && (keyCode === _KeyCode2['default'].UP || keyCode === _KeyCode2['default'].DOWN)) {
- return menu.onKeyDown(e);
- }
- return undefined;
- },
- onPopupVisibleChange: function onPopupVisibleChange(visible) {
- this.triggerOpenChange(visible, visible ? 'mouseenter' : 'mouseleave');
- },
- onMouseEnter: function onMouseEnter(e) {
- var _$props3 = this.$props,
- key = _$props3.eventKey,
- store = _$props3.store;
- updateDefaultActiveFirst(store, key, false);
- this.__emit('mouseenter', {
- key: key,
- domEvent: e
- });
- },
- onMouseLeave: function onMouseLeave(e) {
- var eventKey = this.eventKey,
- parentMenu = this.parentMenu;
- parentMenu.subMenuInstance = this;
- // parentMenu.subMenuLeaveFn = () => {
- // // trigger mouseleave
- // this.__emit('mouseleave', {
- // key: eventKey,
- // domEvent: e,
- // })
- // }
- this.__emit('mouseleave', {
- key: eventKey,
- domEvent: e
- });
- // prevent popup menu and submenu gap
- // parentMenu.subMenuLeaveTimer = setTimeout(parentMenu.subMenuLeaveFn, 100)
- },
- onTitleMouseEnter: function onTitleMouseEnter(domEvent) {
- var key = this.$props.eventKey;
- // this.clearSubMenuTitleLeaveTimer()
- this.__emit('itemHover', {
- key: key,
- hover: true
- });
- this.__emit('titleMouseenter', {
- key: key,
- domEvent: domEvent
- });
- },
- onTitleMouseLeave: function onTitleMouseLeave(e) {
- var eventKey = this.eventKey,
- parentMenu = this.parentMenu;
- parentMenu.subMenuInstance = this;
- this.__emit('itemHover', {
- key: eventKey,
- hover: false
- });
- this.__emit('titleMouseleave', {
- key: eventKey,
- domEvent: e
- });
- },
- onTitleClick: function onTitleClick(e) {
- var _$props4 = this.$props,
- triggerSubMenuAction = _$props4.triggerSubMenuAction,
- eventKey = _$props4.eventKey,
- isOpen = _$props4.isOpen,
- store = _$props4.store;
- this.__emit('titleClick', {
- key: eventKey,
- domEvent: e
- });
- if (triggerSubMenuAction === 'hover') {
- return;
- }
- this.triggerOpenChange(!isOpen, 'click');
- updateDefaultActiveFirst(store, eventKey, false);
- },
- onSubMenuClick: function onSubMenuClick(info) {
- this.__emit('click', this.addKeyPath(info));
- },
- getPrefixCls: function getPrefixCls() {
- return this.$props.rootPrefixCls + '-submenu';
- },
- getActiveClassName: function getActiveClassName() {
- return this.getPrefixCls() + '-active';
- },
- getDisabledClassName: function getDisabledClassName() {
- return this.getPrefixCls() + '-disabled';
- },
- getSelectedClassName: function getSelectedClassName() {
- return this.getPrefixCls() + '-selected';
- },
- getOpenClassName: function getOpenClassName() {
- return this.$props.rootPrefixCls + '-submenu-open';
- },
- saveMenuInstance: function saveMenuInstance(c) {
- // children menu instance
- this.menuInstance = c;
- },
- addKeyPath: function addKeyPath(info) {
- return (0, _extends4['default'])({}, info, {
- keyPath: (info.keyPath || []).concat(this.$props.eventKey)
- });
- },
- // triggerOpenChange (open, type) {
- // const key = this.$props.eventKey
- // this.__emit('openChange', {
- // key,
- // item: this,
- // trigger: type,
- // open,
- // })
- // },
- triggerOpenChange: function triggerOpenChange(open, type) {
- var _this4 = this;
- var key = this.$props.eventKey;
- var openChange = function openChange() {
- _this4.__emit('openChange', {
- key: key,
- item: _this4,
- trigger: type,
- open: open
- });
- };
- if (type === 'mouseenter') {
- // make sure mouseenter happen after other menu item's mouseleave
- this.mouseenterTimeout = (0, _requestAnimationTimeout.requestAnimationTimeout)(function () {
- openChange();
- }, 0);
- } else {
- openChange();
- }
- },
- isChildrenSelected: function isChildrenSelected() {
- var ret = { find: false };
- (0, _util.loopMenuItemRecursively)(this.$slots['default'], this.$props.selectedKeys, ret);
- return ret.find;
- },
- // isOpen () {
- // return this.$props.openKeys.indexOf(this.$props.eventKey) !== -1
- // },
- adjustWidth: function adjustWidth() {
- /* istanbul ignore if */
- if (!this.$refs.subMenuTitle || !this.menuInstance) {
- return;
- }
- var popupMenu = this.menuInstance.$el;
- if (popupMenu.offsetWidth >= this.$refs.subMenuTitle.offsetWidth) {
- return;
- }
- /* istanbul ignore next */
- popupMenu.style.minWidth = this.$refs.subMenuTitle.offsetWidth + 'px';
- },
- renderChildren: function renderChildren(children) {
- var h = this.$createElement;
- var props = this.$props;
- var _getListeners = (0, _propsUtil.getListeners)(this),
- select = _getListeners.select,
- deselect = _getListeners.deselect,
- openChange = _getListeners.openChange;
- var subPopupMenuProps = {
- props: {
- mode: props.mode === 'horizontal' ? 'vertical' : props.mode,
- visible: props.isOpen,
- level: props.level + 1,
- inlineIndent: props.inlineIndent,
- focusable: false,
- selectedKeys: props.selectedKeys,
- eventKey: props.eventKey + '-menu-',
- openKeys: props.openKeys,
- openTransitionName: props.openTransitionName,
- openAnimation: props.openAnimation,
- subMenuOpenDelay: props.subMenuOpenDelay,
- parentMenu: this,
- subMenuCloseDelay: props.subMenuCloseDelay,
- forceSubMenuRender: props.forceSubMenuRender,
- triggerSubMenuAction: props.triggerSubMenuAction,
- builtinPlacements: props.builtinPlacements,
- defaultActiveFirst: props.store.getState().defaultActiveFirst[(0, _util.getMenuIdFromSubMenuEventKey)(props.eventKey)],
- multiple: props.multiple,
- prefixCls: props.rootPrefixCls,
- manualRef: this.saveMenuInstance,
- itemIcon: (0, _propsUtil.getComponentFromProp)(this, 'itemIcon'),
- expandIcon: (0, _propsUtil.getComponentFromProp)(this, 'expandIcon'),
- children: children
- },
- on: {
- click: this.onSubMenuClick,
- select: select,
- deselect: deselect,
- openChange: openChange
- },
- id: this.internalMenuId
- };
- var baseProps = subPopupMenuProps.props;
- var haveRendered = this.haveRendered;
- this.haveRendered = true;
- this.haveOpened = this.haveOpened || baseProps.visible || baseProps.forceSubMenuRender;
- // never rendered not planning to, don't render
- if (!this.haveOpened) {
- return h('div');
- }
- // don't show transition on first rendering (no animation for opened menu)
- // show appear transition if it's not visible (not sure why)
- // show appear transition if it's not inline mode
- var transitionAppear = haveRendered || !baseProps.visible || !baseProps.mode === 'inline';
- subPopupMenuProps['class'] = ' ' + baseProps.prefixCls + '-sub';
- var animProps = { appear: transitionAppear, css: false };
- var transitionProps = {
- props: animProps,
- on: {}
- };
- if (baseProps.openTransitionName) {
- transitionProps = (0, _getTransitionProps2['default'])(baseProps.openTransitionName, {
- appear: transitionAppear
- });
- } else if ((0, _typeof3['default'])(baseProps.openAnimation) === 'object') {
- animProps = (0, _extends4['default'])({}, animProps, baseProps.openAnimation.props || {});
- if (!transitionAppear) {
- animProps.appear = false;
- }
- } else if (typeof baseProps.openAnimation === 'string') {
- transitionProps = (0, _getTransitionProps2['default'])(baseProps.openAnimation, { appear: transitionAppear });
- }
- if ((0, _typeof3['default'])(baseProps.openAnimation) === 'object' && baseProps.openAnimation.on) {
- transitionProps.on = baseProps.openAnimation.on;
- }
- return h(
- 'transition',
- transitionProps,
- [h(_SubPopupMenu2['default'], (0, _babelHelperVueJsxMergeProps2['default'])([{
- directives: [{
- name: 'show',
- value: props.isOpen
- }]
- }, subPopupMenuProps]))]
- );
- }
- },
- render: function render() {
- var _className, _attrs;
- var h = arguments[0];
- var props = this.$props;
- var rootPrefixCls = this.rootPrefixCls,
- parentMenu = this.parentMenu;
- var isOpen = props.isOpen;
- var prefixCls = this.getPrefixCls();
- var isInlineMode = props.mode === 'inline';
- var className = (_className = {}, (0, _defineProperty3['default'])(_className, prefixCls, true), (0, _defineProperty3['default'])(_className, prefixCls + '-' + props.mode, true), (0, _defineProperty3['default'])(_className, this.getOpenClassName(), isOpen), (0, _defineProperty3['default'])(_className, this.getActiveClassName(), props.active || isOpen && !isInlineMode), (0, _defineProperty3['default'])(_className, this.getDisabledClassName(), props.disabled), (0, _defineProperty3['default'])(_className, this.getSelectedClassName(), this.isChildrenSelected()), _className);
- if (!this.internalMenuId) {
- if (props.eventKey) {
- this.internalMenuId = props.eventKey + '$Menu';
- } else {
- this.internalMenuId = '$__$' + ++guid + '$Menu';
- }
- }
- var mouseEvents = {};
- var titleClickEvents = {};
- var titleMouseEvents = {};
- if (!props.disabled) {
- mouseEvents = {
- mouseleave: this.onMouseLeave,
- mouseenter: this.onMouseEnter
- };
- // only works in title, not outer li
- titleClickEvents = {
- click: this.onTitleClick
- };
- titleMouseEvents = {
- mouseenter: this.onTitleMouseEnter,
- mouseleave: this.onTitleMouseLeave
- };
- }
- var style = {};
- if (isInlineMode) {
- style.paddingLeft = props.inlineIndent * props.level + 'px';
- }
- var ariaOwns = {};
- // only set aria-owns when menu is open
- // otherwise it would be an invalid aria-owns value
- // since corresponding node cannot be found
- if (isOpen) {
- ariaOwns = {
- 'aria-owns': this.internalMenuId
- };
- }
- var titleProps = {
- attrs: (0, _extends4['default'])({
- 'aria-expanded': isOpen
- }, ariaOwns, {
- 'aria-haspopup': 'true',
- title: typeof props.title === 'string' ? props.title : undefined
- }),
- on: (0, _extends4['default'])({}, titleMouseEvents, titleClickEvents),
- style: style,
- 'class': prefixCls + '-title',
- ref: 'subMenuTitle'
- };
- // expand custom icon should NOT be displayed in menu with horizontal mode.
- var icon = null;
- if (props.mode !== 'horizontal') {
- icon = (0, _propsUtil.getComponentFromProp)(this, 'expandIcon', props);
- }
- var title = h(
- 'div',
- titleProps,
- [(0, _propsUtil.getComponentFromProp)(this, 'title'), icon || h('i', { 'class': prefixCls + '-arrow' })]
- );
- var children = this.renderChildren((0, _propsUtil.filterEmpty)(this.$slots['default']));
- var getPopupContainer = this.parentMenu.isRootMenu ? this.parentMenu.getPopupContainer : function (triggerNode) {
- return triggerNode.parentNode;
- };
- var popupPlacement = popupPlacementMap[props.mode];
- var popupAlign = props.popupOffset ? { offset: props.popupOffset } : {};
- var popupClassName = props.mode === 'inline' ? '' : props.popupClassName;
- var liProps = {
- on: (0, _extends4['default'])({}, (0, _omit2['default'])((0, _propsUtil.getListeners)(this), ['click']), mouseEvents),
- 'class': className
- };
- return h(
- 'li',
- (0, _babelHelperVueJsxMergeProps2['default'])([liProps, {
- attrs: { role: 'menuitem' }
- }]),
- [isInlineMode && title, isInlineMode && children, !isInlineMode && h(
- _vcTrigger2['default'],
- {
- attrs: (_attrs = {
- prefixCls: prefixCls,
- popupClassName: prefixCls + '-popup ' + rootPrefixCls + '-' + parentMenu.theme + ' ' + (popupClassName || ''),
- getPopupContainer: getPopupContainer,
- builtinPlacements: _placements2['default']
- }, (0, _defineProperty3['default'])(_attrs, 'builtinPlacements', (0, _extends4['default'])({}, _placements2['default'], props.builtinPlacements)), (0, _defineProperty3['default'])(_attrs, 'popupPlacement', popupPlacement), (0, _defineProperty3['default'])(_attrs, 'popupVisible', isOpen), (0, _defineProperty3['default'])(_attrs, 'popupAlign', popupAlign), (0, _defineProperty3['default'])(_attrs, 'action', props.disabled ? [] : [props.triggerSubMenuAction]), (0, _defineProperty3['default'])(_attrs, 'mouseEnterDelay', props.subMenuOpenDelay), (0, _defineProperty3['default'])(_attrs, 'mouseLeaveDelay', props.subMenuCloseDelay), (0, _defineProperty3['default'])(_attrs, 'forceRender', props.forceSubMenuRender), _attrs),
- on: {
- 'popupVisibleChange': this.onPopupVisibleChange
- }
- },
- [h(
- 'template',
- { slot: 'popup' },
- [children]
- ), title]
- )]
- );
- }
- };
- var connected = (0, _store.connect)(function (_ref, _ref2) {
- var openKeys = _ref.openKeys,
- activeKey = _ref.activeKey,
- selectedKeys = _ref.selectedKeys;
- var eventKey = _ref2.eventKey,
- subMenuKey = _ref2.subMenuKey;
- return {
- isOpen: openKeys.indexOf(eventKey) > -1,
- active: activeKey[subMenuKey] === eventKey,
- selectedKeys: selectedKeys
- };
- })(SubMenu);
- connected.isSubMenu = true;
- exports['default'] = connected;
|