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.
- package/build/js/bloomreach-widget.min.js +1 -1
- package/build/js/emulation.min.js +2446 -2397
- package/build/js/page/bloomreach-widget/bloomreach-widget-tracking.js +87 -0
- package/build/js/page/bloomreach-widget/complete-your-project-widget.js +65 -0
- package/build/js/page/bloomreach-widget/why-not-add-widget.js +34 -2
- package/build/js/page/utils/data-layer.js +9 -0
- package/package.json +1 -1
- package/src/js/emulation/mock.js +2394 -2348
- package/src/js/emulation/tracking-emulation.js +38 -0
- package/src/js/page/bloomreach-widget/bloomreach-widget-tracking.js +87 -0
- package/src/js/page/bloomreach-widget/complete-your-project-widget.js +65 -0
- package/src/js/page/bloomreach-widget/why-not-add-widget.js +34 -2
- package/src/js/page/utils/data-layer.js +9 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const TRACKING_WIDGET_SELECTOR = '[data-complete-widget], [data-why-not-add-widget]';
|
|
2
|
+
const TRACKED_EVENT_NAMES = [
|
|
3
|
+
'brRecommendationWidgetView',
|
|
4
|
+
'brRecommendationWidgetClick',
|
|
5
|
+
'brRecommendationWidgetAddToCart',
|
|
6
|
+
];
|
|
7
|
+
|
|
8
|
+
function initializeTrackingEmulation() {
|
|
9
|
+
if (
|
|
10
|
+
!document.querySelector(TRACKING_WIDGET_SELECTOR) ||
|
|
11
|
+
window.__trackingEmulationInitialized
|
|
12
|
+
) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
window.__trackingEmulationInitialized = true;
|
|
17
|
+
window.dataLayer = window.dataLayer || [];
|
|
18
|
+
|
|
19
|
+
const originalPush = window.dataLayer.push;
|
|
20
|
+
|
|
21
|
+
window.dataLayer.push = function () {
|
|
22
|
+
const entries = Array.prototype.slice.call(arguments);
|
|
23
|
+
const result = originalPush.apply(window.dataLayer, entries);
|
|
24
|
+
|
|
25
|
+
entries.forEach(function (entry) {
|
|
26
|
+
if (!entry || TRACKED_EVENT_NAMES.indexOf(entry.event) === -1) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
console.log('[TRACKING EMULATION]', entry.event, entry);
|
|
31
|
+
console.log('[DATA LAYER]', window.dataLayer.slice());
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
$(document).ready(initializeTrackingEmulation);
|
|
@@ -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(
|
|
129
|
-
const productCode = $card.attr(
|
|
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
|
|