wickes-css2 2.103.0-RG-1658-apply-dynamic-logic-gift-card.1 → 2.103.0-develop.1

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 +3 -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 +258 -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 -144
  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 -144
  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,258 @@
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
+ },
217
+ getBannerPriority(banner) {
218
+ if ($(banner).hasClass(Wick.BannerPlacementManager.classes.sponsorProducts)) {
219
+ return 1;
220
+ }
221
+ if ($(banner).hasClass(Wick.BannerPlacementManager.classes.sponsorBanners)) {
222
+ return 2;
223
+ }
224
+ return 3;
225
+ },
226
+ dispatchSponsorAdsDisplayedEvent() {
227
+ return new Promise((resolve, reject) => {
228
+ const eventDetail = { resolve, reject };
229
+ const sponsorAdsEvent = createEvent(Wick.BannerPlacementManager.SPONSOR_BANNERS_DISPLAYED_EVENT, { displayed: true }, eventDetail);
230
+ window.dispatchEvent(sponsorAdsEvent);
231
+ });
232
+ },
233
+ init() {
234
+ Wick.Responsive.onResize(function () {
235
+ if(Wick.BannerPlacementManager.currentBreakpoint !== Wick.Responsive.getCurrentBreakpoint()) {
236
+ Wick.BannerPlacementManager.currentBreakpoint = Wick.Responsive.getCurrentBreakpoint()
237
+ Wick.BannerPlacementManager.checkProductsInColumn();
238
+
239
+ if (
240
+ !Wick.BannerPlacementManager.isEventSent && $(Wick.BannerPlacementManager.el.sponsoredAdvBanners).length
241
+ ) {
242
+ Wick.BannerPlacementManager.dispatchSponsorAdsDisplayedEvent();
243
+ Wick.BannerPlacementManager.isEventSent = true;
244
+ }
245
+
246
+ $(window).trigger('productBannerPositionChanged');
247
+ }
248
+ });
249
+ }
250
+ };
251
+
252
+ $(document).ready(function () {
253
+ if (!Wick.BannerPlacementManager.getBannersAmount() || !Wick.BannerPlacementManager.getProductsAmount()) {
254
+ return;
255
+ }
256
+
257
+ Wick.BannerPlacementManager.init();
258
+ })
@@ -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
- }
@@ -22,10 +22,14 @@
22
22
  {{/block}}
23
23
  <a id="skip-to-content"></a>
24
24
  <main {{#if fullWidth}}class="full-width-content"{{/if}}>
25
+ <div class="globalMessages">
26
+ <div class="container">
27
+ {{#block "notification"}}{{/block}}
28
+ </div>
29
+ </div>
25
30
  <div class="container">
26
31
  <div class="row">
27
32
  {{#block "steps"}}{{/block}}
28
- {{#block "notification"}}{{/block}}
29
33
  <div class="content">
30
34
  {{#block "main"}}{{/block}}
31
35
  </div>