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
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
|
|
|