wickes-css2 2.103.0-RG-1764-gift-card-amount-applied-is-incorrect-formatted.1 → 2.103.0-develop.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/Readme.md +2 -1
  2. package/build/css/components/card-product-banner.css +1 -1
  3. package/build/css/components/checkout-payment-details-v2.css +1 -1
  4. package/build/css/main.css +1 -1
  5. package/build/css/pages/page_checkout_delivery-new.css +1 -1
  6. package/build/css/pages/page_products-list-combined.css +1 -1
  7. package/build/css/pages/page_products-list.css +1 -1
  8. package/build/css/plp-main.css +1 -1
  9. package/build/js/account-members.min.js +1 -1
  10. package/build/js/add-project-list-id.min.js +1 -1
  11. package/build/js/address-book.min.js +1 -1
  12. package/build/js/basket.min.js +2 -2
  13. package/build/js/bundle.min.js +1 -1
  14. package/build/js/change-password.min.js +1 -1
  15. package/build/js/checkout.min.js +2 -2
  16. package/build/js/emulation.min.js +70 -268
  17. package/build/js/general.bundle.min.js +1 -1
  18. package/build/js/merged-checkout.min.js +2 -2
  19. package/build/js/page/components/order-summary.js +25 -42
  20. package/build/js/page/plp-cards-v2.js +15 -6
  21. package/build/js/page/plp-load-more.js +1 -1
  22. package/build/js/page/utils/validation.js +1 -46
  23. package/build/js/pdp.bundle.min.js +1 -1
  24. package/build/js/personal-details.min.js +1 -1
  25. package/build/js/plp.bundle.min.js +1 -1
  26. package/build/js/project-list.min.js +1 -44
  27. package/build/js/quiz.min.js +1 -1
  28. package/build/js/track-my-order.min.js +1 -1
  29. package/package.json +2 -2
  30. package/src/components/card_product_v2.hbs +10 -5
  31. package/src/components/card_sponsor_banner.hbs +8 -0
  32. package/src/components/card_sponsor_product.hbs +6 -0
  33. package/src/components/checkout-payment-details-v2.hbs +2 -3
  34. package/src/components/injected-content.hbs +1 -1
  35. package/src/data/data_search-results_v2.json +56 -141
  36. package/src/elements/form-row.hbs +1 -1
  37. package/src/elements/input.hbs +2 -31
  38. package/src/js/components/banner-placement-manager.js +267 -0
  39. package/src/js/components/general/notification.js +1 -2
  40. package/src/js/components/toggle-password-visibility.js +58 -0
  41. package/src/js/emulation/banner-placement-manager.js +53 -0
  42. package/src/js/emulation/checkout-payment-details.js +14 -23
  43. package/src/js/emulation/forms.js +2 -7
  44. package/src/js/page/components/order-summary.js +25 -42
  45. package/src/js/page/plp-cards-v2.js +15 -6
  46. package/src/js/page/plp-load-more.js +1 -1
  47. package/src/js/page/utils/validation.js +1 -46
  48. package/src/layouts/checkout.hbs +5 -1
  49. package/src/page_my-account_change-password.html +0 -1
  50. package/src/page_payment-details-with-gift-card.html +4 -7
  51. package/src/page_plp_v2.html +16 -6
  52. package/src/page_search-results.html +12 -2
  53. package/src/scss/components/card-product-banner.scss +91 -3
  54. package/src/scss/components/checkout-payment-details-v2.scss +0 -2
  55. package/src/scss/pages/page_checkout_delivery-new.scss +0 -26
  56. package/src/scss/pages/page_products-list-combined.scss +11 -0
  57. package/src/scss/pages/page_products-list.scss +8 -0
  58. package/build/img/giftcard.svg +0 -28
  59. package/build/js/gift-cards.min.js +0 -1
  60. package/build/js/page/components/gift-cards.js +0 -877
  61. package/build/js/page/components/toggle-password-visibility.js +0 -22
  62. package/build/js/page/utils/gift-cards-utils.js +0 -151
  63. package/build/js/page/utils/input-handling.js +0 -92
  64. package/build/js/page/utils/show-hide-input.js +0 -28
  65. package/build/js/toggle-password-visibility.min.js +0 -1
  66. package/src/components/gift-cards-hint.hbs +0 -9
  67. package/src/components/gift-cards.hbs +0 -90
  68. package/src/components/giftcard-chip.hbs +0 -23
  69. package/src/components/giftcard-summary.hbs +0 -6
  70. package/src/img/giftcard.svg +0 -28
  71. package/src/js/components/product-banner.js +0 -148
  72. package/src/js/emulation/checkout-data.js +0 -35
  73. package/src/js/emulation/gift-cards.js +0 -201
  74. package/src/js/page/components/gift-cards.js +0 -877
  75. package/src/js/page/components/toggle-password-visibility.js +0 -22
  76. package/src/js/page/utils/gift-cards-utils.js +0 -151
  77. package/src/js/page/utils/input-handling.js +0 -92
  78. package/src/js/page/utils/show-hide-input.js +0 -28
  79. package/src/scss/components/_gift-cards.scss +0 -361
@@ -0,0 +1,267 @@
1
+ var Wick = Wick || {};
2
+ Wick.BannerPlacementManager = {
3
+ SPONSOR_BANNERS_DISPLAYED_EVENT: 'sponsorAdsDisplayedEvent',
4
+ el: {
5
+ banners: '.card-product-banner',
6
+ sponsorBanners: '.card-sponsor-banner',
7
+ sponsorProducts: '.card-sponsor-product',
8
+ allBanners: '.card-product-banner, .card-sponsor-banner, .card-sponsor-product',
9
+ productCard: '.product-card',
10
+ allListSlots: '.product-card, .card-product-banner, .card-sponsor-banner, .card-sponsor-product',
11
+ productsWrap: '.products-list-v2',
12
+ $products: $('.product-card'),
13
+ attrPositionDesktop: 'data-desktop-position',
14
+ attrPositionMobile: 'data-mobile-position',
15
+ attrRequiredAmountDesktop: 'data-required-amount-desktop',
16
+ attrRequiredAmountMobile: 'data-required-amount-mobile',
17
+ hide: 'd-none',
18
+ sponsoredAdvBanners: '.sponsored-ad'
19
+ },
20
+ classes: {
21
+ sponsorBanners: 'card-sponsor-banner',
22
+ sponsorProducts: 'card-sponsor-product',
23
+ productBanners: 'card-product-banner',
24
+ bannerInactiveClass: 'card-product-banner--inactive'
25
+ },
26
+ isEventSent: false,
27
+ currentBreakpoint: null,
28
+ checkProductsInColumn() {
29
+ Wick.BannerPlacementManager.addInactiveClasses();
30
+ Wick.BannerPlacementManager.arrangeBannersInRightOrder();
31
+ const $allBanners = $(Wick.BannerPlacementManager.el.allBanners);
32
+ const totalProducts = Wick.BannerPlacementManager.getListLength();
33
+ const totalSlots = totalProducts + $allBanners.length;
34
+ $allBanners.each((index, banner) => {
35
+ const bannerPosition = Wick.BannerPlacementManager.getBannerPosition(banner);
36
+
37
+ if ($(banner).hasClass('card-product-banner')) {
38
+ if (bannerPosition > totalSlots) {
39
+ Wick.BannerPlacementManager.hideBanner(banner);
40
+ $(Wick.BannerPlacementManager.el.productsWrap).append(banner);
41
+ return;
42
+ }
43
+ }
44
+
45
+ if ($(banner).hasClass(Wick.BannerPlacementManager.classes.sponsorBanners) || $(banner).hasClass(Wick.BannerPlacementManager.classes.sponsorProducts)) {
46
+ if (bannerPosition > totalProducts) {
47
+ Wick.BannerPlacementManager.showBanner(banner);
48
+ Wick.BannerPlacementManager.removeInactiveClass(banner);
49
+ $(Wick.BannerPlacementManager.el.productsWrap).append(banner);
50
+ return;
51
+ }
52
+ }
53
+
54
+ Wick.BannerPlacementManager.hideBannerDueLimit(banner, index);
55
+ Wick.BannerPlacementManager.moveBannerToSpecifiedPosition(banner);
56
+ });
57
+ },
58
+ moveBannerToSpecifiedPosition(banner) {
59
+ const $listSlots = Wick.BannerPlacementManager.getListSlots();
60
+ const bannerPosition = Wick.BannerPlacementManager.getBannerPosition(banner) - 2;
61
+ const listSlotsLength = $listSlots.length;
62
+
63
+ if (Wick.BannerPlacementManager.isBannerVisible(banner)) {
64
+ if (bannerPosition <= listSlotsLength) {
65
+ if ($listSlots[bannerPosition]) {
66
+ Wick.BannerPlacementManager.showBanner(banner);
67
+ Wick.BannerPlacementManager.removeInactiveClass(banner);
68
+ Wick.BannerPlacementManager.moveBanner(banner, $listSlots[bannerPosition]);
69
+ } else {
70
+ Wick.BannerPlacementManager.hideBanner(banner);
71
+ Wick.BannerPlacementManager.coverEdgeCases(banner);
72
+ }
73
+ } else {
74
+ if ($(banner).hasClass(Wick.BannerPlacementManager.classes.sponsorBanners) || $(banner).hasClass(Wick.BannerPlacementManager.classes.sponsorProducts)) {
75
+ Wick.BannerPlacementManager.showBanner(banner);
76
+ Wick.BannerPlacementManager.removeInactiveClass(banner);
77
+ $(Wick.BannerPlacementManager.el.productsWrap).append(banner);
78
+ } else {
79
+ Wick.BannerPlacementManager.hideBanner(banner);
80
+ }
81
+ }
82
+ }
83
+ },
84
+ moveBanner(banner, targetElement) {
85
+ $(banner).remove();
86
+ $(targetElement).after(banner);
87
+ },
88
+ hideBanner(banner) {
89
+ $(banner).addClass(Wick.BannerPlacementManager.el.hide);
90
+ },
91
+ showBanner(banner) {
92
+ $(banner).removeClass(Wick.BannerPlacementManager.el.hide);
93
+ },
94
+ isBannerVisible(banner) {
95
+ return !$(banner).hasClass(Wick.BannerPlacementManager.el.hide);
96
+ },
97
+ hideBannerDueLimit(banner) {
98
+ const bannerMinLimit = Wick.BannerPlacementManager.getBannerLimit(banner) - 1;
99
+ const $listSlots = Wick.BannerPlacementManager.getListSlots();
100
+ const listProductsLength = $listSlots.length;
101
+ Wick.BannerPlacementManager.showBanner(banner);
102
+
103
+ if (bannerMinLimit > listProductsLength) {
104
+ Wick.BannerPlacementManager.hideBanner(banner);
105
+ }
106
+ },
107
+ getBannerPosition(banner) {
108
+ const isMobile = Wick.BannerPlacementManager.isMobileResolution();
109
+ const positionAttribute = isMobile
110
+ ? Wick.BannerPlacementManager.el.attrPositionMobile
111
+ : Wick.BannerPlacementManager.el.attrPositionDesktop
112
+
113
+ return banner.hasAttribute(positionAttribute)
114
+ ? Number(banner.getAttribute(positionAttribute))
115
+ : Number(Wick.BannerPlacementManager.getListLength() + Wick.BannerPlacementManager.getBannersAmount());
116
+ },
117
+ getBannerLimit(banner) {
118
+ const isMobile = Wick.BannerPlacementManager.isMobileResolution();
119
+
120
+ const limitAttribute = isMobile
121
+ ? Wick.BannerPlacementManager.el.attrRequiredAmountMobile
122
+ : Wick.BannerPlacementManager.el.attrRequiredAmountDesktop;
123
+
124
+ return banner.hasAttribute(limitAttribute)
125
+ ? Number(banner.getAttribute(limitAttribute))
126
+ : 0;
127
+ },
128
+ isMobileResolution() {
129
+ return Wick.Responsive.getCurrentBreakpoint() !== 'up-lg';
130
+ },
131
+ getListLength() {
132
+ const $listItems = $(Wick.BannerPlacementManager.el.productsWrap).children(Wick.BannerPlacementManager.el.productCard);
133
+ return $listItems.length;
134
+ },
135
+ getBannersAmount() {
136
+ return $(Wick.BannerPlacementManager.el.allBanners).length;
137
+ },
138
+ getProductsAmount() {
139
+ return Wick.BannerPlacementManager.el.$products.length;
140
+ },
141
+ arrangeBannersInRightOrder() {
142
+ const $allBanners = $(Wick.BannerPlacementManager.el.allBanners);
143
+
144
+ const sponsorProducts = $allBanners.filter((i, el) =>
145
+ $(el).hasClass(Wick.BannerPlacementManager.classes.sponsorProducts)
146
+ );
147
+ const sponsorBanners = $allBanners.filter((i, el) =>
148
+ $(el).hasClass(Wick.BannerPlacementManager.classes.sponsorBanners)
149
+ );
150
+
151
+ const firstSponsorProductPos = sponsorProducts.length > 0
152
+ ? Math.min(...sponsorProducts.map((i, el) => Wick.BannerPlacementManager.getBannerPosition(el)).get())
153
+ : Infinity;
154
+ const firstSponsorBannerPos = sponsorBanners.length > 0
155
+ ? Math.min(...sponsorBanners.map((i, el) => Wick.BannerPlacementManager.getBannerPosition(el)).get())
156
+ : Infinity;
157
+
158
+ let groupOrder;
159
+ if (firstSponsorProductPos < firstSponsorBannerPos) {
160
+ groupOrder = [
161
+ Wick.BannerPlacementManager.classes.sponsorProducts,
162
+ Wick.BannerPlacementManager.classes.sponsorBanners,
163
+ Wick.BannerPlacementManager.classes.productBanners
164
+ ];
165
+ } else {
166
+ groupOrder = [
167
+ Wick.BannerPlacementManager.classes.sponsorBanners,
168
+ Wick.BannerPlacementManager.classes.sponsorProducts,
169
+ Wick.BannerPlacementManager.classes.productBanners
170
+ ];
171
+ }
172
+
173
+ $allBanners.sort((a, b) => {
174
+ function getGroupIndex(el) {
175
+ if ($(el).hasClass(groupOrder[0])) return 0;
176
+ if ($(el).hasClass(groupOrder[1])) return 1;
177
+ if ($(el).hasClass(groupOrder[2])) return 2;
178
+ return 3;
179
+ }
180
+
181
+ const groupA = getGroupIndex(a);
182
+ const groupB = getGroupIndex(b);
183
+
184
+ if (groupA !== groupB) {
185
+ return groupA - groupB;
186
+ }
187
+
188
+ const positionA = Wick.BannerPlacementManager.getBannerPosition(a);
189
+ const positionB = Wick.BannerPlacementManager.getBannerPosition(b);
190
+
191
+ return positionA - positionB;
192
+ }).appendTo(Wick.BannerPlacementManager.el.productsWrap);
193
+ },
194
+ addInactiveClasses() {
195
+ $(Wick.BannerPlacementManager.el.allBanners).addClass(Wick.BannerPlacementManager.el.hide);
196
+ },
197
+ removeInactiveClass(banner) {
198
+ $(banner).removeClass(Wick.BannerPlacementManager.classes.bannerInactiveClass)
199
+ },
200
+ insertFirstBanner(banner) {
201
+ const bannerPosition = Wick.BannerPlacementManager.getBannerPosition(banner);
202
+
203
+ if (bannerPosition === 1) {
204
+ Wick.BannerPlacementManager.showBanner(banner);
205
+ Wick.BannerPlacementManager.removeInactiveClass(banner);
206
+ $(banner).remove();
207
+ $(Wick.BannerPlacementManager.el.productsWrap).prepend(banner);
208
+ }
209
+ },
210
+ coverEdgeCases(banner) {
211
+ Wick.BannerPlacementManager.insertFirstBanner(banner);
212
+ },
213
+ getListSlots() {
214
+ return $(Wick.BannerPlacementManager.el.productsWrap)
215
+ .children(Wick.BannerPlacementManager.el.allListSlots)
216
+ .filter(function() {
217
+ if ($(this).hasClass(Wick.BannerPlacementManager.classes.productBanners)) {
218
+ const position = Wick.BannerPlacementManager.getBannerPosition(this);
219
+ const productsCount = Wick.BannerPlacementManager.getListLength();
220
+ return position <= productsCount;
221
+ }
222
+
223
+ return true;
224
+ });
225
+ },
226
+ getBannerPriority(banner) {
227
+ if ($(banner).hasClass(Wick.BannerPlacementManager.classes.sponsorProducts)) {
228
+ return 1;
229
+ }
230
+ if ($(banner).hasClass(Wick.BannerPlacementManager.classes.sponsorBanners)) {
231
+ return 2;
232
+ }
233
+ return 3;
234
+ },
235
+ dispatchSponsorAdsDisplayedEvent() {
236
+ return new Promise((resolve, reject) => {
237
+ const eventDetail = { resolve, reject };
238
+ const sponsorAdsEvent = createEvent(Wick.BannerPlacementManager.SPONSOR_BANNERS_DISPLAYED_EVENT, { displayed: true }, eventDetail);
239
+ window.dispatchEvent(sponsorAdsEvent);
240
+ });
241
+ },
242
+ init() {
243
+ Wick.Responsive.onResize(function () {
244
+ if(Wick.BannerPlacementManager.currentBreakpoint !== Wick.Responsive.getCurrentBreakpoint()) {
245
+ Wick.BannerPlacementManager.currentBreakpoint = Wick.Responsive.getCurrentBreakpoint()
246
+ Wick.BannerPlacementManager.checkProductsInColumn();
247
+
248
+ if (
249
+ !Wick.BannerPlacementManager.isEventSent && $(Wick.BannerPlacementManager.el.sponsoredAdvBanners).length
250
+ ) {
251
+ Wick.BannerPlacementManager.dispatchSponsorAdsDisplayedEvent();
252
+ Wick.BannerPlacementManager.isEventSent = true;
253
+ }
254
+
255
+ $(window).trigger('productBannerPositionChanged');
256
+ }
257
+ });
258
+ }
259
+ };
260
+
261
+ $(document).ready(function () {
262
+ if (!Wick.BannerPlacementManager.getBannersAmount() || !Wick.BannerPlacementManager.getProductsAmount()) {
263
+ return;
264
+ }
265
+
266
+ Wick.BannerPlacementManager.init();
267
+ })
@@ -4,14 +4,13 @@ Wick.Notification = (function(){
4
4
  var self = this,
5
5
  iconSuccess = '<span class="icon notification__icon"><span class="fas fa-check-circle"></span></span>',
6
6
  iconWarning = '<span class="icon notification__icon"><span class="fas fa-exclamation-circle"></span></span>',
7
- iconError = '<span class="icon notification__icon"><span class="fas fa-times-circle"></span></span>',
8
7
  closeBtn = '<span class="icon notification__close"><span class="far fa-times"></span></span>';
9
8
 
10
9
  this.$self = $('<div/>', {
11
10
  'class': 'notification notification_general notification_' + params.type,
12
11
  html: params.text
13
12
  })
14
- .prepend(params.type === 'success' ? iconSuccess : params.type === 'warning' ? iconWarning : params.type === 'error' ? iconError : '')
13
+ .prepend(params.type === 'success' ? iconSuccess : params.type === 'warning' ? iconWarning : params.type === 'error' ? iconWarning : '')
15
14
  .prepend(params.closeBtn ? closeBtn : '')
16
15
  .prependTo(params.container);
17
16
 
@@ -0,0 +1,58 @@
1
+ var Wick = window.Wick || {};
2
+
3
+ Wick.TogglePasswordVisibility = {
4
+ el: {
5
+ $toggleShow: $('[data-show-content] .toggle-show'),
6
+ inputWrap: $('.form-row[data-show-content] .input-wrap'),
7
+ toggleIcon: '.toggle-show',
8
+ },
9
+
10
+ updateIconVisibility(inputField, toggleIcon) {
11
+ const valueLength = inputField.val().length;
12
+ if (valueLength > 0) {
13
+ toggleIcon.show();
14
+ } else {
15
+ toggleIcon.hide();
16
+ }
17
+ },
18
+
19
+ attachInputListener(inputField, toggleIcon) {
20
+ inputField.on('input', function () {
21
+ Wick.TogglePasswordVisibility.updateIconVisibility($(this), toggleIcon);
22
+ });
23
+ },
24
+
25
+ attachToggleClickListener(inputField, toggleIcon) {
26
+ toggleIcon.on('click', function () {
27
+ const isPasswordType = inputField.attr('type') === 'password';
28
+ const iconSvg = $(this).find('svg');
29
+
30
+ if (isPasswordType) {
31
+ inputField.attr('type', 'text');
32
+ iconSvg.removeClass('fa-eye-slash').addClass('fa-eye');
33
+ } else {
34
+ inputField.attr('type', 'password');
35
+ iconSvg.removeClass('fa-eye').addClass('fa-eye-slash');
36
+ }
37
+ });
38
+ },
39
+
40
+ init() {
41
+ Wick.TogglePasswordVisibility.el.inputWrap.each(function () {
42
+ const inputField = $(this).find('input');
43
+ const toggleIcon = $(this).find(Wick.TogglePasswordVisibility.el.toggleIcon);
44
+
45
+ Wick.TogglePasswordVisibility.attachInputListener(inputField, toggleIcon);
46
+ Wick.TogglePasswordVisibility.updateIconVisibility(inputField, toggleIcon);
47
+ Wick.TogglePasswordVisibility.attachToggleClickListener(inputField, toggleIcon);
48
+ });
49
+ },
50
+ };
51
+
52
+ $(document).ready(function () {
53
+ if (!Wick.TogglePasswordVisibility.el.$toggleShow.length) {
54
+ return;
55
+ }
56
+
57
+ Wick.TogglePasswordVisibility.init();
58
+ });
@@ -0,0 +1,53 @@
1
+ // Simulate prompt for input
2
+ function getInputs() {
3
+ const productBannerPositions = prompt("Enter Product Banner Positions:", "2") || "";
4
+ const sponsorProductPositions = prompt("Enter Sponsor Product Positions (comma-separated):", "6,7,8") || "";
5
+ const sponsorBannerPositions = prompt("Enter Sponsor Banner Positions:", "10") || "";
6
+
7
+ return {
8
+ productBannerPositions: productBannerPositions ? productBannerPositions.split(",").map(Number) : [],
9
+ sponsorProductPositions: sponsorProductPositions ? sponsorProductPositions.split(",").map(Number) : [],
10
+ sponsorBannerPositions: sponsorBannerPositions ? sponsorBannerPositions.split(",").map(Number) : [],
11
+ };
12
+ }
13
+
14
+ function getPositionAttr() {
15
+ const isMobile = Wick.BannerPlacementManager.isMobileResolution();
16
+ return isMobile
17
+ ? 'data-mobile-position'
18
+ : 'data-desktop-position';
19
+ }
20
+
21
+ function updatePositions(inputs) {
22
+ const productBannerElements = document.querySelectorAll(".card-product-banner");
23
+ productBannerElements.forEach((el, index) => {
24
+ if (inputs.productBannerPositions[index] !== undefined) {
25
+ el.setAttribute(getPositionAttr(), inputs.productBannerPositions[index]);
26
+ }
27
+ });
28
+
29
+ const sponsorProductElements = document.querySelectorAll(".card-sponsor-product");
30
+ sponsorProductElements.forEach((el, index) => {
31
+ if (inputs.sponsorProductPositions[index] !== undefined) {
32
+ el.setAttribute(getPositionAttr(), inputs.sponsorProductPositions[index]);
33
+ }
34
+ });
35
+
36
+ const sponsorBannerElements = document.querySelectorAll(".card-sponsor-banner");
37
+ sponsorBannerElements.forEach((el, index) => {
38
+ if (inputs.sponsorBannerPositions[index] !== undefined) {
39
+ el.setAttribute(getPositionAttr(), inputs.sponsorBannerPositions[index]);
40
+ }
41
+ });
42
+ }
43
+
44
+ function init() {
45
+ const inputs = getInputs();
46
+ updatePositions(inputs);
47
+ }
48
+
49
+ $(document).ready(function () {
50
+ if ($('.retail-media .products-list.products-list-v2').length) {
51
+ setTimeout(() => init(), 100)
52
+ }
53
+ });
@@ -2,33 +2,24 @@ var Wick = Wick || {};
2
2
 
3
3
  Wick.PaymentDetails = (function () {
4
4
  var $btnEnterDetails = $('.btn-enter-details'),
5
+ $form = $btnEnterDetails.parents('form'),
5
6
  isGuestPage = $('.page_checkout-payment-details_guest').length;
6
7
 
7
8
  function bindEvents () {
8
- $btnEnterDetails.on('click', function (e) {
9
- e.preventDefault();
10
- var $scope = $(this).closest('form');
11
- if (!$scope.length) $scope = $(this).closest('.billing-address');
12
- if (!$scope.length) $scope = $('.billing-address');
13
- var nameVal= ($scope.find('#card-name').val() || '').trim();
14
- var finderVal= ($scope.find('#first-line-address').val() || '').trim();
15
- var manualLine1= ($scope.find('#address-line-1').val() || '').trim();
16
- var manualTown= ($scope.find('#town-city').val() || '').trim();
17
- var manualPost= ($scope.find('#postcode_additional').val() || '').trim();
18
- var addressFinderOk = finderVal.length > 0;
19
- var addressManualOk = manualLine1 && manualTown && manualPost;
20
-
21
- if (nameVal && (addressFinderOk || addressManualOk)) {
22
- var $details = $('.checkout-payment-details__card-details');
23
- $details.removeClass('checkout-payment-details__card-details_hidden');
24
- $('html, body').animate({ scrollTop: $details.offset().top - 15 }, 700);
25
- return;
26
- }
27
-
28
- var formEl = $scope.closest('form').get(0) || $scope.get(0);
29
- if (formEl && Wick.Forms && Wick.Forms.showValidationErrors) {
30
- Wick.Forms.showValidationErrors(formEl);
9
+ $btnEnterDetails.on('click', function(){
10
+ if ($form.find('#card-name').val().length &&
11
+ $form.find('#first-line-address').val().length &&
12
+ $form.find('#address-line-1').val().length &&
13
+ $form.find('#town-city').val().length &&
14
+ $form.find('#postcode_additional').val().length){
15
+ $('.checkout-payment-details__card-details').removeClass('checkout-payment-details__card-details_hidden');
16
+ $('html, body').animate({
17
+ scrollTop: $('.checkout-payment-details__card-details').offset().top - 15
18
+ }, 700);
19
+ return false;
31
20
  }
21
+ Wick.Forms.showValidationErrors($form[0]);
22
+ return false;
32
23
  });
33
24
 
34
25
  $('.checkout-payment-details__card-details').on('submit', function(){
@@ -60,16 +60,11 @@ Wick.Forms = (function(){
60
60
 
61
61
  var showValidationErrors = function (form, errorMsg) {
62
62
  var $form = $(form);
63
- var $rows = $form.find(fieldRow).not('[data-no-global-validation]');
64
- if (!$rows.length) return;
65
- $rows.find('.form-row__error').remove();
66
-
67
63
  if (!$form.hasClass(formInvalid)) {
68
- $form.addClass(formInvalid);
64
+ $form.find('.form-row__error').remove();
65
+ $form.addClass(formInvalid).find(fieldRow).append(validationError(errorMsg)).addClass(rowValidationError);
69
66
  }
70
67
 
71
- $rows.append(validationError(errorMsg)).addClass(rowValidationError);
72
-
73
68
  var $firstMsg = $form.find(fieldRow).first();
74
69
  if($firstMsg.length && !isElementInViewport($firstMsg)){
75
70
  var inModal = $firstMsg.closest('.modal').length,
@@ -13,46 +13,31 @@ const osEl = {
13
13
  }
14
14
 
15
15
  export function updateOrderSummary(data, equalMap, isVoucher) {
16
- equalMap.forEach((obj) => {
17
- if (typeof obj.dataValue === 'undefined') return;
18
-
19
- if ($(obj.item).length) {
20
- $(obj.item).show();
21
- } else {
22
- if ($(osEl.checkoutWidgetDetailsDiscount).length) {
23
- $(osEl.checkoutWidgetDetailsDiscount).before(createCheckoutWidgetItem(obj));
24
- } else {
25
- $(osEl.checkoutWidgetDetails).append(createCheckoutWidgetItem(obj));
26
- }
27
- }
16
+ equalMap.forEach((obj) => {
17
+ if ($(obj.item).length) {
18
+ $(obj.item).show();
19
+ } else {
20
+ if ($(osEl.checkoutWidgetDetailsDiscount).length) {
21
+ $(osEl.checkoutWidgetDetailsDiscount).before(createCheckoutWidgetItem(obj))
22
+ } else {
23
+ $(osEl.checkoutWidgetDetails).append(createCheckoutWidgetItem(obj))
24
+ }
25
+ }
28
26
 
29
- $(obj.item).find(obj.itemValue).text(obj.dataValue);
30
- if (isVoucher ? obj.dataValue : obj.value && obj.dataValue) {
31
- $(obj.item).find(obj.itemValue).show();
32
- } else {
33
- $(obj.item).hide();
34
- }
35
- });
27
+ $(obj.item).find(obj.itemValue).text(obj.dataValue);
28
+ if (isVoucher ? obj.dataValue : obj.value && obj.dataValue) {
29
+ $(obj.item).find(obj.itemValue).show();
30
+ } else {
31
+ $(obj.item).hide();
32
+ }
33
+ })
36
34
 
37
- const keys = new Set(Object.keys(data || {}));
38
- const hasAny = (...arr) => arr.some(k => keys.has(k));
35
+ const value = data.totalPrice?.formattedValue || data.total;
39
36
 
40
- const value = data.totalPrice?.formattedValue || data.total;
41
- if (typeof value !== 'undefined' && hasAny('total', 'totalPrice')) {
42
- updateSummaryMobileBarTotal(value);
43
- }
44
-
45
- if (hasAny('promotionsInfo')) {
46
37
  updateDiscount(data, isVoucher);
47
- }
48
-
49
- if (hasAny('deliveryOrder', 'clickAndCollectOrder', 'clickAndCollectOnly', 'deliveryItemsQuantity', 'pickupItemsQuantity')) {
50
38
  hideUnusedDeliveryTypeCost(data, isVoucher);
51
- }
52
-
53
- if (hasAny('freeDelivery', 'messageForFreeDelivery', 'clickAndCollectOnly')) {
54
39
  calculateFreeDelivery(data);
55
- }
40
+ updateSummaryMobileBarTotal(value);
56
41
  }
57
42
 
58
43
  function createCheckoutWidgetItem(obj) {
@@ -68,14 +53,12 @@ function hideUnusedDeliveryTypeCost(data, isVoucher) {
68
53
  $(osEl.delivery).show()
69
54
  $(osEl.cc).show()
70
55
  if (isVoucher) {
71
- if ('deliveryOrder' in data && data.deliveryOrder === false) {
72
- $(osEl.delivery).hide();
73
- }
74
-
75
- if ('clickAndCollectOrder' in data && data.clickAndCollectOrder === false) {
76
- $(osEl.cc).hide();
77
- }
78
- } else {
56
+ if (!data.deliveryOrder) {
57
+ $(osEl.delivery).hide()
58
+ } else if (!data.clickAndCollectOrder) {
59
+ $(osEl.cc).hide()
60
+ }
61
+ } else {
79
62
  if (data.clickAndCollectOnly) {
80
63
  $(osEl.delivery).hide()
81
64
  } else if (data.deliveryItemsQuantity > 0 && data.pickupItemsQuantity === 0) {
@@ -6,7 +6,9 @@ $(document).ready(function () {
6
6
  }
7
7
 
8
8
  function cardsContent(itemsInRow) {
9
- let card = $('.content .product-card, .content .card-product-banner');
9
+ let card = $('.content .product-card, .content .card-product-banner, .content .card-sponsor-banner, .content .card-sponsor-product').filter(function() {
10
+ return $(this).parents('.product-card, .card-product-banner, .card-sponsor-banner, .card-sponsor-product').length === 0;
11
+ });
10
12
  let priceSelectors = [
11
13
  '.including-vat .product-card__price__old-price',
12
14
  '.excluding-vat .product-card__price__old-price',
@@ -17,6 +19,7 @@ $(document).ready(function () {
17
19
  revealAll(card, ['.product-card__price__old-price',
18
20
  '.product-card__price-sqm',
19
21
  '.product-card__price-value',
22
+ '.product-card__sponsored',
20
23
  '.energy-efficiency',
21
24
  '.energy-efficiency__link']);
22
25
 
@@ -33,6 +36,8 @@ $(document).ready(function () {
33
36
  hideEmptiness(currentRow, '.product-card__price-sqm');
34
37
  }
35
38
  hideEmptiness(currentRow, '.product-card__price-value');
39
+ hideEmptiness(currentRow, '.product-card__sponsored');
40
+ hideEmptiness(currentRow, '.product-card__price__old-price');
36
41
  hideEmptiness(currentRow, '.energy-efficiency');
37
42
  hideEmptiness(currentRow, '.energy-efficiency__link');
38
43
 
@@ -43,11 +48,15 @@ $(document).ready(function () {
43
48
  function hideEmptiness(query, className) {
44
49
  let currentQuery = query.find(className);
45
50
  let rowContent = currentQuery.text();
46
-
47
- if (className === '.energy-efficiency') {
48
- let isEnergyQueryEmpty = isClassPresentInQuery(currentQuery, "energy-efficiency--empty");
49
-
50
- if (isEnergyQueryEmpty) {
51
+ const classEmptyCheckMap = {
52
+ '.energy-efficiency': 'energy-efficiency--empty',
53
+ '.product-card__sponsored': 'product-card__sponsored--empty',
54
+ '.product-card__price__old-price': 'product-card__price_empty'
55
+ };
56
+
57
+ if (classEmptyCheckMap[className]) {
58
+ let isClassEmpty = isClassPresentInQuery(currentQuery, classEmptyCheckMap[className]);
59
+ if (isClassEmpty) {
51
60
  currentQuery.hide();
52
61
  }
53
62
  return;
@@ -43,7 +43,7 @@ Wick.PLPLoadMore = {
43
43
  .finally(() => {
44
44
  hideLoader(Wick.PLPLoadMore.el.loader);
45
45
  Wick.PLPLoadMore.el.$loadMoreBtn.blur();
46
- Wick.ProductBanner.checkProductsInColumn();
46
+ Wick.BannerPlacementManager.checkProductsInColumn();
47
47
  $(window).trigger('productBannerPositionChanged');
48
48
  Wick.EnergyEfficiency.drawEnergyLabels();
49
49
  Wick.PLP?.bindEvents();
@@ -257,6 +257,7 @@ export function wrapWithError(element) {
257
257
 
258
258
  }
259
259
 
260
+
260
261
  export function addErrorMessage(element, errorMessage) {
261
262
  if (errorMessage) {
262
263
  $(element).append('<div class="form-row__error">' + errorMessage + '</div>');
@@ -315,49 +316,3 @@ export function validateGuidPattern (value) {
315
316
  export function validateUserFriendlyIdPattern (value) {
316
317
  return patterns.userFriendlyIdPattern.test(value);
317
318
  }
318
-
319
- export function showErrorText($input, message, fieldSelector, errorTextClass, errorClass, ariaInvalidAttr) {
320
- const $field = $input.closest(fieldSelector);
321
- $field.addClass(errorClass);
322
- $input.attr(ariaInvalidAttr, 'true');
323
-
324
- let $err = $field.find(errorTextClass);
325
- if (!$err.length) {
326
- $err = $(`<div class="${errorTextClass.slice(1)}" />`).appendTo($field);
327
- }
328
- $err.text(message);
329
- }
330
-
331
- export function clearErrorText($input, fieldSelector, errorTextClass, errorClass, ariaInvalidAttr) {
332
- const $field = $input.closest(fieldSelector);
333
- $field.removeClass(errorClass);
334
- $input.removeAttr(ariaInvalidAttr);
335
- $field.find(errorTextClass).remove();
336
- }
337
-
338
- function digitsOnly(value) {
339
- return String(value || '').replace(/\D/g, '');
340
- }
341
-
342
- function hasExactDigits(value, n) {
343
- return digitsOnly(value).length === Number(n);
344
- }
345
-
346
- function validateByPredicate($input, predicate, message, {
347
- fieldSelector,
348
- errorText: errorTextClass,
349
- fieldError: errorClass,
350
- ariaInvalidAttr,
351
- }) {
352
- const ok = !!predicate(String($input.val() || ''));
353
- if (!ok) {
354
- showErrorText($input, message, fieldSelector, errorTextClass, errorClass, ariaInvalidAttr);
355
- } else {
356
- clearErrorText($input, fieldSelector, errorTextClass, errorClass, ariaInvalidAttr);
357
- }
358
- return ok;
359
- }
360
-
361
- export function validateExactDigits($input, n, message, cfg) {
362
- return validateByPredicate($input, (v) => hasExactDigits(v, n), message, cfg);
363
- }