// 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