element-plus
Version:
A Component Library for Vue 3
106 lines (104 loc) • 3.35 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const require_runtime = require('../../../_virtual/_rolldown/runtime.js');
const require_style = require('../../../utils/dom/style.js');
const require_use_global_config = require('../../config-provider/src/hooks/use-global-config.js');
let vue = require("vue");
//#region ../../packages/components/loading/src/loading.ts
function createLoadingComponent(options, appContext) {
let afterLeaveTimer;
const afterLeaveFlag = (0, vue.ref)(false);
const data = (0, vue.reactive)({
...options,
originalPosition: "",
originalOverflow: "",
visible: false
});
function setText(text) {
data.text = text;
}
function destroySelf() {
const target = data.parent;
const ns = vm.ns;
if (!target.vLoadingAddClassList) {
let loadingNumber = target.getAttribute("loading-number");
loadingNumber = Number.parseInt(loadingNumber) - 1;
if (!loadingNumber) {
require_style.removeClass(target, ns.bm("parent", "relative"));
target.removeAttribute("loading-number");
} else target.setAttribute("loading-number", loadingNumber.toString());
require_style.removeClass(target, ns.bm("parent", "hidden"));
}
removeElLoadingChild();
loadingInstance.unmount();
}
function removeElLoadingChild() {
vm.$el?.parentNode?.removeChild(vm.$el);
}
function close() {
if (options.beforeClose && !options.beforeClose()) return;
afterLeaveFlag.value = true;
clearTimeout(afterLeaveTimer);
afterLeaveTimer = setTimeout(handleAfterLeave, 400);
data.visible = false;
options.closed?.();
}
function handleAfterLeave() {
if (!afterLeaveFlag.value) return;
const target = data.parent;
afterLeaveFlag.value = false;
target.vLoadingAddClassList = void 0;
destroySelf();
}
const loadingInstance = (0, vue.createApp)((0, vue.defineComponent)({
name: "ElLoading",
setup(_, { expose }) {
const { ns, zIndex } = require_use_global_config.useGlobalComponentSettings("loading");
expose({
ns,
zIndex
});
return () => {
const svg = data.spinner || data.svg;
const spinner = (0, vue.h)("svg", {
class: "circular",
viewBox: data.svgViewBox ? data.svgViewBox : "0 0 50 50",
...svg ? { innerHTML: svg } : {}
}, [(0, vue.h)("circle", {
class: "path",
cx: "25",
cy: "25",
r: "20",
fill: "none"
})]);
const spinnerText = data.text ? (0, vue.h)("p", { class: ns.b("text") }, [data.text]) : void 0;
return (0, vue.h)(vue.Transition, {
name: ns.b("fade"),
onAfterLeave: handleAfterLeave
}, { default: (0, vue.withCtx)(() => [(0, vue.withDirectives)((0, vue.createVNode)("div", {
style: { backgroundColor: data.background || "" },
class: [
ns.b("mask"),
data.customClass,
ns.is("fullscreen", data.fullscreen)
]
}, [(0, vue.h)("div", { class: ns.b("spinner") }, [spinner, spinnerText])]), [[vue.vShow, data.visible]])]) });
};
}
}));
Object.assign(loadingInstance._context, appContext ?? {});
const vm = loadingInstance.mount(document.createElement("div"));
return {
...(0, vue.toRefs)(data),
setText,
removeElLoadingChild,
close,
handleAfterLeave,
vm,
get $el() {
return vm.$el;
}
};
}
//#endregion
exports.createLoadingComponent = createLoadingComponent;
//# sourceMappingURL=loading.js.map