yuang-framework-ui-pc
Version:
yuang-framework-ui-pc Library
205 lines (204 loc) • 7.48 kB
JavaScript
"use strict";
const vue = require("vue");
const elementPlus = require("element-plus");
const icons = require("../../icons");
const core = require("../../utils/core");
const EleTooltip = require("../../ele-tooltip/index");
const props$1 = require("../../ele-tooltip/props");
const DropdownMenus = require("./dropdown-menus");
const props = require("../props");
const _sfc_main = vue.defineComponent({
name: "ProDropdown",
components: { ElButton: elementPlus.ElButton, ElScrollbar: elementPlus.ElScrollbar, EleTooltip, DropdownMenus },
props: {
...props.dropdownProps,
/** 当前选中菜单项 */
selected: Object
},
emits: props.dropdownEmits,
setup(props2, { emit }) {
const tooltipRef = vue.ref(null);
const tooltipProps = vue.computed(() => {
const options = core.pick(props2, props$1.tooltipPropKeys);
options.showAfter = props2.trigger === "hover" ? props2.showTimeout : 0;
options.hideAfter = props2.trigger === "hover" ? props2.hideTimeout : 0;
options.gpuAcceleration = props2.transition === "el-fade-in-linear";
const classes = ["ele-dropdown"];
if (props2.preventContextmenu) {
classes.push("is-prevent-event");
}
if (typeof props2.popperClass === "string" && props2.popperClass) {
classes.push(props2.popperClass);
}
options.popperClass = classes.join(" ");
options.isPopover = true;
return options;
});
const hasSubMenu = vue.computed(
() => !!(props2.items && props2.items.some((d) => {
var _a;
return !!((_a = d.children) == null ? void 0 : _a.length);
}))
);
const hidePopper = () => {
tooltipRef.value && tooltipRef.value.hide();
};
const updatePopper = () => {
tooltipRef.value && tooltipRef.value.updatePopper();
};
const handleUpdateVisible = (visible) => {
emit("update:visible", visible);
emit("visibleChange", visible);
};
const handlePopBeforeEnter = () => {
emit("before-enter");
};
const handlePopBeforeLeave = () => {
emit("before-leave");
};
const handlePopAfterEnter = () => {
emit("after-enter");
};
const handlePopAfterLeave = () => {
emit("after-leave");
};
const handleItemClick = (item) => {
var _a;
if (props2.hideOnClick && !((_a = item.children) == null ? void 0 : _a.length)) {
hidePopper();
}
emit("command", item.command);
};
const handleBtnClick = (e) => {
emit("click", e);
};
const handleOpen = () => {
if (props2.disabled) {
return;
}
tooltipRef.value && tooltipRef.value.handleOpen();
};
const handleClose = () => {
hidePopper();
};
const handleWrapperContext = (e) => {
if (props2.preventContextmenu) {
e.preventDefault();
}
};
return {
ArrowDown: icons.ArrowDown,
tooltipRef,
tooltipProps,
hasSubMenu,
hidePopper,
updatePopper,
handleUpdateVisible,
handlePopBeforeEnter,
handlePopBeforeLeave,
handlePopAfterEnter,
handlePopAfterLeave,
handleItemClick,
handleBtnClick,
handleOpen,
handleClose,
handleWrapperContext
};
}
});
const _export_sfc = (sfc, props2) => {
const target = sfc.__vccOpts || sfc;
for (const [key, val] of props2) {
target[key] = val;
}
return target;
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_ElButton = vue.resolveComponent("ElButton");
const _component_DropdownMenus = vue.resolveComponent("DropdownMenus");
const _component_ElScrollbar = vue.resolveComponent("ElScrollbar");
const _component_EleTooltip = vue.resolveComponent("EleTooltip");
return vue.openBlock(), vue.createBlock(_component_EleTooltip, vue.mergeProps({ tabindex: _ctx.tabindex }, _ctx.tooltipProps, {
ref: "tooltipRef",
"onUpdate:visible": _ctx.handleUpdateVisible,
onBeforeShow: _ctx.handlePopBeforeEnter,
onBeforeHide: _ctx.handlePopBeforeLeave,
onShow: _ctx.handlePopAfterEnter,
onHide: _ctx.handlePopAfterLeave
}), {
body: vue.withCtx(() => [
_ctx.hasSubMenu ? (vue.openBlock(), vue.createElementBlock("div", {
key: 0,
class: "ele-dropdown-wrapper",
onContextmenu: _cache[0] || (_cache[0] = (...args) => _ctx.handleWrapperContext && _ctx.handleWrapperContext(...args))
}, [
_ctx.items && _ctx.items.length ? (vue.openBlock(), vue.createBlock(_component_DropdownMenus, {
key: 0,
role: _ctx.role,
items: _ctx.items,
selected: _ctx.modelValue,
menuStyle: _ctx.menuStyle,
iconProps: _ctx.iconProps,
size: _ctx.size,
onItemClick: _ctx.handleItemClick,
onWrapperContext: _ctx.handleWrapperContext
}, vue.createSlots({ _: 2 }, [
vue.renderList(Object.keys(_ctx.$slots).filter((k) => "default" !== k), (name) => {
return {
name,
fn: vue.withCtx((slotProps) => [
vue.renderSlot(_ctx.$slots, name, vue.normalizeProps(vue.guardReactiveProps(slotProps || {})))
])
};
})
]), 1032, ["role", "items", "selected", "menuStyle", "iconProps", "size", "onItemClick", "onWrapperContext"])) : vue.createCommentVNode("", true)
], 32)) : (vue.openBlock(), vue.createBlock(_component_ElScrollbar, {
key: 1,
maxHeight: _ctx.maxHeight,
class: "ele-dropdown-wrapper",
onContextmenu: _ctx.handleWrapperContext
}, {
default: vue.withCtx(() => [
_ctx.items && _ctx.items.length ? (vue.openBlock(), vue.createBlock(_component_DropdownMenus, {
key: 0,
role: _ctx.role,
items: _ctx.items,
selected: _ctx.modelValue,
menuStyle: _ctx.menuStyle,
iconProps: _ctx.iconProps,
size: _ctx.size,
onItemClick: _ctx.handleItemClick,
onWrapperContext: _ctx.handleWrapperContext
}, vue.createSlots({ _: 2 }, [
vue.renderList(Object.keys(_ctx.$slots).filter((k) => "default" !== k), (name) => {
return {
name,
fn: vue.withCtx((slotProps) => [
vue.renderSlot(_ctx.$slots, name, vue.normalizeProps(vue.guardReactiveProps(slotProps || {})))
])
};
})
]), 1032, ["role", "items", "selected", "menuStyle", "iconProps", "size", "onItemClick", "onWrapperContext"])) : vue.createCommentVNode("", true)
]),
_: 3
}, 8, ["maxHeight", "onContextmenu"]))
]),
default: vue.withCtx(() => [
_ctx.splitButton ? (vue.openBlock(), vue.createBlock(_component_ElButton, vue.mergeProps({
key: 0,
type: _ctx.type,
size: _ctx.size,
disabled: _ctx.disabled,
icon: _ctx.ArrowDown,
class: "ele-dropdown-caret-button"
}, _ctx.caretButtonProps || {}), null, 16, ["type", "size", "disabled", "icon"])) : vue.renderSlot(_ctx.$slots, "default", {
key: 1,
active: _ctx.modelValue,
selected: _ctx.selected
})
]),
_: 3
}, 16, ["tabindex", "onUpdate:visible", "onBeforeShow", "onBeforeHide", "onShow", "onHide"]);
}
const proDropdown = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
module.exports = proDropdown;