index.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import Vue, { VueConstructor } from 'vue'
  2. import { VxeUI } from '@vxe-ui/core'
  3. import XEUtils from 'xe-utils'
  4. import VxeModalComponent, { allActiveModals } from './src/modal'
  5. import { dynamicApp, dynamicStore, checkDynamic } from '../dynamics'
  6. import { VxeModalPropTypes, ModalEventTypes, VxeModalListeners, VxeModalDefines } from '../../types'
  7. function handleModal (options: VxeModalDefines.ModalOptions): Promise<ModalEventTypes> {
  8. // 使用动态组件渲染动态弹框
  9. checkDynamic()
  10. return new Promise(resolve => {
  11. const opts = Object.assign({}, options)
  12. if (opts.id && allActiveModals.some(comp => comp.id === opts.id)) {
  13. resolve('exist')
  14. } else {
  15. const events = Object.assign({}, opts.events)
  16. const modalOpts: {
  17. key: number | string
  18. props: VxeModalDefines.ModalOptions
  19. on: VxeModalListeners
  20. } = {
  21. key: XEUtils.uniqueId(),
  22. props: Object.assign(opts, {
  23. value: true
  24. }),
  25. on: {
  26. ...events,
  27. hide (params) {
  28. const modalList = dynamicStore.modals
  29. if (events.hide) {
  30. events.hide.call(this, params)
  31. }
  32. dynamicStore.modals = modalList.filter(item => item.key !== modalOpts.key)
  33. resolve(params.type)
  34. }
  35. }
  36. }
  37. dynamicStore.modals.push(modalOpts)
  38. }
  39. })
  40. }
  41. function getModal (id: VxeModalPropTypes.ID) {
  42. return XEUtils.find(allActiveModals, $modal => $modal.id === id)
  43. }
  44. /**
  45. * 全局关闭动态的活动窗口(只能用于关闭动态的创建的活动窗口)
  46. * 如果传 id 则关闭指定的窗口
  47. * 如果不传则关闭所有窗口
  48. */
  49. function closeModal (id?: VxeModalPropTypes.ID) {
  50. const modals = id ? [getModal(id)] : allActiveModals
  51. const restPromises: any[] = []
  52. modals.forEach($modal => {
  53. if ($modal) {
  54. restPromises.push($modal.close())
  55. }
  56. })
  57. return Promise.all(restPromises)
  58. }
  59. function handleOpen (defOpts: VxeModalDefines.ModalOptions, content: VxeModalPropTypes.Content | VxeModalDefines.ModalOptions, title?: VxeModalPropTypes.Title, options?: VxeModalDefines.ModalOptions) {
  60. let opts
  61. if (XEUtils.isObject(content)) {
  62. opts = content
  63. } else {
  64. opts = { content: XEUtils.toValueString(content), title }
  65. }
  66. return handleModal({ ...defOpts, ...options, ...opts })
  67. }
  68. function openModal (options: VxeModalDefines.ModalOptions) {
  69. return handleOpen({
  70. type: 'modal'
  71. }, options)
  72. }
  73. function openAlert (content: VxeModalPropTypes.Content | VxeModalDefines.ModalOptions, title?: VxeModalPropTypes.Title, options?: VxeModalDefines.ModalOptions) {
  74. return handleOpen({
  75. type: 'alert',
  76. lockScroll: true,
  77. showHeader: true,
  78. showFooter: true
  79. }, content, title, options)
  80. }
  81. function openConfirm (content: VxeModalPropTypes.Content | VxeModalDefines.ModalOptions, title?: VxeModalPropTypes.Title, options?: VxeModalDefines.ModalOptions) {
  82. return handleOpen({
  83. type: 'confirm',
  84. status: 'question',
  85. lockScroll: true,
  86. showHeader: true,
  87. showFooter: true
  88. }, content, title, options)
  89. }
  90. function openMessage (content: VxeModalPropTypes.Content | VxeModalDefines.ModalOptions, options?: VxeModalDefines.ModalOptions) {
  91. return handleOpen({
  92. type: 'message',
  93. mask: false,
  94. lockView: false,
  95. lockScroll: false,
  96. showHeader: false
  97. }, content, '', options)
  98. }
  99. function openNotification (content: VxeModalPropTypes.Content | VxeModalDefines.ModalOptions, title?: VxeModalPropTypes.Title, options?: VxeModalDefines.ModalOptions) {
  100. return handleOpen({
  101. type: 'notification',
  102. mask: false,
  103. lockView: false,
  104. lockScroll: false,
  105. showHeader: true,
  106. draggable: false,
  107. position: 'top-right',
  108. width: 320
  109. }, content, title, options)
  110. }
  111. export const ModalController = {
  112. get: getModal,
  113. close: closeModal,
  114. open: openModal,
  115. alert: openAlert,
  116. confirm: openConfirm,
  117. message: openMessage,
  118. notification: openNotification
  119. }
  120. export const VxeModal = Object.assign(VxeModalComponent, {
  121. install: function (app: VueConstructor) {
  122. app.component(VxeModalComponent.name as string, VxeModalComponent)
  123. // 兼容老版本
  124. if (!Vue.prototype.$vxe) {
  125. Vue.prototype.$vxe = { modal: ModalController }
  126. } else {
  127. Vue.prototype.$vxe.modal = ModalController
  128. }
  129. }
  130. })
  131. VxeUI.modal = ModalController
  132. dynamicApp.use(VxeModal)
  133. VxeUI.component(VxeModalComponent)
  134. export const Modal = VxeModal
  135. export default VxeModal