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; } });