wickes-css2 2.112.0-develop.10 → 2.112.0-develop.11

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.
@@ -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
+ }
@@ -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)
@@ -174,6 +198,7 @@ const WhyNotAddWidget = {
174
198
  Wick.BloomreachWidget.drawRating($root);
175
199
  WhyNotAddWidget.initSliders($root);
176
200
  WhyNotAddWidget.bindAddToCart($root);
201
+ WhyNotAddWidget.bindProductTracking($root);
177
202
  WhyNotAddWidget.bindVatToggle();
178
203
  Wick.BloomreachWidget.reapplyVatDisplay();
179
204
  },
@@ -181,6 +206,8 @@ const WhyNotAddWidget = {
181
206
  init(payloadData) {
182
207
  const $containers = $(WhyNotAddWidget.el.widgetContainer);
183
208
 
209
+ WhyNotAddWidget.tracking.setPayload(payloadData);
210
+
184
211
  if (!payloadData) {
185
212
  $containers.empty().hide();
186
213
  return;
@@ -192,6 +219,11 @@ const WhyNotAddWidget = {
192
219
  WhyNotAddWidget.renderWidget($container, payloadData);
193
220
  WhyNotAddWidget.initRenderedWidget($container);
194
221
  });
222
+
223
+ WhyNotAddWidget.tracking.observeView([
224
+ $containers.find(WhyNotAddWidget.el.productLink).get(0),
225
+ $containers.find(WhyNotAddWidget.el.cta).get(0),
226
+ ]);
195
227
  },
196
228
  };
197
229
 
@@ -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-develop.10",
3
+ "version": "2.112.0-develop.11",
4
4
  "description": "CSS and JS and page templates in use by Wickes",
5
5
  "main": "index.js",
6
6
  "scripts": {