thm-p3-configurator 0.0.381 → 0.0.382

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.
@@ -12,8 +12,10 @@ var _reactGoogleMaps = require("@vis.gl/react-google-maps");
12
12
  var _react = _interopRequireWildcard(require("react"));
13
13
  var _queries = require("../../__api__/queries");
14
14
  var _ActiveMarkerContext = require("../../__context__/ActiveMarkerContext");
15
+ var _CountryContext = require("../../__context__/CountryContext");
15
16
  var _FormulaContext = require("../../__context__/FormulaContext");
16
17
  var _OrderSessionContext = require("../../__context__/OrderSessionContext");
18
+ var _belgianConfiguratorInfo = require("../../__helpers__/belgianConfiguratorInfo");
17
19
  var _helpers__ = require("../../__helpers__");
18
20
  var _useBreakpoint = _interopRequireDefault(require("../../__hooks__/useBreakpoint"));
19
21
  var _useUserLocation = _interopRequireDefault(require("../../__hooks__/useUserLocation"));
@@ -68,6 +70,8 @@ const LocationsSelector = /*#__PURE__*/_react.default.memo(() => {
68
70
  const screen = (0, _useBreakpoint.default)();
69
71
  const isDesktop = screen.size >= 1200;
70
72
  const formula = (0, _FormulaContext.useFormula)();
73
+ const country = (0, _CountryContext.useCountry)();
74
+ const showBelgianLocationNotice = !APP_CONFIG.internal && (0, _belgianConfiguratorInfo.isBelgianConfigurator)(country);
71
75
  const [{
72
76
  franchiseName
73
77
  }] = (0, _OrderSessionContext.useOrderSession)();
@@ -137,7 +141,9 @@ const LocationsSelector = /*#__PURE__*/_react.default.memo(() => {
137
141
  className: (0, _helpers__.withStyle)('dealer-sidebar col-xl-4 mt-3 mt-xl-0')
138
142
  }, /*#__PURE__*/_react.default.createElement(_LocationAutoComplete.default, {
139
143
  onLocationUpdate: handleLocationUpdate
140
- }), franchiseName && /*#__PURE__*/_react.default.createElement("h6", {
144
+ }), showBelgianLocationNotice && /*#__PURE__*/_react.default.createElement("p", {
145
+ className: (0, _helpers__.withStyle)('small text-muted mb-3')
146
+ }, _belgianConfiguratorInfo.BELGIAN_LOCATION_SEARCH_NOTICE), franchiseName && /*#__PURE__*/_react.default.createElement("h6", {
141
147
  className: (0, _helpers__.withStyle)('my-2')
142
148
  }, "Keten: ", franchiseName), /*#__PURE__*/_react.default.createElement(_LocationList.default, {
143
149
  locationIds: allIds,
@@ -120,6 +120,7 @@ const ManualSelectionForm = _ref => {
120
120
  } = (0, _reactRouter.useLocation)();
121
121
  const searchParams = new URLSearchParams(search);
122
122
  const history = (0, _reactRouter.useHistory)();
123
+ const canSwitchToLicenseplate = canSearchLicenseplate && !(0, _helpers__.isBelgianDomain)();
123
124
  const handleLicenseSwitch = () => {
124
125
  (0, _Datalayer.pushToDataLayer)({
125
126
  event: 'configurator',
@@ -251,7 +252,7 @@ const ManualSelectionForm = _ref => {
251
252
  value: model,
252
253
  label: model
253
254
  }
254
- }), canSearchLicenseplate && /*#__PURE__*/_react.default.createElement("div", {
255
+ }), canSwitchToLicenseplate && /*#__PURE__*/_react.default.createElement("div", {
255
256
  className: (0, _helpers__.withStyle)('row mt-3')
256
257
  }, /*#__PURE__*/_react.default.createElement("div", {
257
258
  className: (0, _helpers__.withStyle)('d-grid gap-2')
@@ -121,6 +121,7 @@ const ProductCartSide = () => {
121
121
  consumerDiscounts,
122
122
  touchedConsumerDiscounts
123
123
  });
124
+ const shouldRequestUnfilteredProducts = (0, _product.shouldRequestUnfilteredProductsForCart)(cartInput);
124
125
  const {
125
126
  cart,
126
127
  totals,
@@ -143,7 +144,8 @@ const ProductCartSide = () => {
143
144
  montageRate: (0, _montageRate.toApiMontageRate)(montageRate),
144
145
  extraPriceAmount,
145
146
  discountCode,
146
- priceCalculationDate
147
+ priceCalculationDate,
148
+ skipFilters: shouldRequestUnfilteredProducts
147
149
  });
148
150
  const marketCorrection = cart === null || cart === void 0 ? void 0 : cart.find(item => item.articleNumber === 'MC');
149
151
  const extraPriceItem = cart === null || cart === void 0 ? void 0 : cart.find(item => item.articleNumber === _cartTable.EXTRA_PRICE_ARTICLE_NUMBER);
@@ -347,6 +347,7 @@ const ProductCartTable = () => {
347
347
  consumerDiscounts,
348
348
  touchedConsumerDiscounts
349
349
  });
350
+ const shouldRequestUnfilteredProducts = (0, _product.shouldRequestUnfilteredProductsForCart)(cartInput);
350
351
  const durationAnswerForQuery = durationAnswerIsPrefilled ? undefined : durationAnswer;
351
352
  const {
352
353
  cart,
@@ -368,7 +369,8 @@ const ProductCartTable = () => {
368
369
  discountPercentage,
369
370
  formula,
370
371
  montageRate: (0, _montageRate.toApiMontageRate)(montageRate),
371
- extraPriceAmount
372
+ extraPriceAmount,
373
+ skipFilters: shouldRequestUnfilteredProducts
372
374
  });
373
375
  const montageHours = Number(totals === null || totals === void 0 ? void 0 : totals.montageTime) || 0;
374
376
  const montageTotalExcl = Number((totals === null || totals === void 0 ? void 0 : totals.totalMontageExclVat) || 0);
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ var _product = require("../product");
4
+ describe('product helpers', () => {
5
+ it('requests unfiltered products when cart-selected articles need to be resolved', () => {
6
+ expect((0, _product.shouldRequestUnfilteredProductsForCart)()).toBe(false);
7
+ expect((0, _product.shouldRequestUnfilteredProductsForCart)([])).toBe(false);
8
+ expect((0, _product.shouldRequestUnfilteredProductsForCart)([{
9
+ articleNumber: 'TOWBAR-HIDDEN',
10
+ quantity: 1
11
+ }])).toBe(true);
12
+ });
13
+ });
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.regexp.to-string.js");
4
+ require("core-js/modules/es.string.trim.js");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.isBelgianConfigurator = exports.BELGIAN_PRICE_OVERVIEW_NOTICE = exports.BELGIAN_LOCATION_SEARCH_NOTICE = void 0;
9
+ require("core-js/modules/es.regexp.to-string.js");
10
+ require("core-js/modules/es.string.trim.js");
11
+ const BELGIAN_PRICE_OVERVIEW_NOTICE = exports.BELGIAN_PRICE_OVERVIEW_NOTICE = 'De prijs uit de offerte geldt alleen voor montage op een Belgische locatie.';
12
+ const BELGIAN_LOCATION_SEARCH_NOTICE = exports.BELGIAN_LOCATION_SEARCH_NOTICE = 'Montagetarieven kunnen per land verschillen.';
13
+ const isBelgianConfigurator = country => {
14
+ return (country === null || country === void 0 ? void 0 : country.toString().trim().toUpperCase()) === 'BE';
15
+ };
16
+ exports.isBelgianConfigurator = isBelgianConfigurator;
@@ -4,6 +4,7 @@ require("core-js/modules/es.array.reduce.js");
4
4
  require("core-js/modules/es.object.from-entries.js");
5
5
  require("core-js/modules/es.regexp.exec.js");
6
6
  require("core-js/modules/es.regexp.to-string.js");
7
+ require("core-js/modules/es.string.ends-with.js");
7
8
  require("core-js/modules/es.string.replace.js");
8
9
  require("core-js/modules/es.string.trim.js");
9
10
  require("core-js/modules/esnext.iterator.constructor.js");
@@ -30,16 +31,18 @@ var _exportNames = {
30
31
  parseArrayToInputOptions: true,
31
32
  truncateAtPipe: true,
32
33
  parseJson: true,
34
+ isBelgianDomain: true,
33
35
  removeNullishProps: true,
34
36
  createSlug: true,
35
37
  getProxyApiErrorMessage: true,
36
38
  formatMontageTime: true
37
39
  };
38
- exports.withStyle = exports.truncateAtPipe = exports.removeNullishProps = exports.reduceYupErrorsToObject = exports.pushToDataLayer = exports.parseJson = exports.parseDateAndTimeToTimestamp = exports.parseArrayToInputOptions = exports.normalizeArray = exports.groupByKey = exports.getProxyApiErrorMessage = exports.getConfiguratorThemeClassByFormula = exports.getConfiguratorThemeClass = exports.getConfiguratorButtonVariant = exports.formatPrice = exports.formatMontageTime = exports.createSlug = void 0;
40
+ exports.withStyle = exports.truncateAtPipe = exports.removeNullishProps = exports.reduceYupErrorsToObject = exports.pushToDataLayer = exports.parseJson = exports.parseDateAndTimeToTimestamp = exports.parseArrayToInputOptions = exports.normalizeArray = exports.isBelgianDomain = exports.groupByKey = exports.getProxyApiErrorMessage = exports.getConfiguratorThemeClassByFormula = exports.getConfiguratorThemeClass = exports.getConfiguratorButtonVariant = exports.formatPrice = exports.formatMontageTime = exports.createSlug = void 0;
39
41
  require("core-js/modules/es.array.reduce.js");
40
42
  require("core-js/modules/es.object.from-entries.js");
41
43
  require("core-js/modules/es.regexp.exec.js");
42
44
  require("core-js/modules/es.regexp.to-string.js");
45
+ require("core-js/modules/es.string.ends-with.js");
43
46
  require("core-js/modules/es.string.replace.js");
44
47
  require("core-js/modules/es.string.trim.js");
45
48
  require("core-js/modules/esnext.iterator.constructor.js");
@@ -280,11 +283,20 @@ const parseJson = string => {
280
283
  return null;
281
284
  }
282
285
  };
286
+ exports.parseJson = parseJson;
287
+ const isBelgianDomain = () => {
288
+ var _window$location;
289
+ if (typeof window === 'undefined') {
290
+ return false;
291
+ }
292
+ const hostname = (_window$location = window.location) === null || _window$location === void 0 || (_window$location = _window$location.hostname) === null || _window$location === void 0 ? void 0 : _window$location.toLowerCase();
293
+ return Boolean(hostname && (hostname === 'be' || hostname.endsWith('.be')));
294
+ };
283
295
 
284
296
  /**
285
297
  * @description Removes nullish properties from a passed object
286
298
  */
287
- exports.parseJson = parseJson;
299
+ exports.isBelgianDomain = isBelgianDomain;
288
300
  const removeNullishProps = exports.removeNullishProps = function removeNullishProps() {
289
301
  let object = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
290
302
  return Object.fromEntries(Object.entries(object).filter(_ref3 => {
@@ -9,11 +9,12 @@ require("core-js/modules/esnext.iterator.filter.js");
9
9
  require("core-js/modules/esnext.iterator.flat-map.js");
10
10
  require("core-js/modules/esnext.iterator.for-each.js");
11
11
  require("core-js/modules/esnext.iterator.map.js");
12
+ require("core-js/modules/esnext.iterator.some.js");
12
13
  require("core-js/modules/web.dom-collections.iterator.js");
13
14
  Object.defineProperty(exports, "__esModule", {
14
15
  value: true
15
16
  });
16
- exports.validateCartInput = exports.parseProductSpecifications = exports.formatHyperDescription = exports.extractProductSpecsArray = exports.checkIfTowbarIsRecommended = exports.buildCartInput = void 0;
17
+ exports.validateCartInput = exports.shouldRequestUnfilteredProductsForCart = exports.parseProductSpecifications = exports.formatHyperDescription = exports.extractProductSpecsArray = exports.checkIfTowbarIsRecommended = exports.buildCartInput = void 0;
17
18
  require("core-js/modules/es.array.flat-map.js");
18
19
  require("core-js/modules/es.array.includes.js");
19
20
  require("core-js/modules/es.array.unscopables.flat-map.js");
@@ -23,6 +24,7 @@ require("core-js/modules/esnext.iterator.filter.js");
23
24
  require("core-js/modules/esnext.iterator.flat-map.js");
24
25
  require("core-js/modules/esnext.iterator.for-each.js");
25
26
  require("core-js/modules/esnext.iterator.map.js");
27
+ require("core-js/modules/esnext.iterator.some.js");
26
28
  require("core-js/modules/web.dom-collections.iterator.js");
27
29
  var _constants__ = require("../__constants__");
28
30
  function ownKeys(e, r) {
@@ -97,6 +99,16 @@ const validateCartInput = exports.validateCartInput = function validateCartInput
97
99
  return;
98
100
  };
99
101
 
102
+ /**
103
+ * @description Cart overviews resolve selected articles from the order article lists.
104
+ * If the user selected an article that only appears with skipFilters enabled,
105
+ * those read-only lookups must request the unfiltered product list too.
106
+ */
107
+ const shouldRequestUnfilteredProductsForCart = exports.shouldRequestUnfilteredProductsForCart = function shouldRequestUnfilteredProductsForCart() {
108
+ let cart = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
109
+ return Array.isArray(cart) && cart.some(lineItem => (lineItem === null || lineItem === void 0 ? void 0 : lineItem.articleNumber) != null);
110
+ };
111
+
100
112
  /**
101
113
  * @description Builds the cart input including optional TowMotive vehicle coding discount
102
114
  */
@@ -13,6 +13,8 @@ var _BottomNavigationBar = _interopRequireDefault(require("../__containers__/Bot
13
13
  var _ExitIntentModal = _interopRequireDefault(require("../__containers__/ExitIntentModal"));
14
14
  var _ProductDiscountCard = _interopRequireDefault(require("../__containers__/ProductDiscountCard"));
15
15
  var _ProductsCartOverview = _interopRequireDefault(require("../__containers__/ProductsCartOverview"));
16
+ var _CountryContext = require("../__context__/CountryContext");
17
+ var _belgianConfiguratorInfo = require("../__helpers__/belgianConfiguratorInfo");
16
18
  var _helpers__ = require("../__helpers__");
17
19
  var _Datalayer = require("../__services__/Datalayer");
18
20
  var _useBranchTheme = require("../__hooks__/useBranchTheme");
@@ -22,7 +24,9 @@ function _interopRequireDefault(e) {
22
24
  };
23
25
  }
24
26
  const OverviewPage = () => {
27
+ const country = (0, _CountryContext.useCountry)();
25
28
  const themeClass = (0, _helpers__.getConfiguratorThemeClass)((0, _useBranchTheme.useBranchTheme)());
29
+ const showBelgianPriceNotice = !APP_CONFIG.internal && (0, _belgianConfiguratorInfo.isBelgianConfigurator)(country);
26
30
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("section", {
27
31
  className: (0, _helpers__.withStyle)("thm-configurator-wrapper ".concat(themeClass))
28
32
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -36,7 +40,9 @@ const OverviewPage = () => {
36
40
  className: (0, _helpers__.withStyle)('row gx-5 mt-3 mt-lg-5')
37
41
  }, /*#__PURE__*/_react.default.createElement("div", {
38
42
  className: (0, _helpers__.withStyle)('col-lg')
39
- }, /*#__PURE__*/_react.default.createElement(_ProductsCartOverview.default, null), /*#__PURE__*/_react.default.createElement(_ProductDiscountCard.default, null)), /*#__PURE__*/_react.default.createElement("div", {
43
+ }, /*#__PURE__*/_react.default.createElement(_ProductsCartOverview.default, null), showBelgianPriceNotice && /*#__PURE__*/_react.default.createElement("p", {
44
+ className: (0, _helpers__.withStyle)('small text-muted mt-2 mb-0')
45
+ }, _belgianConfiguratorInfo.BELGIAN_PRICE_OVERVIEW_NOTICE), /*#__PURE__*/_react.default.createElement(_ProductDiscountCard.default, null)), /*#__PURE__*/_react.default.createElement("div", {
40
46
  className: (0, _helpers__.withStyle)("sidebar col-xxl-auto col-lg-4")
41
47
  }, /*#__PURE__*/_react.default.createElement("div", {
42
48
  className: (0, _helpers__.withStyle)('d-grid gap-2 mt-3')
@@ -2,7 +2,9 @@
2
2
 
3
3
  require("core-js/modules/es.array.includes.js");
4
4
  require("core-js/modules/es.object.assign.js");
5
+ require("core-js/modules/es.regexp.exec.js");
5
6
  require("core-js/modules/es.string.includes.js");
7
+ require("core-js/modules/es.string.search.js");
6
8
  require("core-js/modules/web.dom-collections.iterator.js");
7
9
  require("core-js/modules/es.array.includes.js");
8
10
  require("core-js/modules/es.object.assign.js");
@@ -83,10 +85,13 @@ Object.defineProperty(exports, "QuotationThanksPage", {
83
85
  }
84
86
  });
85
87
  exports.default = void 0;
88
+ require("core-js/modules/es.regexp.exec.js");
89
+ require("core-js/modules/es.string.search.js");
86
90
  require("core-js/modules/web.dom-collections.iterator.js");
87
91
  var _react = _interopRequireDefault(require("react"));
88
92
  var _reactRouterDom = require("react-router-dom");
89
93
  var _OrderSessionContext = require("../__context__/OrderSessionContext");
94
+ var _helpers__ = require("../__helpers__");
90
95
  var _AppointmentPage = _interopRequireDefault(require("./AppointmentPage"));
91
96
  var _AppointmentThanksPage = _interopRequireDefault(require("./AppointmentThanksPage"));
92
97
  var _ExtraProductsPage = _interopRequireDefault(require("./ExtraProductsPage"));
@@ -150,11 +155,19 @@ const ProtectedConfiguratorRoute = _ref => {
150
155
  })
151
156
  }));
152
157
  };
158
+ const LicensePlateRoute = props => {
159
+ if ((0, _helpers__.isBelgianDomain)()) {
160
+ return /*#__PURE__*/_react.default.createElement(_reactRouterDom.Redirect, {
161
+ to: "/configurator/manual".concat(props.location.search)
162
+ });
163
+ }
164
+ return /*#__PURE__*/_react.default.createElement(_LicensePlatePage.default, props);
165
+ };
153
166
  const Routes = () => {
154
167
  return /*#__PURE__*/_react.default.createElement(_reactRouterDom.Switch, null, /*#__PURE__*/_react.default.createElement(_reactRouterDom.Route, {
155
168
  exact: true,
156
169
  path: "/",
157
- render: props => /*#__PURE__*/_react.default.createElement(_LicensePlatePage.default, props)
170
+ render: props => /*#__PURE__*/_react.default.createElement(LicensePlateRoute, props)
158
171
  }), /*#__PURE__*/_react.default.createElement(_reactRouterDom.Route, {
159
172
  exact: true,
160
173
  path: "/configurator/geen-producten",
@@ -195,7 +208,7 @@ const Routes = () => {
195
208
  render: props => /*#__PURE__*/_react.default.createElement(_ExtraProductsPage.default, null)
196
209
  }), /*#__PURE__*/_react.default.createElement(_reactRouterDom.Route, {
197
210
  path: "/configurator",
198
- render: props => /*#__PURE__*/_react.default.createElement(_LicensePlatePage.default, null)
211
+ render: props => /*#__PURE__*/_react.default.createElement(LicensePlateRoute, props)
199
212
  }), /*#__PURE__*/_react.default.createElement(_reactRouterDom.Route, {
200
213
  path: "/niet-gevonden",
201
214
  render: () => /*#__PURE__*/_react.default.createElement(_NotFoundPage.default, null)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thm-p3-configurator",
3
- "version": "0.0.381",
3
+ "version": "0.0.382",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.js",
6
6
  "author": "EnoRm.",