import XEUtils from 'xe-utils' import VXEModal, { allActivedModals } from './src/modal' import VXETable from '../v-x-e-table' /* eslint-disable @typescript-eslint/no-use-before-define */ let ModalClass = null function openModal (opts) { const options = Object.assign({}, opts, { transfer: true }) return new Promise(resolve => { if (options && options.id && allActivedModals.some(comp => comp.id === options.id)) { resolve('exist') } else { const events = options.events || {} options.events = Object.assign({}, events, { hide (params) { if (events.hide) { events.hide.call(this, params) } setTimeout(() => $modal.$destroy(), $modal.isMsg ? 500 : 100) resolve(params.type) } }) const $modal = new ModalClass({ el: document.createElement('div'), propsData: options }) setTimeout(() => { if ($modal.isDestroy) { $modal.close() } else { $modal.open() } }) } }) } /** * 全局关闭动态的活动窗口(只能用于关闭动态的创建的活动窗口) * 如果传 id 则关闭指定的窗口 * 如果不传则关闭所有窗口 */ function closeModal (id) { const modals = arguments.length ? [getModal(id)] : allActivedModals modals.forEach($modal => { if ($modal) { $modal.isDestroy = true $modal.close('close') } }) return Promise.resolve() } function getModal (id) { return XEUtils.find(allActivedModals, $modal => $modal.id === id) } const ModalController = { get: getModal, close: closeModal, open: openModal } export const modal = ModalController const shortcutTypes = ['alert', 'confirm', 'message'] shortcutTypes.forEach((type, index) => { const defOpts = index === 2 ? { mask: false, lockView: false, showHeader: false } : { showFooter: true } defOpts.type = type defOpts.dblclickZoom = false if (index === 1) { defOpts.status = 'question' } ModalController[type] = function (message, title, options) { let opts if (XEUtils.isObject(message)) { opts = message } else { if (title) { opts = index === 2 ? { status: title } : { title } } } return openModal(Object.assign({ message: XEUtils.toValueString(message), type }, defOpts, opts, options)) } }) export const Modal = Object.assign(VXEModal, { install (Vue) { VXETable._modal = 1 Vue.component(VXEModal.name, VXEModal) ModalClass = Vue.extend(VXEModal) VXETable.modal = ModalController if (!Vue.prototype.$vxe) { Vue.prototype.$vxe = { modal: ModalController } } else { Vue.prototype.$vxe.modal = ModalController } } }) export default Modal