element-plus
Version:
A Component Library for Vue3.0
603 lines (591 loc) • 20.3 kB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true });
var vue = require('vue');
var ElButton = require('../el-button');
var ElInput = require('../el-input');
var locale = require('../locale');
var overlay = require('../el-overlay');
var hooks = require('../hooks');
var directives = require('../directives');
var PopupManager = require('../utils/popup-manager');
var dom = require('../utils/dom');
var aria = require('../utils/aria');
var validators = require('../utils/validators');
var isServer = require('../utils/isServer');
var util = require('../utils/util');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var ElButton__default = /*#__PURE__*/_interopDefaultLegacy(ElButton);
var ElInput__default = /*#__PURE__*/_interopDefaultLegacy(ElInput);
var PopupManager__default = /*#__PURE__*/_interopDefaultLegacy(PopupManager);
var isServer__default = /*#__PURE__*/_interopDefaultLegacy(isServer);
/**
* Make a map and return a function for checking if a key
* is in that map.
* IMPORTANT: all calls of this function must be prefixed with
* \/\*#\_\_PURE\_\_\*\/
* So that rollup can tree-shake them if necessary.
*/
const EMPTY_OBJ = (process.env.NODE_ENV !== 'production')
? Object.freeze({})
: {};
const EMPTY_ARR = (process.env.NODE_ENV !== 'production') ? Object.freeze([]) : [];
const hasOwnProperty = Object.prototype.hasOwnProperty;
const hasOwn = (val, key) => hasOwnProperty.call(val, key);
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));
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
const TypeMap = {
success: "success",
info: "info",
warning: "warning",
error: "error"
};
var script = vue.defineComponent({
name: "ElMessageBox",
directives: {
TrapFocus: directives.TrapFocus
},
components: {
ElButton: ElButton__default['default'],
ElInput: ElInput__default['default'],
ElOverlay: overlay.Overlay
},
inheritAttrs: false,
props: {
buttonSize: {
type: String,
validator: validators.isValidComponentSize
},
modal: {
type: Boolean,
default: true
},
lockScroll: {
type: Boolean,
default: true
},
showClose: {
type: Boolean,
default: true
},
closeOnClickModal: {
type: Boolean,
default: true
},
closeOnPressEscape: {
type: Boolean,
default: true
},
closeOnHashChange: {
type: Boolean,
default: true
},
center: Boolean,
roundButton: {
default: false,
type: Boolean
},
container: {
type: String,
default: "body"
},
boxType: {
type: String,
default: ""
}
},
emits: ["vanish", "action"],
setup(props, { emit }) {
const visible = vue.ref(false);
const state = vue.reactive({
beforeClose: null,
callback: null,
cancelButtonText: "",
cancelButtonClass: "",
confirmButtonText: "",
confirmButtonClass: "",
customClass: "",
dangerouslyUseHTMLString: false,
distinguishCancelAndClose: false,
iconClass: "",
inputPattern: null,
inputPlaceholder: "",
inputType: "text",
inputValue: null,
inputValidator: null,
inputErrorMessage: "",
message: null,
modalFade: true,
modalClass: "",
showCancelButton: false,
showConfirmButton: true,
type: "",
title: void 0,
showInput: false,
action: "",
confirmButtonLoading: false,
cancelButtonLoading: false,
confirmButtonDisabled: false,
editorErrorMessage: "",
validateError: false,
zIndex: PopupManager__default['default'].nextZIndex()
});
const icon = vue.computed(() => state.iconClass || (state.type && TypeMap[state.type] ? `el-icon-${TypeMap[state.type]}` : ""));
const hasMessage = vue.computed(() => !!state.message);
const inputRef = vue.ref(null);
const confirmRef = vue.ref(null);
const confirmButtonClasses = vue.computed(() => `el-button--primary ${state.confirmButtonClass}`);
vue.watch(() => state.inputValue, (val) => __async(this, null, function* () {
yield vue.nextTick();
if (props.boxType === "prompt" && val !== null) {
validate();
}
}), { immediate: true });
vue.watch(() => visible.value, (val) => {
if (val) {
if (props.boxType === "alert" || props.boxType === "confirm") {
vue.nextTick().then(() => {
var _a, _b, _c;
(_c = (_b = (_a = confirmRef.value) == null ? void 0 : _a.$el) == null ? void 0 : _b.focus) == null ? void 0 : _c.call(_b);
});
}
state.zIndex = PopupManager__default['default'].nextZIndex();
}
if (props.boxType !== "prompt")
return;
if (val) {
vue.nextTick().then(() => {
if (inputRef.value && inputRef.value.$el) {
getInputElement().focus();
}
});
} else {
state.editorErrorMessage = "";
state.validateError = false;
}
});
vue.onMounted(() => __async(this, null, function* () {
yield vue.nextTick();
if (props.closeOnHashChange) {
dom.on(window, "hashchange", doClose);
}
}));
vue.onBeforeUnmount(() => {
if (props.closeOnHashChange) {
dom.off(window, "hashchange", doClose);
}
});
function doClose() {
if (!visible.value)
return;
visible.value = false;
vue.nextTick(() => {
if (state.action)
emit("action", state.action);
});
}
const handleWrapperClick = () => {
if (props.closeOnClickModal) {
handleAction(state.distinguishCancelAndClose ? "close" : "cancel");
}
};
const handleInputEnter = () => {
if (state.inputType !== "textarea") {
return handleAction("confirm");
}
};
const handleAction = (action) => {
var _a;
if (props.boxType === "prompt" && action === "confirm" && !validate()) {
return;
}
state.action = action;
if (state.beforeClose) {
(_a = state.beforeClose) == null ? void 0 : _a.call(state, action, state, doClose);
} else {
doClose();
}
};
const validate = () => {
if (props.boxType === "prompt") {
const inputPattern = state.inputPattern;
if (inputPattern && !inputPattern.test(state.inputValue || "")) {
state.editorErrorMessage = state.inputErrorMessage || locale.t("el.messagebox.error");
state.validateError = true;
return false;
}
const inputValidator = state.inputValidator;
if (typeof inputValidator === "function") {
const validateResult = inputValidator(state.inputValue);
if (validateResult === false) {
state.editorErrorMessage = state.inputErrorMessage || locale.t("el.messagebox.error");
state.validateError = true;
return false;
}
if (typeof validateResult === "string") {
state.editorErrorMessage = validateResult;
state.validateError = true;
return false;
}
}
}
state.editorErrorMessage = "";
state.validateError = false;
return true;
};
const getInputElement = () => {
const inputRefs = inputRef.value.$refs;
return inputRefs.input || inputRefs.textarea;
};
const handleClose = () => {
handleAction("close");
};
if (props.closeOnPressEscape) {
hooks.useModal({
handleClose
}, visible);
} else {
hooks.usePreventGlobal(visible, "keydown", (e) => e.code === aria.EVENT_CODE.esc);
}
if (props.lockScroll) {
hooks.useLockScreen(visible);
}
hooks.useRestoreActive(visible);
return __spreadProps(__spreadValues({}, vue.toRefs(state)), {
visible,
hasMessage,
icon,
confirmButtonClasses,
inputRef,
confirmRef,
doClose,
handleClose,
handleWrapperClick,
handleInputEnter,
handleAction,
t: locale.t
});
}
});
const _hoisted_1 = {
key: 0,
class: "el-message-box__header"
};
const _hoisted_2 = { class: "el-message-box__title" };
const _hoisted_3 = /* @__PURE__ */ vue.createVNode("i", { class: "el-message-box__close el-icon-close" }, null, -1);
const _hoisted_4 = { class: "el-message-box__content" };
const _hoisted_5 = { class: "el-message-box__container" };
const _hoisted_6 = {
key: 1,
class: "el-message-box__message"
};
const _hoisted_7 = { key: 0 };
const _hoisted_8 = { class: "el-message-box__input" };
const _hoisted_9 = { class: "el-message-box__btns" };
function render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_el_input = vue.resolveComponent("el-input");
const _component_el_button = vue.resolveComponent("el-button");
const _component_el_overlay = vue.resolveComponent("el-overlay");
const _directive_trap_focus = vue.resolveDirective("trap-focus");
return vue.openBlock(), vue.createBlock(vue.Transition, {
name: "fade-in-linear",
onAfterLeave: _cache[8] || (_cache[8] = ($event) => _ctx.$emit("vanish"))
}, {
default: vue.withCtx(() => [
vue.withDirectives(vue.createVNode(_component_el_overlay, {
"z-index": _ctx.zIndex,
"overlay-class": ["is-message-box", _ctx.modalClass],
mask: _ctx.modal,
onClick: vue.withModifiers(_ctx.handleWrapperClick, ["self"])
}, {
default: vue.withCtx(() => [
vue.withDirectives(vue.createVNode("div", {
ref: "root",
"aria-label": _ctx.title || "dialog",
"aria-modal": "true",
class: [
"el-message-box",
_ctx.customClass,
{ "el-message-box--center": _ctx.center }
]
}, [
_ctx.title !== null && _ctx.title !== void 0 ? (vue.openBlock(), vue.createBlock("div", _hoisted_1, [
vue.createVNode("div", _hoisted_2, [
_ctx.icon && _ctx.center ? (vue.openBlock(), vue.createBlock("div", {
key: 0,
class: ["el-message-box__status", _ctx.icon]
}, null, 2)) : vue.createCommentVNode("v-if", true),
vue.createVNode("span", null, vue.toDisplayString(_ctx.title), 1)
]),
_ctx.showClose ? (vue.openBlock(), vue.createBlock("button", {
key: 0,
type: "button",
class: "el-message-box__headerbtn",
"aria-label": "Close",
onClick: _cache[1] || (_cache[1] = ($event) => _ctx.handleAction(_ctx.distinguishCancelAndClose ? "close" : "cancel")),
onKeydown: _cache[2] || (_cache[2] = vue.withKeys(vue.withModifiers(($event) => _ctx.handleAction(_ctx.distinguishCancelAndClose ? "close" : "cancel"), ["prevent"]), ["enter"]))
}, [
_hoisted_3
], 32)) : vue.createCommentVNode("v-if", true)
])) : vue.createCommentVNode("v-if", true),
vue.createVNode("div", _hoisted_4, [
vue.createVNode("div", _hoisted_5, [
_ctx.icon && !_ctx.center && _ctx.hasMessage ? (vue.openBlock(), vue.createBlock("div", {
key: 0,
class: ["el-message-box__status", _ctx.icon]
}, null, 2)) : vue.createCommentVNode("v-if", true),
_ctx.hasMessage ? (vue.openBlock(), vue.createBlock("div", _hoisted_6, [
vue.renderSlot(_ctx.$slots, "default", {}, () => [
!_ctx.dangerouslyUseHTMLString ? (vue.openBlock(), vue.createBlock("p", _hoisted_7, vue.toDisplayString(_ctx.message), 1)) : (vue.openBlock(), vue.createBlock("p", {
key: 1,
innerHTML: _ctx.message
}, null, 8, ["innerHTML"]))
])
])) : vue.createCommentVNode("v-if", true)
]),
vue.withDirectives(vue.createVNode("div", _hoisted_8, [
vue.createVNode(_component_el_input, {
ref: "inputRef",
modelValue: _ctx.inputValue,
"onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.inputValue = $event),
type: _ctx.inputType,
placeholder: _ctx.inputPlaceholder,
class: { invalid: _ctx.validateError },
onKeydown: vue.withKeys(vue.withModifiers(_ctx.handleInputEnter, ["prevent"]), ["enter"])
}, null, 8, ["modelValue", "type", "placeholder", "class", "onKeydown"]),
vue.createVNode("div", {
class: "el-message-box__errormsg",
style: {
visibility: !!_ctx.editorErrorMessage ? "visible" : "hidden"
}
}, vue.toDisplayString(_ctx.editorErrorMessage), 5)
], 512), [
[vue.vShow, _ctx.showInput]
])
]),
vue.createVNode("div", _hoisted_9, [
_ctx.showCancelButton ? (vue.openBlock(), vue.createBlock(_component_el_button, {
key: 0,
loading: _ctx.cancelButtonLoading,
class: [_ctx.cancelButtonClass],
round: _ctx.roundButton,
size: _ctx.buttonSize || "small",
onClick: _cache[4] || (_cache[4] = ($event) => _ctx.handleAction("cancel")),
onKeydown: _cache[5] || (_cache[5] = vue.withKeys(vue.withModifiers(($event) => _ctx.handleAction("cancel"), ["prevent"]), ["enter"]))
}, {
default: vue.withCtx(() => [
vue.createTextVNode(vue.toDisplayString(_ctx.cancelButtonText || _ctx.t("el.messagebox.cancel")), 1)
]),
_: 1
}, 8, ["loading", "class", "round", "size"])) : vue.createCommentVNode("v-if", true),
vue.withDirectives(vue.createVNode(_component_el_button, {
ref: "confirmRef",
loading: _ctx.confirmButtonLoading,
class: [_ctx.confirmButtonClasses],
round: _ctx.roundButton,
disabled: _ctx.confirmButtonDisabled,
size: _ctx.buttonSize || "small",
onClick: _cache[6] || (_cache[6] = ($event) => _ctx.handleAction("confirm")),
onKeydown: _cache[7] || (_cache[7] = vue.withKeys(vue.withModifiers(($event) => _ctx.handleAction("confirm"), ["prevent"]), ["enter"]))
}, {
default: vue.withCtx(() => [
vue.createTextVNode(vue.toDisplayString(_ctx.confirmButtonText || _ctx.t("el.messagebox.confirm")), 1)
]),
_: 1
}, 8, ["loading", "class", "round", "disabled", "size"]), [
[vue.vShow, _ctx.showConfirmButton]
])
])
], 10, ["aria-label"]), [
[_directive_trap_focus]
])
]),
_: 3
}, 8, ["z-index", "overlay-class", "mask", "onClick"]), [
[vue.vShow, _ctx.visible]
])
]),
_: 1
});
}
script.render = render;
script.__file = "packages/message-box/src/index.vue";
const messageInstance = new Map();
const initInstance = (props, container) => {
const vnode = vue.h(script, props);
vue.render(vnode, container);
document.body.appendChild(container.firstElementChild);
return vnode.component;
};
const genContainer = () => {
return document.createElement("div");
};
const showMessage = (options) => {
const container = genContainer();
options.onVanish = () => {
vue.render(null, container);
messageInstance.delete(vm);
};
options.onAction = (action) => {
const currentMsg = messageInstance.get(vm);
let resolve;
if (options.showInput) {
resolve = { value: vm.inputValue, action };
} else {
resolve = action;
}
if (options.callback) {
options.callback(resolve, instance.proxy);
} else {
if (action === "cancel" || action === "close") {
if (options.distinguishCancelAndClose && action !== "cancel") {
currentMsg.reject("close");
} else {
currentMsg.reject("cancel");
}
} else {
currentMsg.resolve(resolve);
}
}
};
const instance = initInstance(options, container);
const vm = instance.proxy;
for (const prop in options) {
if (hasOwn(options, prop) && !hasOwn(vm.$props, prop)) {
vm[prop] = options[prop];
}
}
vue.watch(() => vm.message, (newVal, oldVal) => {
if (util.isVNode(newVal)) {
instance.slots.default = () => [newVal];
} else if (util.isVNode(oldVal) && !util.isVNode(newVal)) {
delete instance.slots.default;
}
}, {
immediate: true
});
vm.visible = true;
return vm;
};
function MessageBox(options) {
if (isServer__default['default'])
return;
let callback;
if (util.isString(options) || util.isVNode(options)) {
options = {
message: options
};
} else {
callback = options.callback;
}
return new Promise((resolve, reject) => {
const vm = showMessage(options);
messageInstance.set(vm, {
options,
callback,
resolve,
reject
});
});
}
MessageBox.alert = (message, title, options) => {
if (typeof title === "object") {
options = title;
title = "";
} else if (title === void 0) {
title = "";
}
return MessageBox(Object.assign({
title,
message,
type: "",
closeOnPressEscape: false,
closeOnClickModal: false
}, options, {
boxType: "alert"
}));
};
MessageBox.confirm = (message, title, options) => {
if (typeof title === "object") {
options = title;
title = "";
} else if (title === void 0) {
title = "";
}
return MessageBox(Object.assign({
title,
message,
type: "",
showCancelButton: true
}, options, {
boxType: "confirm"
}));
};
MessageBox.prompt = (message, title, options) => {
if (typeof title === "object") {
options = title;
title = "";
} else if (title === void 0) {
title = "";
}
return MessageBox(Object.assign({
title,
message,
showCancelButton: true,
showInput: true,
type: ""
}, options, {
boxType: "prompt"
}));
};
MessageBox.close = () => {
messageInstance.forEach((_, vm) => {
vm.doClose();
});
messageInstance.clear();
};
const _MessageBox = MessageBox;
_MessageBox.install = (app) => {
app.config.globalProperties.$msgbox = _MessageBox;
app.config.globalProperties.$messageBox = _MessageBox;
app.config.globalProperties.$alert = _MessageBox.alert;
app.config.globalProperties.$confirm = _MessageBox.confirm;
app.config.globalProperties.$prompt = _MessageBox.prompt;
};
exports.default = _MessageBox;
;