ant-design-vue
Version:
An enterprise-class UI design language and Vue-based implementation
137 lines (122 loc) • 5.26 kB
JavaScript
import { isVNode as _isVNode, createVNode as _createVNode } from "vue";
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
import { provide, inject, cloneVNode, defineComponent } from 'vue';
import RcDropdown from '../vc-dropdown/src/index';
import DropdownButton from './dropdown-button';
import PropTypes from '../_util/vue-types';
import { cloneElement } from '../_util/vnode';
import classNames from '../_util/classNames';
import { getOptionProps, getPropsData, getComponent, isValidElement, getSlot } from '../_util/props-util';
import getDropdownProps from './getDropdownProps';
import { defaultConfigProvider } from '../config-provider';
import RightOutlined from '@ant-design/icons-vue/RightOutlined';
function _isSlot(s) {
return typeof s === 'function' || Object.prototype.toString.call(s) === '[object Object]' && !_isVNode(s);
}
var DropdownProps = getDropdownProps();
var Dropdown = defineComponent({
name: 'ADropdown',
inheritAttrs: false,
props: _extends(_extends({}, DropdownProps), {
prefixCls: PropTypes.string,
mouseEnterDelay: PropTypes.number.def(0.15),
mouseLeaveDelay: PropTypes.number.def(0.1),
placement: DropdownProps.placement.def('bottomLeft'),
onVisibleChange: PropTypes.func,
'onUpdate:visible': PropTypes.func
}),
emits: ['visibleChange', 'update:visible'],
setup: function setup() {
return {
configProvider: inject('configProvider', defaultConfigProvider),
popupRef: null
};
},
created: function created() {
provide('savePopupRef', this.savePopupRef);
},
methods: {
savePopupRef: function savePopupRef(ref) {
this.popupRef = ref;
},
getTransitionName: function getTransitionName() {
var _this$$props = this.$props,
_this$$props$placemen = _this$$props.placement,
placement = _this$$props$placemen === void 0 ? '' : _this$$props$placemen,
transitionName = _this$$props.transitionName;
if (transitionName !== undefined) {
return transitionName;
}
if (placement.indexOf('top') >= 0) {
return 'slide-down';
}
return 'slide-up';
},
renderOverlay: function renderOverlay(prefixCls) {
var overlay = getComponent(this, 'overlay');
var overlayNode = Array.isArray(overlay) ? overlay[0] : overlay; // menu cannot be selectable in dropdown defaultly
// menu should be focusable in dropdown defaultly
var overlayProps = overlayNode && getPropsData(overlayNode);
var _ref = overlayProps || {},
_ref$selectable = _ref.selectable,
selectable = _ref$selectable === void 0 ? false : _ref$selectable,
_ref$focusable = _ref.focusable,
focusable = _ref$focusable === void 0 ? true : _ref$focusable;
var expandIcon = _createVNode("span", {
"class": "".concat(prefixCls, "-menu-submenu-arrow")
}, [_createVNode(RightOutlined, {
"class": "".concat(prefixCls, "-menu-submenu-arrow-icon")
}, null)]);
var fixedModeOverlay = isValidElement(overlayNode) ? cloneVNode(overlayNode, {
mode: 'vertical',
selectable: selectable,
focusable: focusable,
expandIcon: expandIcon
}) : overlay;
return fixedModeOverlay;
},
handleVisibleChange: function handleVisibleChange(val) {
this.$emit('update:visible', val);
this.$emit('visibleChange', val);
}
},
render: function render() {
var _a;
var props = getOptionProps(this);
var customizePrefixCls = props.prefixCls,
trigger = props.trigger,
disabled = props.disabled,
getPopupContainer = props.getPopupContainer;
var getContextPopupContainer = this.configProvider.getPopupContainer;
var getPrefixCls = this.configProvider.getPrefixCls;
var prefixCls = getPrefixCls('dropdown', customizePrefixCls);
var child = getSlot(this)[0];
var dropdownTrigger = cloneElement(child, {
class: classNames((_a = child === null || child === void 0 ? void 0 : child.props) === null || _a === void 0 ? void 0 : _a.class, "".concat(prefixCls, "-trigger")),
disabled: disabled
});
var triggerActions = disabled ? [] : trigger;
var alignPoint;
if (triggerActions && triggerActions.indexOf('contextmenu') !== -1) {
alignPoint = true;
}
var dropdownProps = _extends(_extends(_extends({
alignPoint: alignPoint
}, props), this.$attrs), {
prefixCls: prefixCls,
getPopupContainer: getPopupContainer || getContextPopupContainer,
transitionName: this.getTransitionName(),
trigger: triggerActions,
overlay: this.renderOverlay(prefixCls),
onVisibleChange: this.handleVisibleChange
});
return _createVNode(RcDropdown, dropdownProps, _isSlot(dropdownTrigger) ? dropdownTrigger : {
default: function _default() {
return [dropdownTrigger];
}
});
}
});
Dropdown.Button = DropdownButton;
export default Dropdown;
export { DropdownProps };