define([
'jquery',
'mage/translate',
'underscore',
'Magento_Catalog/js/product/view/product-ids-resolver',
'ko',
'mage/url',
'Magento_Ui/js/modal/modal',
'jquery-ui-modules/widget'
], function ($, $t, _, idsResolver, ko, $url, modal) {
'use strict';
return function (widget) {
$.widget('mage.catalogAddToCart', widget, {
options: {
processStart: null,
processStop: null,
bindSubmit: true,
minicartSelector: '[data-block="minicart"]',
messagesSelector: '[data-placeholder="messages"]',
productStatusSelector: '.stock.available',
addToCartButtonSelector: '.action.tocart',
addToCartButtonDisabledClass: 'disabled',
addToCartButtonTextWhileAdding: '',
addToCartButtonTextAdded: '',
addToCartButtonTextDefault: ''
},
/** @inheritdoc */
_create: function () {
if (this.options.bindSubmit) {
this._bindSubmit();
}
},
/**
* @private
*/
_bindSubmit: function () {
var self = this;
if (this.element.data('catalog-addtocart-initialized')) {
return;
}
this.element.data('catalog-addtocart-initialized', 1);
this.element.on('submit', function (e) {
e.preventDefault();
self.submitForm($(this));
});
},
/**
* @private
*/
_redirect: function (url) {
var urlParts, locationParts, forceReload;
urlParts = url.split('#');
locationParts = window.location.href.split('#');
forceReload = urlParts[0] === locationParts[0];
window.location.assign(url);
if (forceReload) {
window.location.reload();
}
},
/**
* @return {Boolean}
*/
isLoaderEnabled: function () {
return this.options.processStart && this.options.processStop;
},
/**
* Handler for the form 'submit' event
*
* @param {jQuery} form
*/
submitForm: function (form) {
this.ajaxSubmit(form);
},
/**
* @param {jQuery} form
*/
ajaxSubmit: function (form) {
var self = this,
productIds = idsResolver(form),
productInfo = self.options.productInfoResolver(form),
formData;
self.disableAddToCartButton(form);
formData = new FormData(form[0]);
$.ajax({
url: form.attr('action'),
data: formData,
type: 'post',
dataType: 'json',
cache: false,
contentType: false,
processData: false,
/** @inheritdoc */
beforeSend: function () {
// $('.loading-mask').show();
console.log('modal widget mixin ajaxSubmit beforeSend');
//$('[data-block=\'minicart\']').trigger('processStart');
if (self.isLoaderEnabled()) {
//$('body').trigger(self.options.processStart);
}
// $('span .counter.qty').addClass('loading-mask').show();
var ves = ".actions-secondary", num = 0;
$(".fotorama__active").each(function(index) {
ves = ".fotorama__stage__frame.fotorama__active.fotorama_vertical_ratio.fotorama__loaded.fotorama__loaded--img";
num++;
});
if(num){
$("
", {
"class": "add-prod",
"id": form.data().productSku,
"text": "Producto agregado al carro"
}).insertBefore(ves).hide();
}else{
$('#'+form.data().productSku)
.text('Producto agregado al carro')
.addClass('add-prod').hide();
}
},
/** @inheritdoc */
success: function (res) {
var eventData, parameters;
$(document).trigger('ajax:addToCart', {
'sku': form.data().productSku,
'productIds': productIds,
'productInfo': productInfo,
'form': form,
'response': res
});
if (self.isLoaderEnabled()) {
$('body').trigger(self.options.processStop);
}
if (res.backUrl) {
eventData = {
'form': form,
'redirectParameters': []
};
// trigger global event, so other modules will be able add parameters to redirect url
$('body').trigger('catalogCategoryAddToCartRedirect', eventData);
if (eventData.redirectParameters.length > 0 &&
window.location.href.split(/[?#]/)[0] === res.backUrl
) {
parameters = res.backUrl.split('#');
parameters.push(eventData.redirectParameters.join('&'));
res.backUrl = parameters.join('#');
}
self._redirect(res.backUrl);
return;
}else{
$('#'+form.data().productSku).slideDown();
}
if(typeof rrApi != "undefined" ){
self.addToBasket(form);
}
if (res.messages) {
self.modalAddToCart(form);
$(self.options.messagesSelector).html(res.messages);
}
if (res.minicart) {
$(self.options.minicartSelector).replaceWith(res.minicart);
$(self.options.minicartSelector).trigger('contentUpdated');
}
if (res.product && res.product.statusText) {
$(self.options.productStatusSelector)
.removeClass('available')
.addClass('unavailable')
.find('span')
.html(res.product.statusText);
}
self.enableAddToCartButton(form);
try {
$(self.options.minicartSelector).find('[data-trigger=minicart-content]').click();
}
catch (e){
console.error(e);
}
},
/** @inheritdoc */
error: function (res) {
$(document).trigger('ajax:addToCart:error', {
'sku': form.data().productSku,
'productIds': productIds,
'productInfo': productInfo,
'form': form,
'response': res
});
},
/** @inheritdoc */
complete: function (res) {
$('#'+form.data().productSku).fadeOut(1500);
$(self.options.minicartSelector).trigger('processStop');
setTimeout(function(){
$("#"+form.data().productSku)
.removeClass('add-prod')
.text('');
}, 4500);
if (res.state() === 'rejected' ) {
location.reload();
}
}
});
},
addToBasket: ($form) => {
let productId, swatches, product = _.findWhere($form.serializeArray(), {
name: 'product'
});
if (_.isUndefined(product)) {
return;
}
productId = product.value;
swatches = $('.swatch-opt-' + productId + ',#product_addtocart_form .swatch-opt');
if (swatches.length === 0) {
rrApi.addToBasket(productId);
} else {
rrApi.addToBasket(swatches.data('mage-SwatchRenderer').getProduct());
}
},
/**
* @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('Buy');
addToCartButton.removeClass(self.options.addToCartButtonDisabledClass);
addToCartButton.find('span').text(addToCartButtonTextDefault);
addToCartButton.attr('title', addToCartButtonTextDefault);
}, 2000);
},
/**
* @param {String} form
*/
modalAddToCart: function (form) {
let modal_option={
type: 'popup',
modalClass: 'confirm',
title: $.mage.__("ATENCIÓN"),
buttons: [{
text: 'ACEPTAR',
class: 'action-primary',
click: function () {
this.closeModal();
}}]
};
let popup_content = $('
La cantidad solicitada no esta disponible para los siguientes artÃculos.
');
let popup = modal(modal_option, popup_content);
popup.openModal();
}
});
return $.mage.catalogAddToCart;
}
});