Untitled
unknown
plain_text
2 years ago
17 kB
9
Indexable
define([
'jquery',
'mage/translate',
'Magento_Ui/js/modal/modal'
], function ($, $t, modal) {
'use strict';
$.widget('magepow.ajaxcart', {
options: {
processStart: null,
processStop : null,
bindSubmit : true,
countDown : 0,
showLoader : true,
minicartSelector: '[data-block="minicart"]',
messagesSelector: '[data-placeholder="messages"]',
productStatusSelector: '.stock.available',
addToCartButtonSelector: '.action.tocart',
addAllToCartButtonSelector: '.add-all-tocart',
addToCartButtonDisabledClass: 'disabled',
addToCartButtonTextWhileAdding: '',
addToCartButtonTextAdded: '',
addToCartButtonTextDefault: '',
addUrl: '',
quickview: false,
isProductView: false,
isSuggestPopup: false,
quickViewUrl: ''
},
productIdInputName: ["product", "product-id", "data-product-id", "data-product"],
_create: function () {
this._initAjaxcart();
window.ajaxCart = this;
$('body').on('ajaxcart:refresh', function () {
window.ajaxCart._initAjaxcart();
});
},
_initAjaxcart: function () {
var options = this.options;
var self = this;
self.addAllToCart();
self.element.on("click", options.addToCartButtonSelector, function(e){
if($(this).attr('data-post')) return;// turn off add to cart for wishlist in category page
var form = $(this).parents('form').get(0);
if($(form).hasClass('reorder')) return;// turn off the recently ordered sidebar in category page
e.preventDefault();
var form = $(this).parents('form').get(0);
var data = '';
if (form) {
var isValid = true;
if (options.isProductView || $('body').hasClass('open-quickview')) {
try {
isValid = $(form).valid();
} catch(err) {
isValid = true;
}
}
if (isValid) {
var oldAction = $(form).attr('action');
var serialize = $(form).serialize();
var id = self._findId(this, oldAction, form);
if ($.isNumeric(id)) {
data += 'id=' + id;
if (serialize == '') {
$(form).find('input, select').each(function () {
data += "&" + $(this).attr('name') + "=" + $(this).val();
});
} else {
data += "&" + serialize;
}
if (options.quickview) {
window.parent.ajaxCart._sendAjax(options.addUrl, data, oldAction, form);
return false;
}
self._sendAjax(options.addUrl, data, oldAction, form);
return false;
}
window.location.href = oldAction;
}
} else {
var dataPost = $.parseJSON($(this).attr('data-post'));
if (dataPost) {
var formKey = $("input[name='form_key']").val();
var oldAction = dataPost.action;
data += 'id=' + dataPost.data.product + '&product=' + dataPost.data.product + '&form_key=' + formKey + '&uenc=' + dataPost.data.uenc;
self._sendAjax(options.addUrl, data, oldAction);
return false;
} else {
var id = self._findId(this);
if (id) {
e.stopImmediatePropagation();
self.quickview(options.quickViewUrl + 'id/' + id);
return false;
}
}
}
});
},
_findId: function (btn, oldAction, form) {
var self = this;
var id = $(btn).attr('data-product-id');
if($.isNumeric(id)) return id;
var item = $(btn).closest('li.product-item');
id = $(item).find('[data-product-id]').attr('data-product-id');
if ($.isNumeric(id)) return id;
if (oldAction) {
var formData = oldAction.split('/');
for (var i = 0; i < formData.length; i++) {
if (self.productIdInputName.indexOf(formData[i]) >= 0) {
if ($.isNumeric(formData[i + 1])) {
id = formData[i + 1];
}
}
}
if ($.isNumeric(id)) return id;
}
if (form) {
$(form).find('input').each(function () {
if (self.productIdInputName.indexOf($(this).attr('name')) >= 0) {
if ($.isNumeric($(this).val())) {
id = $(this).val();
}
}
});
if ($.isNumeric(id)) return id;
}
var priceBox = $(btn).closest('.price-box.price-final_price');
id = $(priceBox).attr('data-product-id');
if ($.isNumeric(id)) return id;
return false;
},
_sendAjax: function (addUrl, data, oldAction, form=false) {
var body = $('body');
var options = this.options;
var self = this;
if(form){
self.disableAddToCartButton(form);
data = new FormData(form);
}
$.ajax({
type: 'post',
url: addUrl,
data: data,
showLoader: options.showLoader,
dataType: 'json',
cache: false,
contentType: false,
processData: false,
success: function (data) {
if(!$('#modals_ajaxcart').length) body.append('<div id="modals_ajaxcart" style="display:none"></div>');
var _qsModal = $('#modals_ajaxcart');
if (data.popup) {
self._showPopup(_qsModal, '<div class="content-ajaxcart">' + data.popup + '</div>');
} else if (data.error && data.view) {
/*show Quick View*/
var quickView = true;
if(form){
var addToCartButtonMain = $(form).closest('#product_addtocart_form');
if(addToCartButtonMain.length) quickView = false;
}
if(quickView && data.error_info.search("not available") == -1){
if ($.fn.quickview) {
$.fn.quickview({url:options.quickViewUrl + 'id/' + data['id']});
} else {
self.quickview({url:options.quickViewUrl + 'id/' + data['id']});
}
} else {
self._showPopup(_qsModal, data.error_info);
}
}
if(form) self.enableAddToCartButton(form);
},
error: function () {
window.location.href = oldAction;
}
});
},
_showPopup: function (_qsModal, data) {
var body = $('body');
self = this;
_qsModal.html(data);
if(!body.hasClass('open-ajaxcart')){
self._closePopup();
body.addClass('open-ajaxcart');
var modals = body.find('.modals-ajaxcart');
if(!modals.length){
modal({
type: 'popup',
modalClass: 'modals-ajaxcart',
responsive: true,
innerScroll: true,
buttons: false,
closed: function(){
body.removeClass('open-ajaxcart');
}
}, _qsModal);
}
_qsModal.modal('openModal');
_qsModal.trigger('contentUpdated');
}
_qsModal.find('.btn-continue').on('click', function() {
self._closePopup();
});
/*Show count down*/
this._showCountdown();
},
_closePopup: function(){
var $body = $('body');
$body.removeClass('open-minicart-modal open-ajaxcart open-quickview _has-modal');
$body.find('.modal-popup:not(.popup-authentication, .customer-popup-ajaxwishlist), .modals-overlay').remove();
$body.find('.modal-popup .action-close').trigger('click');
clearInterval(window.ajaxcart_countdown);
},
_showCountdown: function () {
self = this;
var options = this.options;
var countDown = options.countDown;
if(countDown > 0) {
window.ajaxcart_countdown = setInterval(function () {
countDown -= 1;
$('.content-ajaxcart span.countdown').text("(" + countDown + ")");
if (countDown <= 0) {
self._closePopup();
}
}, 1000);
}
},
/**
* @param {String} form
*/
disableAddToCartButton: function (form) {
var addToCartButtonTextWhileAdding = this.options.addToCartButtonTextWhileAdding || $t('Adding...'),
addToCartButton = $(form).find(this.options.addToCartButtonSelector);
addToCartButton.addClass(this.options.addToCartButtonDisabledClass);
addToCartButton.find('span').text(addToCartButtonTextWhileAdding);
addToCartButton.attr('title', addToCartButtonTextWhileAdding);
},
/**
* @param {String} form
*/
enableAddToCartButton: function (form) {
var addToCartButtonTextAdded = this.options.addToCartButtonTextAdded || $t('Added'),
self = this,
addToCartButton = $(form).find(this.options.addToCartButtonSelector);
addToCartButton.find('span').text(addToCartButtonTextAdded);
addToCartButton.attr('title', addToCartButtonTextAdded);
setTimeout(function () {
var addToCartButtonTextDefault = self.options.addToCartButtonTextDefault || $t('Add to Cart');
addToCartButton.removeClass(self.options.addToCartButtonDisabledClass);
addToCartButton.find('span').text(addToCartButtonTextDefault);
addToCartButton.attr('title', addToCartButtonTextDefault);
}, 1000);
},
quickview: function () {
var obj = arguments[0];
var body = $('body');
if(!$('#modals_quickview').length) body.append('<div id="modals_quickview" style="display:none"></div>');
var _qsModal = $('#modals_quickview');
var quickajax= function(url){
$.ajax({
url:url,
type:'POST',
showLoader: true,
cache:false,
success:function(data){
_qsModal.html('<div class="content-quickview">' + data + '</div>');
if(!body.hasClass('open-quickview')){
body.addClass('open-quickview');
var modalsQuickview = body.find('.modals-quickview');
if(!modalsQuickview.length){
modal({
type: 'popup',
modalClass: 'modals-quickview',
responsive: true,
innerScroll: true,
buttons: false,
closed: function(){
body.removeClass('open-quickview');
}
}, _qsModal);
}
_qsModal.modal('openModal');
}
_qsModal.trigger('contentUpdated');
}
});
_qsModal.on('fotorama:load', function(){
_qsModal.find(".product-view .product-info-main.product-shop").height(_qsModal.find(".product-img-box").height());
});
}
if(obj.url){
quickajax(obj.url)
} else {
$(document).on('click', obj.itemClass, function(e) {
e.preventDefault();
quickajax($(this).data('url'))
});
}
},
addAllToCart: function() {
var self = this;
var options = this.options;
$(document).on("click", options.addAllToCartButtonSelector, function(e){
var searchIds = $("input[name='product']").map(function(){return $(this).val();}).get();
$.ajax({
url: options.addUrl + 'index/allcart',
type: 'POST',
showLoader: true,
cache: false,
dataType: 'json',
data: {productIds : searchIds.join()},
success: function (data) {
var _qsModalContent = '<div class="content-ajaxcart">quickview placeholder</div>';
if(!$('#modals_ajaxcart').length){
$(document.body).append('<div id="modals_ajaxcart" style="display:none">' + _qsModalContent + '</div>');
}
var _qsModal = $('#modals_ajaxcart .content-ajaxcart');
if (data.error) {
window.location.replace(options.addUrl +'#scroll');
}else{
if (data.popup) {
self._showPopup(_qsModal, _qsModalContent, data.popup);
}
}
}
});
})
}
});
return $.magepow.ajaxcart;
});
Editor is loading...
Leave a Comment