You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

287 lines
6.8 KiB

// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import Vue from 'vue'
import Modal from 'element-ui/src/components/modal/modal.vue'
import Button from 'element-ui/src/components/button/button.vue'
import Locale from 'element-ui/src/mixins/locale'
const prefixCls = 'ivu-modal-alert'
Modal.newInstance = properties => {
const _props = properties || {}
const Instance = new Vue({
mixins: [Locale],
data: Object.assign({}, _props, {
visible: false,
width: 416,
title: '',
body: '',
iconType: '',
iconName: '',
okText: undefined,
cancelText: undefined,
showCancel: false,
loading: false,
buttonLoading: false,
scrollable: false,
closable: true,
closing: false // 关闭有动画,期间使用此属性避免重复点击
}),
computed: {
iconTypeCls() {
return [
`${prefixCls}-head-icon`,
`${prefixCls}-head-icon-${this.iconType}`
]
},
iconNameCls() {
return [
'ivu-icon',
`ivu-icon-${this.iconName}`
]
},
localeOkText() {
if (this.okText) {
return this.okText
} else {
return this.t('i.modal.okText')
}
},
localeCancelText() {
if (this.cancelText) {
return this.cancelText
} else {
return this.t('i.modal.cancelText')
}
}
},
methods: {
cancel() {
if (this.closing) return
this.$children[0].visible = false
this.buttonLoading = false
this.onCancel()
this.remove()
},
ok() {
if (this.closing) return
if (this.loading) {
this.buttonLoading = true
} else {
this.$children[0].visible = false
this.remove()
}
this.onOk()
},
remove() {
this.closing = true
setTimeout(() => {
this.closing = false
this.destroy()
}, 300)
},
destroy() {
this.$destroy()
if (this.$el) {
document.body.removeChild(this.$el)
}
this.onRemove()
},
onOk() {
},
onCancel() {
},
onRemove() {
}
},
render(h) {
const footerVNodes = []
if (this.showCancel) {
footerVNodes.push(h(Button, {
props: {
type: 'text',
size: 'large'
},
on: {
click: this.cancel
}
}, this.localeCancelText))
}
// footerVNodes.push(h(Button, {
// props: {
// type: 'primary',
// size: 'large',
// loading: this.buttonLoading
// },
// on: {
// click: this.ok
// }
// }, this.localeOkText))
// render content
let body_render
if (this.render) {
body_render = h('div', {
attrs: {
class: `${prefixCls}-body ${prefixCls}-body-render`
}
}, [this.render(h)])
} else {
body_render = h('div', {
attrs: {
class: `${prefixCls}-body`
}
}, [
h('div', {
domProps: {
innerHTML: this.body
}
})
])
}
// when render with no title, hide head
let head_render
if (this.title) {
head_render = h('div', {
attrs: {
class: `${prefixCls}-head`
},
slot: 'header'
}, [
h('h2', {
attrs: {
class: `${prefixCls}-head-title`
},
domProps: {
innerHTML: this.title,
style: 'margin-bottom: 10px;'
}
})
])
}
return h(Modal, {
props: Object.assign({}, _props, {
width: this.width,
scrollable: this.scrollable,
closable: this.closable
}),
domProps: {
value: this.visible
},
on: {
input: (status) => {
this.visible = status
},
'on-cancel': this.cancel
}
}, [
h('div', {
attrs: {
class: prefixCls
}
}, [
head_render,
body_render,
h('div', {
attrs: {
class: `${prefixCls}-footer`
}
}, footerVNodes)
])
])
}
})
const component = Instance.$mount()
document.body.appendChild(component.$el)
const modal = Instance.$children[0]
return {
show(props) {
modal.$parent.showCancel = props.showCancel
modal.$parent.iconType = props.icon
switch (props.icon) {
case 'info':
modal.$parent.iconName = 'ios-information-circle'
break
case 'success':
modal.$parent.iconName = 'ios-checkmark-circle'
break
case 'warning':
modal.$parent.iconName = 'ios-alert'
break
case 'error':
modal.$parent.iconName = 'ios-close-circle'
break
case 'confirm':
modal.$parent.iconName = 'ios-help-circle'
break
}
if ('width' in props) {
modal.$parent.width = props.width
}
if ('closable' in props) {
modal.$parent.closable = props.closable
}
if ('title' in props) {
modal.$parent.title = props.title
}
if ('content' in props) {
modal.$parent.body = props.content
}
if ('okText' in props) {
modal.$parent.okText = props.okText
}
if ('cancelText' in props) {
modal.$parent.cancelText = props.cancelText
}
if ('onCancel' in props) {
modal.$parent.onCancel = props.onCancel
}
if ('onOk' in props) {
modal.$parent.onOk = props.onOk
}
// async for ok
if ('loading' in props) {
modal.$parent.loading = props.loading
}
if ('scrollable' in props) {
modal.$parent.scrollable = props.scrollable
}
// notice when component destroy
modal.$parent.onRemove = props.onRemove
modal.visible = true
},
remove() {
modal.visible = false
modal.$parent.buttonLoading = false
modal.$parent.remove()
},
component: modal
}
}
export default Modal