//@ts-nocheck import { xU } from "../../ventoseUtils"; import $ from "jquery"; import { KEY, LayerUtils } from "../layer/LayerUtils"; import { createApp, defineComponent } from "vue"; import { State_UI } from "../../State_UI"; const EcsPressHandler = xU.debounce(async function (event, dialogOptions) { const $antModal = $(".ant-modal-root"); /* 如果有ant的弹窗就不关闭layer */ if ($antModal.length > 0) { return; } if (event.keyCode === KEY.esc) { await dialogOptions.closeDialog(); } }, 100); export type t_dialogOptions = { /* 弹窗里面的弹窗点击之后不关闭(点不到其他位置) */ keepTop?: boolean; payload?: any; isEcsCloseDialog?: boolean; /* 传入的组件的实例 */ _contentInstance?: object; /* dialog jQuery 实例 */ _dialog$ele?: JQuery; /* 在component里面propDialogOptions作为参数传入*/ title?: any; component: object; area?: string[]; /* layer 索引,用于layer close */ _layerKey?: number; /*关闭方法*/ closeDialog?: Function; /* hook: 完成组件首次加载 */ onAfterOpenDialoag?: Function; onBeforeClose?: Function; }; const xDialogFooter = defineComponent({ props: ["configs"], computed: { onCancel() { return this.configs.onCancel; }, onOk() { return this.configs.onOk; }, vDomOk() { if (this.configs?.hideOk) { return null; } const configs = { text: xU.isInput(this.configs.textOk) ? this.configs.textOk : State_UI.$t("确定").label, disabled: xU.isInput(this.configs.disabledOk) ? this.configs.disabledOk : false, onClick: this.onOk || xU.doNothing }; return ; }, vDomCancel() { if (this.configs?.hideCancel) { return null; } const configs = { text: xU.isInput(this.configs.textCancel) ? this.configs.textCancel : State_UI.$t("取消").label, disabled: xU.isInput(this.configs.disabledCancel) ? this.configs.disabledCancel : false, onClick: this.onCancel || xU.doNothing }; return ; }, vDomContent() { if (this.$slots.default) { return this.$slots.default(); } else { return ( <> {this.vDomCancel} {this.vDomOk} ); } } }, render() { return ( ); } }); export const installUIDialogComponent = ( UI, { appPlugins, dependState }, app ) => { app.component("xDialogFooter", xDialogFooter); UI.dialog.component = async (dialogOptions: t_dialogOptions) => new Promise((resolve, reject) => { const { component: BussinessComponent, title, area } = dialogOptions; const id = `xDialog_${Date.now()}`; let $container = $("
", { id }); const _dialogId = `#${id}`; /* FIXED: */ if (dialogOptions.yes) { dialogOptions._yes = dialogOptions.yes; delete dialogOptions.yes; } dialogOptions.closeDialog = async () => { let isCloseDialog = true; if (dialogOptions.onBeforeClose) { const res = await dialogOptions.onBeforeClose({ dialogOptions, _layerKey: "", $eleLayer: "" }); if (xU.isBoolean(res) && !res) { isCloseDialog = false; } } if (isCloseDialog) { LayerUtils.close(handleEcsPress._layerKey); } }; /*dialog 的vue app*/ let dialogVueApp = null; /* 处理按Esc键关闭弹窗 */ let handleEcsPress = { _layerKey: "", handler: event => EcsPressHandler(event, dialogOptions), on(_layerKey) { handleEcsPress._layerKey = _layerKey; if (!dialogOptions.isEcsCloseDialog) { return; } $(document).on(`keyup.${_dialogId}`, handleEcsPress.handler); }, off() { $(document).off(`keyup.${_dialogId}`, handleEcsPress.handler); handleEcsPress = null; } }; const layerOptions = xU.merge( dialogOptions, { /* 传入自定义样式 */ contentClass: "flex1", offset: ["160px", null], btn: [ /*'确定', '取消'*/ ] }, dialogOptions, { type: LayerUtils.DIALOG, title: [title || ""], area: area || [], content: $container, offset: ["160px", null], /* 无按钮 */ btn: [ /*'确定', '取消'*/ ], success($eleLayer, _layerKey, layerInstance) { handleEcsPress.on(_layerKey); /* dialog jQuery 实例 */ dialogOptions._layerInstance = layerInstance; dialogOptions._dialog$ele = $eleLayer; dialogOptions._layerKey = _layerKey; try { dialogVueApp = createApp( defineComponent({ components: { BussinessComponent }, created() { this.dialogOptions._contentInstance = this; if (this.dialogOptions.keepTop) { setTimeout(() => { $(`#layui-layer-shade${_layerKey}`).css("z-index", 1); }, 6); } resolve(this.dialogOptions); }, data() { return { dialogOptions }; }, render() { return (
); } }) ); dialogVueApp.use(appPlugins, { dependState }); dialogVueApp.mount(_dialogId); } catch (e) { console.error(e); } dialogOptions.onAfterOpenDialoag && dialogOptions.onAfterOpenDialoag(dialogVueApp); }, cancel() { dialogOptions.closeDialog(); return false; }, end() { handleEcsPress.off(); $container.remove(); $container = null; if (dialogVueApp) { dialogVueApp.unmount(); dialogVueApp = null; } dialogOptions.payload = null; dialogOptions._contentInstance = null; dialogOptions = null; } }, xU.omit(dialogOptions, ["end", "cancel", "success", "content"]) ); LayerUtils.open(layerOptions); }); };