winbox-ui-next
Version:
We Design Vue 2.0: A Vue.js 3 UI Library
155 lines (154 loc) • 5.05 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var vue = require("vue");
var scrollIntoView = require("scroll-into-view-if-needed");
var index = require("../tooltip/index.js");
var useMenu = require("./hooks/use-menu.js");
var useLevel = require("./hooks/use-level.js");
var omit = require("../_utils/omit.js");
var indent = require("./indent.js");
var useMenuContext = require("./hooks/use-menu-context.js");
var useMenuDataCollector = require("./hooks/use-menu-data-collector.js");
function _interopDefaultLegacy(e) {
return e && typeof e === "object" && "default" in e ? e : { "default": e };
}
var scrollIntoView__default = /* @__PURE__ */ _interopDefaultLegacy(scrollIntoView);
var MenuItem = vue.defineComponent({
name: "MenuItem",
inheritAttrs: false,
props: {
key: {
type: String
},
disabled: {
type: Boolean,
default: false
}
},
emits: ["click"],
setup(props, {
emit
}) {
const {
key
} = useMenu();
const {
level
} = useLevel["default"]();
const menuContext = useMenuContext();
const refItemElement = vue.ref();
const isSelected = vue.computed(() => (menuContext.selectedKeys || []).indexOf(key.value) > -1);
const menuDataCollector = useMenuDataCollector.useMenuDataCollectorContext();
vue.onMounted(() => {
menuDataCollector == null ? void 0 : menuDataCollector.collectMenuItem(key.value);
});
vue.onUnmounted(() => {
menuDataCollector == null ? void 0 : menuDataCollector.removeMenuItem(key.value);
});
function scrollTo() {
if (menuContext.autoScrollIntoView && refItemElement.value && isSelected.value) {
scrollIntoView__default["default"](refItemElement.value, __spreadValues({
behavior: "smooth",
block: "nearest",
scrollMode: "if-needed",
boundary: document.documentElement
}, menuContext.scrollConfig || {}));
}
}
let timer;
vue.onMounted(() => {
timer = setTimeout(() => {
scrollTo();
}, 500);
});
vue.onUnmounted(() => {
clearTimeout(timer);
});
vue.watch([isSelected], () => {
scrollTo();
});
return {
menuContext,
level,
isSelected,
refItemElement,
onClick(e) {
if (props.disabled)
return;
menuContext.onMenuItemClick && menuContext.onMenuItemClick(key.value);
emit("click", e);
}
};
},
render() {
var _a, _b;
const {
level,
menuContext,
disabled,
isSelected,
onClick
} = this;
const {
prefixCls,
collapsed,
inTrigger,
mode,
tooltipProps
} = menuContext;
const needTooltip = collapsed && !inTrigger && level === 1;
const needTextIndent = mode === "vertical" && level > 1;
const children = ((_b = (_a = this.$slots).default) == null ? void 0 : _b.call(_a)) || [];
const showIndent = needTextIndent && !inTrigger && !collapsed;
const iconElement = this.$slots.icon && this.$slots.icon();
const content = [showIndent && vue.createVNode(indent, {
"level": level
}, null), iconElement && vue.createVNode("span", {
"class": `${prefixCls}-icon`
}, [iconElement]), showIndent || iconElement ? vue.createVNode("span", {
"class": [`${prefixCls}-item-inner`, {
[`${prefixCls}-title`]: iconElement
}]
}, [children]) : children].filter(Boolean);
const itemElement = vue.createVNode("div", vue.mergeProps({
"ref": "refItemElement",
"class": [`${prefixCls}-item`, {
[`${prefixCls}-disabled`]: disabled,
[`${prefixCls}-selected`]: isSelected,
[`${prefixCls}-has-icon`]: iconElement
}]
}, this.$attrs, {
"onClick": onClick
}), [content, isSelected && mode === "horizontal" && vue.createVNode("div", {
"class": `${prefixCls}-selected-label`
}, null)]);
if (needTooltip) {
const tooltipClassNames = [`${prefixCls}-item-tooltip`, tooltipProps == null ? void 0 : tooltipProps.class];
return vue.createVNode(index, vue.mergeProps({
"trigger": "hover",
"position": "right",
"class": tooltipClassNames
}, omit.omit(tooltipProps || {}, ["class"])), {
default: () => itemElement,
content: () => children
});
}
return itemElement;
}
});
module.exports = MenuItem;