var _ = require('../util') var applyCSSTransition = require('./css') var applyJSTransition = require('./js') /** * Append with transition. * * @oaram {Element} el * @param {Element} target * @param {Vue} vm * @param {Function} [cb] */ exports.append = function (el, target, vm, cb) { apply(el, 1, function () { target.appendChild(el) }, vm, cb) } /** * InsertBefore with transition. * * @oaram {Element} el * @param {Element} target * @param {Vue} vm * @param {Function} [cb] */ exports.before = function (el, target, vm, cb) { apply(el, 1, function () { _.before(el, target) }, vm, cb) } /** * Remove with transition. * * @oaram {Element} el * @param {Vue} vm * @param {Function} [cb] */ exports.remove = function (el, vm, cb) { apply(el, -1, function () { _.remove(el) }, vm, cb) } /** * Remove by appending to another parent with transition. * This is only used in block operations. * * @oaram {Element} el * @param {Element} target * @param {Vue} vm * @param {Function} [cb] */ exports.removeThenAppend = function (el, target, vm, cb) { apply(el, -1, function () { target.appendChild(el) }, vm, cb) } /** * Append the childNodes of a fragment to target. * * @param {DocumentFragment} block * @param {Node} target * @param {Vue} vm */ exports.blockAppend = function (block, target, vm) { var nodes = _.toArray(block.childNodes) for (var i = 0, l = nodes.length; i < l; i++) { exports.before(nodes[i], target, vm) } } /** * Remove a block of nodes between two edge nodes. * * @param {Node} start * @param {Node} end * @param {Vue} vm */ exports.blockRemove = function (start, end, vm) { var node = start.nextSibling var next while (node !== end) { next = node.nextSibling exports.remove(node, vm) node = next } } /** * Apply transitions with an operation callback. * * @oaram {Element} el * @param {Number} direction * 1: enter * -1: leave * @param {Function} op - the actual DOM operation * @param {Vue} vm * @param {Function} [cb] */ var apply = exports.apply = function (el, direction, op, vm, cb) { var transData = el.__v_trans if ( !transData || !vm._isCompiled || // if the vm is being manipulated by a parent directive // during the parent's compilation phase, skip the // animation. (vm.$parent && !vm.$parent._isCompiled) ) { op() if (cb) cb() return } // determine the transition type on the element var jsTransition = vm.$options.transitions[transData.id] if (jsTransition) { // js applyJSTransition( el, direction, op, transData, jsTransition, vm, cb ) } else if (_.transitionEndEvent) { // css applyCSSTransition( el, direction, op, transData, cb ) } else { // not applicable op() if (cb) cb() } }