good.js 8.49 KB
/**
 * 购物车商品
 * @author: xuqi<qi.xu@yoho.cn>
 * @date: 2015/10/20
 */

var $ = require('jquery'),
    ellipsis = require('mlellipsis'),
    chosePanel = require('../cart/chose-panel'),
    loading = require('../plugin/loading'),
    lazyLoad = require('yoho.lazyload');

var dialog = require('../me/dialog'),
    tip = require('../plugin/tip');

var $selectAllBtn = $('.balance .checkbox'),
    requesting = false;

//上次编辑的商品skn
var previousEditSkn;

ellipsis.init();

lazyLoad({
    try_again_css: 'order-failure'
});

setTimeout(function() {
    $('.shopping-cart-good .name').each(function() {
        this.mlellipsis(2);
    });
}, 0);

function GoodInfo(properties) {
    this.goods_type = properties.goods_type;
    this.buy_number = properties.buy_number;
    this.product_sku = properties.product_sku;
    this.selected = properties.selected;
}

//TIP:事件委托在.cart-goods,商品列表的容器统一需要有.cart-goods
$('.cart-goods').on('touchstart', '.checkbox', function() {
    var $this = $(this),
        $good = $this.closest('.shopping-cart-good'),
        id = $good.data('id');

    var goodsList = [],
        goodInfo = {};

    if (!$this.hasClass('icon-cb-checked') && $this.siblings('.info').find('.low-stocks').length > 0) {
        tip.show('库存不足,无法购买');
        return false;
    }

    goodInfo.goods_type = $('#cartType').val();
    goodInfo.selected = $this.hasClass('icon-cb-checked') ? 'N' : 'Y';
    goodInfo.product_sku = id;
    goodInfo.buy_number = $good.find('.count').eq(0).text().trim().replace('×', '');
    goodsList.push(new GoodInfo(goodInfo));

    $.ajax({
        type: 'post',
        url: 'select',
        data: {
            skuList: JSON.stringify(goodsList)
        }
    }).then(function(data) {
        if (data.code === 200) {
            if ($this.hasClass('icon-cb-checked')) {
                $this.removeClass('icon-cb-checked').addClass('icon-checkbox');
            } else {
                $this.removeClass('icon-checkbox').addClass('icon-cb-checked');
            }
            window.location.href = '/cart/index/index?cartType=' + $('#cartType').val();
        } else if (data.code === 400) {
            tip.show('网络异常');
        }
    }, function() {
        tip.show('网络异常');
    });
});

/*
 * 显示购物车编辑面板。
 *
 * @param {String} html. chose-pannel模板,由服务端返回
 *
 * @param {String} id. 商品skuid
 *
 * @param {Bool} isSelected. 所要编辑的商品是否被选中
 *
 * @param {Bool} isEditNum. 所要编辑的商品是否被选中
 *
 * @return false or undefined
 *
 */
function showEditPannelWithSku(html, id, isSelected, isEditNum) {
    if (html.length < 2) {
        tip.show('出错啦!');
        return false;
    }

    //删掉页面上原有的pannel
    chosePanel.remove();

    $(html).appendTo('#mainCart');


    chosePanel.init();
    chosePanel.setEditModeWithSknId(id, isSelected);

    if (!isEditNum) {
        chosePanel.disableNumEdit();
    }

    chosePanel.show();
}


$('.icon-edit').on('touchstart', function(e) {
    var $this = $(this),
        skn = $this.closest('.shopping-cart-good').data('skn');

    var $checkBox,
        $tag;

    var id,
        count,
        canEditNum;

    if ($this.parents('.off-shell-goods').length) {
        tip.show('商品已下架');
        return false;
    }

    //如果点击的是上次编辑的商品,直接显示chose-pannel
    if (skn === previousEditSkn) {
        chosePanel.show();
        return;
    }

    previousEditSkn = skn;


    $checkBox = $this.closest('.info').siblings('.checkbox');
    $tag = $this.closest('.deps').siblings('.few-tag');

    id = $this.closest('.shopping-cart-good').data('id');
    count = $this.data('count');

    //加价购或者赠品不能编辑数量
    canEditNum = $tag.hasClass('gift-tag') || $tag.hasClass('plus-tag') ? false : true;

    e.stopPropagation();

    loading.showLoadingMask();


    $.ajax({
        url: '/cart/index/goodinfo',
        data: {
            skn: skn,
            buy_num: count
        },
        success: function(res) {
            showEditPannelWithSku(res, id, $checkBox.hasClass('icon-cb-checked'), canEditNum);
        },
        error: function() {
            tip.show('网络异常');
            window.location.reload();
        },
        complete: function() {
            loading.hideLoadingMask();
        }
    });
});

$('.icon-del').on('touchstart', function(e) {
    var $this = $(this);

    if ($this.parents('.off-shell-goods').length) {
        tip.show('商品已下架');
        return false;
    }

    e.stopPropagation();

    dialog.showDialog({
        dialogText: '您确定要从购物车中删除吗?',
        hasFooter: {
            leftBtnText: '取消',
            rightBtnText: '确定'
        }
    }, function() {
        var id = $this.closest('.shopping-cart-good').data('id'),
            count = $this.data('count');

        $.ajax({
            method: 'post',
            url: '/cart/index/del',
            data: {
                sku: id,
                count: count
            }
        }).then(function(data) {
            if (data.code === 200) {
                dialog.showDialog({
                    dialogText: '删除成功',
                    autoHide: true,
                    fast: true
                });
                window.setCookie('_yoho-cart-refreshByDelete', true);
                window.location.href = '/cart/index/index?cartType=' + $('#cartType').val();
            } else {
                tip.show(data.message);
            }
        }, function() {
            tip.show('网络异常');
            window.location.reload();
        });
    });
});

function requestUpdateAllGoodsCheckStatus(theGoods, successHandeler) {
    if (requesting) {
        return;
    }
    requesting = true;
    $.ajax({
        url: 'select',
        type: 'post',
        data: {
            skuList: JSON.stringify(theGoods)
        },
        success: function(res) {
            if (res.code === 200) {
                successHandeler();
            } else {
                tip.show(res.message);
            }
        },
        error: function() {
            tip.show('网络异常');
        },
        complete: function() {
            requesting = false;
        }
    });
}

function didUpdateAllGoodsCheckStatus() {
    var $checkedBoxs = $('.shopping-cart-good .icon-cb-checked'),
        $uncheckedBoxs = $('.shopping-cart-good .icon-checkbox');

    var shouldSelectAll;

    if ($selectAllBtn.hasClass('icon-cb-checked')) {
        $selectAllBtn.removeClass('icon-cb-checked').addClass('icon-checkbox');
        shouldSelectAll = true;
    } else {
        $selectAllBtn.removeClass('icon-checkbox').addClass('icon-cb-checked');
        shouldSelectAll = false;
    }

    if (!shouldSelectAll) {
        $uncheckedBoxs.each(function(idx, uncheckedBox) {
            $(uncheckedBox).removeClass('icon-checkbox').addClass('icon-cb-checked');
        });
    } else {
        $checkedBoxs.each(function(idx, checkedBox) {
            $(checkedBox).removeClass('icon-cb-checked').addClass('icon-checkbox');
        });
    }
    window.location.href = '/cart/index/index?cartType=' + $('#cartType').val();
}

function bottomCheckBoxHandeler(isSelected, type, handlerAfterTouch) {
    var goodInfo = {},
        $goods = $('.cart-content:not(.hide) .shopping-cart-good'),
        $good = null,
        goodsList = [];

    goodInfo.goods_type = type;
    goodInfo.selected = isSelected ? 'N' : 'Y';

    $goods.each(function(idx, good) {
        $good = $(good);

        goodInfo.product_sku = $(good).data('id');
        goodInfo.buy_number = $good.find('.count').eq(0).text().trim().replace('×', '');

        goodsList.push(new GoodInfo(goodInfo));
    });

    requestUpdateAllGoodsCheckStatus(goodsList, handlerAfterTouch);
}

//全选按钮点击事件
$selectAllBtn.on('touchend', function() {
    var cartType = $('#cartType').val(),
        isSelect = $(this).hasClass('icon-cb-checked');

    if ('ordinary' === cartType) {
        if (!isSelect && $('.common .low-stocks').length > 0) {
            tip.show('所选商品中含有库存不足的商品');
            return false;
        }
    } else if ('advance' === cartType) {
        if (!isSelect && $('.presell .low-stocks').length > 0) {
            tip.show('所选商品中含有库存不足的商品');
            return false;
        }
    }

    bottomCheckBoxHandeler(isSelect, cartType, didUpdateAllGoodsCheckStatus);
});

$('.down').on('touchend', function() {
    chosePanel.show();
});