UNPKG

vue-devui

Version:

DevUI components based on Vite and Vue3

223 lines (222 loc) 6.59 kB
import { reactive, ref, defineComponent, provide, computed, createVNode, inject, onMounted, Transition } from "vue"; const panelProps = { type: { type: String, default: "default" }, cssClass: { type: String, default: "" }, isCollapsed: { type: Boolean, default: false }, beforeToggle: { type: Function, default: null }, showAnimation: { type: Boolean, default: true }, hasLeftPadding: { type: Boolean, default: true } }; const option = reactive({}); class Store { static getByKey(timeStamp) { return option[timeStamp]; } static state() { return option; } static setData(key, value) { option[key] = ref(value); } } var panel = ""; var Panel = defineComponent({ name: "DPanel", props: panelProps, emits: ["toggle"], setup(props, ctx) { provide("beforeToggle", props.beforeToggle); provide("showAnimation", computed(() => props.showAnimation)); provide("hasLeftPadding", computed(() => props.hasLeftPadding)); const isCollapsed = ref(props.isCollapsed); const type = computed(() => props.type); const cssClass = computed(() => props.cssClass); const timeStamp = new Date().getTime().toString() + Math.random(); const onToggle = () => { ctx.emit("toggle", Store.getByKey(`isCollapsed[${timeStamp}]`)); }; Store.setData(`isCollapsed[${timeStamp}]`, isCollapsed.value); return () => { var _a, _b; return createVNode("div", { "onClick": onToggle, "class": `devui-panel devui-panel-${type.value} ${cssClass.value}` }, [(_b = (_a = ctx.slots).default) == null ? void 0 : _b.call(_a)]); }; } }); var PanelHeader = defineComponent({ name: "DPanelHeader", props: panelProps, emits: ["toggle"], setup(props, ctx) { const beforeToggle = inject("beforeToggle"); const keys = Object.keys(Store.state()); const key = keys.pop(); const isCollapsed = ref(Store.state()[key]); const changeFlag = ref(); let header = null; const res = ref(isCollapsed.value); let changeResult = true; const done = () => { res.value = !res.value; if (!changeFlag.value) { if (res.value) { Store.setData(`${key}`, res.value); isCollapsed.value = res.value; ctx.emit("toggle", res.value); } return; } if (res.value !== void 0) { Store.setData(`${key}`, res.value); isCollapsed.value = res.value; ctx.emit("toggle", res.value); } }; const canToggle = async () => { if (beforeToggle) { const tmpRes = beforeToggle(isCollapsed, done); if (typeof tmpRes !== "undefined") { if (tmpRes instanceof Promise) { changeResult = await tmpRes; } else { changeResult = tmpRes; } } else { changeResult = true; } } return changeResult; }; canToggle().then((val) => changeFlag.value = val); const toggleBody = () => { canToggle().then((val) => { changeFlag.value = val; if (!val) { if (!isCollapsed.value) { Store.setData(`${key}`, !isCollapsed.value); isCollapsed.value = !isCollapsed.value; ctx.emit("toggle", isCollapsed.value); } return; } if (isCollapsed.value !== void 0) { Store.setData(`${key}`, !isCollapsed.value); isCollapsed.value = !isCollapsed.value; ctx.emit("toggle", isCollapsed.value); } }); }; return () => { var _a, _b; if (ctx.slots.default) { header = createVNode("div", { "class": "devui-panel-heading", "onClick": toggleBody, "style": { cursor: changeFlag.value ? "pointer" : "auto" } }, [(_b = (_a = ctx.slots).default) == null ? void 0 : _b.call(_a)]); } return header; }; } }); var PanelBody = defineComponent({ name: "DPanelBody", props: panelProps, setup(props, ctx) { const animationName = inject("showAnimation"); const hasLeftPadding = inject("hasLeftPadding"); const keys = Object.keys(Store.state()); const key = keys.pop(); const isCollapsed = Store.state(); const bodyEl = ref(); onMounted(() => { if (bodyEl.value) { const dom = bodyEl.value; if (isCollapsed[key]) { dom.style.height = `${dom.offsetHeight}px`; } } }); const enter = (element) => { const el = element; el.style.height = ""; const height = el.offsetHeight; el.style.height = "0px"; el.offsetHeight; el.style.height = `${height}px`; }; const leave = (element) => { const el = element; el.style.height = "0px"; }; return () => { return createVNode("div", { "class": `devui-panel devui-panel-${props.type} ${props.cssClass}` }, [createVNode(Transition, { "name": animationName.value ? "devui-panel" : "", "onEnter": enter, "onLeave": leave }, { default: () => { var _a, _b; return [isCollapsed[key] === void 0 || isCollapsed[key] ? createVNode("div", { "ref": bodyEl, "class": `devui-panel-body ${isCollapsed[key] !== void 0 ? "devui-panel-body-collapse" : ""} ${!hasLeftPadding.value ? "no-left-padding" : ""}` }, [createVNode("div", { "class": "devui-panel-content" }, [(_b = (_a = ctx.slots).default) == null ? void 0 : _b.call(_a)])]) : null]; } })]); }; } }); var PanelFooter = defineComponent({ name: "DPanelFooter", setup(props, ctx) { return () => { var _a, _b; const footerContent = ctx.slots.default ? createVNode("div", { "class": "devui-panel-footer" }, [(_b = (_a = ctx.slots).default) == null ? void 0 : _b.call(_a)]) : null; return footerContent; }; } }); var index = { title: "Panel \u9762\u677F", category: "\u901A\u7528", status: "100%", deprecated: { value: true, reason: "Panel \u662F\u6298\u53E0\u9762\u677F\u7684\u4E00\u79CD\u7279\u6B8A\u5F62\u6001\uFF0C\u5E94\u8BE5\u4F7F\u7528\u66F4\u901A\u7528\u7684 Collapse \u66FF\u4EE3\u3002" }, install(app) { app.component(Panel.name, Panel); app.component(PanelHeader.name, PanelHeader); app.component(PanelBody.name, PanelBody); app.component(PanelFooter.name, PanelFooter); } }; export { Panel, PanelBody, PanelFooter, PanelHeader, index as default, panelProps };