mirror of
https://github.com/crmeb/CRMEB.git
synced 2026-10-30 22:40:48 +00:00
310 lines
7.3 KiB
JavaScript
310 lines
7.3 KiB
JavaScript
// +----------------------------------------------------------------------
|
||
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||
// +----------------------------------------------------------------------
|
||
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
|
||
// +----------------------------------------------------------------------
|
||
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||
// +----------------------------------------------------------------------
|
||
// | Author: CRMEB Team <admin@crmeb.com>
|
||
// +----------------------------------------------------------------------
|
||
|
||
import Vue from 'vue';
|
||
import Modal from 'iview/src/components/modal/modal.vue';
|
||
import Button from 'iview/src/components/button/button.vue';
|
||
import Locale from 'iview/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, // 关闭有动画,期间使用此属性避免重复点击
|
||
}),
|
||
render(h) {
|
||
let 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,
|
||
),
|
||
],
|
||
),
|
||
],
|
||
);
|
||
},
|
||
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() {},
|
||
},
|
||
});
|
||
|
||
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;
|