layer.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /**
  2. * Copyright ? 2016 Mageplaza. All rights reserved.
  3. * See https://www.mageplaza.com/LICENSE.txt for license details.
  4. */
  5. define([
  6. 'jquery',
  7. 'jquery/ui',
  8. 'productListToolbarForm'
  9. ], function ($) {
  10. "use strict";
  11. $.widget('mageplaza.layer', {
  12. options: {
  13. productsListSelector: '#layer-product-list',
  14. navigationSelector: '#layered-filter-block'
  15. },
  16. _create: function () {
  17. this.initProductListUrl();
  18. this.initObserve();
  19. this.initLoading();
  20. },
  21. initProductListUrl: function () {
  22. var self = this;
  23. $.mage.productListToolbarForm.prototype.changeUrl = function (paramName, paramValue, defaultValue) {
  24. var urlPaths = this.options.url.split('?'),
  25. baseUrl = urlPaths[0],
  26. urlParams = urlPaths[1] ? urlPaths[1].split('&') : [],
  27. paramData = {},
  28. parameters;
  29. for (var i = 0; i < urlParams.length; i++) {
  30. parameters = urlParams[i].split('=');
  31. paramData[parameters[0]] = parameters[1] !== undefined
  32. ? window.decodeURIComponent(parameters[1].replace(/\+/g, '%20'))
  33. : '';
  34. }
  35. paramData[paramName] = paramValue;
  36. if (paramValue == defaultValue) {
  37. delete paramData[paramName];
  38. }
  39. paramData = $.param(paramData);
  40. self.ajaxSubmit(baseUrl + (paramData.length ? '?' + paramData : ''));
  41. }
  42. },
  43. initObserve: function () {
  44. var self = this;
  45. var aElements = this.element.find('a');
  46. aElements.each(function (index) {
  47. var el = $(this);
  48. var link = self.checkUrl(el.prop('href'));
  49. if(!link) return;
  50. el.off('click').on('click', function (e) {
  51. if (el.hasClass('swatch-option-link-layered')) {
  52. var childEl = el.find('.swatch-option');
  53. childEl.addClass('selected');
  54. } else {
  55. var checkboxEl = el.find('input[type=checkbox]');
  56. checkboxEl.prop('checked', !checkboxEl.prop('checked'));
  57. }
  58. self.ajaxSubmit(link);
  59. e.stopPropagation();
  60. e.preventDefault();
  61. });
  62. var checkbox = el.find('input[type=checkbox]');
  63. checkbox.off('click').on('click', function (e) {
  64. self.ajaxSubmit(link);
  65. e.stopPropagation();
  66. });
  67. });
  68. $(".filter-current a").off('click').on('click', function (e) {
  69. var link = self.checkUrl($(this).prop('href'));
  70. if(!link) return;
  71. self.ajaxSubmit(link);
  72. e.stopPropagation();
  73. e.preventDefault();
  74. });
  75. $(".filter-actions a").off('click').on('click', function (e) {
  76. var link = self.checkUrl($(this).prop('href'));
  77. if(!link) return;
  78. self.ajaxSubmit(link);
  79. e.stopPropagation();
  80. e.preventDefault();
  81. });
  82. },
  83. checkUrl: function (url) {
  84. var regex = /(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/;
  85. return regex.test(url) ? url : null;
  86. },
  87. initLoading: function () {
  88. },
  89. ajaxSubmit: function (submitUrl) {
  90. var self = this;
  91. $.ajax({
  92. url: submitUrl,
  93. data: {isAjax: 1},
  94. type: 'post',
  95. dataType: 'json',
  96. beforeSend: function () {
  97. $('.ln_overlay').show();
  98. if (typeof window.history.pushState === 'function') {
  99. window.history.pushState({url: submitUrl}, '', submitUrl);
  100. }
  101. },
  102. success: function (res) {
  103. if (res.backUrl) {
  104. window.location = res.backUrl;
  105. return;
  106. }
  107. if (res.navigation) {
  108. $(self.options.navigationSelector).replaceWith(res.navigation);
  109. $(self.options.navigationSelector).trigger('contentUpdated');
  110. }
  111. if (res.products) {
  112. $(self.options.productsListSelector).replaceWith(res.products);
  113. $(self.options.productsListSelector).trigger('contentUpdated');
  114. }
  115. $('.ln_overlay').hide();
  116. },
  117. error: function () {
  118. window.location.reload();
  119. }
  120. });
  121. }
  122. });
  123. return $.mageplaza.layer;
  124. });