wickes-css2 2.113.0-develop.3 → 2.113.0-develop.6

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 (88) hide show
  1. package/build/css/main.css +1 -1
  2. package/build/css/pages/checkout-new.css +1 -1
  3. package/build/css/pages/page_checkout_delivery-new.css +1 -1
  4. package/build/css/pages/page_merged-basket.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/emulation/low-trees.png +0 -0
  9. package/build/img/emulation/overhead-power-cables.png +0 -0
  10. package/build/img/emulation/parked-vehicles.png +0 -0
  11. package/build/img/emulation/traffic-access-issues.png +0 -0
  12. package/build/img/emulation/walls-or-fences.png +0 -0
  13. package/build/js/basket.min.js +1 -1
  14. package/build/js/bloomreach-widget.min.js +1 -1
  15. package/build/js/bundle.min.js +1 -1
  16. package/build/js/checkout.min.js +1 -1
  17. package/build/js/emulation.min.js +360 -3222
  18. package/build/js/general.bundle.min.js +1 -1
  19. package/build/js/merged-checkout.min.js +1 -1
  20. package/build/js/page/bloomreach-widget/bloomreach-recommendation-carousel-widget.js +318 -0
  21. package/build/js/page/bloomreach-widget/bloomreach-widget-core.js +370 -0
  22. package/build/js/page/bloomreach-widget/bloomreach-widget-tracking.js +16 -13
  23. package/build/js/page/bloomreach-widget/bloomreach-widget.js +8 -237
  24. package/build/js/page/bloomreach-widget/complete-your-project/cards.js +308 -0
  25. package/build/js/page/bloomreach-widget/complete-your-project/config.js +60 -0
  26. package/build/js/page/bloomreach-widget/complete-your-project/model.js +140 -0
  27. package/build/js/page/bloomreach-widget/complete-your-project/presenter.js +69 -0
  28. package/build/js/page/bloomreach-widget/complete-your-project/quantity.js +80 -0
  29. package/build/js/page/bloomreach-widget/complete-your-project/view.js +179 -0
  30. package/build/js/page/bloomreach-widget/complete-your-project/widget.js +185 -0
  31. package/build/js/page/bloomreach-widget/dont-forget-widget.js +15 -0
  32. package/build/js/page/bloomreach-widget/why-not-add-widget.js +10 -228
  33. package/build/js/pdp.bundle.min.js +1 -1
  34. package/build/js/plp.bundle.min.js +1 -1
  35. package/build/js/project-list.min.js +1 -1
  36. package/package.json +1 -1
  37. package/src/components/base/button.hbs +7 -0
  38. package/src/components/bloomreach/complete-your-project-skeleton.hbs +21 -0
  39. package/src/components/bloomreach/complete-your-project.hbs +6 -21
  40. package/src/components/bloomreach/why-not-add-card-skeleton.hbs +2 -2
  41. package/src/components/bloomreach/why-not-add-card.hbs +79 -60
  42. package/src/components/bloomreach/why-not-add-content.hbs +3 -3
  43. package/src/components/bloomreach/why-not-add.hbs +1 -1
  44. package/src/components/date-selection.hbs +17 -12
  45. package/src/components/heavy-banners-wrapper.hbs +21 -0
  46. package/src/data/data_heavy-banner.json +29 -0
  47. package/src/img/emulation/low-trees.png +0 -0
  48. package/src/img/emulation/overhead-power-cables.png +0 -0
  49. package/src/img/emulation/parked-vehicles.png +0 -0
  50. package/src/img/emulation/traffic-access-issues.png +0 -0
  51. package/src/img/emulation/walls-or-fences.png +0 -0
  52. package/src/js/components/general/cart-slider.js +41 -4
  53. package/src/js/emulation/complete-your-project-loading.js +16 -0
  54. package/src/js/emulation/custom-slider-emulation.js +21 -8
  55. package/src/js/emulation/dont-forget-loading.js +36 -0
  56. package/src/js/emulation/just-added-scenarios-emulation.js +131 -0
  57. package/src/js/emulation/mini-basket.js +34 -34
  58. package/src/js/emulation/mock.js +429 -4
  59. package/src/js/emulation/why-not-add-loading.js +14 -3
  60. package/src/js/emulation/why-not-add.js +12 -14
  61. package/src/js/page/bloomreach-widget/bloomreach-recommendation-carousel-widget.js +318 -0
  62. package/src/js/page/bloomreach-widget/bloomreach-widget-core.js +370 -0
  63. package/src/js/page/bloomreach-widget/bloomreach-widget-tracking.js +16 -13
  64. package/src/js/page/bloomreach-widget/bloomreach-widget.js +8 -237
  65. package/src/js/page/bloomreach-widget/complete-your-project/cards.js +308 -0
  66. package/src/js/page/bloomreach-widget/complete-your-project/config.js +60 -0
  67. package/src/js/page/bloomreach-widget/complete-your-project/model.js +140 -0
  68. package/src/js/page/bloomreach-widget/complete-your-project/presenter.js +69 -0
  69. package/src/js/page/bloomreach-widget/complete-your-project/quantity.js +80 -0
  70. package/src/js/page/bloomreach-widget/complete-your-project/view.js +179 -0
  71. package/src/js/page/bloomreach-widget/complete-your-project/widget.js +185 -0
  72. package/src/js/page/bloomreach-widget/dont-forget-widget.js +15 -0
  73. package/src/js/page/bloomreach-widget/why-not-add-widget.js +10 -228
  74. package/src/page_checkout_big-bulky-delivery-details.html +272 -0
  75. package/src/page_product-details-with-global-search-v2.html +4 -6
  76. package/src/page_product-details-with-why-not-add-single.html +1 -1
  77. package/src/scss/components/_checkout_order.scss +2 -1
  78. package/src/scss/components/_heavy-banners.scss +216 -0
  79. package/src/scss/components/bloomreach/_bloomreach.scss +1 -0
  80. package/src/scss/components/bloomreach/_card-shared.scss +24 -0
  81. package/src/scss/components/bloomreach/_complete-card.scss +1 -9
  82. package/src/scss/components/bloomreach/_why-not-add-card.scss +137 -10
  83. package/src/scss/components/bloomreach/_why-not-add.scss +31 -2
  84. package/src/scss/main.scss +1 -0
  85. package/src/scss/pages/page_checkout_delivery-new.scss +4 -0
  86. package/src/sitemap.html +2 -0
  87. package/build/js/page/bloomreach-widget/complete-your-project-widget.js +0 -1100
  88. package/src/js/page/bloomreach-widget/complete-your-project-widget.js +0 -1100
@@ -0,0 +1,308 @@
1
+ import { createDropdown } from '../../utils/custom-dropdown';
2
+ import {
3
+ COMPLETE_YOUR_PROJECT_EL as EL,
4
+ COMPLETE_YOUR_PROJECT_TEMPLATES as TEMPLATES,
5
+ } from './config';
6
+ import { createCompleteYourProjectQuantity } from './quantity';
7
+
8
+ export function createCompleteYourProjectCards({
9
+ model,
10
+ presenter,
11
+ view,
12
+ tracking,
13
+ calculateTotal,
14
+ }) {
15
+ let dropdownCurrent = {};
16
+
17
+ function resetDropdownState() {
18
+ dropdownCurrent = {};
19
+ }
20
+
21
+ function getDropdownCard($dropdown) {
22
+ return $dropdown.closest(EL.completeCard);
23
+ }
24
+
25
+ function getDropdownCheckbox($dropdown) {
26
+ return getDropdownCard($dropdown).find(EL.cardCheckbox);
27
+ }
28
+
29
+ function setDropdownCheckboxState($dropdown, isChecked, shouldTriggerChange = true) {
30
+ const $checkbox = getDropdownCheckbox($dropdown);
31
+
32
+ if (!$checkbox.length) {
33
+ return;
34
+ }
35
+
36
+ $checkbox.prop('checked', isChecked);
37
+
38
+ if (shouldTriggerChange) {
39
+ $checkbox.trigger('change');
40
+ }
41
+ }
42
+
43
+ function setDropdownError($dropdown, hasError) {
44
+ $dropdown.toggleClass(EL.dropdownErrorClass, hasError);
45
+ }
46
+
47
+ function validateDropdown($dropdown, options = {}) {
48
+ const isValid = Boolean($dropdown.data(EL.selectedValueData));
49
+
50
+ setDropdownError($dropdown, !isValid);
51
+
52
+ if (!isValid && options.uncheck) {
53
+ setDropdownCheckboxState($dropdown, false, false);
54
+ getDropdownCard($dropdown).removeClass(EL.selectedClass);
55
+ }
56
+
57
+ return isValid;
58
+ }
59
+
60
+ function validateCardDropdown($card, options = {}) {
61
+ const $dropdown = $card.find(EL.dropdownRoot);
62
+
63
+ if (!$dropdown.length) {
64
+ return true;
65
+ }
66
+
67
+ return validateDropdown($dropdown, options);
68
+ }
69
+
70
+ function reinitCard($card) {
71
+ $card.find(EL.countBtn).remove();
72
+ quantity.initQuantityFields($card);
73
+ Wick.BloomreachWidget.drawRating($card);
74
+ view.alignCardBlocks($card.closest(EL.completeWidget));
75
+ Wick.BloomreachWidget.reapplyVatDisplay();
76
+ }
77
+
78
+ function replaceCard($card, recommendationIndex, product, renderOptions = {}, state = {}) {
79
+ const productData = presenter.getProductRenderData(
80
+ product,
81
+ recommendationIndex,
82
+ renderOptions
83
+ );
84
+ const $newCard = $(TEMPLATES.card(productData));
85
+
86
+ $newCard.attr(EL.recommendationIndexAttr, recommendationIndex);
87
+ $newCard.toggleClass(EL.selectedClass, Boolean(state.checked));
88
+
89
+ const $newDropdown = $newCard.find(EL.dropdownRoot);
90
+
91
+ if ($newDropdown.length && state.selectedValue) {
92
+ $newDropdown.data(EL.selectedValueData, state.selectedValue);
93
+ }
94
+
95
+ if (state.dropdownError) {
96
+ $newDropdown.addClass(EL.dropdownErrorClass);
97
+ }
98
+
99
+ $card.replaceWith($newCard);
100
+ $newCard.find(EL.cardCheckbox).prop('checked', Boolean(state.checked));
101
+ quantity.resetCardQuantity($newCard);
102
+ reinitCard($newCard);
103
+
104
+ return $newCard;
105
+ }
106
+
107
+ function replaceCardWithBaseProduct($dropdown, options = {}) {
108
+ const $card = getDropdownCard($dropdown);
109
+ const recommendationIndex = model.getRecommendationIndex($card);
110
+ const recommendation = model.getRecommendations()[recommendationIndex];
111
+
112
+ if (!recommendation || !recommendation.baseProduct) {
113
+ return null;
114
+ }
115
+
116
+ return replaceCard(
117
+ $card,
118
+ recommendationIndex,
119
+ recommendation.baseProduct,
120
+ {
121
+ dropdownError: options.dropdownError || false,
122
+ checked: false,
123
+ },
124
+ {
125
+ checked: false,
126
+ dropdownError: options.dropdownError || false,
127
+ }
128
+ );
129
+ }
130
+
131
+ function replaceCardWithVariant($dropdown, selectedValue) {
132
+ const $card = getDropdownCard($dropdown);
133
+ const recommendationIndex = model.getRecommendationIndex($card);
134
+ const recommendation = model.getRecommendations()[recommendationIndex];
135
+
136
+ if (!recommendation) {
137
+ return null;
138
+ }
139
+
140
+ const variantProduct = model.findVariantProduct(recommendation, selectedValue);
141
+
142
+ if (!variantProduct) {
143
+ return null;
144
+ }
145
+
146
+ return replaceCard(
147
+ $card,
148
+ recommendationIndex,
149
+ {
150
+ ...variantProduct,
151
+ variantOptions: recommendation.baseProduct.variantOptions,
152
+ },
153
+ {
154
+ fallbackProduct: recommendation.baseProduct,
155
+ checked: true,
156
+ selectedDropdownValue: selectedValue,
157
+ },
158
+ {
159
+ checked: true,
160
+ selectedValue,
161
+ }
162
+ );
163
+ }
164
+
165
+ function handleDropdownSelect($dropdown, selectedValue) {
166
+ const $card = getDropdownCard($dropdown);
167
+ const recommendationIndex = $card.attr(EL.recommendationIndexAttr);
168
+ const currentValue = dropdownCurrent[recommendationIndex];
169
+
170
+ if (`${currentValue}` === `${selectedValue}`) {
171
+ return;
172
+ }
173
+
174
+ dropdownCurrent[recommendationIndex] = selectedValue;
175
+
176
+ const $completeWidget = $dropdown.closest(EL.completeWidget);
177
+ const isPlaceholder = !selectedValue;
178
+
179
+ if (isPlaceholder) {
180
+ setDropdownError($dropdown, true);
181
+ setDropdownCheckboxState($dropdown, false, false);
182
+ replaceCardWithBaseProduct($dropdown, { dropdownError: true });
183
+
184
+ if ($completeWidget.length) {
185
+ calculateTotal($completeWidget);
186
+ }
187
+
188
+ return;
189
+ }
190
+
191
+ setDropdownError($dropdown, false);
192
+ setDropdownCheckboxState($dropdown, true, false);
193
+ replaceCardWithVariant($dropdown, selectedValue);
194
+
195
+ if ($completeWidget.length) {
196
+ calculateTotal($completeWidget);
197
+ }
198
+ }
199
+
200
+ function bindDropdowns() {
201
+ const dropdown = createDropdown({
202
+ root: EL.dropdownRoot,
203
+ toggle: EL.dropdownToggle,
204
+ value: EL.dropdownValue,
205
+ option: EL.dropdownOption,
206
+ openClass: EL.dropdownOpenClass,
207
+ selectedClass: EL.dropdownOptionSelectedClass,
208
+ namespace: 'bloomreachDropdown',
209
+ onSelect($dropdown, $option, selectedValue) {
210
+ handleDropdownSelect($dropdown, selectedValue);
211
+ },
212
+ });
213
+
214
+ dropdown.bind();
215
+ }
216
+
217
+ function bindCardSelection($root) {
218
+ const $firstCard = $root.find(EL.completeCard).first();
219
+
220
+ $firstCard.find(EL.cardCheckbox).prop('checked', true);
221
+ $firstCard.addClass(EL.selectedClass);
222
+
223
+ $root.off('change.bloomreachCardSelection', EL.cardCheckbox);
224
+ $root.on('change.bloomreachCardSelection', EL.cardCheckbox, function () {
225
+ const $checkbox = $(this);
226
+ const $card = $checkbox.closest(EL.completeCard);
227
+ const $dropdown = $card.find(EL.dropdownRoot);
228
+
229
+ if (!$checkbox.prop('checked') && $dropdown.hasClass(EL.dropdownErrorClass)) {
230
+ $card.removeClass(EL.selectedClass);
231
+ return;
232
+ }
233
+
234
+ if (
235
+ $checkbox.prop('checked') &&
236
+ !validateCardDropdown($card, {
237
+ uncheck: true,
238
+ })
239
+ ) {
240
+ $checkbox.prop('checked', false);
241
+ $card.removeClass(EL.selectedClass);
242
+ return;
243
+ }
244
+
245
+ $card.toggleClass(EL.selectedClass, this.checked);
246
+ calculateTotal($root);
247
+ });
248
+ }
249
+
250
+ function bindDropdownValidation($root) {
251
+ $root.off('click.bloomreachDropdownValidation', EL.cardCheckbox);
252
+ $root.on('click.bloomreachDropdownValidation', EL.cardCheckbox, function () {
253
+ const $checkbox = $(this);
254
+ const $card = $checkbox.closest(EL.completeCard);
255
+
256
+ if (
257
+ $checkbox.prop('checked') &&
258
+ !validateCardDropdown($card, {
259
+ uncheck: true,
260
+ })
261
+ ) {
262
+ $checkbox.prop('checked', false);
263
+ $card.removeClass(EL.selectedClass);
264
+ }
265
+ });
266
+ }
267
+
268
+ function bindProductTracking($root) {
269
+ $root.off('click.bloomreachWidgetTracking', EL.titleEl);
270
+ $root.on('click.bloomreachWidgetTracking', EL.titleEl, function () {
271
+ const $card = $(this).closest(EL.completeCard);
272
+ const recommendationIndex = model.getRecommendationIndex($card);
273
+
274
+ if (recommendationIndex === 0) {
275
+ return;
276
+ }
277
+
278
+ const recommendation = model.getRecommendations()[recommendationIndex];
279
+ const baseProduct = recommendation && recommendation.baseProduct;
280
+
281
+ tracking.trackClick(baseProduct && baseProduct.code);
282
+ });
283
+ }
284
+
285
+ function resetBackForwardState() {
286
+ $(EL.completeWidget).each(function () {
287
+ const $widget = $(this);
288
+
289
+ view.resetWidgetState($widget);
290
+ bindCardSelection($widget);
291
+ });
292
+ }
293
+
294
+ const quantity = createCompleteYourProjectQuantity({
295
+ validateCardDropdown,
296
+ calculateTotal,
297
+ });
298
+
299
+ return {
300
+ resetDropdownState,
301
+ bindDropdowns,
302
+ bindCardSelection,
303
+ bindDropdownValidation,
304
+ bindProductTracking,
305
+ initQuantityFields: quantity.initQuantityFields,
306
+ resetBackForwardState,
307
+ };
308
+ }
@@ -0,0 +1,60 @@
1
+ const Handlebars = require('hbsfy/runtime');
2
+
3
+ Handlebars.registerPartial('checkbox', require('../../../../elements/checkbox.hbs'));
4
+ Handlebars.registerPartial('loader', require('../../../../elements/loader.hbs'));
5
+ Handlebars.registerPartial('button', require('../../../../components/base/button.hbs'));
6
+ Handlebars.registerPartial(
7
+ 'bloomreach/complete-card-dropdown',
8
+ require('../../../../components/bloomreach/complete-card-dropdown.hbs')
9
+ );
10
+ Handlebars.registerPartial('notifications', require('../../../../elements/notifications.hbs'));
11
+ Handlebars.registerPartial('reviews-rating', require('../../../../components/reviews-rating.hbs'));
12
+
13
+ export const COMPLETE_YOUR_PROJECT_EVENTS = {
14
+ calculateTotal: 'calculateProductBundleTotal',
15
+ addToCart: 'bulkAddToCart',
16
+ };
17
+
18
+ export const COMPLETE_YOUR_PROJECT_EL = {
19
+ cardCheckbox: '.complete-card__select input[type="checkbox"]',
20
+ completeCard: '.complete-card',
21
+ completeWidget: '.complete-widget',
22
+ countBtn: '.count-btn',
23
+ countMinusBtn: '.count-btn--minus',
24
+ countStepperInitializedData: 'count-stepper-initialized',
25
+ countStepperRoot: '.count-stepper',
26
+ ctaButton: '.complete-widget__cta .btn',
27
+ summaryPriceValue: '.complete-widget__price-value',
28
+ summarySalePrice: '.complete-widget__sale-price',
29
+ summaryTotal: '.complete-widget__total',
30
+
31
+ dropdownErrorClass: 'complete-card-dropdown--error',
32
+ dropdownOpenClass: 'complete-card-dropdown--open',
33
+ dropdownOption: '[data-complete-card-dropdown-option]',
34
+ dropdownOptionSelectedClass: 'complete-card-dropdown__option--selected',
35
+ dropdownRoot: '[data-complete-card-dropdown]',
36
+ dropdownToggle: '[data-complete-card-dropdown-toggle]',
37
+ dropdownValue: '[data-complete-card-dropdown-value]',
38
+
39
+ optionsEl: '.complete-card__options',
40
+ previousQuantityData: 'previous-quantity',
41
+ quantityInput: '.tbx_quantity',
42
+ quantityReadyData: 'quantity-ready',
43
+
44
+ recommendationIndexAttr: 'data-recommendation-index',
45
+ selectedClass: 'complete-card--selected',
46
+ selectedValueData: 'selected-value',
47
+ titleEl: '.complete-card__title',
48
+
49
+ widgetContainer: '[data-complete-widget]',
50
+ widgetContent: '[data-complete-widget-content]',
51
+ widgetWrapper: '[data-complete-widget-wrapper]',
52
+ };
53
+
54
+ export const COMPLETE_YOUR_PROJECT_TEMPLATES = {
55
+ notification: require('../../../../elements/notifications.hbs'),
56
+ wrapper: require('../../../../components/bloomreach/complete-wrapper.hbs'),
57
+ divider: require('../../../../components/bloomreach/complete-divider.hbs'),
58
+ card: require('../../../../components/bloomreach/complete-card.hbs'),
59
+ summary: require('../../../../components/bloomreach/complete-summary.hbs'),
60
+ };
@@ -0,0 +1,140 @@
1
+ import { COMPLETE_YOUR_PROJECT_EL as EL } from './config';
2
+
3
+ export function createCompleteYourProjectModel() {
4
+ let recommendations = [];
5
+
6
+ function setRecommendations(payloadData) {
7
+ recommendations = Wick.BloomreachWidget.normalizePayload(payloadData);
8
+ }
9
+
10
+ function getRecommendations() {
11
+ return recommendations;
12
+ }
13
+
14
+ function getRecommendationIndex($card) {
15
+ return Number($card.attr(EL.recommendationIndexAttr));
16
+ }
17
+
18
+ function getRecommendation($card) {
19
+ return recommendations[getRecommendationIndex($card)];
20
+ }
21
+
22
+ function findVariantProduct(recommendation, selectedValue) {
23
+ if (
24
+ !recommendation ||
25
+ !recommendation.variantProducts ||
26
+ !recommendation.variantProducts.length
27
+ ) {
28
+ return null;
29
+ }
30
+
31
+ return recommendation.variantProducts.find(function (variantProduct) {
32
+ return `${variantProduct.code}` === `${selectedValue}`;
33
+ });
34
+ }
35
+
36
+ function getCardQuantity($card) {
37
+ const quantity = parseInt($card.find(EL.quantityInput).val(), 10);
38
+
39
+ return Number.isNaN(quantity) ? 1 : quantity;
40
+ }
41
+
42
+ function getCardProduct($card) {
43
+ const recommendation = getRecommendation($card);
44
+
45
+ if (!recommendation) {
46
+ return null;
47
+ }
48
+
49
+ const $dropdown = $card.find(EL.dropdownRoot);
50
+ const selectedValue = $dropdown.length ? $dropdown.data(EL.selectedValueData) : '';
51
+
52
+ if (selectedValue) {
53
+ return findVariantProduct(recommendation, selectedValue) || recommendation.baseProduct;
54
+ }
55
+
56
+ return recommendation.baseProduct;
57
+ }
58
+
59
+ function getSelectedItems($root) {
60
+ const items = [];
61
+
62
+ $root.find(EL.completeCard).each(function () {
63
+ const $card = $(this);
64
+
65
+ if (!$card.find(EL.cardCheckbox).prop('checked')) {
66
+ return;
67
+ }
68
+
69
+ const product = getCardProduct($card);
70
+
71
+ if (!product) {
72
+ return;
73
+ }
74
+
75
+ const recommendationIndex = getRecommendationIndex($card);
76
+ const recommendation = recommendations[recommendationIndex];
77
+
78
+ items.push({
79
+ recommendationIndex,
80
+ baseProduct: recommendation && recommendation.baseProduct,
81
+ product,
82
+ quantity: getCardQuantity($card),
83
+ });
84
+ });
85
+
86
+ return items;
87
+ }
88
+
89
+ function toSelectedEntries(items) {
90
+ return items.map(function (item) {
91
+ return {
92
+ product: item.product,
93
+ quantity: item.quantity,
94
+ };
95
+ });
96
+ }
97
+
98
+ function toAddToCartEntries(items) {
99
+ return items.map(function (item) {
100
+ return {
101
+ productCode: item.product.code,
102
+ quantity: item.quantity,
103
+ };
104
+ });
105
+ }
106
+
107
+ function toTrackingItems(items) {
108
+ return items
109
+ .filter(function (item) {
110
+ return item.recommendationIndex !== 0;
111
+ })
112
+ .map(function (item) {
113
+ if (
114
+ !item.baseProduct ||
115
+ !item.baseProduct.code ||
116
+ !item.product ||
117
+ !item.product.code
118
+ ) {
119
+ return null;
120
+ }
121
+
122
+ return {
123
+ item_id: item.baseProduct.code,
124
+ sku: item.product.code,
125
+ };
126
+ })
127
+ .filter(Boolean);
128
+ }
129
+
130
+ return {
131
+ setRecommendations,
132
+ getRecommendations,
133
+ getRecommendationIndex,
134
+ findVariantProduct,
135
+ getSelectedItems,
136
+ toSelectedEntries,
137
+ toAddToCartEntries,
138
+ toTrackingItems,
139
+ };
140
+ }
@@ -0,0 +1,69 @@
1
+ export function createCompleteYourProjectPresenter() {
2
+ function getDropdownOptions(product) {
3
+ if (!product.variantOptions || !product.variantOptions.length) {
4
+ return [];
5
+ }
6
+
7
+ return product.variantOptions.map(function (variantOption) {
8
+ const qualifiers = variantOption.variantOptionQualifiers || [];
9
+
10
+ return {
11
+ label: qualifiers
12
+ .map(function (qualifier) {
13
+ return qualifier.value;
14
+ })
15
+ .join(', '),
16
+ value: variantOption.code,
17
+ };
18
+ });
19
+ }
20
+
21
+ function getSelectedDropdownLabel(options, selectedValue) {
22
+ const selectedOption = options.find(function (option) {
23
+ return option.value === selectedValue;
24
+ });
25
+
26
+ return selectedOption ? selectedOption.label : '';
27
+ }
28
+
29
+ function getProductRenderData(product, index, options = {}) {
30
+ const shouldShowDropdown = index !== 0;
31
+ const dropdownOptions = shouldShowDropdown ? getDropdownOptions(product) : [];
32
+ const selectedDropdownValue = options.selectedDropdownValue || '';
33
+ const selectedDropdownLabel = getSelectedDropdownLabel(
34
+ dropdownOptions,
35
+ selectedDropdownValue
36
+ );
37
+ const renderData = Wick.BloomreachWidget.getProductRenderData(product, {
38
+ image: options.image,
39
+ fallbackProduct: options.fallbackProduct,
40
+ fallbackExcVat: true,
41
+ });
42
+ const showFromPrice = Boolean(
43
+ index !== 0 &&
44
+ !selectedDropdownValue &&
45
+ renderData.price &&
46
+ renderData.price.priceType === 'FROM'
47
+ );
48
+
49
+ return {
50
+ ...renderData,
51
+ showFromPrice,
52
+ dropdownOptions: dropdownOptions.map(function (option) {
53
+ return {
54
+ ...option,
55
+ selected: option.value === selectedDropdownValue,
56
+ };
57
+ }),
58
+ checkboxId: `${product.code}-${index}`,
59
+ dropdownError: options.dropdownError || false,
60
+ checked: options.checked || false,
61
+ selectedDropdownValue,
62
+ selectedDropdownLabel,
63
+ };
64
+ }
65
+
66
+ return {
67
+ getProductRenderData,
68
+ };
69
+ }
@@ -0,0 +1,80 @@
1
+ import { createCountStepper } from '../../utils/create-count-stepper';
2
+ import { COMPLETE_YOUR_PROJECT_EL as EL } from './config';
3
+
4
+ export function createCompleteYourProjectQuantity({ validateCardDropdown, calculateTotal }) {
5
+ function resetCardQuantity($card) {
6
+ $card
7
+ .find(EL.quantityInput)
8
+ .val(1)
9
+ .data(EL.previousQuantityData, 1)
10
+ .removeData(EL.quantityReadyData)
11
+ .removeData(EL.countStepperInitializedData);
12
+ }
13
+
14
+ function initQuantityField($root, inputSel) {
15
+ const stepper = createCountStepper({
16
+ inputSel,
17
+ min: 1,
18
+ onChange(qty, inputEl) {
19
+ const $input = $(inputEl);
20
+ const $card = $input.closest(EL.completeCard);
21
+ const $completeWidget = $input.closest(EL.completeWidget);
22
+ const $checkbox = $card.find(EL.cardCheckbox);
23
+ const previousQuantity = $input.data(EL.previousQuantityData) || 1;
24
+
25
+ if (!$input.data(EL.quantityReadyData)) {
26
+ $input.data(EL.previousQuantityData, qty || 1);
27
+ return;
28
+ }
29
+
30
+ if (!validateCardDropdown($card)) {
31
+ $input.val(previousQuantity);
32
+
33
+ if (previousQuantity <= 1) {
34
+ $card.find(EL.countMinusBtn).prop('disabled', true);
35
+ }
36
+
37
+ return;
38
+ }
39
+
40
+ $checkbox.prop('checked', true);
41
+ $card.addClass(EL.selectedClass);
42
+ $input.data(EL.previousQuantityData, qty);
43
+ $input.trigger('change');
44
+
45
+ if ($completeWidget.length) {
46
+ calculateTotal($completeWidget);
47
+ }
48
+ },
49
+ });
50
+
51
+ stepper.init($root);
52
+ $root.find(inputSel).data(EL.quantityReadyData, true);
53
+ }
54
+
55
+ function initQuantityFields($root) {
56
+ $root.find(EL.quantityInput).each(function () {
57
+ const $input = $(this);
58
+
59
+ if ($input.data(EL.countStepperInitializedData)) {
60
+ return;
61
+ }
62
+
63
+ const inputId = $input.attr('id');
64
+
65
+ if (!inputId) {
66
+ return;
67
+ }
68
+
69
+ $input.data(EL.countStepperInitializedData, true);
70
+ $input.data(EL.previousQuantityData, parseInt($input.val(), 10) || 1);
71
+
72
+ initQuantityField($input.closest(EL.countStepperRoot), `#${inputId}`);
73
+ });
74
+ }
75
+
76
+ return {
77
+ resetCardQuantity,
78
+ initQuantityFields,
79
+ };
80
+ }