ans-ui
Version:
A vue-based UI components library for analysys
102 lines (94 loc) • 3.23 kB
JavaScript
import { addClass, removeClass, getStyle } from '../../../../src/util'
import Vue from 'vue'
import xSpin from './Spin.vue'
import { defaults } from './service'
const SpinConstructor = Vue.extend(xSpin)
export default {
bind (el, binding) {
const text = el.getAttribute('spin-text') || defaults.text
const background = el.getAttribute('spin-background') || defaults.background
const iconClass = el.getAttribute('spin-icon-class') || defaults.iconClass
const customClass = el.getAttribute('spin-custom-class') || defaults.customClass
const spin = new SpinConstructor({
el: document.createElement('div'),
data: {
text,
background,
iconClass,
customClass,
fullscreen: !!binding.modifiers.fullscreen,
onAfterLeave () {
el.domVisible = false
const target = binding.modifiers.fullscreen || binding.modifiers.body
? document.body
: el
removeClass(target, 'spin-relative-parent')
removeClass(target, 'spin-lock-overflow')
}
}
})
el.spin = spin
binding.value && toggle(el, binding)
},
update (el, binding) {
let text = el.getAttribute('spin-text')
if (text === null) {
text = defaults.text
}
el.spin.setText(text)
if (binding.oldValue !== binding.value) {
toggle(el, binding)
}
},
unbind (el, binding) {
if (el.domAppended) {
if (el.spin && el.spin.$el.parentNode) {
el.spin.$el.parentNode.removeChild(el.spin.$el)
}
toggle(el, { value: false, modifiers: binding.modifiers })
}
}
}
function toggle (el, binding) {
if (binding.value) {
if (binding.modifiers.fullscreen) {
el.originalPosition = getStyle(document.body, 'position')
appendDom(document.body, el, binding)
} else {
if (binding.modifiers.body) {
el.originalPosition = getStyle(document.body, 'position')
const spinStyle = el.spin.$el.style
;['top', 'left'].forEach(property => {
const scroll = property === 'top' ? 'scrollTop' : 'scrollLeft'
spinStyle[property] = el.getBoundingClientRect()[property] +
document.body[scroll] +
document.documentElement[scroll] -
parseInt(getStyle(document.body, `margin-${property}`), 10) + 'px'
})
;['height', 'width'].forEach(property => {
spinStyle[property] = el.getBoundingClientRect()[property] + 'px'
})
appendDom(document.body, el, binding)
} else {
el.originalPosition = getStyle(el, 'position')
appendDom(el, el, binding)
}
}
el.spin.visible = true
} else {
el.spin.visible = false
}
}
function appendDom (parent, el, binding) {
if (!el.domVisible && getStyle(el, 'display') !== 'none' && getStyle(el, 'visibility') !== 'hidden') {
if (el.originalPosition !== 'absolute' && el.originalPosition !== 'fixed') {
addClass(parent, 'spin-relative-parent')
}
if (binding.modifiers.fullscreen && binding.modifiers.lock) {
addClass(parent, 'spin-lock-overflow')
}
el.domVisible = true
parent.appendChild(el.spin.$el)
el.domAppended = true
}
}