wickes-css2 2.112.0-why-not-add.4 → 2.112.0

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 (26) hide show
  1. package/Readme.md +0 -4
  2. package/build/js/bloomreach-widget.min.js +1 -1
  3. package/build/js/emulation.min.js +2446 -2397
  4. package/build/js/page/bloomreach-widget/bloomreach-widget-tracking.js +87 -0
  5. package/build/js/page/bloomreach-widget/bloomreach-widget.js +9 -0
  6. package/build/js/page/bloomreach-widget/complete-your-project-widget.js +65 -0
  7. package/build/js/page/bloomreach-widget/why-not-add-widget.js +36 -2
  8. package/build/js/page/checkout-payment-details.js +10 -0
  9. package/build/js/page/utils/data-layer.js +9 -0
  10. package/package.json +1 -5
  11. package/src/components/address-billie.hbs +22 -18
  12. package/src/components/checkout-edit-billing-address.hbs +1 -1
  13. package/src/components/checkout-payment-details-v2.hbs +6 -1
  14. package/src/components/share-list-modal-without-social-icons.hbs +1 -1
  15. package/src/components/share-list-modal.hbs +1 -1
  16. package/src/js/emulation/mock.js +2394 -2348
  17. package/src/js/emulation/tracking-emulation.js +38 -0
  18. package/src/js/page/bloomreach-widget/bloomreach-widget-tracking.js +87 -0
  19. package/src/js/page/bloomreach-widget/bloomreach-widget.js +9 -0
  20. package/src/js/page/bloomreach-widget/complete-your-project-widget.js +65 -0
  21. package/src/js/page/bloomreach-widget/why-not-add-widget.js +36 -2
  22. package/src/js/page/checkout-payment-details.js +10 -0
  23. package/src/js/page/utils/data-layer.js +9 -0
  24. package/src/page_payment-details-billie-registered-only.html +76 -0
  25. package/src/page_payment-details-billie-unregistered-only.html +76 -0
  26. package/src/sitemap.html +12 -0
@@ -0,0 +1,87 @@
1
+ import { pushDataLayerEvent } from '../utils/data-layer';
2
+
3
+ const EVENT_NAMES = {
4
+ view: 'brRecommendationWidgetView',
5
+ click: 'brRecommendationWidgetClick',
6
+ addToCart: 'brRecommendationWidgetAddToCart',
7
+ };
8
+
9
+ function disconnectViewObserver(state) {
10
+ if (!state.viewObserver) {
11
+ return;
12
+ }
13
+
14
+ state.viewObserver.disconnect();
15
+ state.viewObserver = null;
16
+ }
17
+
18
+ function observeView(state, elements) {
19
+ if (!window.IntersectionObserver) {
20
+ return;
21
+ }
22
+
23
+ elements = Array.isArray(elements) ? elements : [elements];
24
+
25
+ state.viewObserver = new IntersectionObserver(function (entries) {
26
+ if (
27
+ entries.some(function (entry) {
28
+ return entry.isIntersecting;
29
+ })
30
+ ) {
31
+ pushDataLayerEvent(EVENT_NAMES.view, state.widgetData);
32
+ disconnectViewObserver(state);
33
+ }
34
+ });
35
+
36
+ elements.forEach(function (element) {
37
+ if (element) {
38
+ state.viewObserver.observe(element);
39
+ }
40
+ });
41
+ }
42
+
43
+ function trackClick(state, itemId) {
44
+ pushDataLayerEvent(EVENT_NAMES.click, {
45
+ ...state.widgetData,
46
+ item_id: itemId,
47
+ });
48
+ }
49
+
50
+ function trackAddToCart(state, items) {
51
+ pushDataLayerEvent(EVENT_NAMES.addToCart, {
52
+ ...state.widgetData,
53
+ items,
54
+ });
55
+ }
56
+
57
+ export function createBloomreachWidgetTracking() {
58
+ const state = {
59
+ initWidgetPayload: null,
60
+ viewObserver: null,
61
+ };
62
+
63
+ return {
64
+ setPayload(payloadData) {
65
+ disconnectViewObserver(state);
66
+ const metadata = payloadData.widgetMetadata;
67
+
68
+ state.widgetData = {
69
+ wrid: metadata.responseId,
70
+ wid: metadata.id,
71
+ wty: metadata.type,
72
+ };
73
+ },
74
+
75
+ observeView(element) {
76
+ observeView(state, element);
77
+ },
78
+
79
+ trackClick(itemId) {
80
+ trackClick(state, itemId);
81
+ },
82
+
83
+ trackAddToCart(items) {
84
+ trackAddToCart(state, items);
85
+ },
86
+ };
87
+ }
@@ -1,5 +1,6 @@
1
1
  var Wick = window.Wick || {};
2
2
 
3
+ import { isApp } from '../utils/helpers';
3
4
  import { createEvent } from '../utils/create-event';
4
5
  import CompleteYourProjectWidget from './complete-your-project-widget';
5
6
  import WhyNotAddWidget from './why-not-add-widget';
@@ -80,6 +81,14 @@ Wick.BloomreachWidget = {
80
81
  return '';
81
82
  },
82
83
 
84
+ removeBlankTargets($root) {
85
+ if (!isApp()) {
86
+ return;
87
+ }
88
+
89
+ $root.find('a[target="_blank"]').removeAttr('target');
90
+ },
91
+
83
92
  getWasPrice(product) {
84
93
  const displayPrice = Wick.BloomreachWidget.getDisplayPrice(product);
85
94
 
@@ -4,6 +4,7 @@ import { createCountStepper } from '../utils/create-count-stepper';
4
4
  import { createDropdown } from '../utils/custom-dropdown';
5
5
  import { createLoadingButton } from '../utils/create-loading-button';
6
6
  import { createToast } from '../utils/create-toast';
7
+ import { createBloomreachWidgetTracking } from './bloomreach-widget-tracking';
7
8
 
8
9
  const Handlebars = require('hbsfy/runtime');
9
10
 
@@ -34,6 +35,7 @@ const CompleteYourProjectWidget = {
34
35
  lastCalculationResponse: null,
35
36
  dropdownCurrent: {},
36
37
  toast: null,
38
+ tracking: createBloomreachWidgetTracking(),
37
39
 
38
40
  el: {
39
41
  cardCheckbox: '.complete-card__select input[type="checkbox"]',
@@ -427,6 +429,55 @@ const CompleteYourProjectWidget = {
427
429
  });
428
430
  },
429
431
 
432
+ getSelectedTrackingItems($root) {
433
+ const { completeCard, cardCheckbox, recommendationIndexAttr } =
434
+ CompleteYourProjectWidget.el;
435
+ const items = [];
436
+
437
+ $root.find(completeCard).each(function () {
438
+ const $card = $(this);
439
+ const recommendationIndex = Number($card.attr(recommendationIndexAttr));
440
+
441
+ if (recommendationIndex === 0 || !$card.find(cardCheckbox).prop('checked')) {
442
+ return;
443
+ }
444
+
445
+ const recommendation = CompleteYourProjectWidget.recommendations[recommendationIndex];
446
+ const baseProduct = recommendation && recommendation.baseProduct;
447
+ const selectedProduct = CompleteYourProjectWidget.getCardProduct($card);
448
+
449
+ if (!baseProduct || !baseProduct.code || !selectedProduct || !selectedProduct.code) {
450
+ return;
451
+ }
452
+
453
+ items.push({
454
+ item_id: baseProduct.code,
455
+ sku: selectedProduct.code,
456
+ });
457
+ });
458
+
459
+ return items;
460
+ },
461
+
462
+ bindProductTracking($root) {
463
+ const { completeCard, recommendationIndexAttr, titleEl } = CompleteYourProjectWidget.el;
464
+
465
+ $root.off('click.bloomreachWidgetTracking', titleEl);
466
+ $root.on('click.bloomreachWidgetTracking', titleEl, function () {
467
+ const $card = $(this).closest(completeCard);
468
+ const recommendationIndex = Number($card.attr(recommendationIndexAttr));
469
+
470
+ if (recommendationIndex === 0) {
471
+ return;
472
+ }
473
+
474
+ const recommendation = CompleteYourProjectWidget.recommendations[recommendationIndex];
475
+ const baseProduct = recommendation && recommendation.baseProduct;
476
+
477
+ CompleteYourProjectWidget.tracking.trackClick(baseProduct && baseProduct.code);
478
+ });
479
+ },
480
+
430
481
  updateSummary($root, response = {}) {
431
482
  const totalPriceExclusiveVat = response.totalPriceExclusiveVat || response.totalExcVatPrice;
432
483
 
@@ -818,6 +869,12 @@ const CompleteYourProjectWidget = {
818
869
  return;
819
870
  }
820
871
 
872
+ const trackingItems = CompleteYourProjectWidget.getSelectedTrackingItems($root);
873
+
874
+ if (trackingItems.length) {
875
+ CompleteYourProjectWidget.tracking.trackAddToCart(trackingItems);
876
+ }
877
+
821
878
  CompleteYourProjectWidget.dispatchAddToCart($root, $button);
822
879
  });
823
880
  },
@@ -991,6 +1048,7 @@ const CompleteYourProjectWidget = {
991
1048
  CompleteYourProjectWidget.bindDropdowns();
992
1049
  CompleteYourProjectWidget.bindDropdownValidation($completeWidget);
993
1050
  CompleteYourProjectWidget.bindAddToCart($completeWidget);
1051
+ CompleteYourProjectWidget.bindProductTracking($completeWidget);
994
1052
  CompleteYourProjectWidget.bindVatToggle();
995
1053
  CompleteYourProjectWidget.initQuantityFields($completeWidget);
996
1054
 
@@ -1007,12 +1065,19 @@ const CompleteYourProjectWidget = {
1007
1065
  init(payloadData) {
1008
1066
  const $containers = $(CompleteYourProjectWidget.el.widgetContainer);
1009
1067
 
1068
+ CompleteYourProjectWidget.tracking.setPayload(payloadData);
1069
+
1010
1070
  if (!payloadData || !Wick.BloomreachWidget.hasRecommendations(payloadData)) {
1011
1071
  $containers.find(CompleteYourProjectWidget.el.completeWidget).hide();
1012
1072
  return;
1013
1073
  }
1014
1074
 
1015
1075
  CompleteYourProjectWidget.renderWidgetFromPayload(payloadData);
1076
+
1077
+ CompleteYourProjectWidget.tracking.observeView([
1078
+ $containers.find(CompleteYourProjectWidget.el.titleEl).get(0),
1079
+ $containers.find(CompleteYourProjectWidget.el.ctaButton).get(0),
1080
+ ]);
1016
1081
  },
1017
1082
  };
1018
1083
 
@@ -1,6 +1,7 @@
1
1
  var Wick = window.Wick || {};
2
2
 
3
3
  import { createLoadingButton } from '../utils/create-loading-button';
4
+ import { createBloomreachWidgetTracking } from './bloomreach-widget-tracking';
4
5
 
5
6
  const Handlebars = require('hbsfy/runtime');
6
7
 
@@ -32,11 +33,15 @@ const WhyNotAddWidget = {
32
33
  products: [],
33
34
  sliders: [],
34
35
  loadingButton: null,
36
+ tracking: createBloomreachWidgetTracking(),
35
37
 
36
38
  el: {
37
39
  cta: '.why-not-add-card__cta',
38
40
  next: '[data-why-not-add-next]',
39
41
  pagination: '[data-why-not-add-pagination]',
42
+ productCard: '.why-not-add-card',
43
+ productCodeAttr: 'data-product-code',
44
+ productLink: '.why-not-add-card__title',
40
45
  prev: '[data-why-not-add-prev]',
41
46
  root: '[data-why-not-add]',
42
47
  slider: '[data-why-not-add-slider]',
@@ -119,14 +124,26 @@ const WhyNotAddWidget = {
119
124
  WhyNotAddWidget.sliders.push(slider);
120
125
  });
121
126
  },
127
+
128
+ bindProductTracking($root) {
129
+ $root.off('click.bloomreachWidgetTracking', WhyNotAddWidget.el.productLink);
130
+ $root.on('click.bloomreachWidgetTracking', WhyNotAddWidget.el.productLink, function () {
131
+ const productCode = $(this)
132
+ .closest(WhyNotAddWidget.el.productCard)
133
+ .attr(WhyNotAddWidget.el.productCodeAttr);
134
+
135
+ WhyNotAddWidget.tracking.trackClick(productCode);
136
+ });
137
+ },
138
+
122
139
  bindAddToCart($root) {
123
140
  $root.off('click.whyNotAdd', WhyNotAddWidget.el.cta);
124
141
  $root.on('click.whyNotAdd', WhyNotAddWidget.el.cta, function (event) {
125
142
  event.preventDefault();
126
143
 
127
144
  const $button = $(this);
128
- const $card = $button.closest('.why-not-add-card');
129
- const productCode = $card.attr('data-product-code');
145
+ const $card = $button.closest(WhyNotAddWidget.el.productCard);
146
+ const productCode = $card.attr(WhyNotAddWidget.el.productCodeAttr);
130
147
 
131
148
  if (!productCode || WhyNotAddWidget.loadingButton.isLoading($button)) {
132
149
  return;
@@ -136,6 +153,13 @@ const WhyNotAddWidget = {
136
153
  productCode,
137
154
  };
138
155
 
156
+ WhyNotAddWidget.tracking.trackAddToCart([
157
+ {
158
+ item_id: productCode,
159
+ sku: productCode,
160
+ },
161
+ ]);
162
+
139
163
  WhyNotAddWidget.loadingButton.start($button);
140
164
 
141
165
  Wick.BloomreachWidget.dispatchWidgetEvent(WhyNotAddWidget.ADD_TO_CART_EVENT, payload)
@@ -169,9 +193,12 @@ const WhyNotAddWidget = {
169
193
  });
170
194
  }
171
195
 
196
+ Wick.BloomreachWidget.removeBlankTargets($root);
197
+
172
198
  Wick.BloomreachWidget.drawRating($root);
173
199
  WhyNotAddWidget.initSliders($root);
174
200
  WhyNotAddWidget.bindAddToCart($root);
201
+ WhyNotAddWidget.bindProductTracking($root);
175
202
  WhyNotAddWidget.bindVatToggle();
176
203
  Wick.BloomreachWidget.reapplyVatDisplay();
177
204
  },
@@ -179,6 +206,8 @@ const WhyNotAddWidget = {
179
206
  init(payloadData) {
180
207
  const $containers = $(WhyNotAddWidget.el.widgetContainer);
181
208
 
209
+ WhyNotAddWidget.tracking.setPayload(payloadData);
210
+
182
211
  if (!payloadData) {
183
212
  $containers.empty().hide();
184
213
  return;
@@ -190,6 +219,11 @@ const WhyNotAddWidget = {
190
219
  WhyNotAddWidget.renderWidget($container, payloadData);
191
220
  WhyNotAddWidget.initRenderedWidget($container);
192
221
  });
222
+
223
+ WhyNotAddWidget.tracking.observeView([
224
+ $containers.find(WhyNotAddWidget.el.productLink).get(0),
225
+ $containers.find(WhyNotAddWidget.el.cta).get(0),
226
+ ]);
193
227
  },
194
228
  };
195
229
 
@@ -244,6 +244,7 @@ Wick.CheckoutPaymentDetails = (function () {
244
244
  setBillieStepVisibility(getBillieRepaymentTermsLength() === 1);
245
245
  resetBillieRepaymentSelection();
246
246
  showBillieBusiness();
247
+ initBillieBusinessType();
247
248
  break;
248
249
 
249
250
  case 'clearpay':
@@ -324,6 +325,14 @@ Wick.CheckoutPaymentDetails = (function () {
324
325
  });
325
326
  }
326
327
 
328
+ function initBillieBusinessType() {
329
+ const $radios = elements.$billieBusiness.find(`input${elements.businessTypeName}`);
330
+ if ($radios.length === 1) {
331
+ $radios.prop('checked', true);
332
+ toggleBusinessTypeFields($radios.val());
333
+ }
334
+ }
335
+
327
336
  function forceReflow($element) {
328
337
  if (!$element.length) return;
329
338
  void $element[0].offsetHeight;
@@ -345,6 +354,7 @@ Wick.CheckoutPaymentDetails = (function () {
345
354
 
346
355
  const hasSelection = $('input[name="repaymentTerms"]:checked').length > 0;
347
356
  setBillieStepVisibility(hasSelection);
357
+ initBillieBusinessType();
348
358
 
349
359
  const $row = $(this).closest('.form-row[data-row-required]');
350
360
  $row.removeClass('form-row_validation-error').find('.form-row__error').remove();
@@ -0,0 +1,9 @@
1
+ export function pushDataLayerEvent(eventName, data) {
2
+ window.dataLayer = window.dataLayer || [];
3
+ window.dataLayer.push({
4
+ event: eventName,
5
+ data,
6
+ });
7
+
8
+ return true;
9
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wickes-css2",
3
- "version": "2.112.0-why-not-add.4",
3
+ "version": "2.112.0",
4
4
  "description": "CSS and JS and page templates in use by Wickes",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -123,10 +123,6 @@
123
123
  {
124
124
  "name": "develop",
125
125
  "prerelease": true
126
- },
127
- {
128
- "name": "custom-tag/*",
129
- "prerelease": "${name.replace(/^custom-tag\\//g, '')}"
130
126
  }
131
127
  ],
132
128
  "plugins": [
@@ -4,26 +4,30 @@
4
4
  Select your business type
5
5
  </label>
6
6
 
7
- <div class="form-row">
8
- <div class="form-row__field">
9
- {{> radiobutton
10
- id="businessTypeUnregistered"
11
- name="businessType"
12
- value="unregistered"
13
- label="Unregistered Sole Trader / Business"}}
7
+ {{#unless (eq billie-business-type "REGISTERED_SOLE_TRADER_BUSINESS")}}
8
+ <div class="form-row">
9
+ <div class="form-row__field">
10
+ {{> radiobutton
11
+ id="businessTypeUnregistered"
12
+ name="businessType"
13
+ value="unregistered"
14
+ label="Unregistered Sole Trader / Business"}}
15
+ </div>
14
16
  </div>
15
- </div>
16
- <div class="form-row">
17
- <div class="form-row__field">
18
- {{> radiobutton
19
- id="businessTypeRegistered"
20
- name="businessType"
21
- value="registered"
22
- labelClass="registered-label"
23
- label="Registered Sole Trader / Business"
24
- tooltip="A Registered Business is one that has undergone the official process of being recognised and registered with Companies House, establishing its legal identity and enabling it to operate within a specific jurisdiction, such as a limited company. A Registered Business will have been issued a Company Registration Number (CRN) from Companies House."}}
17
+ {{/unless}}
18
+ {{#unless (eq billie-business-type "UNREGISTERED_SOLE_TRADER_BUSINESS")}}
19
+ <div class="form-row">
20
+ <div class="form-row__field">
21
+ {{> radiobutton
22
+ id="businessTypeRegistered"
23
+ name="businessType"
24
+ value="registered"
25
+ labelClass="registered-label"
26
+ label="Registered Sole Trader / Business"
27
+ tooltip="A Registered Business is one that has undergone the official process of being recognised and registered with Companies House, establishing its legal identity and enabling it to operate within a specific jurisdiction, such as a limited company. A Registered Business will have been issued a Company Registration Number (CRN) from Companies House."}}
28
+ </div>
25
29
  </div>
26
- </div>
30
+ {{/unless}}
27
31
  </div>
28
32
  <div
29
33
  id="unregistered-fields"
@@ -23,7 +23,7 @@
23
23
 
24
24
  <div class="address-postcode">
25
25
  {{> address-postcode-look-up}}
26
- {{> address-billie}}
26
+ {{> address-billie billie-business-type=billie-business-type}}
27
27
  </div>
28
28
 
29
29
  {{#unless no-set-card}}
@@ -239,7 +239,12 @@
239
239
  </div>
240
240
  </div>
241
241
  <div class="billing-address">
242
- {{> checkout-edit-billing-address actionBlock="true" no-set-card="true" billie-form=billie-form}}
242
+ {{> checkout-edit-billing-address
243
+ actionBlock="true"
244
+ no-set-card="true"
245
+ billie-form=billie-form
246
+ billie-business-type=billie-business-type
247
+ }}
243
248
  </div>
244
249
  <div data-existing-card
245
250
  class="form-row form-row__action form-row__action_custom checkout-payment-details__place-order paypal__row">
@@ -18,7 +18,7 @@
18
18
 
19
19
  <form class="share-list__form" action="#" id="share-list-form">
20
20
 
21
- {{> form-row type="text" id="share-via-email" label="Share via email" info="Enter email addresses separated by space:"}}
21
+ {{> form-row type="text" id="share-via-email" label="Share via email"}}
22
22
 
23
23
  <div class="share-via-email-box">
24
24
  {{> form-row type="text"}}
@@ -18,7 +18,7 @@
18
18
 
19
19
  <form class="share-list__form" action="#" id="share-list-form">
20
20
 
21
- {{> form-row type="text" id="share-via-email" label="Share via email" info="Enter email addresses separated by space:"}}
21
+ {{> form-row type="text" id="share-via-email" label="Share via email"}}
22
22
 
23
23
  <div class="share-via-email-box">
24
24
  {{> form-row type="text"}}