wickes-css2 2.103.0-lg-867-improve-retail-media-v3.2 → 2.103.0-rg-1802-gift-card-error-codes.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 (82) hide show
  1. package/Readme.md +1 -3
  2. package/build/css/components/checkout-payment-details-v2.css +1 -1
  3. package/build/css/pages/page_checkout_delivery-new.css +1 -1
  4. package/build/css/pages/page_product-details-v2.css +1 -1
  5. package/build/css/pdp-main-before-combine.css +1 -1
  6. package/build/css/pdp-main-non-critical.css +1 -1
  7. package/build/css/pdp-main.css +1 -1
  8. package/build/img/giftcard.svg +28 -0
  9. package/build/img/klarna.svg +10 -0
  10. package/build/img/payment/checkout/klarna.svg +10 -0
  11. package/build/img/payment/footer/klarna.svg +10 -0
  12. package/build/js/account-members.min.js +1 -1
  13. package/build/js/add-project-list-id.min.js +1 -1
  14. package/build/js/address-book.min.js +1 -1
  15. package/build/js/basket.min.js +2 -2
  16. package/build/js/bundle.min.js +1 -1
  17. package/build/js/change-password.min.js +1 -1
  18. package/build/js/checkout.min.js +2 -2
  19. package/build/js/emulation.min.js +272 -16
  20. package/build/js/general.bundle.min.js +1 -1
  21. package/build/js/gift-cards.min.js +1 -0
  22. package/build/js/merged-checkout.min.js +2 -2
  23. package/build/js/page/components/gift-cards.js +894 -0
  24. package/build/js/page/components/order-summary.js +42 -25
  25. package/build/js/page/components/toggle-password-visibility.js +22 -0
  26. package/build/js/page/utils/gift-cards-utils.js +176 -0
  27. package/build/js/page/utils/input-handling.js +92 -0
  28. package/build/js/page/utils/show-hide-input.js +28 -0
  29. package/build/js/page/utils/validation.js +46 -1
  30. package/build/js/pdp.bundle.min.js +1 -1
  31. package/build/js/personal-details.min.js +1 -1
  32. package/build/js/plp.bundle.min.js +1 -1
  33. package/build/js/project-list.min.js +44 -1
  34. package/build/js/quiz.min.js +1 -1
  35. package/build/js/toggle-password-visibility.min.js +1 -0
  36. package/build/js/track-my-order.min.js +1 -1
  37. package/package.json +2 -2
  38. package/src/components/checkout-payment-details-v2.hbs +10 -11
  39. package/src/components/checkout_payment-new.hbs +1 -4
  40. package/src/components/checkout_payment-other-methods.hbs +1 -4
  41. package/src/components/gift-cards-hint.hbs +9 -0
  42. package/src/components/gift-cards.hbs +90 -0
  43. package/src/components/giftcard-chip.hbs +23 -0
  44. package/src/components/giftcard-summary.hbs +6 -0
  45. package/src/components/payments-checkout-v2.hbs +2 -7
  46. package/src/components/payments-checkout.hbs +1 -6
  47. package/src/components/payments.hbs +1 -5
  48. package/src/components/table_order-details-klarna.hbs +1 -1
  49. package/src/components/table_payment.hbs +1 -4
  50. package/src/data/data_wismo.json +1 -1
  51. package/src/elements/form-row.hbs +1 -1
  52. package/src/elements/input.hbs +31 -2
  53. package/src/img/giftcard.svg +28 -0
  54. package/src/img/klarna.svg +10 -0
  55. package/src/img/payment/checkout/klarna.svg +10 -0
  56. package/src/img/payment/footer/klarna.svg +10 -0
  57. package/src/js/components/general/notification.js +2 -1
  58. package/src/js/emulation/checkout-data.js +35 -0
  59. package/src/js/emulation/checkout-payment-details.js +23 -14
  60. package/src/js/emulation/forms.js +7 -2
  61. package/src/js/emulation/gift-cards.js +205 -0
  62. package/src/js/page/components/gift-cards.js +894 -0
  63. package/src/js/page/components/order-summary.js +42 -25
  64. package/src/js/page/components/toggle-password-visibility.js +22 -0
  65. package/src/js/page/utils/gift-cards-utils.js +176 -0
  66. package/src/js/page/utils/input-handling.js +92 -0
  67. package/src/js/page/utils/show-hide-input.js +28 -0
  68. package/src/js/page/utils/validation.js +46 -1
  69. package/src/layouts/checkout.hbs +1 -5
  70. package/src/page_checkout_payment-details_guest-with-checkout-journey.html +1 -1
  71. package/src/page_my-account_change-password.html +1 -0
  72. package/src/page_my-order.html +1 -1
  73. package/src/page_payment-details-with-clearpay.html +2 -2
  74. package/src/page_payment-details-with-gift-card.html +8 -5
  75. package/src/page_shopping-cart-v2.html +2 -2
  76. package/src/scss/components/_gift-cards.scss +360 -0
  77. package/src/scss/components/checkout-payment-details-v2.scss +2 -0
  78. package/src/scss/pages/page_checkout_delivery-new.scss +26 -0
  79. package/src/scss/pages/page_product-details-v2.scss +4 -0
  80. package/src/sitemap.html +0 -6
  81. package/src/js/components/toggle-password-visibility.js +0 -58
  82. package/src/page_split-orders-klarna.html +0 -106
@@ -3482,6 +3482,42 @@ Wick.checkLocalEnv = (function () {
3482
3482
  }
3483
3483
  })();
3484
3484
 
3485
+ var Wick = Wick || {};
3486
+ Wick.CheckoutData = (function () {
3487
+ return {
3488
+ //TODO: update after BE confirmation
3489
+ successGiftCardData: {
3490
+ "subTotal": "£100.00",
3491
+ "deliveryCost": "£4.00",
3492
+ "freeDelivery": false,
3493
+ "clickAndCollectCost": "FREE",
3494
+ "totalForDelivery": "£69.00",
3495
+ "totalForClickAndCollect": "FREE",
3496
+ "total": "£0.00",
3497
+ "vat": "£11.17",
3498
+ "deliveryOrder": true,
3499
+ "clickAndCollectOrder": false,
3500
+ "discountTotal": "£2.00",
3501
+ "giftCardApplied": "-£100.00",
3502
+ "discounts": [
3503
+ "Spend over £10 and get £2 fixed discount"
3504
+ ],
3505
+ "promotionsInfo": [
3506
+ {
3507
+ "description": "Spend over £10 and get £2 fixed discount",
3508
+ "usedCouponCode": "RT_02"
3509
+ }
3510
+ ],
3511
+ "subTotalWithDeliveryCost": "£69.00",
3512
+ "net": false,
3513
+ "subtotalWithDeliveryAndDiscounts": "£67.00",
3514
+ "discountAmounts": [],
3515
+ "goodsTotalWithoutDiscount": "£65.00",
3516
+ "charityPrice": ""
3517
+ },
3518
+ }
3519
+ })();
3520
+
3485
3521
  var Wick = Wick || {};
3486
3522
  Wick.DeliveryDetails = (function () {
3487
3523
  var $page = $('.page_checkout-delivery-details');
@@ -3522,24 +3558,33 @@ var Wick = Wick || {};
3522
3558
 
3523
3559
  Wick.PaymentDetails = (function () {
3524
3560
  var $btnEnterDetails = $('.btn-enter-details'),
3525
- $form = $btnEnterDetails.parents('form'),
3526
3561
  isGuestPage = $('.page_checkout-payment-details_guest').length;
3527
3562
 
3528
3563
  function bindEvents () {
3529
- $btnEnterDetails.on('click', function(){
3530
- if ($form.find('#card-name').val().length &&
3531
- $form.find('#first-line-address').val().length &&
3532
- $form.find('#address-line-1').val().length &&
3533
- $form.find('#town-city').val().length &&
3534
- $form.find('#postcode_additional').val().length){
3535
- $('.checkout-payment-details__card-details').removeClass('checkout-payment-details__card-details_hidden');
3536
- $('html, body').animate({
3537
- scrollTop: $('.checkout-payment-details__card-details').offset().top - 15
3538
- }, 700);
3539
- return false;
3564
+ $btnEnterDetails.on('click', function (e) {
3565
+ e.preventDefault();
3566
+ var $scope = $(this).closest('form');
3567
+ if (!$scope.length) $scope = $(this).closest('.billing-address');
3568
+ if (!$scope.length) $scope = $('.billing-address');
3569
+ var nameVal= ($scope.find('#card-name').val() || '').trim();
3570
+ var finderVal= ($scope.find('#first-line-address').val() || '').trim();
3571
+ var manualLine1= ($scope.find('#address-line-1').val() || '').trim();
3572
+ var manualTown= ($scope.find('#town-city').val() || '').trim();
3573
+ var manualPost= ($scope.find('#postcode_additional').val() || '').trim();
3574
+ var addressFinderOk = finderVal.length > 0;
3575
+ var addressManualOk = manualLine1 && manualTown && manualPost;
3576
+
3577
+ if (nameVal && (addressFinderOk || addressManualOk)) {
3578
+ var $details = $('.checkout-payment-details__card-details');
3579
+ $details.removeClass('checkout-payment-details__card-details_hidden');
3580
+ $('html, body').animate({ scrollTop: $details.offset().top - 15 }, 700);
3581
+ return;
3582
+ }
3583
+
3584
+ var formEl = $scope.closest('form').get(0) || $scope.get(0);
3585
+ if (formEl && Wick.Forms && Wick.Forms.showValidationErrors) {
3586
+ Wick.Forms.showValidationErrors(formEl);
3540
3587
  }
3541
- Wick.Forms.showValidationErrors($form[0]);
3542
- return false;
3543
3588
  });
3544
3589
 
3545
3590
  $('.checkout-payment-details__card-details').on('submit', function(){
@@ -4076,11 +4121,16 @@ Wick.Forms = (function(){
4076
4121
 
4077
4122
  var showValidationErrors = function (form, errorMsg) {
4078
4123
  var $form = $(form);
4124
+ var $rows = $form.find(fieldRow).not('[data-no-global-validation]');
4125
+ if (!$rows.length) return;
4126
+ $rows.find('.form-row__error').remove();
4127
+
4079
4128
  if (!$form.hasClass(formInvalid)) {
4080
- $form.find('.form-row__error').remove();
4081
- $form.addClass(formInvalid).find(fieldRow).append(validationError(errorMsg)).addClass(rowValidationError);
4129
+ $form.addClass(formInvalid);
4082
4130
  }
4083
4131
 
4132
+ $rows.append(validationError(errorMsg)).addClass(rowValidationError);
4133
+
4084
4134
  var $firstMsg = $form.find(fieldRow).first();
4085
4135
  if($firstMsg.length && !isElementInViewport($firstMsg)){
4086
4136
  var inModal = $firstMsg.closest('.modal').length,
@@ -4390,6 +4440,212 @@ $(document).ready(function () {
4390
4440
  Wick.GenerateProjectIdLocal.init();
4391
4441
  });
4392
4442
 
4443
+ (function () {
4444
+ if (!window.Wick) return;
4445
+
4446
+ const M_OK = '0000000000000001';
4447
+ const M_ZERO_BALANCE = '0000000000000000';
4448
+ const M_NOT_RECOGNISED = '1111111111111111';
4449
+ const M_LOCKED = '2222222222222222';
4450
+ const M_MERCHANT_ISSUE = '3333333333333333';
4451
+ const M_EXCHANGE = '4040404040404040';
4452
+ const M_EXPIRED = '4444444444444444';
4453
+ const M_INVALID = '5555555555555555';
4454
+ const M_ADDED = '6666666666666666';
4455
+ const M_CONFIG_PROBLEM = '9999999999999999';
4456
+
4457
+ const M_PAY_ERR_101 = '7777777777777101';
4458
+ const M_PAY_ERR_102 = '7777777777777102';
4459
+ const M_PAY_ERR_103 = '7777777777777103';
4460
+
4461
+ const PAY_ERROR_CARD_MAP = {
4462
+ [M_PAY_ERR_101]: 101,
4463
+ [M_PAY_ERR_102]: 102,
4464
+ [M_PAY_ERR_103]: 103,
4465
+ };
4466
+
4467
+ const GIFT_CARDS_LIMIT = 3;
4468
+ const BASE_ORDER_TOTAL = 300.00;
4469
+
4470
+ let PAY_ERROR_CODE;
4471
+
4472
+ const mock = {
4473
+ orderTotal: BASE_ORDER_TOTAL,
4474
+ giftCardTotal: 0.00,
4475
+ giftCards: [],
4476
+ };
4477
+
4478
+ const toMasked = (num) => `************${String(num || '').slice(-5)}`;
4479
+
4480
+ function recomputeTotalsAndOrder() {
4481
+ mock.giftCardTotal = mock.giftCards.reduce((sum, c) => sum + Number(c.amountToRedeem || 0), 0);
4482
+ const remaining = Math.max(0, BASE_ORDER_TOTAL - mock.giftCardTotal);
4483
+ mock.orderTotal = Number(remaining.toFixed(2));
4484
+ }
4485
+
4486
+ function applyWithClamp(requestedAmount) {
4487
+ const remaining = Math.max(0, BASE_ORDER_TOTAL - mock.giftCardTotal);
4488
+ const applied = Math.min(Number(requestedAmount || 0), remaining);
4489
+ return Number(applied.toFixed(2));
4490
+ }
4491
+
4492
+ function successPayload() {
4493
+ return {
4494
+ orderTotal: mock.orderTotal,
4495
+ giftCardTotal: mock.giftCardTotal,
4496
+ giftCards: mock.giftCards.slice()
4497
+ };
4498
+ }
4499
+
4500
+ function getGiftCardErrorCode(giftCardNumber) {
4501
+ switch (giftCardNumber) {
4502
+ case M_NOT_RECOGNISED:
4503
+ return 10;
4504
+ case M_LOCKED:
4505
+ return 16;
4506
+ case M_MERCHANT_ISSUE:
4507
+ return 20;
4508
+ case M_EXCHANGE:
4509
+ return 40;
4510
+ case M_EXPIRED:
4511
+ return 60;
4512
+ case M_INVALID:
4513
+ return 99;
4514
+ case M_ADDED:
4515
+ return 89;
4516
+ case M_CONFIG_PROBLEM:
4517
+ return -1;
4518
+ default:
4519
+ return null;
4520
+ }
4521
+ }
4522
+
4523
+ function addGiftCardMock(giftCardNumber) {
4524
+ const errorCode = getGiftCardErrorCode(giftCardNumber);
4525
+
4526
+ if (Number.isFinite(errorCode)) {
4527
+ return Promise.reject({ code: errorCode });
4528
+ }
4529
+
4530
+ let requested;
4531
+ if (giftCardNumber === M_OK) {
4532
+ requested = 123.45;
4533
+ } else if (giftCardNumber === M_ZERO_BALANCE) {
4534
+ requested = 0;
4535
+ } else {
4536
+ requested = 50.00;
4537
+ }
4538
+
4539
+ if (mock.giftCards.length >= GIFT_CARDS_LIMIT) {
4540
+ return Promise.reject({ code: 20 });
4541
+ }
4542
+
4543
+ const beforeTotal = mock.giftCardTotal;
4544
+ const applied = applyWithClamp(requested);
4545
+
4546
+ mock.giftCards.push({
4547
+ id: (Date.now() + Math.random()).toString(36),
4548
+ maskedNumber: toMasked(giftCardNumber),
4549
+ amountToRedeem: applied,
4550
+ originalNumber: giftCardNumber,
4551
+ });
4552
+
4553
+ if (mock.giftCards.length === GIFT_CARDS_LIMIT) {
4554
+ const leftover = Math.max(0, BASE_ORDER_TOTAL - (beforeTotal + applied));
4555
+ if (leftover > 0) {
4556
+ const last = mock.giftCards[mock.giftCards.length - 1];
4557
+ last.amountToRedeem = Number((Number(last.amountToRedeem) + leftover).toFixed(2));
4558
+ }
4559
+ mock.giftCardTotal = BASE_ORDER_TOTAL;
4560
+ mock.orderTotal = 0;
4561
+ return Promise.resolve(successPayload());
4562
+ }
4563
+
4564
+ recomputeTotalsAndOrder();
4565
+ return Promise.resolve(successPayload());
4566
+ }
4567
+
4568
+ function removeGiftCardMock(index) {
4569
+ const beforeLen = mock.giftCards.length;
4570
+ if (index < 0 || index >= beforeLen) return Promise.reject({ code: 20 });
4571
+
4572
+ mock.giftCards.splice(index, 1);
4573
+ recomputeTotalsAndOrder();
4574
+ return Promise.resolve(successPayload());
4575
+ }
4576
+
4577
+ function anyPayErrorCardApplied() {
4578
+ for (const gc of mock.giftCards) {
4579
+ const code = PAY_ERROR_CARD_MAP[gc.originalNumber];
4580
+ if (Number.isFinite(code)) return code;
4581
+ }
4582
+ return undefined;
4583
+ }
4584
+
4585
+ function initGiftCardMock() {
4586
+ if (!$('.giftcard-row, .giftcard').length) return;
4587
+
4588
+ $(window).off(Wick.GiftCard.ADD_GIFT_CARD);
4589
+ $(window).off(Wick.GiftCard.REMOVE_GIFT_CARD);
4590
+ $(window).off(Wick.GiftCard.PAY_WITH_GIFT_CARD);
4591
+
4592
+ $(window).on(Wick.GiftCard.ADD_GIFT_CARD, function (e) {
4593
+ const payload = (e.detail && e.detail.payload) || {};
4594
+ const giftCardNumber = payload.giftCardNumber;
4595
+ setTimeout(function () {
4596
+ addGiftCardMock(giftCardNumber)
4597
+ .then(function (p) { e.detail.resolve(Object.assign({ code: 0 }, p)); })
4598
+ .catch(function (err) { e.detail.reject(err); });
4599
+ }, 1000);
4600
+ });
4601
+
4602
+ $(window).on(Wick.GiftCard.REMOVE_GIFT_CARD, function (e) {
4603
+ const payload = (e.detail && e.detail.payload) || {};
4604
+ const index = Number(payload.index);
4605
+ setTimeout(function () {
4606
+ removeGiftCardMock(index)
4607
+ .then(function (p) { e.detail.resolve(Object.assign({ code: 0 }, p)); })
4608
+ .catch(function (err) { e.detail.reject(err); });
4609
+ }, 1000);
4610
+ });
4611
+
4612
+ $(window).on(Wick.GiftCard.PAY_WITH_GIFT_CARD, function (e) {
4613
+ setTimeout(function () {
4614
+ const forcedErrorFromCard = anyPayErrorCardApplied();
4615
+ if (Number.isFinite(forcedErrorFromCard)) {
4616
+ return e.detail.reject({
4617
+ errorCode: forcedErrorFromCard,
4618
+ giftCards: mock.giftCards.slice(),
4619
+ });
4620
+ }
4621
+
4622
+ if (Number(mock.orderTotal) === 0) {
4623
+ e.detail.resolve({ url: 'page_checkout_confirmation-billie.html' });
4624
+ } else {
4625
+ const errorCode = Number.isFinite(PAY_ERROR_CODE) ? PAY_ERROR_CODE : undefined;
4626
+ e.detail.reject({
4627
+ errorCode,
4628
+ giftCards: mock.giftCards.slice(),
4629
+ });
4630
+ }
4631
+ }, 1000);
4632
+ });
4633
+ }
4634
+
4635
+ $(document).ready(function () {
4636
+ mock.giftCards = [];
4637
+ recomputeTotalsAndOrder();
4638
+
4639
+ Wick.GiftCard.init({
4640
+ giftCardsLimit: GIFT_CARDS_LIMIT,
4641
+ errorCode: PAY_ERROR_CODE,
4642
+ giftCards: mock.giftCards.slice()
4643
+ });
4644
+ });
4645
+
4646
+ $(document).ready(initGiftCardMock);
4647
+ })();
4648
+
4393
4649
  const suggestions = [
4394
4650
  {
4395
4651
  value: 'lintel',