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.

103 lines
2.8 KiB

import Vue from 'vue'
import Main from './main.vue'
import {PopupManager} from 'element-ui/src/utils/popup'
import {isVNode} from 'element-ui/src/utils/vdom'
import {isEmpty} from "@/utils"
let MessageConstructor = Vue.extend(Main)
let instance
let instances = []
let seed = 1
//键:options.type+'|'+options.message,值:message实例
let groups = {}
const Message = function (options) {
options = options || {}
if (typeof options === 'string') {
options = {message: options}
}
if (isEmpty(options.type)) {
options.type = 'info'
}
const group = options.type + '|' + options.message
const originalMessage = groups[group]
//若不是新的message
if (originalMessage) {
//旧实例的badge+1,并重新计时(如果有的话)
originalMessage.badge++
originalMessage.clearTimer(true)
originalMessage.startTimer()
return originalMessage
}
let userOnClose = options.onClose
let id = 'message_' + seed++
options.onClose = function () {
Message.close(id, userOnClose)
}
instance = new MessageConstructor({data: options})
instance.id = id
instance.group = group
if (isVNode(instance.message)) {
instance.$slots.default = [instance.message]
instance.message = null
}
instance.$mount()
document.body.appendChild(instance.$el)
let verticalOffset = options.offset || 20
instances.forEach(item => {
verticalOffset += item.$el.offsetHeight + 16
})
instance.verticalOffset = verticalOffset
instance.visible = true
instance.$el.style.zIndex = PopupManager.nextZIndex()
instances.push(instance)
groups[group] = instance
return instance
};
['success', 'warning', 'info', 'error'].forEach(type => {
Message[type] = options => {
if (typeof options === 'string') {
options = {message: options}
}
options.type = type
return Message(options)
}
})
Message.close = function (id, userOnClose) {
let len = instances.length
let index = -1
let removedHeight
for (let i = 0; i < len; i++) {
if (id === instances[i].id) {
removedHeight = instances[i].$el.offsetHeight
index = i
if (typeof userOnClose === 'function') {
userOnClose(instances[i])
}
delete groups[instances[i].group]
instances.splice(i, 1)
break
}
}
if (len <= 1 || index === -1 || index > instances.length - 1) return
for (let i = index; i < len - 1; i++) {
let dom = instances[i].$el
dom.style.top =
parseInt(dom.style.top, 10) - removedHeight - 16 + 'px'
}
}
Message.closeAll = function () {
for (let i = instances.length - 1; i >= 0; i--) {
instances[i].close()
}
}
export default Message