wickes-css2 2.117.0-gift-cards.2 → 2.117.1-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 (102) hide show
  1. package/Readme.md +1 -0
  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/js/account-members.min.js +1 -1
  20. package/build/js/add-project-list-id.min.js +1 -1
  21. package/build/js/address-book.min.js +1 -1
  22. package/build/js/basket.min.js +2 -2
  23. package/build/js/bundle.min.js +1 -1
  24. package/build/js/change-password.min.js +1 -1
  25. package/build/js/checkout.min.js +2 -2
  26. package/build/js/emulation.min.js +83 -425
  27. package/build/js/general.bundle.min.js +1 -1
  28. package/build/js/gift-cards.min.js +1 -1
  29. package/build/js/merged-checkout.min.js +2 -2
  30. package/build/js/page/bloomreach-widget/bloomreach-widget-core.js +3 -1
  31. package/build/js/page/checkout-payment-details.js +10 -114
  32. package/build/js/page/components/gift-cards.js +115 -524
  33. package/build/js/page/ripple/bulk-add.js +2 -2
  34. package/build/js/page/ripple/thumb-gallery.js +8 -14
  35. package/build/js/page/utils/validation.js +1 -54
  36. package/build/js/pdp.bundle.min.js +2 -2
  37. package/build/js/personal-details.min.js +1 -1
  38. package/build/js/plp.bundle.min.js +1 -1
  39. package/build/js/postcode-checker.min.js +1 -1
  40. package/build/js/project-list.min.js +2 -57
  41. package/build/js/quiz.min.js +1 -1
  42. package/build/js/track-my-order.min.js +1 -1
  43. package/package.json +1 -5
  44. package/src/components/checkout-payment-details-v2.hbs +0 -1
  45. package/src/components/checkout_order-summary-new.hbs +0 -6
  46. package/src/components/checkout_payment-new.hbs +8 -35
  47. package/src/components/gift-cards.hbs +15 -8
  48. package/src/components/payments.hbs +6 -7
  49. package/src/components/wismo-payment.hbs +0 -10
  50. package/src/data/data_delivery-address-v2.json +0 -4
  51. package/src/data/data_payments-checkout.json +0 -4
  52. package/src/data/data_wismo.json +1 -46
  53. package/src/data/footer_menu.json +0 -4
  54. package/src/elements/input.hbs +1 -3
  55. package/src/js/components/general/footer.js +56 -63
  56. package/src/js/emulation/checkout-payment-details.js +0 -2
  57. package/src/js/emulation/gift-cards.js +1 -23
  58. package/src/js/emulation/mock.js +20 -21
  59. package/src/js/emulation/postcode-checker.js +1 -1
  60. package/src/js/page/bloomreach-widget/bloomreach-widget-core.js +3 -1
  61. package/src/js/page/checkout-payment-details.js +10 -114
  62. package/src/js/page/components/gift-cards.js +115 -524
  63. package/src/js/page/ripple/bulk-add.js +2 -2
  64. package/src/js/page/ripple/thumb-gallery.js +8 -14
  65. package/src/js/page/utils/validation.js +1 -54
  66. package/src/page_product-details-billie.html +0 -2
  67. package/src/page_product-details-clearpay.html +0 -1
  68. package/src/scss/common/_CTAs.scss +0 -4
  69. package/src/scss/components/_gift-cards.scss +9 -66
  70. package/src/scss/components/_payments-checkout.scss +2 -2
  71. package/src/scss/components/_payments-v2.scss +7 -5
  72. package/src/scss/components/checkout-payment-details-v2.scss +0 -1
  73. package/src/scss/helpers/_CTAs.scss +0 -26
  74. package/src/scss/helpers/_variables.scss +0 -2
  75. package/src/scss/pages/_checkout-confirmation-new.scss +3 -96
  76. package/src/scss/pages/page_wismo-details.scss +0 -29
  77. package/src/sitemap.html +0 -24
  78. package/build/img/payment/checkout/giftcard.svg +0 -28
  79. package/build/img/payment/footer/giftcard.svg +0 -28
  80. package/build/js/page/components/postcode-lookup/postcode-lookup-api.js +0 -56
  81. package/build/js/page/components/postcode-lookup/postcode-lookup-render.js +0 -98
  82. package/build/js/page/components/postcode-lookup/postcode-lookup-validation.js +0 -81
  83. package/build/js/page/components/postcode-lookup.js +0 -503
  84. package/build/js/page/utils/address-utils.js +0 -32
  85. package/src/components/order-address.hbs +0 -28
  86. package/src/components/postcode-lookup-v2.hbs +0 -85
  87. package/src/components/wismo-giftcard-payment-item.hbs +0 -29
  88. package/src/data/data_checkout-giftcards.json +0 -7
  89. package/src/data/data_postcode-lookup.json +0 -200
  90. package/src/img/payment/checkout/giftcard.svg +0 -28
  91. package/src/img/payment/footer/giftcard.svg +0 -28
  92. package/src/js/emulation/postcode-lookup.js +0 -122
  93. package/src/js/page/components/postcode-lookup/postcode-lookup-api.js +0 -56
  94. package/src/js/page/components/postcode-lookup/postcode-lookup-render.js +0 -98
  95. package/src/js/page/components/postcode-lookup/postcode-lookup-validation.js +0 -81
  96. package/src/js/page/components/postcode-lookup.js +0 -503
  97. package/src/js/page/utils/address-utils.js +0 -32
  98. package/src/page_checkout_confirmation-gift-card-split-payment.html +0 -339
  99. package/src/page_checkout_confirmation-gift-card.html +0 -339
  100. package/src/page_my_account_payment_info_gift_cards.html +0 -96
  101. package/src/page_my_account_payment_info_gift_cards_split_payment.html +0 -96
  102. package/src/scss/components/_postcode-lookup-v2.scss +0 -164
@@ -1,503 +0,0 @@
1
- import {
2
- bindBlurValidation,
3
- isFieldRowVisible,
4
- removeErrorStylingForElement,
5
- resetBlurValidation,
6
- } from '../utils/validation';
7
- import { toCanonicalPostcode } from '../utils/address-utils';
8
- import { createPostcodeLookupApi } from './postcode-lookup/postcode-lookup-api';
9
- import {
10
- MODES,
11
- autoGrow,
12
- classes,
13
- renderDropdown,
14
- renderHighlight,
15
- renderMode,
16
- toggleManualPlaceholders,
17
- } from './postcode-lookup/postcode-lookup-render';
18
- import {
19
- ADDRESS_FIELDS,
20
- validate,
21
- validateAddressInputs,
22
- validateField,
23
- validateSearch,
24
- } from './postcode-lookup/postcode-lookup-validation';
25
-
26
- const DEBOUNCE_MS = 300;
27
- const MIN_QUERY_LENGTH = 2;
28
- const EVENT_NS = '.postcodeLookup';
29
-
30
- const selectors = {
31
- formRow: '.form-row',
32
- search: '[data-postcode-lookup-input]',
33
- line1: '[data-postcode-lookup-line1]',
34
- line2: '[data-postcode-lookup-line2]',
35
- town: '[data-postcode-lookup-town]',
36
- postcode: '[data-postcode-lookup-postcode]',
37
- line2Wrap: '[data-postcode-lookup-line2-wrap]',
38
- addLine2: '[data-postcode-lookup-add-line2]',
39
- searchWrap: '[data-postcode-lookup-search]',
40
- dropdown: '[data-postcode-lookup-dropdown]',
41
- list: '[data-postcode-lookup-list]',
42
- hint: '[data-postcode-lookup-hint]',
43
- manual: '[data-postcode-lookup-manual]',
44
- manualBtn: '[data-postcode-lookup-manual-btn]',
45
- expand: '[data-postcode-lookup-expand]',
46
- };
47
-
48
- const api = createPostcodeLookupApi();
49
-
50
- function setSuggestions(lookup, list) {
51
- const { state } = lookup;
52
-
53
- state.suggestions = list;
54
- state.highlightedIndex = -1;
55
- }
56
-
57
- function openDropdown(lookup) {
58
- const { state, $search } = lookup;
59
-
60
- if (state.mode === MODES.UNAVAILABLE) return;
61
-
62
- state.isOpen = true;
63
- renderDropdown(lookup);
64
- removeErrorStylingForElement($search);
65
- }
66
-
67
- function closeDropdown(lookup, { shouldValidate = true } = {}) {
68
- const { state } = lookup;
69
-
70
- if (!state.isOpen) return;
71
-
72
- state.isOpen = false;
73
- state.highlightedIndex = -1;
74
- renderDropdown(lookup);
75
- updateSearchFromFields(lookup);
76
- if (shouldValidate) validateSearch(lookup);
77
- }
78
-
79
- function setExternalError(lookup) {
80
- const { state, $search } = lookup;
81
-
82
- cancelLookup(lookup);
83
- state.isOpen = false;
84
- renderDropdown(lookup);
85
- removeErrorStylingForElement($search);
86
- setMode(lookup, MODES.UNAVAILABLE);
87
- }
88
-
89
- function setMode(lookup, mode) {
90
- const { state } = lookup;
91
-
92
- if (state.mode === MODES.UNAVAILABLE) return;
93
-
94
- state.mode = mode;
95
- renderMode(lookup);
96
- }
97
-
98
- function setSearchValue(lookup, value) {
99
- const { $search } = lookup;
100
-
101
- $search.val(value);
102
- autoGrow(lookup);
103
- }
104
-
105
- function cancelLookup(lookup) {
106
- const { requestIds, debouncedFetch } = lookup;
107
-
108
- debouncedFetch.cancel();
109
- requestIds.autocomplete += 1;
110
- setSuggestions(lookup, []);
111
- }
112
-
113
- async function fetchSuggestions(lookup, query) {
114
- const { requestIds } = lookup;
115
-
116
- requestIds.autocomplete += 1;
117
- const currentRequest = requestIds.autocomplete;
118
-
119
- try {
120
- const hits = await api.autocomplete(query);
121
- if (currentRequest !== requestIds.autocomplete) return;
122
-
123
- setSuggestions(lookup, hits);
124
- renderDropdown(lookup);
125
- } catch (e) {
126
- if (currentRequest !== requestIds.autocomplete) return;
127
- setExternalError(lookup);
128
- }
129
- }
130
-
131
- function handleInput(lookup) {
132
- const { $search, debouncedFetch } = lookup;
133
-
134
- autoGrow(lookup);
135
-
136
- const query = ($search.val() || '').trim();
137
-
138
- if (query.length < MIN_QUERY_LENGTH) {
139
- cancelLookup(lookup);
140
- } else {
141
- debouncedFetch(query);
142
- }
143
-
144
- openDropdown(lookup);
145
- }
146
-
147
- function hasVisibleSuggestions(lookup) {
148
- const { state, $search } = lookup;
149
-
150
- return state.isOpen && !!$search.val() && state.suggestions.length > 0;
151
- }
152
-
153
- function navigate(lookup, step) {
154
- const { state } = lookup;
155
-
156
- if (!hasVisibleSuggestions(lookup)) return;
157
-
158
- const totalItems = state.suggestions.length;
159
- const isFirstMoveUp = state.highlightedIndex === -1 && step < 0;
160
- const nextIndex = isFirstMoveUp ? totalItems - 1 : state.highlightedIndex + step;
161
-
162
- state.highlightedIndex = (nextIndex + totalItems) % totalItems;
163
- renderHighlight(lookup);
164
- scrollToHighlighted(lookup);
165
- }
166
-
167
- function selectHighlighted(lookup) {
168
- const { state } = lookup;
169
-
170
- if (state.highlightedIndex === -1 || !hasVisibleSuggestions(lookup)) return;
171
-
172
- const selected = state.suggestions[state.highlightedIndex];
173
- if (selected) selectSuggestion(lookup, selected);
174
- }
175
-
176
- function scrollToHighlighted(lookup) {
177
- const { state, $list, $manual } = lookup;
178
-
179
- if (!state.isOpen) return;
180
-
181
- const highlightedEl = $list.find('.' + classes.highlighted)[0];
182
- if (!highlightedEl) return;
183
-
184
- $list[0].style.scrollPaddingBottom = `${$manual[0].offsetHeight}px`;
185
- highlightedEl.scrollIntoView({ block: 'nearest' });
186
- }
187
-
188
- function handleEsc(lookup) {
189
- const { state } = lookup;
190
-
191
- state.isOpen = true;
192
- resetAddressSearch(lookup);
193
- renderDropdown(lookup);
194
- }
195
-
196
- function handleSearchKeydown(lookup, e) {
197
- switch (e.key) {
198
- case 'ArrowDown':
199
- case 'Down':
200
- e.preventDefault();
201
- navigate(lookup, 1);
202
- break;
203
- case 'ArrowUp':
204
- case 'Up':
205
- e.preventDefault();
206
- navigate(lookup, -1);
207
- break;
208
- case 'Enter':
209
- e.preventDefault();
210
- selectHighlighted(lookup);
211
- break;
212
- case 'Escape':
213
- case 'Esc':
214
- e.preventDefault();
215
- handleEsc(lookup);
216
- break;
217
- }
218
- }
219
-
220
- function showLine2(lookup) {
221
- const { $line2Wrap, $addLine2 } = lookup;
222
-
223
- $line2Wrap.removeClass(classes.hidden);
224
- $addLine2.addClass(classes.hidden);
225
- }
226
-
227
- function resetAddressSearch(lookup) {
228
- cancelLookup(lookup);
229
- setSearchValue(lookup, '');
230
- }
231
-
232
- function resetAddressInputs(lookup) {
233
- const { $fields } = lookup;
234
-
235
- ADDRESS_FIELDS.forEach((key) => {
236
- const $field = $fields[key];
237
- $field.val('');
238
- removeErrorStylingForElement($field);
239
- resetBlurValidation($field);
240
- });
241
- }
242
-
243
- function enterManualMode(lookup) {
244
- const { state, requestIds } = lookup;
245
-
246
- requestIds.resolve += 1;
247
- resetAddressSearch(lookup);
248
- state.isOpen = false;
249
- renderDropdown(lookup);
250
-
251
- setMode(lookup, MODES.MANUAL);
252
- toggleManualPlaceholders(lookup, true);
253
- resetAddressInputs(lookup);
254
- }
255
-
256
- function exitManualMode(lookup) {
257
- const { $search } = lookup;
258
-
259
- setMode(lookup, MODES.LOOKUP);
260
- toggleManualPlaceholders(lookup, false);
261
- resetAddressSearch(lookup);
262
- removeErrorStylingForElement($search);
263
- resetAddressInputs(lookup);
264
- }
265
-
266
- function reset(lookup) {
267
- const { state, requestIds, $search } = lookup;
268
-
269
- requestIds.resolve += 1;
270
- closeDropdown(lookup, { shouldValidate: false });
271
- setMode(lookup, MODES.LOOKUP);
272
- toggleManualPlaceholders(lookup, false);
273
- resetAddressSearch(lookup);
274
- removeErrorStylingForElement($search);
275
- resetBlurValidation($search);
276
- resetAddressInputs(lookup);
277
- state.isValidationPending = false;
278
- }
279
-
280
- function setShown(lookup, isShown) {
281
- const { state } = lookup;
282
-
283
- if (!isShown) {
284
- if (state.isOpen) {
285
- cancelLookup(lookup);
286
- closeDropdown(lookup, { shouldValidate: false });
287
- }
288
- return;
289
- }
290
-
291
- autoGrow(lookup);
292
-
293
- if (state.isValidationPending) {
294
- state.isValidationPending = false;
295
- validateSearch(lookup);
296
- validateAddressInputs(lookup);
297
- }
298
- }
299
-
300
- function fillAddress(lookup, address) {
301
- const { state, $search, $fields } = lookup;
302
- const values = {
303
- line1: address.line1,
304
- line2: address.line2,
305
- town: address.town,
306
- postcode: toCanonicalPostcode(address.postcode),
307
- };
308
-
309
- if (values.line2) showLine2(lookup);
310
-
311
- Object.keys(values).forEach((key) => {
312
- const value = key === 'postcode' ? values[key] : values[key].trim();
313
- $fields[key].val(value);
314
- });
315
-
316
- updateSearchFromFields(lookup);
317
- renderDropdown(lookup);
318
- validateSearch(lookup);
319
- validateAddressInputs(lookup);
320
- state.isValidationPending = !isFieldRowVisible($search);
321
- }
322
-
323
- function updateSearchFromFields(lookup) {
324
- const { $fields } = lookup;
325
- const combined = ADDRESS_FIELDS.map((key) => $fields[key].val())
326
- .filter(Boolean)
327
- .join(', ');
328
-
329
- setSearchValue(lookup, combined);
330
- }
331
-
332
- function handleFieldChange(lookup, key) {
333
- const { $fields } = lookup;
334
-
335
- if (key === 'postcode') {
336
- const $postcode = $fields.postcode;
337
- $postcode.val(toCanonicalPostcode($postcode.val()));
338
- }
339
- updateSearchFromFields(lookup);
340
- validateSearch(lookup);
341
- }
342
-
343
- async function selectSuggestion(lookup, suggestion) {
344
- const { state, requestIds, $search } = lookup;
345
-
346
- state.isPopulating = true;
347
- if (document.activeElement !== $search[0]) $search[0].focus();
348
- cancelLookup(lookup);
349
- closeDropdown(lookup, { shouldValidate: false });
350
-
351
- requestIds.resolve += 1;
352
- const currentResolve = requestIds.resolve;
353
-
354
- try {
355
- const address = await api.resolve(suggestion);
356
- state.isPopulating = false;
357
- if (currentResolve !== requestIds.resolve) return;
358
- if (!address) throw new Error('Address not found');
359
-
360
- fillAddress(lookup, address);
361
- } catch (e) {
362
- state.isPopulating = false;
363
- if (currentResolve !== requestIds.resolve) return;
364
- setExternalError(lookup);
365
- }
366
- }
367
-
368
- async function checkApiKey(lookup) {
369
- try {
370
- const { available } = await api.checkKey();
371
- if (!available) {
372
- setExternalError(lookup);
373
- }
374
- } catch (e) {
375
- setExternalError(lookup);
376
- }
377
- }
378
-
379
- function bindEvents(lookup) {
380
- const {
381
- rootSelector,
382
- state,
383
- $search,
384
- $searchLabel,
385
- $searchWrap,
386
- $dropdown,
387
- $list,
388
- $hint,
389
- $manual,
390
- $expand,
391
- $addLine2,
392
- } = lookup;
393
-
394
- $search.on('input', () => handleInput(lookup));
395
- $search.on('keydown', (e) => handleSearchKeydown(lookup, e));
396
-
397
- ADDRESS_FIELDS.forEach((key) => {
398
- bindBlurValidation(`${rootSelector} ${selectors[key]}`, () => validateField(lookup, key), {
399
- namespace: EVENT_NS,
400
- onChange: () => handleFieldChange(lookup, key),
401
- });
402
- });
403
-
404
- $search.on('focus', () => openDropdown(lookup));
405
-
406
- $addLine2.on('click', () => showLine2(lookup));
407
-
408
- $list.on('mousedown', `.${classes.item}, ${selectors.manual}`, function (e) {
409
- e.preventDefault();
410
- });
411
-
412
- $list.on('click', '.' + classes.item, function () {
413
- const suggestion = state.suggestions[$(this).data('index')];
414
- if (suggestion) selectSuggestion(lookup, suggestion);
415
- });
416
-
417
- $manual.on('click', selectors.manualBtn, function (e) {
418
- e.stopPropagation();
419
- enterManualMode(lookup);
420
- });
421
-
422
- $expand.on('click', () => exitManualMode(lookup));
423
-
424
- $hint.on('pointerdown', () => closeDropdown(lookup));
425
-
426
- $(document).on(`pointerdown${EVENT_NS}`, function (e) {
427
- if (!state.isOpen) {
428
- if (state.isPopulating && !$(e.target).closest($search).length) validateSearch(lookup);
429
- return;
430
- }
431
- if (!$(e.target).closest($search.add($dropdown)).length) closeDropdown(lookup);
432
- });
433
-
434
- $searchLabel.on('click', function (e) {
435
- e.preventDefault();
436
- });
437
-
438
- $searchWrap.on('focusout', function (e) {
439
- if (!state.isOpen) {
440
- if (state.isPopulating) validateSearch(lookup);
441
- return;
442
- }
443
- if (!e.relatedTarget) return;
444
- if (!$.contains(this, e.relatedTarget)) closeDropdown(lookup);
445
- });
446
-
447
- $(window).on(`blur${EVENT_NS}`, () => closeDropdown(lookup));
448
- }
449
-
450
- export function createPostcodeLookup(context) {
451
- const rootSelector = `[data-postcode-lookup="${context}"]`;
452
- const $root = $(rootSelector);
453
- const find = (key) => $root.find(selectors[key]);
454
-
455
- const $search = find('search');
456
- if (!$search.length) return null;
457
-
458
- const lookup = {
459
- rootSelector,
460
- $search,
461
- $searchLabel: $search.closest(selectors.formRow).find('label'),
462
- $fields: {
463
- line1: find('line1'),
464
- line2: find('line2'),
465
- town: find('town'),
466
- postcode: find('postcode'),
467
- },
468
- $line2Wrap: find('line2Wrap'),
469
- $addLine2: find('addLine2'),
470
- $searchWrap: find('searchWrap'),
471
- $dropdown: find('dropdown'),
472
- $list: find('list'),
473
- $hint: find('hint'),
474
- $manual: find('manual'),
475
- $expand: find('expand'),
476
- state: {
477
- mode: MODES.LOOKUP,
478
- isOpen: false,
479
- isPopulating: false,
480
- isValidationPending: false,
481
- suggestions: [],
482
- highlightedIndex: -1,
483
- },
484
- requestIds: {
485
- autocomplete: 0,
486
- resolve: 0,
487
- },
488
- };
489
-
490
- lookup.debouncedFetch = _.debounce((query) => fetchSuggestions(lookup, query), DEBOUNCE_MS);
491
-
492
- bindEvents(lookup);
493
-
494
- if (lookup.$fields.line2.val()) showLine2(lookup);
495
- checkApiKey(lookup);
496
- autoGrow(lookup);
497
-
498
- return {
499
- validate: (options) => validate(lookup, options),
500
- setShown: (isShown) => setShown(lookup, isShown),
501
- reset: () => reset(lookup),
502
- };
503
- }
@@ -1,32 +0,0 @@
1
- export function getAddressLines(address) {
2
- const { line_1: line1, line_2: line2, line_3: line3 } = address;
3
-
4
- if (line3) {
5
- return {
6
- line1: [line1, line2].filter(Boolean).join(', '),
7
- line2: line3,
8
- };
9
- }
10
-
11
- return { line1, line2 };
12
- }
13
-
14
- export function toCanonicalPostcode(postcode) {
15
- const compact = String(postcode || '')
16
- .toUpperCase()
17
- .replace(/\s/g, '');
18
-
19
- if (compact.length < 3) return compact;
20
- return compact.slice(0, -3) + ' ' + compact.slice(-3);
21
- }
22
-
23
- export function resolvePostcodeToAddress(result) {
24
- const { line1, line2 } = getAddressLines(result);
25
-
26
- return {
27
- line1: line1 || '',
28
- line2: line2 || '',
29
- town: result.post_town || '',
30
- postcode: result.postcode || '',
31
- };
32
- }