UNPKG

@zhsz/cool-design-crud

Version:

409 lines (408 loc) 12.2 kB
"use strict"; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } }); const vue = require("vue"); const tdesignVueNext = require("tdesign-vue-next"); const tdesignIconsVueNext = require("tdesign-icons-vue-next"); const coolDesign = require("@zhsz/cool-design"); const index = require("../../utils/index.js"); const vnode = require("../../utils/vnode.js"); require("../../utils/test.js"); const core = require("../../hooks/core.js"); require("@formily/core"); const lodashEs = require("lodash-es"); require("../../hooks/table.js"); const XEUtils = require("xe-utils"); const ClDialog = /* @__PURE__ */ vue.defineComponent({ name: "cl-dialog", components: { TDialog: tdesignVueNext.Dialog, CloseIcon: tdesignIconsVueNext.CloseIcon, FullscreenIcon: tdesignIconsVueNext.FullscreenIcon, FullscreenExitIcon: tdesignIconsVueNext.FullscreenExitIcon, ChevronLeftIcon: tdesignIconsVueNext.ChevronLeftIcon, TdButton: tdesignVueNext.Button, Space: tdesignVueNext.Space, Divider: tdesignVueNext.Divider, Scrollbar: coolDesign.Scrollbar, Transition: vue.Transition }, props: { /** 表格水印 优先级高于全局设置 */ watermarkText: String, /** 表格水印props,会覆盖watermarkText */ watermarkProps: { type: Object }, watermarkDic: { type: Object }, dialogProps: { type: Object }, // 是否可见 modelValue: { type: Boolean, default: false }, props: Object, // 自定义样式名 customClass: String, // 标题 title: { type: String, default: "-" }, // 高度 height: { type: String, default: null }, // 宽度 width: { type: String, default: "50%" }, placement: { type: String, default: "center" }, attach: { type: String, default: "body" }, // 是否缓存 keepAlive: Boolean, // 是否全屏 fullscreen: Boolean, // 点击蒙层时是否触发关闭事件 closeOnOverlayClick: { type: Boolean, default: false }, // 按下 ESC 时是否触发对话框关闭事件 closeOnEscKeydown: { type: Boolean, default: false }, // 控制按钮 controls: { type: Array, default: () => ["fullscreen", "close"] }, showBox: { type: Boolean, default: false }, pageLayoutId: { type: String }, // 关闭前 beforeClose: Function, // 按钮组 footer: [Function, Boolean], // 页面级样式 pageStyle: { type: [Object, String], default: () => ({}) }, pageClass: { type: String, default: "" } }, emits: ["update:modelValue", "fullscreen-change", "closed"], setup(props, { emit, expose, slots }) { const { browser, showWatermark, watermark, dict } = core.useTools(); const Dialog = vue.ref(); const fullscreen = vue.ref(false); const visible = vue.ref(false); const cacheKey = vue.ref(0); const isFullscreen = vue.computed(() => { return browser && browser.isMini ? true : fullscreen.value; }); const isMounted = vue.ref(false); vue.onMounted(async () => { await vue.nextTick(); if (props.showBox) { if (props.pageLayoutId && document.getElementById(props.pageLayoutId)) { isMounted.value = true; } else { console.error("不存在渲染父节点"); } } }); vue.watch(() => props.showBox, (bol) => { if (bol) { if (props.pageLayoutId && document.getElementById(props.pageLayoutId)) { isMounted.value = true; } else { console.error("不存在渲染父节点"); } } }); vue.watch(() => props.modelValue, (val) => { visible.value = val; if (val && !props.keepAlive) { cacheKey.value += 1; } }, { immediate: true }); vue.watch(() => props.fullscreen, (val) => { fullscreen.value = val; }, { immediate: true }); vue.watch(fullscreen, (val) => { emit("fullscreen-change", val); }); vue.provide("dialog", { visible, fullscreen: isFullscreen }); function open() { fullscreen.value = true; } function close() { function done() { onClose(); } if (props.beforeClose) { props.beforeClose(done); } else { done(); } } function onClose() { emit("update:modelValue", false); emit("closed"); } function changeFullscreen(val) { fullscreen.value = index.isBoolean(val) ? Boolean(val) : !fullscreen.value; } function dblClickFullscreen() { if (index.isArray(props.controls) && props.controls.includes("fullscreen")) { changeFullscreen(); } } function renderHeader() { return vue.createVNode("div", { "class": "cl-dialog__header", "onDblclick": dblClickFullscreen }, [vue.createVNode("span", { "class": "cl-dialog__title" }, [props.title]), vue.createVNode("div", { "class": "cl-dialog__controls" }, [props.controls.map((e) => { switch (e) { case "fullscreen": if (browser.screen === "xs") { return null; } if (isFullscreen.value) { return vue.createVNode("div", { "class": "minimize" }, [vue.createVNode(tdesignIconsVueNext.FullscreenExitIcon, { "size": "20px", "onClick": () => { changeFullscreen(false); } }, null)]); } else { return vue.createVNode("div", { "class": "maximize" }, [vue.createVNode(tdesignIconsVueNext.FullscreenIcon, { "size": "20px", "onClick": () => { changeFullscreen(true); } }, null)]); } case "close": return vue.createVNode("div", { "class": "close" }, [vue.createVNode(tdesignIconsVueNext.CloseIcon, { "size": "25px", "onClick": close }, null)]); default: return vnode.renderNode(e, { slots }); } })])]); } const watermarkProps = vue.computed(() => { var _a, _b, _c, _d, _e, _f; if (props.watermarkProps) if (props.watermarkProps.watermarkContent) { return props.watermarkProps; } else { return { ...props.watermarkProps, watermarkContent: props.watermarkText }; } if (showWatermark) { if (props.watermarkDic) { return { ...watermark, watermarkContent: { text: ((_a = props.watermarkDic) == null ? void 0 : _a.prefix) ?? "" + ((_b = props.watermarkDic) == null ? void 0 : _b.level) + ((_c = props.watermarkDic) == null ? void 0 : _c.detail) } }; } if (dict.watermark) { return { ...watermark, watermarkContent: { text: ((_d = dict.watermark) == null ? void 0 : _d.prefix) ?? "" + ((_e = dict.watermark) == null ? void 0 : _e.level) + ((_f = dict.watermark) == null ? void 0 : _f.detail) } }; } return { ...watermark, watermarkContent: { text: "" } }; } else { return { ...watermark, watermarkContent: { text: "" } }; } }); expose({ Dialog, visible, isFullscreen, open, close, changeFullscreen }); const box = vue.createVNode(vue.Teleport, { "to": ["#", props.pageLayoutId].join("") }, { default: () => [vue.createVNode(vue.Transition, { "name": "slide-fade" }, { default: () => [visible.value ? vue.createVNode("div", { "ref": "popupContainer", "class": "cl-popup-container" }, [vue.createVNode(tdesignVueNext.Watermark, watermarkProps.value, { default: () => [vue.createVNode("div", { "class": "cl-popup-body" }, [vue.createVNode("div", { "class": "cl-popup-header" }, [vue.createVNode("div", { "style": { display: "flex", paddingLeft: "24px", alignItems: "center" } }, [vue.createVNode("div", null, [vue.createVNode(tdesignVueNext.Button, { "variant": "text", "onClick": close, "style": "padding:0" }, { default: () => [vue.createVNode("div", { "style": "display:flex;align-items:center;" }, [vue.createVNode(tdesignIconsVueNext.ChevronLeftIcon, { "size": "18px" }, null), vue.createTextVNode("返回")])] })]), vue.createVNode(tdesignVueNext.Divider, { "layout": "vertical" }, null), vue.createVNode("div", { "style": { fontSize: "14px", color: "#86909c" } }, [props.title])]), vue.createVNode("div", { "style": { paddingRight: "20px" } }, [vue.createVNode(tdesignVueNext.Space, null, { default: () => { var _a; return [(_a = slots.footer) == null ? void 0 : _a.call(slots)]; } })])]), vue.createVNode(coolDesign.Scrollbar, null, { default: () => { var _a; return [vue.createVNode("div", { "class": props.pageClass, "style": XEUtils.isString(props.pageStyle) ? `pading: 50px 100px;flex: 1 1 0%;overflow:auto;${props.pageStyle}` : { padding: "50px 100px", flex: "1 1 0%", overflow: "auto", ...props.pageStyle } }, [(_a = slots.default) == null ? void 0 : _a.call(slots)])]; } })])] })]) : ""] })] }); const dialog = () => vue.createVNode(coolDesign.Scrollbar, { "height": props.height }, { default: () => [vue.createVNode("div", { "class": "cl-dialog__container", "key": cacheKey.value }, [vue.createVNode(tdesignVueNext.Watermark, watermarkProps.value, { default: () => { var _a; return [(_a = slots.default) == null ? void 0 : _a.call(slots)]; } })])] }); return () => { if (isMounted.value && props.showBox) { return box; } else { return vue.createVNode(tdesignVueNext.Dialog, vue.mergeProps({ "ref": Dialog }, lodashEs.omit(lodashEs.pickBy(props.dialogProps, (value) => value !== void 0), ["header", "footer", "body", "visible", "onClose", "attach", "mode", "closeOnOverlayClick", "placement", "width", "customClass"]), { "class": ["cl-dialog", props.customClass], "width": props.width, "placement": props.placement, "closeOnOverlayClick": props.closeOnOverlayClick, "closeOnEscKeydown": props.closeOnEscKeydown, "mode": fullscreen.value ? "full-screen" : "modal", "attach": props.attach, "onClose": onClose, "visible": visible.value, "onUpdate:visible": (value) => { visible.value = value; } }), { header() { return renderHeader(); }, default() { return dialog(); }, footer() { var _a; return slots.footer ? vue.createVNode("div", { "class": "cl-dialog__footer" }, [(_a = slots.footer) == null ? void 0 : _a.call(slots)]) : ""; } }); } }; } }); exports.default = ClDialog;