wickes-css2 2.117.0-develop.3 → 2.117.0-gift-cards.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 (102) hide show
  1. package/Readme.md +0 -1
  2. package/build/css/category-main.css +1 -1
  3. package/build/css/components/checkout-payment-details-v2.css +1 -1
  4. package/build/css/homepage-main.css +1 -1
  5. package/build/css/kitchen-plp-main.css +1 -1
  6. package/build/css/main.css +1 -1
  7. package/build/css/my-account-main-v2.css +1 -1
  8. package/build/css/my-account-main.css +1 -1
  9. package/build/css/pages/checkout-new.css +1 -1
  10. package/build/css/pages/checkout.css +1 -1
  11. package/build/css/pages/page_my-order.css +1 -1
  12. package/build/css/pages/page_wismo-details.css +1 -1
  13. package/build/css/pdp-main-before-combine.css +1 -1
  14. package/build/css/pdp-main-critical.css +1 -1
  15. package/build/css/pdp-main-non-critical.css +1 -1
  16. package/build/css/pdp-main.css +1 -1
  17. package/build/css/plp-main.css +1 -1
  18. package/build/css/store-locator-main.css +1 -1
  19. package/build/img/payment/checkout/giftcard.svg +28 -0
  20. package/build/img/payment/footer/giftcard.svg +28 -0
  21. package/build/js/account-members.min.js +1 -1
  22. package/build/js/add-project-list-id.min.js +1 -1
  23. package/build/js/address-book.min.js +1 -1
  24. package/build/js/basket.min.js +2 -2
  25. package/build/js/bundle.min.js +1 -1
  26. package/build/js/change-password.min.js +1 -1
  27. package/build/js/checkout.min.js +2 -2
  28. package/build/js/emulation.min.js +424 -82
  29. package/build/js/general.bundle.min.js +1 -1
  30. package/build/js/gift-cards.min.js +1 -1
  31. package/build/js/merged-checkout.min.js +2 -2
  32. package/build/js/page/bloomreach-widget/bloomreach-widget-core.js +1 -3
  33. package/build/js/page/checkout-payment-details.js +114 -10
  34. package/build/js/page/components/gift-cards.js +524 -115
  35. package/build/js/page/components/postcode-lookup/postcode-lookup-api.js +56 -0
  36. package/build/js/page/components/postcode-lookup/postcode-lookup-render.js +98 -0
  37. package/build/js/page/components/postcode-lookup/postcode-lookup-validation.js +81 -0
  38. package/build/js/page/components/postcode-lookup.js +503 -0
  39. package/build/js/page/ripple/bulk-add.js +2 -2
  40. package/build/js/page/ripple/thumb-gallery.js +14 -8
  41. package/build/js/page/utils/address-utils.js +32 -0
  42. package/build/js/page/utils/validation.js +54 -1
  43. package/build/js/pdp.bundle.min.js +2 -2
  44. package/build/js/personal-details.min.js +1 -1
  45. package/build/js/plp.bundle.min.js +1 -1
  46. package/build/js/postcode-checker.min.js +1 -1
  47. package/build/js/project-list.min.js +57 -2
  48. package/build/js/quiz.min.js +1 -1
  49. package/build/js/track-my-order.min.js +1 -1
  50. package/package.json +5 -1
  51. package/src/components/checkout-payment-details-v2.hbs +1 -0
  52. package/src/components/checkout_order-summary-new.hbs +6 -0
  53. package/src/components/checkout_payment-new.hbs +35 -8
  54. package/src/components/gift-cards.hbs +8 -15
  55. package/src/components/order-address.hbs +28 -0
  56. package/src/components/payments.hbs +7 -6
  57. package/src/components/postcode-lookup-v2.hbs +85 -0
  58. package/src/components/wismo-giftcard-payment-item.hbs +29 -0
  59. package/src/components/wismo-payment.hbs +10 -0
  60. package/src/data/data_checkout-giftcards.json +7 -0
  61. package/src/data/data_delivery-address-v2.json +4 -0
  62. package/src/data/data_payments-checkout.json +4 -0
  63. package/src/data/data_postcode-lookup.json +200 -0
  64. package/src/data/data_wismo.json +46 -1
  65. package/src/data/footer_menu.json +4 -0
  66. package/src/elements/input.hbs +3 -1
  67. package/src/img/payment/checkout/giftcard.svg +28 -0
  68. package/src/img/payment/footer/giftcard.svg +28 -0
  69. package/src/js/components/general/footer.js +63 -56
  70. package/src/js/emulation/checkout-payment-details.js +2 -0
  71. package/src/js/emulation/gift-cards.js +22 -0
  72. package/src/js/emulation/mock.js +21 -20
  73. package/src/js/emulation/postcode-checker.js +1 -1
  74. package/src/js/emulation/postcode-lookup.js +122 -0
  75. package/src/js/page/bloomreach-widget/bloomreach-widget-core.js +1 -3
  76. package/src/js/page/checkout-payment-details.js +114 -10
  77. package/src/js/page/components/gift-cards.js +524 -115
  78. package/src/js/page/components/postcode-lookup/postcode-lookup-api.js +56 -0
  79. package/src/js/page/components/postcode-lookup/postcode-lookup-render.js +98 -0
  80. package/src/js/page/components/postcode-lookup/postcode-lookup-validation.js +81 -0
  81. package/src/js/page/components/postcode-lookup.js +503 -0
  82. package/src/js/page/ripple/bulk-add.js +2 -2
  83. package/src/js/page/ripple/thumb-gallery.js +14 -8
  84. package/src/js/page/utils/address-utils.js +32 -0
  85. package/src/js/page/utils/validation.js +54 -1
  86. package/src/page_checkout_confirmation-gift-card-split-payment.html +339 -0
  87. package/src/page_checkout_confirmation-gift-card.html +339 -0
  88. package/src/page_my_account_payment_info_gift_cards.html +96 -0
  89. package/src/page_my_account_payment_info_gift_cards_split_payment.html +96 -0
  90. package/src/page_product-details-billie.html +2 -0
  91. package/src/page_product-details-clearpay.html +1 -0
  92. package/src/scss/common/_CTAs.scss +4 -0
  93. package/src/scss/components/_gift-cards.scss +66 -9
  94. package/src/scss/components/_payments-checkout.scss +2 -2
  95. package/src/scss/components/_payments-v2.scss +5 -7
  96. package/src/scss/components/_postcode-lookup-v2.scss +164 -0
  97. package/src/scss/components/checkout-payment-details-v2.scss +1 -0
  98. package/src/scss/helpers/_CTAs.scss +26 -0
  99. package/src/scss/helpers/_variables.scss +2 -0
  100. package/src/scss/pages/_checkout-confirmation-new.scss +96 -3
  101. package/src/scss/pages/page_wismo-details.scss +29 -0
  102. package/src/sitemap.html +24 -0
@@ -0,0 +1,122 @@
1
+ import data from '../../data/data_postcode-lookup.json';
2
+
3
+ const { autocompleteResponse, addresses } = data['postcode-lookup'];
4
+
5
+ window.Wick = window.Wick || {};
6
+
7
+ const MOCK_DELAY_MS = 300;
8
+ const MAX_HITS = 10;
9
+ const API_MODES = ['real', 'mock', 'block'];
10
+ const CHECK_KEY_UNAVAILABLE = 'unavailable';
11
+ const EMPTY_RESULT_ID = 'mock-empty';
12
+
13
+ const DEFAULT_MODES = {
14
+ checkKey: 'mock',
15
+ autocomplete: 'mock',
16
+ resolve: 'mock',
17
+ };
18
+
19
+ const EMPTY_RESULT_HIT = {
20
+ id: EMPTY_RESULT_ID,
21
+ suggestion: 'Empty result (resolve returns no address)',
22
+ };
23
+
24
+ function delay(value) {
25
+ return new Promise((resolve) => setTimeout(() => resolve(value), MOCK_DELAY_MS));
26
+ }
27
+
28
+ function matchesQuery(suggestion, query) {
29
+ const text = suggestion.toLowerCase();
30
+ return query
31
+ .toLowerCase()
32
+ .split(/[\s,]+/)
33
+ .filter(Boolean)
34
+ .every((word) => text.includes(word));
35
+ }
36
+
37
+ function addressFromSuggestionText(text) {
38
+ const parts = String(text || '')
39
+ .split(',')
40
+ .map((part) => part.trim())
41
+ .filter(Boolean);
42
+ const postcode = parts.length > 2 ? parts.pop() : '';
43
+ const town = parts.length > 1 ? parts.pop() : '';
44
+
45
+ return {
46
+ line_1: parts[0] || '',
47
+ line_2: parts[1] || '',
48
+ line_3: parts.slice(2).join(', '),
49
+ post_town: town,
50
+ postcode,
51
+ };
52
+ }
53
+
54
+ const mocks = {
55
+ checkKey() {
56
+ return delay({ available: true });
57
+ },
58
+
59
+ autocomplete(query) {
60
+ const hits = autocompleteResponse.result.hits
61
+ .concat(/empty/i.test(query) ? [EMPTY_RESULT_HIT] : [])
62
+ .filter((hit) => matchesQuery(hit.suggestion, query))
63
+ .slice(0, MAX_HITS);
64
+
65
+ return delay(hits);
66
+ },
67
+
68
+ resolve(suggestion) {
69
+ if (suggestion.id === EMPTY_RESULT_ID) return delay(null);
70
+
71
+ const found = addresses[suggestion.id];
72
+ const address = found
73
+ ? Object.assign({ id: suggestion.id }, found)
74
+ : addressFromSuggestionText(suggestion.suggestion);
75
+
76
+ return delay(address);
77
+ },
78
+ };
79
+
80
+ function blocked(name) {
81
+ return function () {
82
+ return Promise.reject(new Error(`[PostcodeLookup emulation] ${name} blocked`));
83
+ };
84
+ }
85
+
86
+ function readModes() {
87
+ const modes = Object.assign({}, DEFAULT_MODES);
88
+ const param = new URLSearchParams(window.location.search).get('postcodeLookup');
89
+ if (!param) return modes;
90
+
91
+ if (API_MODES.includes(param)) {
92
+ Object.keys(modes).forEach((name) => {
93
+ modes[name] = param;
94
+ });
95
+ return modes;
96
+ }
97
+
98
+ param.split(',').forEach((pair) => {
99
+ const [name, mode] = pair.split(':').map((part) => part.trim());
100
+ const isValid =
101
+ API_MODES.includes(mode) || (name === 'checkKey' && mode === CHECK_KEY_UNAVAILABLE);
102
+ if (Object.prototype.hasOwnProperty.call(modes, name) && isValid) modes[name] = mode;
103
+ });
104
+
105
+ return modes;
106
+ }
107
+
108
+ function buildOverrides(modes) {
109
+ const overrides = {};
110
+
111
+ Object.keys(modes).forEach((name) => {
112
+ const mode = modes[name];
113
+
114
+ if (mode === 'mock') overrides[name] = mocks[name];
115
+ if (mode === 'block') overrides[name] = blocked(name);
116
+ if (mode === CHECK_KEY_UNAVAILABLE) overrides[name] = () => delay({ available: false });
117
+ });
118
+
119
+ return overrides;
120
+ }
121
+
122
+ window.Wick.PostcodeLookupApi = buildOverrides(readModes());
@@ -363,9 +363,7 @@ Wick.BloomreachWidget = {
363
363
  }
364
364
 
365
365
  const value =
366
- typeof rawValue === 'number'
367
- ? rawValue
368
- : Number(`${rawValue}`.replace(/[,£\s]/g, ''));
366
+ typeof rawValue === 'number' ? rawValue : Number(`${rawValue}`.replace(/[,£\s]/g, ''));
369
367
 
370
368
  if (!Number.isFinite(value)) {
371
369
  return typeof rawValue === 'string' ? rawValue : '';
@@ -13,7 +13,6 @@ Wick.CheckoutPaymentDetails = (function () {
13
13
  };
14
14
 
15
15
  const toggleBillieRepaymentTermsClass = 'js-billie-repayment-terms--has-selection';
16
-
17
16
  const elements = {
18
17
  $billieRepaymentTerms: $('.js-billie-repayment-terms'),
19
18
  $billieWidget: $('.checkout-payment-details__billie[data-billie]'),
@@ -28,8 +27,95 @@ Wick.CheckoutPaymentDetails = (function () {
28
27
  $unregisteredFields: $('#unregistered-fields'),
29
28
  $registeredFields: $('#registered-fields'),
30
29
  hiddenClass: 'd-none',
30
+ $giftcardToggle: $('#giftcard-toggle'),
31
+ $giftcardPanel: $('#giftcard-inline'),
32
+ giftcardDisabledClass: 'giftcard-toggle--disabled',
33
+ giftcardRoot: '.giftcard',
34
+ giftcardHint: '.giftcard-hint',
35
+ giftcardNumber: 'input[name="giftcard-number"]',
36
+ giftcardPin: 'input[name="giftcard-pin"]',
37
+ orderAddress: '[data-order-address]',
31
38
  };
32
39
 
40
+ const isOutsideOrderAddress = (_, el) => !$(el).closest(elements.orderAddress).length;
41
+ function setGiftcardToggleEnabled(isEnabled) {
42
+ const $toggle = elements.$giftcardToggle;
43
+ const $panel = elements.$giftcardPanel;
44
+ const $giftcard = $toggle.closest('.giftcard');
45
+
46
+ if (!$toggle.length) {
47
+ return;
48
+ }
49
+
50
+ $giftcard.toggleClass('giftcard--disabled', !isEnabled);
51
+
52
+ if (isEnabled) {
53
+ $toggle.attr('aria-disabled', 'false').attr('tabindex', '0').css('pointer-events', '');
54
+ } else {
55
+ if ($panel && $panel.length) $panel.prop('hidden', true);
56
+
57
+ $toggle
58
+ .attr('aria-disabled', 'true')
59
+ .attr('tabindex', '-1')
60
+ .css('pointer-events', 'none')
61
+ .attr('aria-expanded', 'false')
62
+ .show();
63
+
64
+ $giftcard.find('.giftcard-hint').show();
65
+ }
66
+ }
67
+
68
+ // function resetGiftcardToDefault() {
69
+ // const {
70
+ // $giftcardToggle: $toggle,
71
+ // $giftcardPanel: $panel,
72
+ // giftcardRoot,
73
+ // giftcardHint,
74
+ // giftcardNumber,
75
+ // giftcardPin,
76
+ // } = elements;
77
+
78
+ // if (!$toggle.length) {
79
+ // return;
80
+ // }
81
+
82
+ // const $giftcard = $toggle.closest(giftcardRoot);
83
+
84
+ // const $hint = $giftcard.find(giftcardHint);
85
+ // const $number = $giftcard.find(giftcardNumber);
86
+ // const $pin = $giftcard.find(giftcardPin);
87
+
88
+ // if ($panel.length) $panel.prop('hidden', true);
89
+
90
+ // $toggle.attr('aria-expanded', 'false').show();
91
+ // $hint.show();
92
+
93
+ // if (window.Wick?.GiftCard?.resetForm) {
94
+ // Wick.GiftCard.resetForm($giftcard);
95
+ // return;
96
+ // }
97
+
98
+ // $number.val('');
99
+ // $pin.val('');
100
+ // }
101
+
102
+ function syncGiftcardAvailability(checkedMethod) {
103
+ const enable = checkedMethod === 'card';
104
+
105
+ if (!enable) {
106
+ const $giftcard = elements.$giftcardToggle.closest(elements.giftcardRoot);
107
+ if (window.Wick?.GiftCard?.collapsePreserveState) {
108
+ Wick.GiftCard.collapsePreserveState($giftcard);
109
+ } else {
110
+ if (elements.$giftcardPanel.length) elements.$giftcardPanel.prop('hidden', true);
111
+ elements.$giftcardToggle.attr('aria-expanded', 'false').show();
112
+ $giftcard.find(elements.giftcardHint).show();
113
+ }
114
+ }
115
+
116
+ setGiftcardToggleEnabled(enable);
117
+ }
118
+
33
119
  let klarnaInited = false;
34
120
  let billieInited = false;
35
121
 
@@ -106,17 +192,21 @@ Wick.CheckoutPaymentDetails = (function () {
106
192
  paymentMethods.forEach((method) => {
107
193
  $(`[data-${method}]`).hide();
108
194
  });
109
-
110
195
  const $selected = $(`[data-${checkedMethod}]`);
111
196
  if ($selected.length) {
112
197
  $selected.show();
113
198
  }
114
199
  }
200
+
115
201
  function resetAllCheckoutForms(keepPaymentMethod) {
116
202
  const $container = elements.$wrapperPaymentInput.closest('.checkout-payment-details');
117
203
  if (!$container.length) return;
204
+ const $giftcardScope = $container.find(elements.giftcardRoot);
205
+ const $exclude = $giftcardScope.find(':input');
118
206
 
119
207
  $container.find('form').each(function () {
208
+ if ($(this).closest(elements.giftcardRoot).length) return;
209
+
120
210
  if (Wick.Forms && typeof Wick.Forms.clearValidationErrors === 'function') {
121
211
  Wick.Forms.clearValidationErrors(this);
122
212
  }
@@ -126,13 +216,22 @@ Wick.CheckoutPaymentDetails = (function () {
126
216
  .find(
127
217
  'input[type="text"], input[type="email"], input[type="tel"], input[type="number"], input[type="password"], textarea'
128
218
  )
219
+ .filter(isOutsideOrderAddress)
220
+ .not($exclude)
129
221
  .val('');
130
222
 
131
- $container.find('select').each(function () {
132
- this.selectedIndex = 0;
133
- });
223
+ $container
224
+ .find('select')
225
+ .not($exclude)
226
+ .each(function () {
227
+ this.selectedIndex = 0;
228
+ });
134
229
 
135
- $container.find('input[type="checkbox"]').prop('checked', false);
230
+ $container
231
+ .find('input[type="checkbox"]')
232
+ .filter(isOutsideOrderAddress)
233
+ .not($exclude)
234
+ .prop('checked', false);
136
235
 
137
236
  $container.find('input[type="radio"]').each(function () {
138
237
  const $radio = $(this);
@@ -308,7 +407,7 @@ Wick.CheckoutPaymentDetails = (function () {
308
407
  }
309
408
 
310
409
  function clearInputFields() {
311
- elements.$billingAddress.find('input.tbx').val('');
410
+ elements.$billingAddress.find('input.tbx').filter(isOutsideOrderAddress).val('');
312
411
  }
313
412
 
314
413
  function showPlaceOrder() {
@@ -341,6 +440,8 @@ Wick.CheckoutPaymentDetails = (function () {
341
440
 
342
441
  function init() {
343
442
  const paymentMethods = getPaymentMethods();
443
+ const initialMethod = $(elements.paymentInputName + ':checked').val() || 'card';
444
+ syncGiftcardAvailability(initialMethod);
344
445
  initBillieBusinessTypeToggle();
345
446
  hideBillieBusiness();
346
447
 
@@ -363,6 +464,10 @@ Wick.CheckoutPaymentDetails = (function () {
363
464
  elements.$wrapperPaymentInput.on('change', elements.paymentInputName, function () {
364
465
  const checkedMethod = $(this).val();
365
466
 
467
+ togglePaymentBlocks(paymentMethods, checkedMethod);
468
+ changeDetailsBlock(checkedMethod);
469
+ syncGiftcardAvailability(checkedMethod);
470
+
366
471
  if (prevPaymentMethod && prevPaymentMethod !== checkedMethod) {
367
472
  resetAllCheckoutForms(checkedMethod);
368
473
  } else {
@@ -373,13 +478,12 @@ Wick.CheckoutPaymentDetails = (function () {
373
478
  Wick.Forms.clearValidationErrors(form);
374
479
  }
375
480
 
376
- togglePaymentBlocks(paymentMethods, checkedMethod);
377
- changeDetailsBlock(checkedMethod);
378
-
379
481
  prevPaymentMethod = checkedMethod;
380
482
  });
381
483
 
382
484
  $('.btn-new-card').on('click', function () {
485
+ elements.$cardDetails.removeClass(elements.hiddenCardDetailsClass);
486
+
383
487
  $('[data-new-card]').show();
384
488
  $('[data-existing-card]').hide();
385
489
  return false;