yuang-framework-ui-pc
Version:
yuang-framework-ui-pc Library
206 lines (205 loc) • 7.44 kB
JavaScript
import { defineComponent, ref, computed, resolveComponent, openBlock, createBlock, mergeProps, withCtx, createElementBlock, createSlots, renderList, renderSlot, normalizeProps, guardReactiveProps, createCommentVNode } from "vue";
import { ElButton, ElScrollbar } from "element-plus";
import { ArrowDown } from "../../icons";
import { pick } from "../../utils/core";
import EleTooltip from "../../ele-tooltip/index";
import { tooltipPropKeys } from "../../ele-tooltip/props";
import DropdownMenus from "./dropdown-menus";
import { dropdownProps, dropdownEmits } from "../props";
const _sfc_main = defineComponent({
name: "ProDropdown",
components: { ElButton, ElScrollbar, EleTooltip, DropdownMenus },
props: {
...dropdownProps,
/** 当前选中菜单项 */
selected: Object
},
emits: dropdownEmits,
setup(props, { emit }) {
const tooltipRef = ref(null);
const tooltipProps = computed(() => {
const options = pick(props, tooltipPropKeys);
options.showAfter = props.trigger === "hover" ? props.showTimeout : 0;
options.hideAfter = props.trigger === "hover" ? props.hideTimeout : 0;
options.gpuAcceleration = props.transition === "el-fade-in-linear";
const classes = ["ele-dropdown"];
if (props.preventContextmenu) {
classes.push("is-prevent-event");
}
if (typeof props.popperClass === "string" && props.popperClass) {
classes.push(props.popperClass);
}
options.popperClass = classes.join(" ");
options.isPopover = true;
return options;
});
const hasSubMenu = computed(
() => !!(props.items && props.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 (props.hideOnClick && !((_a = item.children) == null ? void 0 : _a.length)) {
hidePopper();
}
emit("command", item.command);
};
const handleBtnClick = (e) => {
emit("click", e);
};
const handleOpen = () => {
if (props.disabled) {
return;
}
tooltipRef.value && tooltipRef.value.handleOpen();
};
const handleClose = () => {
hidePopper();
};
const handleWrapperContext = (e) => {
if (props.preventContextmenu) {
e.preventDefault();
}
};
return {
ArrowDown,
tooltipRef,
tooltipProps,
hasSubMenu,
hidePopper,
updatePopper,
handleUpdateVisible,
handlePopBeforeEnter,
handlePopBeforeLeave,
handlePopAfterEnter,
handlePopAfterLeave,
handleItemClick,
handleBtnClick,
handleOpen,
handleClose,
handleWrapperContext
};
}
});
const _export_sfc = (sfc, props) => {
const target = sfc.__vccOpts || sfc;
for (const [key, val] of props) {
target[key] = val;
}
return target;
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_ElButton = resolveComponent("ElButton");
const _component_DropdownMenus = resolveComponent("DropdownMenus");
const _component_ElScrollbar = resolveComponent("ElScrollbar");
const _component_EleTooltip = resolveComponent("EleTooltip");
return openBlock(), createBlock(_component_EleTooltip, 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: withCtx(() => [
_ctx.hasSubMenu ? (openBlock(), createElementBlock("div", {
key: 0,
class: "ele-dropdown-wrapper",
onContextmenu: _cache[0] || (_cache[0] = (...args) => _ctx.handleWrapperContext && _ctx.handleWrapperContext(...args))
}, [
_ctx.items && _ctx.items.length ? (openBlock(), 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
}, createSlots({ _: 2 }, [
renderList(Object.keys(_ctx.$slots).filter((k) => "default" !== k), (name) => {
return {
name,
fn: withCtx((slotProps) => [
renderSlot(_ctx.$slots, name, normalizeProps(guardReactiveProps(slotProps || {})))
])
};
})
]), 1032, ["role", "items", "selected", "menuStyle", "iconProps", "size", "onItemClick", "onWrapperContext"])) : createCommentVNode("", true)
], 32)) : (openBlock(), createBlock(_component_ElScrollbar, {
key: 1,
maxHeight: _ctx.maxHeight,
class: "ele-dropdown-wrapper",
onContextmenu: _ctx.handleWrapperContext
}, {
default: withCtx(() => [
_ctx.items && _ctx.items.length ? (openBlock(), 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
}, createSlots({ _: 2 }, [
renderList(Object.keys(_ctx.$slots).filter((k) => "default" !== k), (name) => {
return {
name,
fn: withCtx((slotProps) => [
renderSlot(_ctx.$slots, name, normalizeProps(guardReactiveProps(slotProps || {})))
])
};
})
]), 1032, ["role", "items", "selected", "menuStyle", "iconProps", "size", "onItemClick", "onWrapperContext"])) : createCommentVNode("", true)
]),
_: 3
}, 8, ["maxHeight", "onContextmenu"]))
]),
default: withCtx(() => [
_ctx.splitButton ? (openBlock(), createBlock(_component_ElButton, 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"])) : 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]]);
export {
proDropdown as default
};