|
@@ -0,0 +1,113 @@
|
|
|
+import Modal from 'ant-design-vue/es/modal'
|
|
|
+export default (Vue) => {
|
|
|
+ function dialog (component, componentProps, modalProps) {
|
|
|
+ const _vm = this
|
|
|
+ modalProps = modalProps || {}
|
|
|
+ if (!_vm || !_vm._isVue) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ let dialogDiv = document.querySelector('body>div[type=dialog]')
|
|
|
+ if (!dialogDiv) {
|
|
|
+ dialogDiv = document.createElement('div')
|
|
|
+ dialogDiv.setAttribute('type', 'dialog')
|
|
|
+ document.body.appendChild(dialogDiv)
|
|
|
+ }
|
|
|
+
|
|
|
+ const handle = function (checkFunction, afterHandel) {
|
|
|
+ if (checkFunction instanceof Function) {
|
|
|
+ const res = checkFunction()
|
|
|
+ if (res instanceof Promise) {
|
|
|
+ res.then(c => {
|
|
|
+ c && afterHandel()
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ res && afterHandel()
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // checkFunction && afterHandel()
|
|
|
+ checkFunction || afterHandel()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const dialogInstance = new Vue({
|
|
|
+ data () {
|
|
|
+ return {
|
|
|
+ visible: true
|
|
|
+ }
|
|
|
+ },
|
|
|
+ router: _vm.$router,
|
|
|
+ store: _vm.$store,
|
|
|
+ mounted () {
|
|
|
+ this.$on('close', (v) => {
|
|
|
+ this.handleClose()
|
|
|
+ })
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ handleClose () {
|
|
|
+ handle(this.$refs._component.onCancel, () => {
|
|
|
+ this.visible = false
|
|
|
+ this.$refs._component.$emit('close')
|
|
|
+ this.$refs._component.$emit('cancel')
|
|
|
+ dialogInstance.$destroy()
|
|
|
+ })
|
|
|
+ },
|
|
|
+ handleOk () {
|
|
|
+ handle(this.$refs._component.onOK || this.$refs._component.onOk, () => {
|
|
|
+ this.visible = false
|
|
|
+ this.$refs._component.$emit('close')
|
|
|
+ this.$refs._component.$emit('ok')
|
|
|
+ dialogInstance.$destroy()
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ render: function (h) {
|
|
|
+ const that = this
|
|
|
+ const modalModel = modalProps && modalProps.model
|
|
|
+ if (modalModel) {
|
|
|
+ delete modalProps.model
|
|
|
+ }
|
|
|
+ const ModalProps = Object.assign({}, modalModel && { model: modalModel } || {}, {
|
|
|
+ attrs: Object.assign({}, {
|
|
|
+ ...(modalProps.attrs || modalProps)
|
|
|
+ }, {
|
|
|
+ visible: this.visible
|
|
|
+ }),
|
|
|
+ on: Object.assign({}, {
|
|
|
+ ...(modalProps.on || modalProps)
|
|
|
+ }, {
|
|
|
+ ok: () => {
|
|
|
+ that.handleOk()
|
|
|
+ },
|
|
|
+ cancel: () => {
|
|
|
+ that.handleClose()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ const componentModel = componentProps && componentProps.model
|
|
|
+ if (componentModel) {
|
|
|
+ delete componentProps.model
|
|
|
+ }
|
|
|
+ const ComponentProps = Object.assign({}, componentModel && { model: componentModel } || {}, {
|
|
|
+ ref: '_component',
|
|
|
+ attrs: Object.assign({}, {
|
|
|
+ ...((componentProps && componentProps.attrs) || componentProps)
|
|
|
+ }),
|
|
|
+ on: Object.assign({}, {
|
|
|
+ ...((componentProps && componentProps.on) || componentProps)
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ return h(Modal, ModalProps, [h(component, ComponentProps)])
|
|
|
+ }
|
|
|
+ }).$mount(dialogDiv)
|
|
|
+ }
|
|
|
+
|
|
|
+ Object.defineProperty(Vue.prototype, '$dialog', {
|
|
|
+ get: () => {
|
|
|
+ return function () {
|
|
|
+ dialog.apply(this, arguments)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|