index.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import XEUtils from 'xe-utils/ctor'
  2. import VXEModal from './src/modal'
  3. import allActivedModals from './src/activities'
  4. import VXETable from '../v-x-e-table'
  5. import { UtilTools } from '../tools'
  6. /* eslint-disable @typescript-eslint/no-use-before-define */
  7. let ModalClass = null
  8. function openModal (opts) {
  9. const options = Object.assign({}, opts, { transfer: true })
  10. return new Promise(resolve => {
  11. if (options && options.id && allActivedModals.some(comp => comp.id === options.id)) {
  12. resolve('exist')
  13. } else {
  14. const events = options.events || {}
  15. options.events = Object.assign({}, events, {
  16. hide (params) {
  17. if (events.hide) {
  18. events.hide.call(this, params)
  19. }
  20. setTimeout(() => $modal.$destroy(), $modal.isMsg ? 500 : 100)
  21. resolve(params.type)
  22. }
  23. })
  24. const $modal = new ModalClass({
  25. el: document.createElement('div'),
  26. propsData: options
  27. })
  28. setTimeout(() => {
  29. if ($modal.isDestroy) {
  30. $modal.close()
  31. } else {
  32. $modal.open()
  33. }
  34. })
  35. }
  36. })
  37. }
  38. export function ModalController (options) {
  39. UtilTools.warn('vxe.error.delFunc', ['Modal', 'Modal.open'])
  40. return openModal(options)
  41. }
  42. ['alert', 'confirm', 'message'].forEach((type, index) => {
  43. const defOpts = index === 2 ? {
  44. mask: false,
  45. lockView: false,
  46. showHeader: false
  47. } : {
  48. showFooter: true
  49. }
  50. defOpts.type = type
  51. defOpts.dblclickZoom = false
  52. if (index === 1) {
  53. defOpts.status = 'question'
  54. }
  55. ModalController[type] = function (content, title, options) {
  56. let opts = {}
  57. if (XEUtils.isObject(content)) {
  58. opts = content
  59. } else {
  60. if (title) {
  61. opts = index === 2 ? { status: title } : { title }
  62. }
  63. opts.content = XEUtils.toString(content)
  64. }
  65. return openModal(Object.assign({ type }, defOpts, opts, options))
  66. }
  67. })
  68. /**
  69. * 全局关闭动态的活动窗口(只能用于关闭动态的创建的活动窗口)
  70. * 如果传 id 则关闭指定的窗口
  71. * 如果不传则关闭所有窗口
  72. */
  73. function closeModal (id) {
  74. const modals = arguments.length ? [getModal(id)] : allActivedModals
  75. modals.forEach($modal => {
  76. if ($modal) {
  77. $modal.isDestroy = true
  78. $modal.close('close')
  79. }
  80. })
  81. return Promise.resolve()
  82. }
  83. function getModal (id) {
  84. return XEUtils.find(allActivedModals, $modal => $modal.id === id)
  85. }
  86. ModalController.closeAll = function () {
  87. UtilTools.warn('vxe.error.delFunc', ['closeAll', 'close'])
  88. closeModal()
  89. }
  90. ModalController.get = getModal
  91. ModalController.close = closeModal
  92. ModalController.open = openModal
  93. ModalController.install = function (Vue) {
  94. VXETable._modal = 1
  95. Vue.component('vxe-message', VXEModal)
  96. Vue.component(VXEModal.name, VXEModal)
  97. ModalClass = Vue.extend(VXEModal)
  98. Vue.prototype.$XMsg = ModalController
  99. Vue.prototype.$XModal = ModalController
  100. VXETable.$modal = ModalController
  101. VXETable.modal = ModalController
  102. if (!Vue.prototype.$vxe) {
  103. Vue.prototype.$vxe = { modal: ModalController }
  104. } else {
  105. Vue.prototype.$vxe.modal = ModalController
  106. }
  107. }
  108. export const Modal = ModalController
  109. export default ModalController