cart.js 9.44 KB
/**
 * [购物车] 购物袋
 * @author: jinhu.dong<jinhu.dong@yoho.cn>
 * @date: 2016/07/08
 * @module shopping/cart
 */

var Dialog = require('../../plugins/dialog');
var JSON = require('yoho-json2');
var _confirm = Dialog.Confirm;
var _alert = Dialog.Alert;
var Util = require('./util');
var hbs = require('yoho-handlebars');
var common = require('../../common');
var Stepper = require('./cart/stepper');

var Cart = {
    /*
     * 添加到购物车
     * @function [addToCart]
     * @params { String } productSku 购买商品Sku码
     * @params { Number } buyNumber 购买商品数量
     * @params { Function } callback 购买结果回调
     */
    addToCart: function(params, callback) {
        // TODO
        common.setCookie('uid', '20000058');
        Util.ajax({
            url: '/shopping/cart/add',
            type: 'POST',
            data: params,
            success: function(res) {
                if (res.code === 200) {
                    common.setCookie('_SPK', res.data.shopping_key);
                    if (callback) {
                        return callback(res);
                    }
                }
            },
            fail: function() {
                // TODO
                console.log('add to cart error');
            }
        });
    },

    /*
     * 显示商品库存不足提示
     * @function [toggleNotEnough]
     * @params { Object } target 提示显示在目标DOM对象
     * @params { String } type 显示全选提示还是单个商品提示
     */
    toggleNotEnough: function(target, type) {
        var msg = '您勾选的商品库存不足',
            allKlass = '',
            tooltip;

        if (type === 'ALL') {
            msg = '您全选的商品中存在库存不足商品,已帮您自动取消勾选';
            allKlass = 'all';
        }

        tooltip = $('<div class="tooltip">' +
            '<div class="content ' + allKlass + '">' + msg + '</div>' +
            '<div class="indicator"></div>' +
          '</div>');

        tooltip.appendTo(target);

        setTimeout(function() {
            tooltip.remove();
        }, 2000);
    },

    /*
     * 全选
     * @function [checkAllPros]
     * @params {Array} invalidIds 失效商品ID
     */
    checkAllPros: function(invalidIds) {
        var proId,
            target;

        $('.toggle-chk-item').each(function() {
            target = $(this);
            proId = target.parent().attr('data-productId');
            if (invalidIds.indexOf(proId) === -1) {
                target.addClass('chk-group').next().val(proId);
            }
        });
    },

    /*
     * 取消全选
     * @function [unCheckAllPros]
     */
    unCheckAllPros: function() {
        var target;

        $('.toggle-chk-item').each(function() {
            target = $(this);
            target.next().val('');
        });
    },

    /*
     *  取消全选样式,选择商品数量没有达到
     *  @function [resetCheckAllStyle]
     */
    resetCheckAllStyle: function() {
        $('.chk-all').removeClass('chk-group');
    },

    /*
     *  根据服务端JSON,刷新购物车信息
     *  @function [refreshCart]
     */
    refreshCart: function(data) {
        var template;

        hbs.registerHelper('multiple', function(num1, num2) {
            num1 = typeof num1 === 'number' ? num1 : parseFloat(num1, 10);
            num2 = typeof num2 === 'number' ? num2 : parseFloat(num2, 10);

            if (num1 && num2) {
                return num1 * num2;
            } else {
                console.error('multiplication needs two number parameters');
            }
        });

        hbs.registerHelper('isEqual', function(v1, v2, options) {
            if (v1 === v2) {
                return options.fn(this);
            }
            return options.inverse(this);
        });

        hbs.registerHelper('image', function(url, width, height, mode) {
            mode = parseInt(mode, 10) ? mode : 2;
            url = url || '';
            return url.replace(/{width}/g, width).replace(/{height}/g, height).replace(/{mode}/g, mode);
        });

        template = hbs.compile($('#cart-content-tpl').html());
        $('#cart_content').html(template(data));

        Stepper.init();
    },

    /*
     *  选择与取消选择
     *  @function [toggleSelectGoods]
     */
    toggleSelectGoods: function(data) {
        $.ajax({
            type: 'POST',
            url: '/shopping/cart/toggleSelectGoods',
            data: {skuList: JSON.stringify(data)},
            dataType: 'json'
        }).done(function(res) {
            if (res.code === 200) {
                Cart.refreshCart(res);
            } else {
                _alert(res.message);
            }
        }).fail(function() {

        });
    },

    /*
     *  单选每一个商品判断是否需要全选
     *  @function [toggleCheckAll]
     */
    toggleCheck: function(target) {
        var $this = $(target),
            $checkoutBtn = $('#checkout_btn'),
            checkAll = $this.hasClass('chk-all');

        var goodInfo;
        var data = [];

        if ($this.hasClass('chk-group')) {
            // 取消选择
            $this.removeClass('chk-group');
            $checkoutBtn.addClass('disable');

            if (checkAll) {
                Cart.unCheckAllPros();

                // TODO
            } else {
                // TODO
                Cart.resetCheckAllStyle();

                // $this.next().val('');
                // data.push($this.parent().attr('data-product_info'));
                console.log($this.parent().attr('data-product_info'));

                // console.log($.parseJSON($this.parent().attr('data-product_info')))
                goodInfo = $.parseJSON($this.parent().attr('data-product_info'));
                goodInfo.selected = 'N';
                data.push(goodInfo);
                Cart.toggleSelectGoods(data);
            }
        } else {
            // 选择
            if (checkAll) {
                data = { productId: 'ALL' };

                // TODO
            } else {
                console.log($this.parent().attr('data-product_info'));

                // console.log($.parseJSON($this.parent().attr('data-product_info')))
                goodInfo = $.parseJSON($this.parent().attr('data-product_info'));
                goodInfo.selected = 'Y';
                data.push(goodInfo);
                Cart.toggleSelectGoods(data);
            }
        }
    },

    /*
     *  删除商品
     *  @function [removePro]
     *  @params { String } productId 商品ID
     */
    removePro: function(productId) {
        var dialog = new _confirm({
            content: '您确定要从购物车中删除该商品吗?',
            cb: function() {
                console.log('confirm:', productId);
                Util.ajax({
                    url: '/shopping/cart/product/' + productId,
                    type: 'DELETE',
                    success: function(res) {
                        if (res.code === '0') {
                            dialog.close();
                        }
                    },
                    fail: function() {
                        // TODO
                    }
                });
            }
        }).show();
    },

    // 移入收藏夹
    sendToFavorite: function(productId) {
        var dialog = new _confirm({
            content: '确定要将该商品从购物车中移入收藏吗?<br/>移入收藏后该商品将不在购物车中显示',
            cb: function() {
                console.log('confirm:', productId);
                Util.ajax({
                    url: '/shopping/cart/product/' + productId + '/send_to_favorite',
                    type: 'POST',
                    success: function(res) {
                        if (res.code === '0') {
                            dialog.close();
                        }
                    },
                    fail: function() {
                        // TODO
                    }
                });
            }
        }).show();
    },

    // 编辑商品的颜色和尺寸
    editColorOrSize: function(productId) {
        var template;

        Util.ajax({
            url: '/shopping/cart/product/' + productId + '/edit',
            success: function(res) {
                if (res.code === '0') {

                    hbs.registerHelper('isEqual', function(v1, v2, options) {
                        if (v1 === v2) {
                            return options.fn(this);
                        }
                        return options.inverse(this);
                    });

                    hbs.registerHelper('image', function(url, width, height, mode) {
                        mode = parseInt(mode, 10) ? mode : 2;
                        url = url || '';
                        return url.replace(/{width}/g, width).replace(/{height}/g, height).replace(/{mode}/g, mode);
                    });

                    template = hbs.compile($('#edit-color-size-tpl').html());

                    $('#edit_' + productId).append(
                        template({
                            colors: res.colors,
                            sizes: res.sizes,
                            defaultColor: res.defaultColor,
                            defaultSize: res.defaultSize,
                            defaultImg: res.defaultImg
                        })
                    );
                }
            },
            fail: function() {
                _alert('此商品无法编辑颜色和尺寸').show();
            }
        });

    }
};

module.exports = Cart;