123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 |
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- define([
- 'jquery',
- 'Magento_Customer/js/model/authentication-popup',
- 'Magento_Customer/js/customer-data',
- 'Magento_Ui/js/modal/alert',
- 'Magento_Ui/js/modal/confirm',
- 'underscore',
- 'jquery/ui',
- 'mage/decorate',
- 'mage/collapsible',
- 'mage/cookies'
- ], function ($, authenticationPopup, customerData, alert, confirm, _) {
- 'use strict';
- $.widget('mage.sidebar', {
- options: {
- isRecursive: true,
- minicart: {
- maxItemsVisible: 3
- }
- },
- scrollHeight: 0,
- shoppingCartUrl: window.checkout.shoppingCartUrl,
- /**
- * Create sidebar.
- * @private
- */
- _create: function () {
- this._initContent();
- },
- /**
- * Update sidebar block.
- */
- update: function () {
- $(this.options.targetElement).trigger('contentUpdated');
- this._calcHeight();
- this._isOverflowed();
- },
- /**
- * @private
- */
- _initContent: function () {
- var self = this,
- events = {};
- this.element.decorate('list', this.options.isRecursive);
- /**
- * @param {jQuery.Event} event
- */
- events['click ' + this.options.button.close] = function (event) {
- event.stopPropagation();
- $(self.options.targetElement).dropdownDialog('close');
- };
- events['click ' + this.options.button.checkout] = $.proxy(function () {
- var cart = customerData.get('cart'),
- customer = customerData.get('customer'),
- element = $(this.options.button.checkout);
- if (!customer().firstname && cart().isGuestCheckoutAllowed === false) {
- // set URL for redirect on successful login/registration. It's postprocessed on backend.
- $.cookie('login_redirect', this.options.url.checkout);
- if (this.options.url.isRedirectRequired) {
- element.prop('disabled', true);
- location.href = this.options.url.loginUrl;
- } else {
- authenticationPopup.showModal();
- }
- return false;
- }
- element.prop('disabled', true);
- location.href = this.options.url.checkout;
- }, this);
- /**
- * @param {jQuery.Event} event
- */
- events['click ' + this.options.button.remove] = function (event) {
- event.stopPropagation();
- confirm({
- content: self.options.confirmMessage,
- actions: {
- /** @inheritdoc */
- confirm: function () {
- self._removeItem($(event.currentTarget));
- },
- /** @inheritdoc */
- always: function (e) {
- e.stopImmediatePropagation();
- }
- }
- });
- };
- /**
- * @param {jQuery.Event} event
- */
- events['keyup ' + this.options.item.qty] = function (event) {
- self._showItemButton($(event.target));
- };
- /**
- * @param {jQuery.Event} event
- */
- events['change ' + this.options.item.qty] = function (event) {
- self._showItemButton($(event.target));
- };
- /**
- * @param {jQuery.Event} event
- */
- events['click ' + this.options.item.button] = function (event) {
- event.stopPropagation();
- self._updateItemQty($(event.currentTarget));
- };
- /**
- * @param {jQuery.Event} event
- */
- events['focusout ' + this.options.item.qty] = function (event) {
- self._validateQty($(event.currentTarget));
- };
- this._on(this.element, events);
- this._calcHeight();
- this._isOverflowed();
- },
- /**
- * Add 'overflowed' class to minicart items wrapper element
- *
- * @private
- */
- _isOverflowed: function () {
- var list = $(this.options.minicart.list),
- cssOverflowClass = 'overflowed';
- if (this.scrollHeight > list.innerHeight()) {
- list.parent().addClass(cssOverflowClass);
- } else {
- list.parent().removeClass(cssOverflowClass);
- }
- },
- /**
- * @param {HTMLElement} elem
- * @private
- */
- _showItemButton: function (elem) {
- var itemId = elem.data('cart-item'),
- itemQty = elem.data('item-qty');
- if (this._isValidQty(itemQty, elem.val())) {
- $('#update-cart-item-' + itemId).show('fade', 300);
- } else if (elem.val() == 0) { //eslint-disable-line eqeqeq
- this._hideItemButton(elem);
- } else {
- this._hideItemButton(elem);
- }
- },
- /**
- * @param {*} origin - origin qty. 'data-item-qty' attribute.
- * @param {*} changed - new qty.
- * @returns {Boolean}
- * @private
- */
- _isValidQty: function (origin, changed) {
- return origin != changed && //eslint-disable-line eqeqeq
- changed.length > 0 &&
- changed - 0 == changed && //eslint-disable-line eqeqeq
- changed - 0 > 0;
- },
- /**
- * @param {Object} elem
- * @private
- */
- _validateQty: function (elem) {
- var itemQty = elem.data('item-qty');
- if (!this._isValidQty(itemQty, elem.val())) {
- elem.val(itemQty);
- }
- },
- /**
- * @param {HTMLElement} elem
- * @private
- */
- _hideItemButton: function (elem) {
- var itemId = elem.data('cart-item');
- $('#update-cart-item-' + itemId).hide('fade', 300);
- },
- /**
- * @param {HTMLElement} elem
- * @private
- */
- _updateItemQty: function (elem) {
- var itemId = elem.data('cart-item');
- this._ajax(this.options.url.update, {
- 'item_id': itemId,
- 'item_qty': $('#cart-item-' + itemId + '-qty').val()
- }, elem, this._updateItemQtyAfter);
- },
- /**
- * Update content after update qty
- *
- * @param {HTMLElement} elem
- */
- _updateItemQtyAfter: function (elem) {
- var productData = this._getProductById(Number(elem.data('cart-item')));
- if (!_.isUndefined(productData)) {
- $(document).trigger('ajax:updateCartItemQty');
- if (window.location.href === this.shoppingCartUrl) {
- window.location.reload(false);
- }
- }
- this._hideItemButton(elem);
- },
- /**
- * @param {HTMLElement} elem
- * @private
- */
- _removeItem: function (elem) {
- var itemId = elem.data('cart-item');
- this._ajax(this.options.url.remove, {
- 'item_id': itemId
- }, elem, this._removeItemAfter);
- },
- /**
- * Update content after item remove
- *
- * @param {Object} elem
- * @private
- */
- _removeItemAfter: function (elem) {
- var productData = this._getProductById(Number(elem.data('cart-item')));
- if (!_.isUndefined(productData)) {
- $(document).trigger('ajax:removeFromCart', {
- productIds: [productData['product_id']]
- });
- }
- },
- /**
- * Retrieves product data by Id.
- *
- * @param {Number} productId - product Id
- * @returns {Object|undefined}
- * @private
- */
- _getProductById: function (productId) {
- return _.find(customerData.get('cart')().items, function (item) {
- return productId === Number(item['item_id']);
- });
- },
- /**
- * @param {String} url - ajax url
- * @param {Object} data - post data for ajax call
- * @param {Object} elem - element that initiated the event
- * @param {Function} callback - callback method to execute after AJAX success
- */
- _ajax: function (url, data, elem, callback) {
- $.extend(data, {
- 'form_key': $.mage.cookies.get('form_key')
- });
- $.ajax({
- url: url,
- data: data,
- type: 'post',
- dataType: 'json',
- context: this,
- /** @inheritdoc */
- beforeSend: function () {
- elem.attr('disabled', 'disabled');
- },
- /** @inheritdoc */
- complete: function () {
- elem.attr('disabled', null);
- }
- })
- .done(function (response) {
- var msg;
- if (response.success) {
- callback.call(this, elem, response);
- } else {
- msg = response['error_message'];
- if (msg) {
- alert({
- content: msg
- });
- }
- }
- })
- .fail(function (error) {
- console.log(JSON.stringify(error));
- });
- },
- /**
- * Calculate height of minicart list
- *
- * @private
- */
- _calcHeight: function () {
- var self = this,
- height = 0,
- counter = this.options.minicart.maxItemsVisible,
- target = $(this.options.minicart.list),
- outerHeight;
- self.scrollHeight = 0;
- target.children().each(function () {
- if ($(this).find('.options').length > 0) {
- $(this).collapsible();
- }
- outerHeight = $(this).outerHeight();
- if (counter-- > 0) {
- height += outerHeight;
- }
- self.scrollHeight += outerHeight;
- });
- target.parent().height(height);
- }
- });
- return $.mage.sidebar;
- });
|