| Current Path : /var/www/html/protegev2/node_modules/vuesax/src/functions/vsNotification/Base/ |
| Current File : /var/www/html/protegev2/node_modules/vuesax/src/functions/vsNotification/Base/index.ts |
import Vue from 'vue';
import './style.sass'
import component from './VsNotification'
interface NotificationParams {
title?: string
text?: string
position?: string
color?: string
border?: string
icon?: string
duration?: number | string
onClick?: any
buttonClose?: boolean
flat?: boolean
onDestroy?: any
sticky?: boolean
square?: boolean
width?: string
loading?: boolean
progress?: any
notPadding?: any
content?: any
clickClose?: boolean
classNotification?: string
}
const notificationConstructor = Vue.extend(component)
// tslint:disable-next-line:only-arrow-functions
notificationConstructor.prototype.close = function() {
this.isVisible = false
}
notificationConstructor.prototype.setLoading = function(val: boolean) {
this.loading = val
}
notificationConstructor.prototype.changeProgress = function(val: number) {
if (val) {
this.progress = val
}
}
notificationConstructor.prototype.toggleClass = function(val: number) {
if (val) {
this.classNotification = val
this.$el.closest('.vs-notification-parent').classList.toggle(val)
}
}
const notification = (params: NotificationParams = {}) => {
const instance = new notificationConstructor()
instance.$data.title = params.title
instance.$data.text = params.text
instance.$data.color = params.color
instance.$data.colorName = params.color
instance.$data.border = params.border
instance.$data.icon = params.icon
instance.$data.onClick = params.onClick
instance.$data.flat = params.flat
instance.$data.onDestroy = params.onDestroy
instance.$data.sticky = params.sticky
instance.$data.square = params.square
instance.$data.width = params.width
instance.$data.loading = params.loading
instance.$data.notPadding = params.notPadding
instance.$data.clickClose = params.clickClose
instance.$data.classNotification = params.classNotification
if (params.duration !== 'none') {
instance.$data.duration = params.duration || 4000
}
if (params.progress == 'auto' && params.duration !== 'none') {
instance.$data.progressAuto = true
} else {
instance.$data.progress = params.progress
}
if (typeof params.buttonClose == 'boolean') {
instance.$data.buttonClose = params.buttonClose
}
if (params.width == '100%' || window.innerWidth < 600) {
if (params.position === 'top-left' || params.position === 'top-right') {
params.position = 'top-center'
} else if (params.position === 'bottom-left' || params.position === 'bottom-right' || !params.position) {
params.position = 'bottom-center'
}
}
if (typeof params.position !== 'string') {
params.position = 'bottom-right'
}
const parent: HTMLElement =
document.querySelector(`.vs-notification-parent--${params.position || 'bottom-right'}`) || document.createElement('div')
if (!document.querySelector(`.vs-notification-parent--${params.position || 'bottom-right'}`)) {
parent.className = 'vs-notification-parent'
parent.classList.add(`vs-notification-parent--${params.position || 'bottom-right'}`)
}
if (params.classNotification) {
parent.classList.add(params.classNotification)
}
parent.appendChild(instance.$mount().$el)
document.body.appendChild(parent)
Vue.nextTick(() => {
instance.$data.isVisible = true
instance.$data.content = params.content
})
if (params.duration !== 'none') {
setTimeout(() => {
(instance as any).close()
}, Number(params.duration) || 4000)
}
return instance
}
export default notification