element-plus
Version:
A Component Library for Vue3.0
206 lines (199 loc) • 6.35 kB
JavaScript
import { ref, computed, watch, defineComponent, toDisplayString, renderSlot, createTextVNode, createCommentVNode, h, Fragment, withDirectives, Teleport } from 'vue';
import ElPopper, { usePopper, renderPopper, Effect, renderArrow, renderTrigger, defaultProps } from '../el-popper';
import { ClickOutside } from '../directives';
import { warn } from '../utils/error';
import { renderIf, PatchFlags } from '../utils/vnode';
import { isString } from '../utils/util';
import PopupManager from '../utils/popup-manager';
import { on } from '../utils/dom';
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
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 __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const SHOW_EVENT = "show";
const HIDE_EVENT = "hide";
function usePopover(props, ctx) {
const zIndex = ref(PopupManager.nextZIndex());
const width = computed(() => {
if (isString(props.width)) {
return props.width;
}
return props.width + "px";
});
const popperStyle = computed(() => {
return {
width: width.value,
zIndex: zIndex.value
};
});
const popperProps = usePopper(props, ctx);
watch(popperProps.visibility, (val) => {
if (val) {
zIndex.value = PopupManager.nextZIndex();
}
ctx.emit(val ? SHOW_EVENT : HIDE_EVENT);
});
return __spreadProps(__spreadValues({}, popperProps), {
popperStyle
});
}
var __defProp$1 = Object.defineProperty;
var __defProps$1 = Object.defineProperties;
var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues$1 = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp$1.call(b, prop))
__defNormalProp$1(a, prop, b[prop]);
if (__getOwnPropSymbols$1)
for (var prop of __getOwnPropSymbols$1(b)) {
if (__propIsEnum$1.call(b, prop))
__defNormalProp$1(a, prop, b[prop]);
}
return a;
};
var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));
const emits = ["update:visible", "after-enter", "after-leave", SHOW_EVENT, HIDE_EVENT];
const NAME = "ElPopover";
const _hoist = { key: 0, class: "el-popover__title", role: "title" };
var script = defineComponent({
name: NAME,
components: {
ElPopper
},
props: __spreadProps$1(__spreadValues$1({}, defaultProps), {
content: {
type: String
},
trigger: {
type: String,
default: "click"
},
title: {
type: String
},
transition: {
type: String,
default: "fade-in-linear"
},
width: {
type: [String, Number],
default: 150
},
appendToBody: {
type: Boolean,
default: true
},
tabindex: [String, Number]
}),
emits,
setup(props, ctx) {
if (process.env.NODE_ENV !== "production" && props.visible && !ctx.slots.reference) {
warn(NAME, `
You cannot init popover without given reference
`);
}
const states = usePopover(props, ctx);
return states;
},
render() {
const { $slots } = this;
const trigger = $slots.reference ? $slots.reference() : null;
const title = renderIf(this.title, "div", _hoist, toDisplayString(this.title), PatchFlags.TEXT);
const content = renderSlot($slots, "default", {}, () => [createTextVNode(toDisplayString(this.content), PatchFlags.TEXT)]);
const {
events,
onAfterEnter,
onAfterLeave,
onPopperMouseEnter,
onPopperMouseLeave,
popperStyle,
popperId,
popperClass,
showArrow,
transition,
visibility,
tabindex
} = this;
const kls = [
this.content ? "el-popover--plain" : "",
"el-popover",
popperClass
].join(" ");
let popover = renderPopper({
effect: Effect.LIGHT,
name: transition,
popperClass: kls,
popperStyle,
popperId,
visibility,
onMouseenter: onPopperMouseEnter,
onMouseleave: onPopperMouseLeave,
onAfterEnter,
onAfterLeave,
stopPopperMouseEvent: false
}, [
title,
content,
renderArrow(showArrow)
]);
const _trigger = trigger ? renderTrigger(trigger, __spreadValues$1({
ariaDescribedby: popperId,
ref: "triggerRef",
tabindex
}, events)) : createCommentVNode("v-if", true);
return h(Fragment, null, [
this.trigger === "click" ? withDirectives(_trigger, [[ClickOutside, this.hide]]) : _trigger,
h(Teleport, {
disabled: !this.appendToBody,
to: "body"
}, [popover])
]);
}
});
script.__file = "packages/popover/src/index.vue";
const attachEvents = (el, binding, vnode) => {
const _ref = binding.arg || binding.value;
const popover = vnode.dirs[0].instance.$refs[_ref];
if (popover) {
popover.triggerRef = el;
el.setAttribute("tabindex", popover.tabindex);
Object.entries(popover.events).forEach(([eventName, e]) => {
on(el, eventName.toLowerCase().slice(2), e);
});
}
};
var PopoverDirective = {
mounted(el, binding, vnode) {
attachEvents(el, binding, vnode);
},
updated(el, binding, vnode) {
attachEvents(el, binding, vnode);
}
};
const VPopover = "popover";
script.install = (app) => {
app.component(script.name, script);
app.directive(VPopover, PopoverDirective);
};
script.directive = PopoverDirective;
const _Popover = script;
export default _Popover;