src/modal/script.js
import getScrollBarWidth from '../_core/_utils/getScrollBarWidth.js'
export default {
props: {
backdrop: {type: Boolean, default: true},
callback: {type: Function, default: null},
cancelText: {type: String, default: 'Close'},
effect: {type: String, default: null},
large: {type: Boolean, default: false},
okText: {type: String, default: 'Save changes'},
small: {type: Boolean, default: false},
title: {type: String, default: ''},
value: {type: Boolean, required: true},
width: {default: null},
subModal: {type: Boolean, default: false}
},
data () {
return {
transition: false,
val: null,
sem: true
}
},
computed: {
optionalWidth () {
if (this.width === null) {
return null
} else if (Number.isInteger(this.width)) {
return this.width + 'px'
}
return this.width
}
},
watch: {
transition (val, old) {
if (val === old) { return }
const el = this.$el
const body = document.body
if (val) {
if (this.val) {
el.querySelector('.modal-content').focus()
el.style.display = 'block'
setTimeout(() => el.classList.add('in'), 0)
body.classList.add('modal-open')
if (getScrollBarWidth() !== 0) {
body.style.paddingRight = getScrollBarWidth() + 'px'
}
} else {
el.classList.remove('in')
}
} else {
this.$emit(this.val ? 'opened' : 'closed')
if (!this.val) {
el.style.display = 'none'
body.style.paddingRight = null
if (!this.subModal) {
body.classList.remove('modal-open')
}
}
}
},
val (val, old) {
this.$emit('input', val)
if (old === null ? val === true : val !== old) this.transition = true
},
value (val, old) {
if (val !== old) this.val = val
}
},
methods: {
action (val, p) {
if (this.sem) {
if (val === null) { return }
this.sem = false
if (val && this.callback instanceof Function) this.callback()
this.$emit(val ? 'ok' : 'cancel', p)
this.val = val || false
setTimeout(() => this.sem = true, 900)
}
}
},
mounted () {
this.val = this.value
}
}