142 lines
3.4 KiB
JavaScript
142 lines
3.4 KiB
JavaScript
|
// Mixins
|
||
|
import Bootable from '../../mixins/bootable';
|
||
|
import { factory as GroupableFactory } from '../../mixins/groupable'; // Directives
|
||
|
|
||
|
import Touch from '../../directives/touch'; // Utilities
|
||
|
|
||
|
import { convertToUnit } from '../../util/helpers';
|
||
|
import mixins from '../../util/mixins';
|
||
|
const baseMixins = mixins(Bootable, GroupableFactory('windowGroup', 'v-window-item', 'v-window'));
|
||
|
export default baseMixins.extend().extend().extend({
|
||
|
name: 'v-window-item',
|
||
|
directives: {
|
||
|
Touch
|
||
|
},
|
||
|
props: {
|
||
|
disabled: Boolean,
|
||
|
reverseTransition: {
|
||
|
type: [Boolean, String],
|
||
|
default: undefined
|
||
|
},
|
||
|
transition: {
|
||
|
type: [Boolean, String],
|
||
|
default: undefined
|
||
|
},
|
||
|
value: {
|
||
|
required: false
|
||
|
}
|
||
|
},
|
||
|
|
||
|
data() {
|
||
|
return {
|
||
|
done: null,
|
||
|
isActive: false,
|
||
|
wasCancelled: false
|
||
|
};
|
||
|
},
|
||
|
|
||
|
computed: {
|
||
|
classes() {
|
||
|
return this.groupClasses;
|
||
|
},
|
||
|
|
||
|
computedTransition() {
|
||
|
if (!this.windowGroup.internalReverse) {
|
||
|
return typeof this.transition !== 'undefined' ? this.transition || '' : this.windowGroup.computedTransition;
|
||
|
}
|
||
|
|
||
|
return typeof this.reverseTransition !== 'undefined' ? this.reverseTransition || '' : this.windowGroup.computedTransition;
|
||
|
}
|
||
|
|
||
|
},
|
||
|
|
||
|
mounted() {
|
||
|
this.$el.addEventListener('transitionend', this.onTransitionEnd, false);
|
||
|
},
|
||
|
|
||
|
beforeDestroy() {
|
||
|
this.$el.removeEventListener('transitionend', this.onTransitionEnd, false);
|
||
|
},
|
||
|
|
||
|
methods: {
|
||
|
genDefaultSlot() {
|
||
|
return this.$slots.default;
|
||
|
},
|
||
|
|
||
|
genWindowItem() {
|
||
|
return this.$createElement('div', {
|
||
|
staticClass: 'v-window-item',
|
||
|
class: this.classes,
|
||
|
directives: [{
|
||
|
name: 'show',
|
||
|
value: this.isActive
|
||
|
}],
|
||
|
on: this.$listeners
|
||
|
}, this.showLazyContent(this.genDefaultSlot()));
|
||
|
},
|
||
|
|
||
|
onAfterEnter() {
|
||
|
if (this.wasCancelled) {
|
||
|
this.wasCancelled = false;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
requestAnimationFrame(() => {
|
||
|
this.windowGroup.internalHeight = undefined;
|
||
|
this.windowGroup.isActive = false;
|
||
|
});
|
||
|
},
|
||
|
|
||
|
onBeforeEnter() {
|
||
|
this.windowGroup.isActive = true;
|
||
|
},
|
||
|
|
||
|
onBeforeLeave(el) {
|
||
|
this.windowGroup.internalHeight = convertToUnit(el.clientHeight);
|
||
|
},
|
||
|
|
||
|
onEnterCancelled() {
|
||
|
this.wasCancelled = true;
|
||
|
},
|
||
|
|
||
|
onEnter(el, done) {
|
||
|
const isBooted = this.windowGroup.isBooted;
|
||
|
if (isBooted) this.done = done;
|
||
|
this.$nextTick(() => {
|
||
|
if (!this.computedTransition) return done();
|
||
|
this.windowGroup.internalHeight = convertToUnit(el.clientHeight); // On initial render, there is no transition
|
||
|
// Vue leaves a `enter` transition class
|
||
|
// if done is called too fast
|
||
|
|
||
|
!isBooted && setTimeout(done, 100);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
onTransitionEnd(e) {
|
||
|
// This ensures we only call done
|
||
|
// when the element transform
|
||
|
// completes
|
||
|
if (e.propertyName !== 'transform' || e.target !== this.$el || !this.done) return;
|
||
|
this.done();
|
||
|
this.done = null;
|
||
|
}
|
||
|
|
||
|
},
|
||
|
|
||
|
render(h) {
|
||
|
return h('transition', {
|
||
|
props: {
|
||
|
name: this.computedTransition
|
||
|
},
|
||
|
on: {
|
||
|
afterEnter: this.onAfterEnter,
|
||
|
beforeEnter: this.onBeforeEnter,
|
||
|
beforeLeave: this.onBeforeLeave,
|
||
|
enter: this.onEnter,
|
||
|
enterCancelled: this.onEnterCancelled
|
||
|
}
|
||
|
}, [this.genWindowItem()]);
|
||
|
}
|
||
|
|
||
|
});
|
||
|
//# sourceMappingURL=VWindowItem.js.map
|