Authored by ccbikai(👎🏻🍜)

Merge remote-tracking branch 'origin/release/5.4.1' into gray

/**
* 购物车Logic
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2015/10/20
*/
var $ = require('yoho-jquery'),
ellipsis = require('yoho-mlellipsis'),
Hammer = require('yoho-hammer');
var chosePanel = require('./chose-panel'),
dialog = require('../plugin/dialog'),
loading = require('../plugin/loading'),
tip = require('../plugin/tip');
var $cartContent = $('.cart-content'),
cartType = $('#cartType').val(),
$cartNav = $('.cart-nav'),
$cartPage = $('.shopping-cart-page'),
hasShowCartPresellTip = false;
var navHammer,
advanceBuyHammer,
freebieHammer,
switchChose = false;
var isRefreshByDelete = window.cookie('_yoho-cart-refreshByDelete') === 'true' ? true : false;
var lowStockCount = 0;
// cookie 参数
var actCkOpthn = {
expires: 'Session',
path: '/cart/index',
domain: 'm.yohobuy.com'
};
loading.showLoadingMask();
function needLoadRecommandForYou() {
return window.isCookiesEnabled() ?
$('.cart-goods').length <= 0 && !isRefreshByDelete :
$('.cart-goods').length <= 0;
}
if (needLoadRecommandForYou()) {
require('../product/recommend-for-you');
} else {
if (isRefreshByDelete) {
$('body').css('background-color', '#f0f0f0');
}
require('./good');
}
$cartPage.css('display', 'block');
loading.hideLoadingMask();
window.setCookie('_yoho-cart-refreshByDelete', false);
ellipsis.init();
function cartContentShow() {
return $cartContent.not('.hide');
}
function mlellipsisHiddenNames() {
cartContentShow().find('.shopping-cart-good .name').each(function() {
this.mlellipsis(2);
});
switchChose = true;
}
function hasChecked() {
return cartContentShow().find('.cart-goods .icon-cb-checked').length > 0 ? true : false;
}
function shouldSelectGift() {
var $freebie = cartContentShow().find('.freebie');
if ($freebie.length <= 0) {
return false;
}
return true;
}
function shouldLowStocks() {
var $lowStocks,
result = false;
if (cartType === 'ordinary') {
$lowStocks = $('.common .low-stocks');
} else if (cartType === 'advance') {
$lowStocks = $('.presell .low-stocks');
}
if ($lowStocks.length <= 0) {
return result;
}
$lowStocks.each(function(idx, item) {
if ($(item).parent().parent().parent().siblings('.checkbox').hasClass('icon-cb-checked')) {
lowStockCount += 1;
result = true;
}
});
return result;
}
function showChooseGifDialog() {
dialog.showDialog({
dialogText: '您还未选择赠品,是否去选择赠品',
hasFooter: {
leftBtnText: '我不要赠品',
rightBtnText: '去选择'
}
}, function() {
window.location.href = cartContentShow().find('.freebie > a').attr('href');
}, function() {
var info = window.cookie('order-info');
if (info) {
window.setCookie('order-info', '', actCkOpthn);
}
window.location.href = '/cart/index/orderEnsure?cartType=' + cartType;
});
}
if (typeof window.cookie === 'function' && window.cookie('_hasShowCartPresellTip') === 'y') {
$('#presell-tip').removeClass('show').addClass('hide');
hasShowCartPresellTip = true;
} else {
$('#presell-tip').removeClass('hide').addClass('show');
}
if (cartType === 'advance') {
$cartContent.toggleClass('hide');
$('#common-cart-nav').removeClass('active');
$('#presell-cart-nav').addClass('active');
mlellipsisHiddenNames();
$(window).trigger('scroll');
}
if ($cartNav.length > 0) {
navHammer = new Hammer(document.getElementsByClassName('cart-nav')[0]);
navHammer.on('tap', function(e) {
var $this = $(e.target).closest('li');
if ($this.hasClass('active')) {
return;
}
if (cartType === 'ordinary') {
cartType = 'advance';
$('#cartType').val('advance');
} else {
cartType = 'ordinary';
$('#cartType').val('ordinary');
}
$this.siblings('.active').removeClass('active');
$this.addClass('active');
// 切换普通商品和预售商品购物车显示
$cartContent.toggleClass('hide');
if (switchChose === false) {
mlellipsisHiddenNames();
}
// trigger lazyload
$(window).trigger('scroll');
});
if (!hasShowCartPresellTip) {
setTimeout(function() {
$('#presell-tip').removeClass('show').addClass('hide');
window.setCookie('_hasShowCartPresellTip', 'y');
}, 3000);
}
}
if ($('.advance-buy').length > 0) {
advanceBuyHammer = new Hammer(document.getElementsByClassName('advance-buy')[0]);
advanceBuyHammer.on('tap', function() {
window.location.href = '/cart/index/advanceBuy?cartType=' + cartType;
});
}
if ($('.freebie').length > 0) {
freebieHammer = new Hammer(document.getElementsByClassName('freebie')[0]);
freebieHammer.on('tap', function() {
window.location.href = '/cart/index/gift?cartType=' + cartType;
});
}
$('.btn-balance').on('touchend', function() {
var info = window.cookie('order-info');
lowStockCount = 0;
if (shouldLowStocks()) {
tip.show('所选商品中有' + lowStockCount + '种库存不足的商品');
return false;
}
if (shouldSelectGift()) {
showChooseGifDialog();
return false;
}
if (hasChecked()) {
if (info) {
window.setCookie('order-info', '', actCkOpthn);
}
window.location.href = '/cart/index/orderEnsure?cartType=' + cartType;
} else {
tip.show('请先勾选商品');
}
});
$('.off-shell-goods').on('touchstart touchend', function(e) {
var $this = $(e.target).closest('span');
if ($this.hasClass('icon-del')) {
return;
}
tip.show('商品已下架');
return false;
});
$('.chose').on('touchend', function() {
chosePanel.show();
});
$cartNav.on('touchstart', 'li', function() {
$(this).addClass('bytouch');
}).on('touchend touchcancel', function() {
$cartNav.find('li').removeClass('bytouch');
});
// 提前触发lazyload
$(window).scrollTop(1).scrollTop(0);
/**
* 购物车商品
* @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);
e.stopPropagation();
dialog.showDialog({
dialogText: '您确定要从购物车中删除吗?',
hasFooter: {
leftBtnText: '取消',
rightBtnText: '确定'
}
}, function() {
var $shoppingCartGood = $this.closest('.shopping-cart-good'),
count = $this.data('count');
$.ajax({
method: 'post',
url: '/cart/index/del',
data: {
sku: $shoppingCartGood.data('id'),
count: count,
promotionId: $shoppingCartGood.data('promotion')
}
}).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.hasPromotion = $(good).data('promotion');
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 (cartType === 'ordinary') {
if (!isSelect && $('.common .low-stocks').length > 0) {
tip.show('所选商品中含有库存不足的商品');
return false;
}
} else if (cartType === 'advance') {
if (!isSelect && $('.presell .low-stocks').length > 0) {
tip.show('所选商品中含有库存不足的商品');
return false;
}
}
bottomCheckBoxHandeler(isSelect, cartType, didUpdateAllGoodsCheckStatus);
});
$('.down').on('touchend', function() {
chosePanel.show();
});
... ... @@ -48,9 +48,7 @@ var invoiceCont = {
// cookie 参数
var actCkOpthn = {
expires: 'Session',
path: '/cart/index',
domain: 'm.yohobuy.com'
path: '/cart/index'
};
lazyLoad();
... ...