@crystaldesign/web-planner-logic 26.13.0-beta.15 → 26.13.0-beta.16

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 (53) hide show
  1. package/build/cjs/{DivaBoxPlanner-be749bb5.js → DivaBoxPlanner-593d689c.js} +3 -2
  2. package/build/cjs/{DivaStandardPlanner-fc05728f.js → DivaStandardPlanner-f5ba6ead.js} +3 -2
  3. package/build/cjs/{DoorPlanner-a862ebe1.js → DoorPlanner-35be7adf.js} +2 -1
  4. package/build/cjs/{Host3DSignalR-05fb621f.js → Host3DSignalR-b8beb958.js} +2 -1
  5. package/build/cjs/{LiviqueWWSHandler-e78d2805.js → LiviqueWWSHandler-13757823.js} +2 -1
  6. package/build/cjs/{PfisterWWSHandler-af7f8c21.js → PfisterWWSHandler-7404917e.js} +2 -1
  7. package/build/cjs/{PlannerHandler2D-24a840c9.js → PlannerHandler2D-d266ccd0.js} +1 -1
  8. package/build/cjs/{SeriousBasketHandler-37c085b7.js → SeriousBasketHandler-2b3d0f22.js} +2 -1
  9. package/build/cjs/{ShelfPlanner-8eeb10d6.js → ShelfPlanner-4eb63a5c.js} +2 -1
  10. package/build/cjs/{StandardWWSHandler-a0b03684.js → StandardWWSHandler-9fce580d.js} +2 -1
  11. package/build/cjs/{index-411c6d20.js → index-ecd4dc0b.js} +947 -849
  12. package/build/cjs/index.js +2 -6
  13. package/build/esm/{DivaBoxPlanner-e86a9c78.js → DivaBoxPlanner-7291fc69.js} +3 -2
  14. package/build/esm/{DivaStandardPlanner-34cb94ca.js → DivaStandardPlanner-cde0a04a.js} +3 -2
  15. package/build/esm/{DoorPlanner-34fcedfe.js → DoorPlanner-599bd2a0.js} +2 -1
  16. package/build/esm/{Host3DSignalR-06a154e9.js → Host3DSignalR-c12d1c95.js} +2 -1
  17. package/build/esm/{LiviqueWWSHandler-08e0fd3f.js → LiviqueWWSHandler-443dd9fb.js} +2 -1
  18. package/build/esm/{PfisterWWSHandler-d5129b6b.js → PfisterWWSHandler-aeeeca0a.js} +2 -1
  19. package/build/esm/{PlannerHandler2D-fa2f950e.js → PlannerHandler2D-eb466bb9.js} +1 -1
  20. package/build/esm/{SeriousBasketHandler-fadb9e59.js → SeriousBasketHandler-8e25438e.js} +2 -1
  21. package/build/esm/{ShelfPlanner-4d988daa.js → ShelfPlanner-93e07971.js} +2 -1
  22. package/build/esm/{StandardWWSHandler-1b06b955.js → StandardWWSHandler-d71f9500.js} +2 -1
  23. package/build/esm/{index-79c27c8c.js → index-d4042c10.js} +947 -845
  24. package/build/esm/index.js +2 -1
  25. package/build/types/web-planner-logic/src/index.d.ts +1 -7
  26. package/build/types/web-planner-logic/src/index.d.ts.map +1 -1
  27. package/build/types/web-planner-logic/src/interface/AdditionalModelInfos.d.ts +4 -2
  28. package/build/types/web-planner-logic/src/interface/AdditionalModelInfos.d.ts.map +1 -1
  29. package/build/types/web-planner-logic/src/interface/IDM/ArticleApi.d.ts +2 -3
  30. package/build/types/web-planner-logic/src/interface/IDM/ArticleApi.d.ts.map +1 -1
  31. package/build/types/web-planner-logic/src/logic/Article/Engine/IDMArticleEngine.d.ts +1 -0
  32. package/build/types/web-planner-logic/src/logic/Article/Engine/IDMArticleEngine.d.ts.map +1 -1
  33. package/build/types/web-planner-logic/src/logic/Planner/IDM3D/idm3dTranslation.d.ts +2 -2
  34. package/build/types/web-planner-logic/src/logic/Planner/IDM3D/idm3dTranslation.d.ts.map +1 -1
  35. package/build/types/web-planner-logic/src/model/Catalog/CatalogData.d.ts.map +1 -1
  36. package/build/types/web-planner-logic/src/model/Catalog/DivaCatalogData.d.ts +3 -0
  37. package/build/types/web-planner-logic/src/model/Catalog/DivaCatalogData.d.ts.map +1 -1
  38. package/build/types/web-planner-logic/src/model/Catalog/IDMCatalogData.d.ts +4 -2
  39. package/build/types/web-planner-logic/src/model/Catalog/IDMCatalogData.d.ts.map +1 -1
  40. package/build/types/web-planner-logic/src/model/Options/CatalogOptionData.d.ts +2 -3
  41. package/build/types/web-planner-logic/src/model/Options/CatalogOptionData.d.ts.map +1 -1
  42. package/build/types/web-planner-logic/src/model/Options/CatalogOptionValueData.d.ts.map +1 -1
  43. package/build/types/web-planner-logic/src/model/Properties/propertySchemaRegistry.d.ts +23 -11
  44. package/build/types/web-planner-logic/src/model/Properties/propertySchemaRegistry.d.ts.map +1 -1
  45. package/build/types/web-planner-logic/src/model/Properties/propertyValueCodec.d.ts +1 -34
  46. package/build/types/web-planner-logic/src/model/Properties/propertyValueCodec.d.ts.map +1 -1
  47. package/build/types/web-planner-logic/src/model/Properties/propertyValues.d.ts +41 -0
  48. package/build/types/web-planner-logic/src/model/Properties/propertyValues.d.ts.map +1 -0
  49. package/build/types/web-planner-logic/src/test/propertyParsers.test.d.ts +2 -0
  50. package/build/types/web-planner-logic/src/test/propertyParsers.test.d.ts.map +1 -0
  51. package/build/types/web-planner-logic/src/test/propertyValues.test.d.ts +2 -0
  52. package/build/types/web-planner-logic/src/test/propertyValues.test.d.ts.map +1 -0
  53. package/package.json +3 -3
@@ -9,6 +9,7 @@ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
9
9
  import axios$1 from 'axios';
10
10
  import DivaUtils, { DivaError, md5, nanoid } from '@crystaldesign/diva-utils';
11
11
  import _typeof from '@babel/runtime/helpers/typeof';
12
+ import _toArray from '@babel/runtime/helpers/toArray';
12
13
  import { parseXml, serializeXml, removeMask, stretchArticleSvg } from '@crystaldesign/planner-2d-core';
13
14
  import { PriceObjectData, VariantItemData, JsonConfigPriceData, OrderLineData, CompactOrderLineData, GroupsData, Favorites, Favorite, ConfigVariantData, BASKET_UPLOAD_FUNCTION_TYPES, BASKET_UPLOAD_MEDIA_TYPES, OrderSetData, BasketData } from '@crystaldesign/basket-model';
14
15
  import { XMLParser } from 'fast-xml-parser';
@@ -139,12 +140,12 @@ function bootRequestName(url) {
139
140
  }
140
141
 
141
142
  var _excluded = ["type"];
142
- function ownKeys$r(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
143
- function _objectSpread$r(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$r(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$r(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
143
+ function ownKeys$s(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
144
+ function _objectSpread$s(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$s(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$s(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
144
145
 
145
146
  // Import types from AI service
146
147
 
147
- var LOG$r = DivaUtils.initLog('Planner', 'WEB-PLANNER-LOGIC');
148
+ var LOG$s = DivaUtils.initLog('Planner', 'WEB-PLANNER-LOGIC');
148
149
 
149
150
  /**
150
151
  * Deadline for the optional catalog XML preload. Axios has no default timeout, and planner start-up
@@ -210,7 +211,7 @@ var DivaApiHandler = /*#__PURE__*/function () {
210
211
  if (plannerConfig.settings) {
211
212
  this.initalizeWebConfigData(plannerConfig);
212
213
  } else {
213
- LOG$r.error(new DivaError('Fehler beim laden der WebConfig', {
214
+ LOG$s.error(new DivaError('Fehler beim laden der WebConfig', {
214
215
  code: 'WC_0001'
215
216
  }));
216
217
  throw Error('Initalize failed!');
@@ -271,7 +272,7 @@ var DivaApiHandler = /*#__PURE__*/function () {
271
272
  case 0:
272
273
  skip = _args.length > 2 && _args[2] !== undefined ? _args[2] : 0;
273
274
  dontLogError = _args.length > 3 ? _args[3] : undefined;
274
- LOG$r.debug('DivaApiHandler.fetchData ' + url, 'DivaApiHandler, fetchData');
275
+ LOG$s.debug('DivaApiHandler.fetchData ' + url, 'DivaApiHandler, fetchData');
275
276
  if (init) {
276
277
  _context.next = 5;
277
278
  break;
@@ -312,7 +313,7 @@ var DivaApiHandler = /*#__PURE__*/function () {
312
313
  netBytes = typeof data === 'string' ? data.length : Number((_response$headers = response.headers) === null || _response$headers === void 0 ? void 0 : _response$headers['content-length']) || undefined;
313
314
  }
314
315
  if (data !== null && data !== void 0 && data.Error) {
315
- if (dontLogError) LOG$r.warn(data.Error + ' ' + url);else LOG$r.error(new DivaError(data.Error, {
316
+ if (dontLogError) LOG$s.warn(data.Error + ' ' + url);else LOG$s.error(new DivaError(data.Error, {
316
317
  code: 'WC_0001',
317
318
  custom: {
318
319
  url: url
@@ -434,7 +435,7 @@ var DivaApiHandler = /*#__PURE__*/function () {
434
435
  return _regeneratorRuntime.wrap(function _callee2$(_context2) {
435
436
  while (1) switch (_context2.prev = _context2.next) {
436
437
  case 0:
437
- LOG$r.debug('getDataWithoutCache: ', {
438
+ LOG$s.debug('getDataWithoutCache: ', {
438
439
  queryString: queryString,
439
440
  init: init,
440
441
  useWebServiceApi: useWebServiceApi
@@ -476,8 +477,8 @@ var DivaApiHandler = /*#__PURE__*/function () {
476
477
  if (this.getApplicationEnvironment() == 'WEB' && (_this$apiConfig7 = this.apiConfig) !== null && _this$apiConfig7 !== void 0 && _this$apiConfig7.api2.web) {
477
478
  api2Url = this.apiConfig.api2.web;
478
479
  }
479
- _context2.t0 = _objectSpread$r;
480
- _context2.t1 = _objectSpread$r({}, init.config.headers);
480
+ _context2.t0 = _objectSpread$s;
481
+ _context2.t1 = _objectSpread$s({}, init.config.headers);
481
482
  _context2.t2 = {};
482
483
  _context2.next = 21;
483
484
  return this.getSessionGuid('V', undefined, this.OrganizationId, api2Url);
@@ -512,7 +513,7 @@ var DivaApiHandler = /*#__PURE__*/function () {
512
513
  return _regeneratorRuntime.wrap(function _callee3$(_context3) {
513
514
  while (1) switch (_context3.prev = _context3.next) {
514
515
  case 0:
515
- LOG$r.debug('getDataCache: ', {
516
+ LOG$s.debug('getDataCache: ', {
516
517
  queryString: queryString,
517
518
  cacheMD5: cacheMD5,
518
519
  accountSessionGuid: accountSessionGuid,
@@ -533,14 +534,14 @@ var DivaApiHandler = /*#__PURE__*/function () {
533
534
  _context3.next = 9;
534
535
  break;
535
536
  }
536
- LOG$r.debug('getDataFromInternalCache: ' + queryString);
537
+ LOG$s.debug('getDataFromInternalCache: ' + queryString);
537
538
  return _context3.abrupt("return", cacheHit);
538
539
  case 9:
539
540
  if (!(cacheMD5 && this.jsonDataCache.get(cacheMD5) && !((_this$divaWebConfigDa2 = this.divaWebConfigData) !== null && _this$divaWebConfigDa2 !== void 0 && _this$divaWebConfigDa2.addOrganizationIdToCacheKey))) {
540
541
  _context3.next = 12;
541
542
  break;
542
543
  }
543
- LOG$r.debug('getDataFromInternalCache: ' + queryString);
544
+ LOG$s.debug('getDataFromInternalCache: ' + queryString);
544
545
  return _context3.abrupt("return", this.jsonDataCache.get(cacheMD5));
545
546
  case 12:
546
547
  if (!addSession) {
@@ -590,7 +591,7 @@ var DivaApiHandler = /*#__PURE__*/function () {
590
591
  // SHOULD have been authenticated against an account, the planner ends up using a
591
592
  // visitor sessionGuid (cached per organization in DataStore). Surface it so we
592
593
  // can spot regressions instead of silently sending the wrong GUID.
593
- LOG$r.warn('[SESSION-GUID][API] visitor fallback used for api2 call (no accountSessionGuid passed)', {
594
+ LOG$s.warn('[SESSION-GUID][API] visitor fallback used for api2 call (no accountSessionGuid passed)', {
594
595
  callTag: "api#".concat(this.instanceId, "/call#").concat(this.apiCallCount),
595
596
  queryString: queryString,
596
597
  organizationId: this.OrganizationId
@@ -612,7 +613,7 @@ var DivaApiHandler = /*#__PURE__*/function () {
612
613
  this.jsonDataCache.set(myQS, result);
613
614
  if (cacheMD5 && !((_this$divaWebConfigDa3 = this.divaWebConfigData) !== null && _this$divaWebConfigDa3 !== void 0 && _this$divaWebConfigDa3.addOrganizationIdToCacheKey)) this.jsonDataCache.set(cacheMD5, result);
614
615
  }
615
- LOG$r.debug('getDataFromApi: ' + queryString);
616
+ LOG$s.debug('getDataFromApi: ' + queryString);
616
617
  return _context3.abrupt("return", result);
617
618
  case 41:
618
619
  case "end":
@@ -648,7 +649,7 @@ var DivaApiHandler = /*#__PURE__*/function () {
648
649
  case 5:
649
650
  _context4.prev = 5;
650
651
  _context4.t0 = _context4["catch"](1);
651
- LOG$r.error(new DivaError('could not create product in Configurator', {
652
+ LOG$s.error(new DivaError('could not create product in Configurator', {
652
653
  cause: _context4.t0
653
654
  }));
654
655
  return _context4.abrupt("return", false);
@@ -1511,11 +1512,11 @@ var DivaApiHandler = /*#__PURE__*/function () {
1511
1512
  headers = this.getAiServiceAuthHeaders(leadKey);
1512
1513
  _context9.next = 4;
1513
1514
  return this.fetchData(url, {
1514
- data: _objectSpread$r(_objectSpread$r({}, data), {}, {
1515
+ data: _objectSpread$s(_objectSpread$s({}, data), {}, {
1515
1516
  organizationId: this.OrganizationId
1516
1517
  }),
1517
1518
  config: {
1518
- headers: _objectSpread$r(_objectSpread$r({}, headers), {}, {
1519
+ headers: _objectSpread$s(_objectSpread$s({}, headers), {}, {
1519
1520
  'X-Session-Id': DivaUtils.SessionId,
1520
1521
  'X-Configurator-Id': (_DivaUtils$Configurat = DivaUtils.ConfigurationId) !== null && _DivaUtils$Configurat !== void 0 ? _DivaUtils$Configurat : ''
1521
1522
  })
@@ -1633,7 +1634,7 @@ var DivaApiHandler = /*#__PURE__*/function () {
1633
1634
  status = _context12.t0 === null || _context12.t0 === void 0 || (_e$response3 = _context12.t0.response) === null || _e$response3 === void 0 ? void 0 : _e$response3.status;
1634
1635
  body = _context12.t0 === null || _context12.t0 === void 0 || (_e$response4 = _context12.t0.response) === null || _e$response4 === void 0 ? void 0 : _e$response4.data;
1635
1636
  apiMessage = typeof (body === null || body === void 0 ? void 0 : body.error) === 'string' ? body.error : _context12.t0 === null || _context12.t0 === void 0 ? void 0 : _context12.t0.message;
1636
- LOG$r.error(new Error("Failed to create lead key for email ".concat(email, ": ").concat(apiMessage)));
1637
+ LOG$s.error(new Error("Failed to create lead key for email ".concat(email, ": ").concat(apiMessage)));
1637
1638
  throw new DivaError(apiMessage || 'Failed to create lead key', {
1638
1639
  code: 'LEAD_KEY_REQUEST_FAILED',
1639
1640
  custom: {
@@ -1729,7 +1730,7 @@ var DivaApiHandler = /*#__PURE__*/function () {
1729
1730
  case 9:
1730
1731
  _context14.prev = 9;
1731
1732
  _context14.t0 = _context14["catch"](4);
1732
- LOG$r.error(new DivaError('Error Connecting to Support-Service-LivePlanner', {
1733
+ LOG$s.error(new DivaError('Error Connecting to Support-Service-LivePlanner', {
1733
1734
  cause: _context14.t0
1734
1735
  }));
1735
1736
  case 12:
@@ -1776,7 +1777,7 @@ var DivaApiHandler = /*#__PURE__*/function () {
1776
1777
  case 10:
1777
1778
  _context15.prev = 10;
1778
1779
  _context15.t0 = _context15["catch"](3);
1779
- LOG$r.error({
1780
+ LOG$s.error({
1780
1781
  message: 'Could not fetch dimension',
1781
1782
  name: 'get dimension error'
1782
1783
  });
@@ -1834,7 +1835,7 @@ var DivaApiHandler = /*#__PURE__*/function () {
1834
1835
  case 9:
1835
1836
  _context16.prev = 9;
1836
1837
  _context16.t0 = _context16["catch"](3);
1837
- LOG$r.error({
1838
+ LOG$s.error({
1838
1839
  message: 'Could not fetch catalogXml',
1839
1840
  name: 'get catalogXml error'
1840
1841
  });
@@ -1913,7 +1914,7 @@ var DivaApiHandler = /*#__PURE__*/function () {
1913
1914
  case 14:
1914
1915
  _context17.prev = 14;
1915
1916
  _context17.t0 = _context17["catch"](6);
1916
- LOG$r.error(new DivaError('Error Connecting to Report Service', {
1917
+ LOG$s.error(new DivaError('Error Connecting to Report Service', {
1917
1918
  cause: _context17.t0
1918
1919
  }));
1919
1920
  case 17:
@@ -1984,6 +1985,550 @@ var DivaApiHandler = /*#__PURE__*/function () {
1984
1985
  }]);
1985
1986
  }();
1986
1987
 
1988
+ /**
1989
+ * Whether a flag property is switched on: empty, '0' and 'false' (any case, trimmed) are OFF, any other value is ON.
1990
+ * Every flag parser reads its value through this.
1991
+ */
1992
+ function isPropertyOn(value) {
1993
+ if (value === undefined || value === null) return false;
1994
+ if (typeof value === 'boolean') return value;
1995
+ if (typeof value === 'number') return value !== 0;
1996
+ var token = String(value).trim().toLowerCase();
1997
+ return token !== '' && token !== '0' && token !== 'false';
1998
+ }
1999
+
2000
+ /**
2001
+ * The VALUE ENCODING of every catalog/article/option/option-value property, keyed by codex: the type the planner reads
2002
+ * the value as, and how a legacy TEXT of it is read.
2003
+ *
2004
+ * Enricher values are typed (a flag, a number, a list, JSON - stored under ALL) and taken as they are. A text - of a
2005
+ * CE catalog or mask, or the legacy text the enricher renders for old configurators - is read the way the parsers read
2006
+ * it before values were typed: '1' for one flag, 'true' for the next, a ';' list for a third (readPropertyValue,
2007
+ * propertyValues.ts). The agent's property-encodings knowhow doc is generated from this table
2008
+ * (scripts/generatePropertyEncodingsDoc.py).
2009
+ *
2010
+ * Hand-maintained: add the codex here when one of the four parsers gets a `case` for it
2011
+ * CatalogData.ts | CatalogArticleData.ts | CatalogOptionData.ts | CatalogOptionValueData.ts
2012
+ * `propertyValueCodec.test.ts` fails when a parser case has no entry here.
2013
+ */
2014
+
2015
+ /** The entity a property hangs on; the same codex can mean different things on different entities. */
2016
+
2017
+ /**
2018
+ * The type a property is read as, and how its legacy text is read. The boolean dialects are NOT interchangeable: a
2019
+ * text 'true' where the dialect is `boolean:1` reads as false.
2020
+ * - `string`: a text, as it is. `opaque`: a text in a format of its own, which the property's parser reads.
2021
+ * - `number`: Number(text).
2022
+ * - `boolean:1`: true for '1' only. `boolean:1|true`: for '1' or 'true' (any case). `boolean:on`: isPropertyOn - false
2023
+ * for empty, '0' and 'false'. `boolean:not-0`: false for '0' only.
2024
+ * - `list:;` / `list:,`: a list of texts, the text split at ';' / ','.
2025
+ * - `all-or-list:;`: `{ all: true }` for '1', else `{ only: [...] }` split at ';'. `boolean-or-list:;`: the same, and
2026
+ * `{ all: false }` for '0'.
2027
+ * - `json`: a JSON value, JSON.parse(text). `shape`: a JSON value of a fixed shape whose text has a format of its own.
2028
+ * - `ignored`: recognised by the parser and deliberately not read.
2029
+ */
2030
+
2031
+ /** The encoding per property codex, for one entity. */
2032
+
2033
+ /** 96 properties parsed on the catalog entity. */
2034
+ var CATALOG_PROPERTIES = {
2035
+ '3D_COMPATIBLE_WITH_IMAGE_CACHE': 'boolean:1',
2036
+ ACCESSOIRE_STEP_AS_PLANNER: 'boolean:1',
2037
+ ADD_NEW_LINE_BEFOR_RULEDESC: 'boolean:1',
2038
+ ADD_PA_ON_EDO: 'opaque',
2039
+ ADD_POS_INVISIBILITY_TO_OL: 'boolean:1',
2040
+ ARTICLECONFIGALL: 'boolean:1',
2041
+ ARTICLECONFIGSINGLE: 'boolean:1',
2042
+ ARTICLE_NR: 'string',
2043
+ AUTO_OPEN_CONTENTITEM: 'all-or-list:;',
2044
+ BANNER: 'json',
2045
+ BUNDLE_RULES: 'json',
2046
+ CHECK_COLLISION_DIFFERENT_LAYERS: 'list:;',
2047
+ CONFIG_ACCESSOIRES: 'boolean:1',
2048
+ CONFIG_ONLY_ACCESSOIRES: 'boolean:1',
2049
+ DEFAULT_DO_SHOW_3DDIMENSIONS: 'boolean:1|true',
2050
+ DEFAULT_GROUPS_CLOSED: 'boolean-or-list:;',
2051
+ DIMENSION_CONFIG: 'json',
2052
+ DIVA3D_AR_FORCERTV: 'boolean:1',
2053
+ DIVA3D_AR_READY: 'boolean:1',
2054
+ DIVA3D_DISABLE_3DEXPORT: 'boolean:1',
2055
+ DIVA3D_PLANER_DIGITS: 'number',
2056
+ DIVA3D_PLANER_SHOW_ARTICLE_SVG: 'boolean:1',
2057
+ DIVA3D_RENDERING: 'boolean:1|true',
2058
+ DIVA3D_ROOM: 'string',
2059
+ DIVA3D_STATIC_BG_IMAGE_ROOMLIST: 'list:;',
2060
+ DIVA3D_USE_RTV_NEXT: 'boolean:1',
2061
+ DIVA_KI_READY: 'boolean:1|true',
2062
+ DOCKACCONAVOONLY: 'boolean:1',
2063
+ DONTCALCBASEPRICE: 'boolean:1',
2064
+ DONTHIDEOPTION: 'list:,',
2065
+ DONT_SAVE_ALTERNATIVERENDERINGS: 'boolean:1',
2066
+ DONT_SET_POSNR_FROM_PLANNER: 'boolean:1',
2067
+ DONT_SHOW_ACC_STEP: 'boolean:1',
2068
+ DONT_USE_VCODEX_FOR_BASKET: 'boolean:1',
2069
+ DO_SHOW_MAIN_DIMENSIONS: 'boolean:1|true',
2070
+ DO_USE_RULEDESC_FOR_PARTLIST: 'boolean:1',
2071
+ ELEMENT_COPY_AVLR: 'all-or-list:;',
2072
+ ENABLE_DO_SHOW_3DDIMENSIONS: 'boolean:1|true',
2073
+ FILTER_FOR_CHECKOUT_BUTTONS: 'list:;',
2074
+ FORCECONSTRUCTIONWARNINGARTICLES: 'list:;',
2075
+ FORCE_CONFIG_ALL_ACCESSOIRES: 'boolean:1',
2076
+ FORCE_CONFIG_SINGLE: 'boolean:1',
2077
+ HEADER_DIMENSION_IDS: 'list:;',
2078
+ HIDECOMPLETENESSWARNING: 'boolean:1',
2079
+ HIDECONSTRUCTIONWARNING: 'boolean:not-0',
2080
+ HIDE_2D_PLANNER: 'boolean:1',
2081
+ HIDE_AV_BUTTONS: 'list:;',
2082
+ HIDE_PLANNER_UI_ICONS: 'boolean:1',
2083
+ HIDE_PRICEPREVIEW_ON_OPTIONS: 'list:;',
2084
+ HIDE_PRICE_GROUPS_OF_OPGS: 'boolean:1',
2085
+ HIDE_SUBPOS_ARTICLECODEX_EKTEXT: 'boolean:1',
2086
+ IDM3D_CAT_CODEX: 'string',
2087
+ IDM3D_ENVIRONMENT: 'string',
2088
+ IDM3D_TRANSLATION: 'json',
2089
+ IGNOREDOCKINGNUMBER: 'boolean:1',
2090
+ IGNORELAYERAVC: 'boolean:1',
2091
+ IGNORELAYERAVNAVS: 'boolean:1',
2092
+ IGNORELAYERAVOAVU: 'boolean:1',
2093
+ IGNORE_ARTICLERELATIONS: 'boolean:1',
2094
+ IGNORE_ISDEFINED_CHECK: 'boolean:1',
2095
+ IGNORE_MAX_PRICE_AS_BASEPRICE: 'boolean:1',
2096
+ INIT_OPTIONTREE_TWICE: 'boolean:1',
2097
+ IS_IDM3D_CAT: 'boolean:1|true',
2098
+ MERGE_OPTIONS_TO_SAME_OPTION: 'shape',
2099
+ NOTIFICATIONS: 'json',
2100
+ ONCONFIG_SINGLE_DONT_GENERALIZE: 'boolean:1',
2101
+ PARTLIST_POSTFIX: 'shape',
2102
+ PLANNERTYPE: 'string',
2103
+ PLANNER_2DOT0: 'boolean:1',
2104
+ PLANNER_REPLACE_MODE: 'boolean:1',
2105
+ PLAN_2D_FONT_URL: 'string',
2106
+ PROGRAM_NR: 'string',
2107
+ RECONFIG_AFTER_ARTICLE_DOCKED: 'boolean:1',
2108
+ REPAIR_VARIANT_VALUES: 'shape',
2109
+ RTV_PRESET: 'json',
2110
+ SHOWACCESSOIREONLASTTAB: 'boolean:1',
2111
+ SHOWACCONDPONLY: 'boolean:1',
2112
+ SHOWTYPENRINPLANNER: 'boolean:1',
2113
+ SHOW_AI_ROOM_RENDERING_IN_SUMMARY: 'boolean:1',
2114
+ SHOW_AI_ROOM_RENDERING_SUMMARY: 'boolean:1',
2115
+ SHOW_ALL_ITEMS_IN_PLANNER: 'boolean:1',
2116
+ SHOW_PRICEPREVIEW_ON_OPTIONS: 'list:;',
2117
+ STARTFILTERPARAMS: 'list:,',
2118
+ STARTHIDEARTICLES: 'list:;',
2119
+ START_PLANNER_ARTICLE: 'list:;',
2120
+ SUMMARY_TABGROUP_POSITION: 'list:;',
2121
+ USEBOXPLANNER: 'all-or-list:;',
2122
+ USEGLOBALSVGSCALE: 'boolean:1',
2123
+ USEPOSCOUNTVALUE: 'boolean:1',
2124
+ USEPRGASOPVARTICLENR: 'boolean:1',
2125
+ USE_DECISION_POS_COUNT_VALUE: 'boolean:1',
2126
+ USE_DIOMEX_CONFIG_LOGIC: 'boolean:1',
2127
+ USE_SHELFPLANNER_RTV: 'boolean:1',
2128
+ USE_SHORT_NAME_AS_NAME: 'boolean:1',
2129
+ USE_TYPENR_AS_ARTICLENR_EKTEXT: 'boolean:1',
2130
+ WARNINGS: 'json'
2131
+ };
2132
+
2133
+ /** 31 properties parsed on the article entity. */
2134
+ var ARTICLE_PROPERTIES = {
2135
+ '3DMODELNAME': 'string',
2136
+ ACCESSOIRE_POS_PRIO: 'number',
2137
+ ADD_AS_ZKAT: 'boolean:1|true',
2138
+ BASIC_UNIT_PRICE: 'number',
2139
+ BUNDLE_RULES: 'json',
2140
+ CONTENT_ITEM: 'string',
2141
+ DEPTH_HAS_PRICE: 'boolean:on',
2142
+ DO_NOT_DEL_ACC_IF_NOT_DOCKED: 'boolean:on',
2143
+ GROUP_CONTENT_ITEM: 'string',
2144
+ HAS3D: 'boolean:on',
2145
+ HEIGHTGRIDABOVE: 'number',
2146
+ HEIGHTGRIDBELOW: 'number',
2147
+ HEIGHTGRIDUSED: 'number',
2148
+ HEIGHT_HAS_PRICE: 'boolean:on',
2149
+ HIDE_IN_PLANNERSTEP: 'boolean:on',
2150
+ IDM3D_SKIP: 'boolean:on',
2151
+ INVALID_ACCESSORIES: 'list:,',
2152
+ MAX_PLANNING_COUNT: 'number',
2153
+ ON_CONFIG_OPTION: 'string',
2154
+ ON_SET_CONFIG_OPTION: 'string',
2155
+ OPTIONS_FOR_PRINT: 'list:;',
2156
+ ORDER_POSNR: 'string',
2157
+ OVERWRITE_PARENT_DEPTH: 'boolean:on',
2158
+ OVERWRITE_PARENT_HEIGHT: 'boolean:on',
2159
+ OVERWRITE_PARENT_WIDTH: 'boolean:on',
2160
+ RETAIL_PREFIX: 'string',
2161
+ TABGROUP: 'string',
2162
+ TABGROUP_OPTIONS: 'string',
2163
+ TYPE_NO: 'string',
2164
+ WIDTH_HAS_PRICE: 'boolean:on',
2165
+ ZUBEHOER_FAMILIE: 'string'
2166
+ };
2167
+
2168
+ /** 41 properties parsed on the option entity. */
2169
+ var OPTION_PROPERTIES = {
2170
+ ADDITIONAL_GROUP_FILTER: 'json',
2171
+ ADD_OPT_TO_TABGROUP_IN_PL_SUM: 'string',
2172
+ ADD_TO_WWS: 'boolean:on',
2173
+ CHECK_FOR_REVERSE_CHANGES: 'shape',
2174
+ CONTENT_ITEM: 'string',
2175
+ CONTENT_ITEM_TEASER: 'json',
2176
+ CUSTOM_DIMENSION: 'boolean:on',
2177
+ CUSTOM_DIMENSION_TEXT: 'string',
2178
+ DEFAULT_SIBLING_OPTION: 'string',
2179
+ DESCRIPTION: 'string',
2180
+ DIAMETER: 'boolean:on',
2181
+ EshopCategoryMapping: 'ignored',
2182
+ EshopSearchRelevant: 'ignored',
2183
+ FEATURE_TYPE: 'ignored',
2184
+ FREETEXT_DEFAULT_VALUE: 'string',
2185
+ GROUP_OPTIONS_LEFT_AND_RIGHT: 'shape',
2186
+ HIDE_OPTION_IN_CONFIGURATOR: 'boolean:on',
2187
+ IDM3D_TARGET: 'list:,',
2188
+ IGNORE_GROUPS: 'boolean:1',
2189
+ IGNORE_PGR_GROUP_POSITION: 'boolean:1',
2190
+ INFO_PDF: 'string',
2191
+ INFO_URL: 'string',
2192
+ ION_COMMENT_TEXT: 'ignored',
2193
+ ISDEFAULTVALUEFOROPTIONS: 'string',
2194
+ IS_MAIN_COLOR: 'boolean:on',
2195
+ IS_STATE: 'boolean:on',
2196
+ IsArtName: 'ignored',
2197
+ IsSalesText: 'ignored',
2198
+ MERGE_IDM_TO_OPG: 'string',
2199
+ ONLY_VISIBLE_IF_CONFIG_ALL: 'boolean:on',
2200
+ ONLY_VISIBLE_IF_CONFIG_SINGLE: 'boolean:on',
2201
+ ONLY_VISIBLE_IF_NOT_UNDOCK: 'boolean:on',
2202
+ REQUIRED_OPTION: 'boolean:on',
2203
+ REQUIRES_USER_INPUT: 'boolean:on',
2204
+ SETNAME: 'boolean:on',
2205
+ SHOW_FILTER: 'boolean:1',
2206
+ SHOW_IN_BASKET_WHEN_HAS_PRICE: 'ignored',
2207
+ SHOW_IN_VARIANTDESC: 'boolean:on',
2208
+ SHOW_SEARCHBAR: 'boolean:1',
2209
+ SHOW_SEPARAT_ON_TABGROUP: 'string',
2210
+ SUGGESTED_OPTION: 'boolean:on'
2211
+ };
2212
+
2213
+ /** 31 properties parsed on the optionValue entity. */
2214
+ var OPTIONVALUE_PROPERTIES = {
2215
+ ADD_TO_MEASURE: 'shape',
2216
+ CONTENT_ITEM: 'string',
2217
+ CUSTOM_DIMENSION: 'opaque',
2218
+ DEFAULT_VALUE: 'boolean:on',
2219
+ EshopCategoryMapping: 'ignored',
2220
+ GROUP_CONTENT_ITEM: 'string',
2221
+ HIDE_IN_SUMMARY: 'boolean:on',
2222
+ IDM3D_VALUE: 'string',
2223
+ INFO_PDF: 'string',
2224
+ INFO_URL: 'string',
2225
+ ION_COMMENT_TEXT: 'ignored',
2226
+ IS_NOT_RELEVANT: 'boolean:on',
2227
+ IsArtName: 'ignored',
2228
+ IsVariantAttribute: 'boolean:1',
2229
+ MEASURE_MAXIMUM: 'string',
2230
+ MEASURE_MINIMUM: 'string',
2231
+ MEASURE_STEP: 'string',
2232
+ MEASURE_UNIT: 'string',
2233
+ ONLY_VISIBLE_IF_NOT_UNDOCK: 'string',
2234
+ ON_RULE: 'string',
2235
+ OPTION_FREE_TEXT: 'boolean:on',
2236
+ PIMFlatValues: 'boolean:1',
2237
+ PRICE_UNIT: 'string',
2238
+ PriceTageRelevant: 'ignored',
2239
+ SAME_OPV: 'string',
2240
+ SETNAME: 'string',
2241
+ SET_BY_RULE: 'string',
2242
+ SET_CONFIG: 'string',
2243
+ SUMMARY_CODEX: 'string',
2244
+ TopFilterAttribute: 'ignored',
2245
+ VIEWPOINTNAME: 'string'
2246
+ };
2247
+ var PROPERTY_SCHEMAS = {
2248
+ catalog: CATALOG_PROPERTIES,
2249
+ article: ARTICLE_PROPERTIES,
2250
+ option: OPTION_PROPERTIES,
2251
+ optionValue: OPTIONVALUE_PROPERTIES
2252
+ };
2253
+
2254
+ /** A catalog-prefixed codex ('MYCAT__USEBOXPLANNER') in its bare form, the same way the parsers strip the prefix. */
2255
+ var bareCodex = function bareCodex(codex) {
2256
+ return codex.includes('__') ? codex.slice(codex.indexOf('__') + 2) : codex;
2257
+ };
2258
+
2259
+ /**
2260
+ * The encoding of one property, or undefined when the codex is not one the engine parses - an organization's own
2261
+ * key, which stays free text. A catalog-prefixed codex resolves to its bare form (bareCodex).
2262
+ */
2263
+ function propertyEncodingOf(codex, entity) {
2264
+ var bare = bareCodex(codex);
2265
+ var entities = entity ? [entity] : ['catalog', 'article', 'option', 'optionValue'];
2266
+ for (var _i = 0, _entities = entities; _i < _entities.length; _i++) {
2267
+ var candidate = _entities[_i];
2268
+ // Own keys only: a codex like 'constructor' or 'toString' would otherwise resolve to an inherited function.
2269
+ if (Object.prototype.hasOwnProperty.call(PROPERTY_SCHEMAS[candidate], bare)) return PROPERTY_SCHEMAS[candidate][bare];
2270
+ }
2271
+ return undefined;
2272
+ }
2273
+
2274
+ function _createForOfIteratorHelper$q(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$q(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
2275
+ function _unsupportedIterableToArray$q(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$q(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$q(r, a) : void 0; } }
2276
+ function _arrayLikeToArray$q(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
2277
+ var LOG$r = DivaUtils.initLog('Planner', 'WEB-PLANNER-LOGIC');
2278
+
2279
+ /** A JSON value: an object or an array. */
2280
+
2281
+ /**
2282
+ * A property value as the planner reads it, in the type of its definition: a flag, a number, a list of texts, a JSON
2283
+ * value or a text.
2284
+ */
2285
+
2286
+ /** What an IDM / enricher property carries: a typed value under ALL, or a text per language. */
2287
+
2288
+ /** The key a typed value is stored under: one value for all languages. */
2289
+ var ALL = 'ALL';
2290
+ var isValues = function isValues(stored) {
2291
+ return _typeof(stored) === 'object' && stored !== null && !Array.isArray(stored);
2292
+ };
2293
+ var isPropertyValue = function isPropertyValue(value) {
2294
+ return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' || _typeof(value) === 'object' && value !== null;
2295
+ };
2296
+
2297
+ /** The typed value under ALL, else the value of the language, else the first one - as DivaUtils.getLocals picks it. */
2298
+ function valueOf(values, lang) {
2299
+ if (ALL in values) return values[ALL];
2300
+ return values[lang.toUpperCase()] || values[lang.toLowerCase()] || Object.values(values)[0];
2301
+ }
2302
+ function readJson(codex, text) {
2303
+ try {
2304
+ return JSON.parse(text);
2305
+ } catch (e) {
2306
+ LOG$r.warn("Invalid JSON in property ".concat(codex), e);
2307
+ return undefined;
2308
+ }
2309
+ }
2310
+
2311
+ /** The legacy texts of the JSON values with a fixed shape, read the way their parsers read them. */
2312
+ var SHAPE_TEXTS = {
2313
+ // 'name;l' - a side other than l/r is no side
2314
+ GROUP_OPTIONS_LEFT_AND_RIGHT: function GROUP_OPTIONS_LEFT_AND_RIGHT(text) {
2315
+ var _text$split = text.split(';'),
2316
+ _text$split2 = _slicedToArray(_text$split, 2),
2317
+ group = _text$split2[0],
2318
+ side = _text$split2[1];
2319
+ return {
2320
+ group: group,
2321
+ side: side === null || side === void 0 ? void 0 : side.toLowerCase()
2322
+ };
2323
+ },
2324
+ // 'BLOCK;A;B' - anything but BLOCK warns; an empty text checks nothing
2325
+ CHECK_FOR_REVERSE_CHANGES: function CHECK_FOR_REVERSE_CHANGES(text) {
2326
+ if (!text) return undefined;
2327
+ var _text$split3 = text.split(';'),
2328
+ _text$split4 = _toArray(_text$split3),
2329
+ mode = _text$split4[0],
2330
+ options = _text$split4.slice(1);
2331
+ return {
2332
+ mode: mode.startsWith('BLOCK') ? 'BLOCK' : 'WARN',
2333
+ options: options
2334
+ };
2335
+ },
2336
+ // 'A,B;C,D'
2337
+ MERGE_OPTIONS_TO_SAME_OPTION: function MERGE_OPTIONS_TO_SAME_OPTION(text) {
2338
+ return text.split(';').map(function (group) {
2339
+ return group.split(',');
2340
+ });
2341
+ },
2342
+ // 'rule:postfix;rule:postfix'
2343
+ PARTLIST_POSTFIX: function PARTLIST_POSTFIX(text) {
2344
+ return text.split(';').map(function (entry) {
2345
+ var _entry$split = entry.split(':'),
2346
+ _entry$split2 = _slicedToArray(_entry$split, 2),
2347
+ rule = _entry$split2[0],
2348
+ postfix = _entry$split2[1];
2349
+ return {
2350
+ rule: rule,
2351
+ postfix: postfix
2352
+ };
2353
+ });
2354
+ },
2355
+ // 'op:value:option;...'
2356
+ ADD_TO_MEASURE: function ADD_TO_MEASURE(text) {
2357
+ return text.split(';').map(function (entry) {
2358
+ var _entry$split3 = entry.split(':'),
2359
+ _entry$split4 = _slicedToArray(_entry$split3, 3),
2360
+ op = _entry$split4[0],
2361
+ value = _entry$split4[1],
2362
+ option = _entry$split4[2];
2363
+ return {
2364
+ op: op,
2365
+ value: Number(value),
2366
+ option: option
2367
+ };
2368
+ });
2369
+ },
2370
+ // 'feature:value;feature:value;;...' - an entry without a target repairs nothing
2371
+ REPAIR_VARIANT_VALUES: function REPAIR_VARIANT_VALUES(text) {
2372
+ var repairs = {};
2373
+ var _iterator = _createForOfIteratorHelper$q(text.split(';;').map(function (entry) {
2374
+ return entry.split(';');
2375
+ })),
2376
+ _step;
2377
+ try {
2378
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
2379
+ var _step$value = _slicedToArray(_step.value, 2),
2380
+ from = _step$value[0],
2381
+ to = _step$value[1];
2382
+ if (to !== undefined) repairs[from] = to;
2383
+ }
2384
+ } catch (err) {
2385
+ _iterator.e(err);
2386
+ } finally {
2387
+ _iterator.f();
2388
+ }
2389
+ return repairs;
2390
+ }
2391
+ };
2392
+ var isRecord = function isRecord(value) {
2393
+ return _typeof(value) === 'object' && value !== null && !Array.isArray(value);
2394
+ };
2395
+ var isTexts = function isTexts(value) {
2396
+ return Array.isArray(value) && value.every(function (entry) {
2397
+ return typeof entry === 'string';
2398
+ });
2399
+ };
2400
+ /** {"all": true} or {"only": [texts]} - and {"all": false} where the key knows "none". */
2401
+ var allOrOnly = function allOrOnly(allowNone) {
2402
+ return function (value) {
2403
+ return isRecord(value) && (typeof value.all === 'boolean' ? value.all || allowNone : isTexts(value.only));
2404
+ };
2405
+ };
2406
+
2407
+ /** The shapes of the JSON values the parsers read member by member - as the enricher checks them on a write (idm PropertyValueShapes). */
2408
+ var SHAPES = {
2409
+ GROUP_OPTIONS_LEFT_AND_RIGHT: isRecord,
2410
+ CHECK_FOR_REVERSE_CHANGES: function CHECK_FOR_REVERSE_CHANGES(value) {
2411
+ return isRecord(value) && isTexts(value.options);
2412
+ },
2413
+ MERGE_OPTIONS_TO_SAME_OPTION: function MERGE_OPTIONS_TO_SAME_OPTION(value) {
2414
+ return Array.isArray(value) && value.every(isTexts);
2415
+ },
2416
+ PARTLIST_POSTFIX: function PARTLIST_POSTFIX(value) {
2417
+ return Array.isArray(value) && value.every(isRecord);
2418
+ },
2419
+ ADD_TO_MEASURE: function ADD_TO_MEASURE(value) {
2420
+ return Array.isArray(value) && value.every(isRecord);
2421
+ },
2422
+ REPAIR_VARIANT_VALUES: function REPAIR_VARIANT_VALUES(value) {
2423
+ return isRecord(value) && Object.values(value).every(function (to) {
2424
+ return typeof to === 'string';
2425
+ });
2426
+ },
2427
+ DEFAULT_GROUPS_CLOSED: allOrOnly(true),
2428
+ USEBOXPLANNER: allOrOnly(false),
2429
+ ELEMENT_COPY_AVLR: allOrOnly(false),
2430
+ AUTO_OPEN_CONTENTITEM: allOrOnly(false)
2431
+ };
2432
+
2433
+ /**
2434
+ * The value of a JSON property with a fixed shape; undefined for a value of another shape - set elsewhere, or left from
2435
+ * before its definition's type changed - which is logged and ignored instead of failing the whole catalog.
2436
+ */
2437
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- the shape is checked; its members are the key's own
2438
+ function shapedJsonOf(codex, value) {
2439
+ var _SHAPES$codex;
2440
+ if (value === undefined || (_SHAPES$codex = SHAPES[codex]) !== null && _SHAPES$codex !== void 0 && _SHAPES$codex.call(SHAPES, value)) return value;
2441
+ LOG$r.warn("Invalid ".concat(codex, " property - its value does not have the shape the key takes"), value);
2442
+ return undefined;
2443
+ }
2444
+
2445
+ /** A legacy text in the type of its encoding, read exactly the way the parsers read the text before values were typed. */
2446
+ function readText(codex, encoding, text) {
2447
+ switch (encoding) {
2448
+ case 'boolean:1':
2449
+ return text == '1';
2450
+ case 'boolean:1|true':
2451
+ return text == '1' || text.toLowerCase() == 'true';
2452
+ case 'boolean:on':
2453
+ return isPropertyOn(text);
2454
+ case 'boolean:not-0':
2455
+ return text != '0';
2456
+ case 'number':
2457
+ return Number(text);
2458
+ case 'list:;':
2459
+ return text.split(';');
2460
+ case 'list:,':
2461
+ return text.split(',');
2462
+ case 'all-or-list:;':
2463
+ return text == '1' ? {
2464
+ all: true
2465
+ } : {
2466
+ only: text.split(';')
2467
+ };
2468
+ case 'boolean-or-list:;':
2469
+ return text == '1' || text == '0' ? {
2470
+ all: text == '1'
2471
+ } : {
2472
+ only: text.split(';')
2473
+ };
2474
+ case 'json':
2475
+ return readJson(codex, text);
2476
+ case 'shape':
2477
+ return SHAPE_TEXTS[codex](text);
2478
+ default:
2479
+ return text;
2480
+ }
2481
+ }
2482
+
2483
+ /**
2484
+ * The value of a property as the planner reads it. `stored` is what the property carries: the values per language of
2485
+ * an IDM / enricher property, or the text of a CE property. A typed value (under ALL) is taken as it is; a text - of a
2486
+ * CE catalog or mask, of a text property, or the legacy text the enricher renders for old configurators - is read in
2487
+ * the encoding the entity parses the codex with. A codex the planner does not parse keeps its text.
2488
+ */
2489
+ function readPropertyValue(entity, codex, stored, lang) {
2490
+ var value = isValues(stored) ? valueOf(stored, lang) : stored;
2491
+ if (typeof value === 'string') {
2492
+ var encoding = propertyEncodingOf(codex, entity);
2493
+ return encoding ? readText(bareCodex(codex), encoding, value) : value;
2494
+ }
2495
+ return isPropertyValue(value) ? value : undefined;
2496
+ }
2497
+
2498
+ /** A text property's text; undefined for any other value. */
2499
+ var textOf = function textOf(value) {
2500
+ return typeof value === 'string' ? value : undefined;
2501
+ };
2502
+
2503
+ /** A list property's entries; an empty list for any other value. */
2504
+ var listOf = function listOf(value) {
2505
+ return Array.isArray(value) ? value.map(String) : [];
2506
+ };
2507
+
2508
+ /**
2509
+ * A JSON property's value - handed on unchecked, as `JSON.parse` handed on the text before: its structure is the
2510
+ * property's own (bundle rules, notifications, a fixed shape, ...). Undefined for any other value.
2511
+ */
2512
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- the structure is each property's own, as JSON.parse's result was
2513
+ var jsonOf = function jsonOf(value) {
2514
+ return _typeof(value) === 'object' ? value : undefined;
2515
+ };
2516
+
2517
+ /**
2518
+ * The texts the basket's MetaData carries for a property the planner does not parse (`values: string[]`): a text split
2519
+ * at ';' as before, a list its entries, a flag '1' or '0', a number its text, a JSON value its JSON text.
2520
+ */
2521
+ function propertyTexts(value) {
2522
+ if (value === undefined) return [];
2523
+ if (typeof value === 'string') return value.split(';');
2524
+ if (typeof value === 'boolean') return [value ? '1' : '0'];
2525
+ if (typeof value === 'number') return [String(value)];
2526
+ if (Array.isArray(value) && value.every(function (entry) {
2527
+ return typeof entry === 'string';
2528
+ })) return value.map(String);
2529
+ return [JSON.stringify(value)];
2530
+ }
2531
+
1987
2532
  var Vector2 = /*#__PURE__*/function () {
1988
2533
  function Vector2(x, y) {
1989
2534
  var interpretation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'any';
@@ -2463,239 +3008,6 @@ var CatalogPlannerArticleData = /*#__PURE__*/function () {
2463
3008
  }]);
2464
3009
  }();
2465
3010
 
2466
- /**
2467
- * Reading and writing a property VALUE in the encoding its own parser expects.
2468
- *
2469
- * Every property travels as a string and each one decides how that string is read (see propertySchemaRegistry).
2470
- * An editor therefore cannot write "a boolean" - it has to write the dialect of THAT property, or the parser reads
2471
- * the opposite of what the user chose. These two functions are that translation:
2472
- *
2473
- * - `decodePropertyValue` is DELIBERATELY TOLERANT. Stored values are a decade of history: the raw strings the
2474
- * parsers document, real booleans and numbers written by editors that typed them natively, and the '.ToString()'
2475
- * spellings those turn into on the way out ('True'). All of them must display as what they mean, or an editor
2476
- * would show a flag as off and silently turn it off on the next save.
2477
- * - `encodePropertyValue` is STRICT. It emits exactly one spelling per encoding - the one the parser reads.
2478
- */
2479
-
2480
- /** What a decoded property value can be, before an editor renders it. */
2481
-
2482
- /**
2483
- * Whether a flag property is switched on: empty, '0' and 'false' (any case, trimmed) are OFF, any other value is ON.
2484
- * Every flag parser reads its value through this, so an editor's off-state and the engine's agree.
2485
- */
2486
- function isPropertyOn(value) {
2487
- if (value === undefined || value === null) return false;
2488
- if (typeof value === 'boolean') return value;
2489
- if (typeof value === 'number') return value !== 0;
2490
- var token = String(value).trim().toLowerCase();
2491
- return token !== '' && token !== '0' && token !== 'false';
2492
- }
2493
-
2494
- /** The raw string a stored value amounts to - what `.ToString()` would hand the parser. */
2495
- function rawStringOf(stored) {
2496
- if (stored === undefined || stored === null) return '';
2497
- if (typeof stored === 'string') return stored;
2498
- // A real boolean stored natively reaches the parser as .NET spells it, capital included.
2499
- if (typeof stored === 'boolean') return stored ? 'True' : 'False';
2500
- if (typeof stored === 'number') return String(stored);
2501
- return JSON.stringify(stored);
2502
- }
2503
-
2504
- /**
2505
- * Reads a stored boolean EXACTLY the way the property's parser does - the editor must show what the engine sees.
2506
- * A `== '1'` property holding 'true' (or a natively stored True) is OFF in the engine; showing it as on would let
2507
- * the next save switch the flag on for real.
2508
- */
2509
- function decodeBoolean(raw, encoding) {
2510
- if (encoding === 'boolean:on') return isPropertyOn(raw);
2511
- var token = raw.trim();
2512
- // The `'true'` parsers mostly lower-case before comparing, the `'1'` parsers compare the digit as is.
2513
- var isOne = token === '1';
2514
- var isTrue = token.toLowerCase() === 'true';
2515
- if (encoding === 'boolean:1') return isOne;
2516
- if (encoding === 'boolean:true') return isTrue;
2517
- return isOne || isTrue;
2518
- }
2519
-
2520
- /** Splits a delimited list, dropping the empty segments a trailing delimiter leaves behind. */
2521
- function decodeList(raw, separator) {
2522
- return raw.split(separator).map(function (entry) {
2523
- return entry.trim();
2524
- }).filter(function (entry) {
2525
- return entry !== '';
2526
- });
2527
- }
2528
-
2529
- /**
2530
- * Joins list entries, or removes the property when nothing is left: '' would reach the parser's `split` and come
2531
- * back as the single entry '' - a cleared list must not turn into a list of one nameless group.
2532
- */
2533
- function encodeList(value, separator) {
2534
- if (Array.isArray(value)) {
2535
- var entries = value.map(function (entry) {
2536
- return String(entry).trim();
2537
- }).filter(function (entry) {
2538
- return entry !== '';
2539
- });
2540
- return entries.length === 0 ? undefined : entries.join(separator);
2541
- }
2542
- // A boolean has no list spelling: 'True' would come back as a list of one entry literally named 'True'.
2543
- if (typeof value === 'boolean') return undefined;
2544
- var raw = rawStringOf(value);
2545
- return raw === '' ? undefined : raw;
2546
- }
2547
-
2548
- /**
2549
- * The value an editor should show for a stored property. `stored` is what the record holds - a string in the
2550
- * normal case, or a natively-typed value from an editor that wrote one.
2551
- */
2552
- function decodePropertyValue(encoding, stored) {
2553
- var raw = rawStringOf(stored);
2554
- switch (encoding) {
2555
- case 'boolean:1':
2556
- case 'boolean:1|true':
2557
- case 'boolean:true':
2558
- case 'boolean:on':
2559
- return decodeBoolean(raw, encoding);
2560
- case 'number':
2561
- {
2562
- if (raw.trim() === '') return undefined;
2563
- // German decimal commas reach these fields through spreadsheets and locale-formatted writers.
2564
- var parsed = Number(raw.trim().replace(',', '.'));
2565
- return Number.isFinite(parsed) ? parsed : undefined;
2566
- }
2567
- case 'list:;':
2568
- return decodeList(raw, ';');
2569
- case 'list:,':
2570
- return decodeList(raw, ',');
2571
-
2572
- // '1' means EVERYTHING; any other value is a list. Kept as the literal '1' so an editor can offer the two
2573
- // states as a choice rather than making the user know the convention.
2574
- case 'all-or-list:;':
2575
- return raw.trim() === '1' ? true : decodeList(raw, ';');
2576
-
2577
- // Three states, not two: '1' is ALL, '0' is NONE, and anything else is the list of the ones that apply.
2578
- // '0' must NOT read as a one-entry list - that is how an off-state turns into the group literally named '0'.
2579
- case 'boolean-or-list:;':
2580
- {
2581
- var token = raw.trim();
2582
- if (token === '1') return true;
2583
- if (token === '0') return false;
2584
- return decodeList(raw, ';');
2585
- }
2586
- case 'json':
2587
- {
2588
- if (raw.trim() === '') return undefined;
2589
- try {
2590
- return JSON.parse(raw);
2591
- } catch (_unused) {
2592
- // Invalid JSON is still the user's text - hand it back so the editor can show and repair it rather than
2593
- // replacing their work with an empty object.
2594
- return raw;
2595
- }
2596
- }
2597
- default:
2598
- return raw === '' ? undefined : raw;
2599
- }
2600
- }
2601
-
2602
- /**
2603
- * The string to store for an edited value - exactly the spelling the property's parser reads.
2604
- * `undefined` means the property should be REMOVED rather than written empty, which is how a `boolean:on` flag is
2605
- * switched off.
2606
- */
2607
- function encodePropertyValue(encoding, value) {
2608
- switch (encoding) {
2609
- case 'boolean:1':
2610
- case 'boolean:1|true':
2611
- return value ? '1' : '0';
2612
- case 'boolean:true':
2613
- return value ? 'true' : 'false';
2614
-
2615
- // Off is written as the absence of a value: an engine older than isPropertyOn read '0' as ON. So a child enrichment
2616
- // cannot switch off a '1' inherited from a base package.
2617
- case 'boolean:on':
2618
- return isPropertyOn(value) ? '1' : undefined;
2619
- case 'number':
2620
- {
2621
- // Blank input (including whitespace) clears the property; Number('') would be 0.
2622
- if (value === undefined || value === null || String(value).trim() === '') return undefined;
2623
- var parsed = typeof value === 'number' ? value : Number(String(value).trim().replace(',', '.'));
2624
- // A decimal point, never a comma - the parsers run Number() on this string.
2625
- return Number.isFinite(parsed) ? String(parsed) : undefined;
2626
- }
2627
- case 'list:;':
2628
- return encodeList(value, ';');
2629
- case 'list:,':
2630
- return encodeList(value, ',');
2631
-
2632
- // '1' is ALL; there is no spelling for OFF, so `false` removes the property (the list branch would otherwise
2633
- // store the text 'False' as a one-entry list).
2634
- case 'all-or-list:;':
2635
- if (value === true) return '1';
2636
- if (value === false) return undefined;
2637
- return encodeList(value, ';');
2638
- case 'boolean-or-list:;':
2639
- if (value === true) return '1';
2640
- // The off-state has its own spelling here, so it is written rather than left to the list branch, which
2641
- // would REMOVE the property for an empty list instead of switching the state off.
2642
- if (value === false) return '0';
2643
- return encodeList(value, ';');
2644
- case 'json':
2645
- {
2646
- if (value === undefined || value === '') return undefined;
2647
- // Already-text stays text: it is either JSON the user typed or something they are still repairing.
2648
- return typeof value === 'string' ? value : JSON.stringify(value);
2649
- }
2650
- default:
2651
- {
2652
- var raw = rawStringOf(value);
2653
- return raw === '' ? undefined : raw;
2654
- }
2655
- }
2656
- }
2657
-
2658
- /** Whether a value can be stored for this encoding at all - what an editor blocks saving on. */
2659
- function propertyValueProblem(encoding, value) {
2660
- if (encoding === 'json' && typeof value === 'string' && value.trim() !== '') {
2661
- try {
2662
- JSON.parse(value);
2663
- } catch (_unused2) {
2664
- return 'invalidJson';
2665
- }
2666
- }
2667
- if (encoding === 'number' && value !== undefined && String(value).trim() !== '') {
2668
- var parsed = typeof value === 'number' ? value : Number(String(value).trim().replace(',', '.'));
2669
- if (!Number.isFinite(parsed)) return 'notANumber';
2670
- }
2671
-
2672
- // A ';' inside a ';'-list entry would split it into two on the way back in - and every encoding that JOINS on
2673
- // ';' is exposed to it, not just the plain list.
2674
- var joinsOnSemicolon = encoding === 'list:;' || encoding === 'all-or-list:;' || encoding === 'boolean-or-list:;';
2675
- if (joinsOnSemicolon && Array.isArray(value) && value.some(function (entry) {
2676
- return String(entry).includes(';');
2677
- })) {
2678
- return 'separatorInEntry';
2679
- }
2680
- if (encoding === 'list:,' && Array.isArray(value) && value.some(function (entry) {
2681
- return String(entry).includes(',');
2682
- })) {
2683
- return 'separatorInEntry';
2684
- }
2685
- return undefined;
2686
- }
2687
-
2688
- /** The control an editor should render for an encoding. */
2689
- function editorKindOf(encoding) {
2690
- if (encoding.startsWith('boolean:')) return 'checkbox';
2691
- if (encoding === 'number') return 'number';
2692
- if (encoding === 'list:;' || encoding === 'list:,') return 'list';
2693
- if (encoding === 'all-or-list:;') return 'allOrList';
2694
- if (encoding === 'boolean-or-list:;') return 'boolOrList';
2695
- if (encoding === 'json') return 'json';
2696
- return 'text';
2697
- }
2698
-
2699
3011
  var LOG$q = DivaUtils.initLog('Planner', 'WEB-PLANNER-LOGIC');
2700
3012
  var OptionCatalogData = /*#__PURE__*/function () {
2701
3013
  function OptionCatalogData(opt, catalogData) {
@@ -3001,122 +3313,129 @@ var OptionCatalogData = /*#__PURE__*/function () {
3001
3313
  }]);
3002
3314
  }();
3003
3315
  var setOptionsProperties = function setOptionsProperties(catalogData, opt, properties) {
3004
- var _groupOptions$;
3005
3316
  for (var i = 0; i < (properties === null || properties === void 0 ? void 0 : properties.length); i++) {
3006
3317
  var prop = properties[i];
3007
3318
  var key = prop.Codex;
3008
3319
  if (key.startsWith(catalogData.catalogCodex + '__')) key = key.replace(catalogData.catalogCodex + '__', '');
3009
3320
  switch (key) {
3010
3321
  case 'INFO_URL':
3011
- opt.url = prop.Value;
3322
+ opt.url = textOf(prop.Value);
3012
3323
  break;
3013
3324
  case 'IGNORE_GROUPS':
3014
- opt.ignoreGroups = prop.Value == '1';
3325
+ opt.ignoreGroups = prop.Value === true;
3015
3326
  break;
3016
3327
  case 'IGNORE_PGR_GROUP_POSITION':
3017
- opt.ignorePgrGroupPosition = prop.Value == '1';
3328
+ opt.ignorePgrGroupPosition = prop.Value === true;
3018
3329
  break;
3019
3330
  case 'SHOW_SEARCHBAR':
3020
- opt.showSearchbar = prop.Value == '1';
3331
+ opt.showSearchbar = prop.Value === true;
3021
3332
  break;
3022
3333
  case 'SHOW_FILTER':
3023
- opt.showFilter = prop.Value == '1';
3334
+ opt.showFilter = prop.Value === true;
3024
3335
  break;
3025
3336
  case 'INFO_PDF':
3026
- opt.pdfUrl = prop.Value;
3337
+ opt.pdfUrl = textOf(prop.Value);
3027
3338
  break;
3028
3339
  case 'DIAMETER':
3029
- opt.diameter = isPropertyOn(prop.Value);
3340
+ opt.diameter = prop.Value === true;
3030
3341
  break;
3031
3342
  case 'GROUP_OPTIONS_LEFT_AND_RIGHT':
3032
- var groupOptions = prop.Value.split(';');
3033
- var position = (_groupOptions$ = groupOptions[1]) === null || _groupOptions$ === void 0 ? void 0 : _groupOptions$.toLocaleLowerCase();
3034
- opt.partOfGroup = {
3035
- groupName: groupOptions[0],
3036
- position: ['l', 'r'].includes(position) ? position : undefined
3037
- };
3038
- break;
3343
+ {
3344
+ var groupOptions = shapedJsonOf('GROUP_OPTIONS_LEFT_AND_RIGHT', prop.Value);
3345
+ if (groupOptions) {
3346
+ var group = groupOptions.group,
3347
+ side = groupOptions.side;
3348
+ opt.partOfGroup = {
3349
+ groupName: group,
3350
+ position: side === 'l' || side === 'r' ? side : undefined
3351
+ };
3352
+ }
3353
+ break;
3354
+ }
3039
3355
  case 'REQUIRES_USER_INPUT':
3040
- opt.requiresUserInput = isPropertyOn(prop.Value);
3356
+ opt.requiresUserInput = prop.Value === true;
3041
3357
  break;
3042
3358
  case 'IS_STATE':
3043
- opt.isDescribingState = isPropertyOn(prop.Value);
3359
+ opt.isDescribingState = prop.Value === true;
3044
3360
  break;
3045
3361
  case 'CUSTOM_DIMENSION':
3046
- opt.customDimension = isPropertyOn(prop.Value);
3362
+ opt.customDimension = prop.Value === true;
3047
3363
  break;
3048
3364
  case 'CUSTOM_DIMENSION_TEXT':
3049
- opt.customDimensionText = prop.Value;
3365
+ opt.customDimensionText = textOf(prop.Value);
3050
3366
  break;
3051
3367
  case 'HIDE_OPTION_IN_CONFIGURATOR':
3052
- opt.hideOptionInConfigurator = isPropertyOn(prop.Value);
3368
+ opt.hideOptionInConfigurator = prop.Value === true;
3053
3369
  break;
3054
3370
  case 'MERGE_IDM_TO_OPG':
3055
- opt.mergeIDMToOPG = prop.Value;
3371
+ opt.mergeIDMToOPG = textOf(prop.Value);
3056
3372
  break;
3057
3373
  case 'ONLY_VISIBLE_IF_NOT_UNDOCK':
3058
- opt.onlyVisibleIfNotDocked = isPropertyOn(prop.Value);
3374
+ opt.onlyVisibleIfNotDocked = prop.Value === true;
3059
3375
  break;
3060
3376
  case 'ONLY_VISIBLE_IF_CONFIG_SINGLE':
3061
- opt.onlyVisibleIfConfigSingle = isPropertyOn(prop.Value);
3377
+ opt.onlyVisibleIfConfigSingle = prop.Value === true;
3062
3378
  break;
3063
3379
  case 'ONLY_VISIBLE_IF_CONFIG_ALL':
3064
- opt.onlyVisibleIfConfigAll = isPropertyOn(prop.Value);
3380
+ opt.onlyVisibleIfConfigAll = prop.Value === true;
3065
3381
  break;
3066
3382
  case 'ISDEFAULTVALUEFOROPTIONS':
3067
- opt.isDefaultValueForOptions = prop.Value;
3383
+ opt.isDefaultValueForOptions = textOf(prop.Value);
3068
3384
  break;
3069
3385
  case 'CHECK_FOR_REVERSE_CHANGES':
3070
- if (prop.Value) {
3071
- opt.checkForReversed = {
3072
- checkForReversingChanges: prop.Value.startsWith('BLOCK') ? 'BLOCK' : 'WARN',
3073
- checkOnlyForOptions: prop.Value.split(';').slice(1).map(function (t) {
3074
- return (!catalogData.isIDMFormat ? 'OPT' : '') + t;
3075
- })
3076
- };
3386
+ {
3387
+ var reverseChanges = shapedJsonOf('CHECK_FOR_REVERSE_CHANGES', prop.Value);
3388
+ if (reverseChanges) {
3389
+ opt.checkForReversed = {
3390
+ checkForReversingChanges: reverseChanges.mode === 'BLOCK' ? 'BLOCK' : 'WARN',
3391
+ checkOnlyForOptions: reverseChanges.options.map(function (t) {
3392
+ return (!catalogData.isIDMFormat ? 'OPT' : '') + t;
3393
+ })
3394
+ };
3395
+ }
3396
+ break;
3077
3397
  }
3078
- break;
3079
3398
  case 'FREETEXT_DEFAULT_VALUE':
3080
- opt.freetextDefaultValue = prop.Value;
3399
+ opt.freetextDefaultValue = textOf(prop.Value);
3081
3400
  break;
3082
3401
  case 'SHOW_IN_VARIANTDESC':
3083
- opt.forceShowVariantDesc = isPropertyOn(prop.Value);
3402
+ opt.forceShowVariantDesc = prop.Value === true;
3084
3403
  break;
3085
3404
  case 'SHOW_SEPARAT_ON_TABGROUP':
3086
- opt.showOnSeparatTabgroup = prop.Value;
3405
+ opt.showOnSeparatTabgroup = textOf(prop.Value);
3087
3406
  break;
3088
3407
  case 'SETNAME':
3089
- opt.setName = isPropertyOn(prop.Value);
3408
+ opt.setName = prop.Value === true;
3090
3409
  break;
3091
3410
  case 'ADD_OPT_TO_TABGROUP_IN_PL_SUM':
3092
- opt.addOptionToTabgroupInPartlistSummary = prop.Value;
3411
+ opt.addOptionToTabgroupInPartlistSummary = textOf(prop.Value);
3093
3412
  break;
3094
3413
  case 'ADD_TO_WWS':
3095
- opt.addToWWS = isPropertyOn(prop.Value);
3414
+ opt.addToWWS = prop.Value === true;
3096
3415
  break;
3097
3416
  case 'IS_MAIN_COLOR':
3098
- opt.isMainColor = isPropertyOn(prop.Value);
3417
+ opt.isMainColor = prop.Value === true;
3099
3418
  break;
3100
3419
  case 'DESCRIPTION':
3101
- opt.description = prop.Value;
3420
+ opt.description = textOf(prop.Value);
3102
3421
  break;
3103
3422
  case 'DEFAULT_SIBLING_OPTION':
3104
- opt.isDefaultSiblingOption = prop.Value;
3423
+ opt.isDefaultSiblingOption = textOf(prop.Value);
3105
3424
  break;
3106
3425
  case 'CONTENT_ITEM':
3107
- opt.contentItemId = prop.Value;
3426
+ opt.contentItemId = textOf(prop.Value);
3108
3427
  break;
3109
3428
  case 'CONTENT_ITEM_TEASER':
3110
- opt.contentItemTeaser = JSON.parse(prop.Value);
3429
+ opt.contentItemTeaser = jsonOf(prop.Value);
3111
3430
  break;
3112
3431
  case 'REQUIRED_OPTION':
3113
- opt.requiredOption = isPropertyOn(prop.Value);
3432
+ opt.requiredOption = prop.Value === true;
3114
3433
  break;
3115
3434
  case 'SUGGESTED_OPTION':
3116
- opt.suggestedOption = isPropertyOn(prop.Value);
3435
+ opt.suggestedOption = prop.Value === true;
3117
3436
  break;
3118
3437
  case 'ADDITIONAL_GROUP_FILTER':
3119
- opt.additionalGroupFilter = JSON.parse(prop.Value);
3438
+ opt.additionalGroupFilter = jsonOf(prop.Value);
3120
3439
  break;
3121
3440
  case 'ION_COMMENT_TEXT':
3122
3441
  case 'SHOW_IN_BASKET_WHEN_HAS_PRICE':
@@ -3127,7 +3446,7 @@ var setOptionsProperties = function setOptionsProperties(catalogData, opt, prope
3127
3446
  case 'IsArtName':
3128
3447
  break;
3129
3448
  case 'IDM3D_TARGET':
3130
- // read raw by the IDM3D translation (logic/Planner/IDM3D/idm3dTranslation.ts)
3449
+ // read by the IDM3D translation (logic/Planner/IDM3D/idm3dTranslation.ts)
3131
3450
  break;
3132
3451
  default:
3133
3452
  LOG$q.debug('implement mapping for these props for options: ' + prop.Codex);
@@ -17375,34 +17694,34 @@ var setOptionValueProperties = function setOptionValueProperties(catalogData, op
17375
17694
  if (key.startsWith(catalogData.catalogCodex + '__')) key = key.replace(catalogData.catalogCodex + '__', '');
17376
17695
  switch (key) {
17377
17696
  case 'INFO_URL':
17378
- opv.url = prop.Value;
17697
+ opv.url = textOf(prop.Value);
17379
17698
  break;
17380
17699
  case 'INFO_PDF':
17381
- opv.pdfUrl = prop.Value;
17700
+ opv.pdfUrl = textOf(prop.Value);
17382
17701
  break;
17383
17702
  case 'SAME_OPV':
17384
- opv.sameopv = prop.Value;
17703
+ opv.sameopv = textOf(prop.Value);
17385
17704
  break;
17386
17705
  case 'ONLY_VISIBLE_IF_NOT_UNDOCK':
17387
- opv.onlyVisibleIfNotDocked = prop.Value;
17706
+ opv.onlyVisibleIfNotDocked = textOf(prop.Value);
17388
17707
  break;
17389
17708
  case 'DEFAULT_VALUE':
17390
- opv.defaultValue = isPropertyOn(prop.Value);
17709
+ opv.defaultValue = prop.Value === true;
17391
17710
  break;
17392
17711
  case 'SUMMARY_CODEX':
17393
- opv.summaryCodex = prop.Value;
17712
+ opv.summaryCodex = textOf(prop.Value);
17394
17713
  break;
17395
17714
  case 'VIEWPOINTNAME':
17396
- opv.viewPointName = prop.Value;
17715
+ opv.viewPointName = textOf(prop.Value);
17397
17716
  break;
17398
17717
  case 'HIDE_IN_SUMMARY':
17399
- opv.hideInSummary = isPropertyOn(prop.Value);
17718
+ opv.hideInSummary = prop.Value === true;
17400
17719
  break;
17401
17720
  case 'SETNAME':
17402
- opv.setName = prop.Value;
17721
+ opv.setName = textOf(prop.Value);
17403
17722
  break;
17404
17723
  case 'SET_CONFIG':
17405
- opv.setConfig = prop.Value;
17724
+ opv.setConfig = textOf(prop.Value);
17406
17725
  break;
17407
17726
  case 'CUSTOM_DIMENSION':
17408
17727
  if (prop.Value == '1' || prop.Value == '0') {
@@ -17415,52 +17734,55 @@ var setOptionValueProperties = function setOptionValueProperties(catalogData, op
17415
17734
  }
17416
17735
  break;
17417
17736
  case 'ON_RULE':
17418
- opv.onRule = prop.Value;
17737
+ opv.onRule = textOf(prop.Value);
17419
17738
  break;
17420
17739
  case 'CONTENT_ITEM':
17421
- opv.contentItemId = prop.Value;
17740
+ opv.contentItemId = textOf(prop.Value);
17422
17741
  break;
17423
17742
  case 'IS_NOT_RELEVANT':
17424
- opv.isNotRelevant = isPropertyOn(prop.Value);
17743
+ opv.isNotRelevant = prop.Value === true;
17425
17744
  break;
17426
17745
  case 'GROUP_CONTENT_ITEM':
17427
- opv.groupContentItemId = prop.Value;
17746
+ opv.groupContentItemId = textOf(prop.Value);
17428
17747
  break;
17429
17748
  case 'SET_BY_RULE':
17430
- opv.setByRule = prop.Value;
17749
+ opv.setByRule = textOf(prop.Value);
17431
17750
  break;
17432
17751
  case 'ADD_TO_MEASURE':
17433
- opv.addToMeasure = prop.Value.split(';').map(function (v) {
17434
- return {
17435
- op: v.split(':')[0],
17436
- value: Number(v.split(':')[1]),
17437
- opt: 'OPT' + v.split(':')[2]
17438
- };
17439
- });
17440
- break;
17752
+ {
17753
+ var measures = shapedJsonOf('ADD_TO_MEASURE', prop.Value);
17754
+ if (measures) opv.addToMeasure = measures.map(function (entry) {
17755
+ return {
17756
+ op: entry.op,
17757
+ value: entry.value,
17758
+ opt: 'OPT' + entry.option
17759
+ };
17760
+ });
17761
+ break;
17762
+ }
17441
17763
  case 'PIMFlatValues':
17442
- opv.isPIMFlatValue = prop.Value == '1';
17764
+ opv.isPIMFlatValue = prop.Value === true;
17443
17765
  break;
17444
17766
  case 'IsVariantAttribute':
17445
- opv.isVariantAttribute = prop.Value == '1';
17767
+ opv.isVariantAttribute = prop.Value === true;
17446
17768
  break;
17447
17769
  case 'OPTION_FREE_TEXT':
17448
- opv.optionFreeText = isPropertyOn(prop.Value);
17770
+ opv.optionFreeText = prop.Value === true;
17449
17771
  break;
17450
17772
  case 'MEASURE_UNIT':
17451
- opv.measureUnit = prop.Value;
17773
+ opv.measureUnit = textOf(prop.Value);
17452
17774
  break;
17453
17775
  case 'MEASURE_MINIMUM':
17454
- opv.measureMinimum = prop.Value;
17776
+ opv.measureMinimum = textOf(prop.Value);
17455
17777
  break;
17456
17778
  case 'MEASURE_MAXIMUM':
17457
- opv.measureMaximum = prop.Value;
17779
+ opv.measureMaximum = textOf(prop.Value);
17458
17780
  break;
17459
17781
  case 'MEASURE_STEP':
17460
- opv.measureStep = prop.Value;
17782
+ opv.measureStep = textOf(prop.Value);
17461
17783
  break;
17462
17784
  case 'PRICE_UNIT':
17463
- opv.priceUnit = prop.Value;
17785
+ opv.priceUnit = textOf(prop.Value);
17464
17786
  break;
17465
17787
  case 'ION_COMMENT_TEXT':
17466
17788
  case 'EshopCategoryMapping':
@@ -17469,7 +17791,7 @@ var setOptionValueProperties = function setOptionValueProperties(catalogData, op
17469
17791
  case 'IsArtName':
17470
17792
  break;
17471
17793
  case 'IDM3D_VALUE':
17472
- // read raw by the IDM3D translation (logic/Planner/IDM3D/idm3dTranslation.ts)
17794
+ // read by the IDM3D translation (logic/Planner/IDM3D/idm3dTranslation.ts)
17473
17795
  break;
17474
17796
  default:
17475
17797
  if (key.includes('__')) break;
@@ -17490,7 +17812,7 @@ var setOptionValueProperties = function setOptionValueProperties(catalogData, op
17490
17812
  metaDatas.push({
17491
17813
  codex: prop.Codex,
17492
17814
  name: prop.Name,
17493
- values: prop.Value.split(';'),
17815
+ values: propertyTexts(prop.Value),
17494
17816
  values_locales: values_locales
17495
17817
  });
17496
17818
  break;
@@ -17506,7 +17828,8 @@ function _arrayLikeToArray$p(r, a) { (null == a || a > r.length) && (a = r.lengt
17506
17828
  //kaufmännischer Artikel
17507
17829
  var CatalogArticleData = /*#__PURE__*/function () {
17508
17830
  function CatalogArticleData(catalogArticle, catalogData) {
17509
- var _this = this;
17831
+ var _this = this,
17832
+ _textOf;
17510
17833
  _classCallCheck(this, CatalogArticleData);
17511
17834
  _defineProperty(this, "_catalogArticle", void 0);
17512
17835
  _defineProperty(this, "useShortNameAsName", void 0);
@@ -17528,13 +17851,13 @@ var CatalogArticleData = /*#__PURE__*/function () {
17528
17851
  if (_key.startsWith(this.catalogCodex + '__')) _key = _key.replace(this.catalogCodex + '__', '');
17529
17852
  switch (_key) {
17530
17853
  case 'BUNDLE_RULES':
17531
- this._catalogArticle.bundleRules = JSON.parse(prop.Value);
17854
+ this._catalogArticle.bundleRules = jsonOf(prop.Value);
17532
17855
  break;
17533
17856
  case 'ACCESSOIRE_POS_PRIO':
17534
17857
  this._catalogArticle.accPosPrio = Number(prop.Value);
17535
17858
  break;
17536
17859
  case 'ADD_AS_ZKAT':
17537
- this._catalogArticle.addAsZKAT = prop.Value === 'true' || prop.Value === '1';
17860
+ this._catalogArticle.addAsZKAT = prop.Value === true;
17538
17861
  break;
17539
17862
  case 'HEIGHTGRIDUSED':
17540
17863
  this._catalogArticle.heightGridUsed = Number(prop.Value);
@@ -17546,83 +17869,83 @@ var CatalogArticleData = /*#__PURE__*/function () {
17546
17869
  this._catalogArticle.heightGridAbove = Number(prop.Value);
17547
17870
  break;
17548
17871
  case 'OVERWRITE_PARENT_WIDTH':
17549
- this._catalogArticle.overwriteParentWidth = isPropertyOn(prop.Value);
17872
+ this._catalogArticle.overwriteParentWidth = prop.Value === true;
17550
17873
  break;
17551
17874
  case 'OVERWRITE_PARENT_HEIGHT':
17552
- this._catalogArticle.overwriteParentHeight = isPropertyOn(prop.Value);
17875
+ this._catalogArticle.overwriteParentHeight = prop.Value === true;
17553
17876
  break;
17554
17877
  case 'OVERWRITE_PARENT_DEPTH':
17555
- this._catalogArticle.overwriteParentDepth = isPropertyOn(prop.Value);
17878
+ this._catalogArticle.overwriteParentDepth = prop.Value === true;
17556
17879
  break;
17557
17880
  case 'DO_NOT_DEL_ACC_IF_NOT_DOCKED':
17558
- this._catalogArticle.doNotDelAccIfNotDocked = isPropertyOn(prop.Value);
17881
+ this._catalogArticle.doNotDelAccIfNotDocked = prop.Value === true;
17559
17882
  break;
17560
17883
  case 'HEIGHT_HAS_PRICE':
17561
- this._catalogArticle.heightHasPrice = isPropertyOn(prop.Value);
17884
+ this._catalogArticle.heightHasPrice = prop.Value === true;
17562
17885
  break;
17563
17886
  case 'DEPTH_HAS_PRICE':
17564
- this._catalogArticle.depthHasPrice = isPropertyOn(prop.Value);
17887
+ this._catalogArticle.depthHasPrice = prop.Value === true;
17565
17888
  break;
17566
17889
  case 'WIDTH_HAS_PRICE':
17567
- this._catalogArticle.widthHasPrice = isPropertyOn(prop.Value);
17890
+ this._catalogArticle.widthHasPrice = prop.Value === true;
17568
17891
  break;
17569
17892
  case 'TYPE_NO':
17570
- if (!this._catalogArticle.typeNr && catalogData.isIDMFormat) this._catalogArticle.typeNr = prop.Value;
17893
+ if (!this._catalogArticle.typeNr && catalogData.isIDMFormat) this._catalogArticle.typeNr = (_textOf = textOf(prop.Value)) !== null && _textOf !== void 0 ? _textOf : '';
17571
17894
  break;
17572
17895
  case 'BASIC_UNIT_PRICE':
17573
17896
  this._catalogArticle.basicUnitPrice = Number(prop.Value);
17574
17897
  break;
17575
17898
  case 'INVALID_ACCESSORIES':
17576
- this._catalogArticle.invalidAccessoires = prop.Value.split(',');
17899
+ this._catalogArticle.invalidAccessoires = listOf(prop.Value);
17577
17900
  break;
17578
17901
  case 'ON_CONFIG_OPTION':
17579
- this._catalogArticle.onConfigOption = prop.Value;
17902
+ this._catalogArticle.onConfigOption = textOf(prop.Value);
17580
17903
  break;
17581
17904
  case 'ON_SET_CONFIG_OPTION':
17582
- this._catalogArticle.onSetConfigOtpion = prop.Value;
17905
+ this._catalogArticle.onSetConfigOtpion = textOf(prop.Value);
17583
17906
  break;
17584
17907
  case '3DMODELNAME':
17585
- this._catalogArticle.modelName3D = prop.Value;
17908
+ this._catalogArticle.modelName3D = textOf(prop.Value);
17586
17909
  break;
17587
17910
  case 'ZUBEHOER_FAMILIE':
17588
- this._catalogArticle.accessoireFamily = prop.Value;
17911
+ this._catalogArticle.accessoireFamily = textOf(prop.Value);
17589
17912
  break;
17590
17913
  case 'ORDER_POSNR':
17591
- this._catalogArticle.orderPosNr = prop.Value;
17914
+ this._catalogArticle.orderPosNr = textOf(prop.Value);
17592
17915
  break;
17593
17916
  case 'HIDE_IN_PLANNERSTEP':
17594
- this._catalogArticle.hideInPlannerStep = isPropertyOn(prop.Value);
17917
+ this._catalogArticle.hideInPlannerStep = prop.Value === true;
17595
17918
  break;
17596
17919
  case 'MAX_PLANNING_COUNT':
17597
17920
  this._catalogArticle.maxPlanningCount = Number(prop.Value);
17598
17921
  break;
17599
17922
  case 'CONTENT_ITEM':
17600
- this._catalogArticle.contentItemId = prop.Value;
17923
+ this._catalogArticle.contentItemId = textOf(prop.Value);
17601
17924
  break;
17602
17925
  case 'GROUP_CONTENT_ITEM':
17603
- this._catalogArticle.groupContentItemId = prop.Value;
17926
+ this._catalogArticle.groupContentItemId = textOf(prop.Value);
17604
17927
  break;
17605
17928
  case 'IDM3D_SKIP':
17606
- this._catalogArticle.idm3DSkip = isPropertyOn(prop.Value);
17929
+ this._catalogArticle.idm3DSkip = prop.Value === true;
17607
17930
  break;
17608
17931
  case 'HAS3D':
17609
- this._catalogArticle.isVisualized = isPropertyOn(prop.Value);
17932
+ this._catalogArticle.isVisualized = prop.Value === true;
17610
17933
  break;
17611
17934
  case 'RETAIL_PREFIX':
17612
17935
  this._catalogArticle.retailPrefix = prop.Value;
17613
17936
  break;
17614
17937
  case 'OPTIONS_FOR_PRINT':
17615
- this.catalogArticle.optionsForPrint = prop.Value.split(';');
17938
+ this.catalogArticle.optionsForPrint = listOf(prop.Value);
17616
17939
  break;
17617
17940
  case 'TABGROUP':
17618
- if (!this._catalogArticle.tabGroup) this._catalogArticle.tabGroup = prop.Value;
17941
+ if (!this._catalogArticle.tabGroup) this._catalogArticle.tabGroup = textOf(prop.Value);
17619
17942
  break;
17620
17943
  case 'TABGROUP_OPTIONS':
17621
- if (!this._catalogArticle.tabGroupOption) this._catalogArticle.tabGroupOption = prop.Value;
17944
+ if (!this._catalogArticle.tabGroupOption) this._catalogArticle.tabGroupOption = textOf(prop.Value);
17622
17945
  break;
17623
17946
  default:
17624
17947
  if (_key.includes('__')) break;
17625
- var values = prop.Value.split(';');
17948
+ var values = propertyTexts(prop.Value);
17626
17949
  var values_locales = [];
17627
17950
  if (prop.Value_locales) {
17628
17951
  var _prop$Value_locales;
@@ -18365,6 +18688,8 @@ var CatalogArticleData = /*#__PURE__*/function () {
18365
18688
  }]);
18366
18689
  }();
18367
18690
 
18691
+ function ownKeys$r(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
18692
+ function _objectSpread$r(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$r(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$r(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
18368
18693
  var LOG$o = DivaUtils.initLog('Planner', 'WEB-PLANNER-LOGIC');
18369
18694
  function initDivaCatalogData(json, orderSet, api) {
18370
18695
  var _json$MainCategory;
@@ -18463,13 +18788,13 @@ function setCatalogPlannsCompletely(catalogData) {
18463
18788
  }
18464
18789
  }
18465
18790
  function getCatalogArticle$1(jsonArticle, catalogData) {
18466
- var _catalogData$catalogM, _catalogData$catalogM2, _catalogData$catalogM3, _articleMask$name$cat, _articleMask$name, _articleMask$shortNam, _articleMask$shortNam2, _jsonArticle$Metadata, _articleMask$groupnam, _articleMask$groupnam2, _articleMask$hidden;
18791
+ var _catalogData$catalogM, _catalogData$catalogM2, _catalogData$catalogM3, _articleMask$name$cat, _articleMask$name, _articleMask$shortNam, _articleMask$shortNam2, _articleMask$groupnam, _articleMask$groupnam2, _articleMask$hidden;
18467
18792
  var articleMask = (_catalogData$catalogM = catalogData.catalogMask) === null || _catalogData$catalogM === void 0 || (_catalogData$catalogM = _catalogData$catalogM.articles) === null || _catalogData$catalogM === void 0 ? void 0 : _catalogData$catalogM[jsonArticle.Codex];
18468
18793
  var maskProperties = getPropertiesForItemNo((_catalogData$catalogM2 = (_catalogData$catalogM3 = catalogData.catalogMask) === null || _catalogData$catalogM3 === void 0 ? void 0 : _catalogData$catalogM3.properties) !== null && _catalogData$catalogM2 !== void 0 ? _catalogData$catalogM2 : [], jsonArticle.Codex, catalogData.api.getLanguage());
18469
18794
  //parse den Json Article und erstelle CatalogArticle
18470
18795
  var name = (_articleMask$name$cat = articleMask === null || articleMask === void 0 || (_articleMask$name = articleMask.name) === null || _articleMask$name === void 0 ? void 0 : _articleMask$name[catalogData.api.getLanguage()]) !== null && _articleMask$name$cat !== void 0 ? _articleMask$name$cat : jsonArticle.Name;
18471
18796
  var shortName = (_articleMask$shortNam = articleMask === null || articleMask === void 0 || (_articleMask$shortNam2 = articleMask.shortName) === null || _articleMask$shortNam2 === void 0 ? void 0 : _articleMask$shortNam2[catalogData.api.getLanguage()]) !== null && _articleMask$shortNam !== void 0 ? _articleMask$shortNam : jsonArticle.ShortName;
18472
- var properties = [].concat(_toConsumableArray((_jsonArticle$Metadata = jsonArticle.Metadatas) !== null && _jsonArticle$Metadata !== void 0 ? _jsonArticle$Metadata : []), _toConsumableArray(maskProperties !== null && maskProperties !== void 0 ? maskProperties : []));
18797
+ var properties = [].concat(_toConsumableArray(readProperties('article', jsonArticle.Metadatas, catalogData.api.getLanguage())), _toConsumableArray(maskProperties !== null && maskProperties !== void 0 ? maskProperties : []));
18473
18798
  return {
18474
18799
  articleCodex: jsonArticle.Codex,
18475
18800
  catalogName: jsonArticle.CatalogName,
@@ -18575,10 +18900,10 @@ function initCatalogOptions(catalogData, jsonOptions) {
18575
18900
  return options;
18576
18901
  }
18577
18902
  function getCatalogOptionDataType(codex, jsonOPT, catalogData) {
18578
- var _catalogData$catalogM4, _catalogData$catalogM5, _catalogData$catalogM6, _catalogData$catalogM7, _catalogData$catalogM8, _jsonOPT$Properties, _optionMask$name$cata, _optionMask$name, _optionMask$name2, _optionMask$tabGroup, _ref, _optionMask$layout, _properties$find, _jsonOPT$showOPVAsArt, _properties$find2, _properties$find3;
18903
+ var _catalogData$catalogM4, _catalogData$catalogM5, _catalogData$catalogM6, _catalogData$catalogM7, _catalogData$catalogM8, _optionMask$name$cata, _optionMask$name, _optionMask$name2, _optionMask$tabGroup, _ref, _optionMask$layout, _properties$find, _jsonOPT$showOPVAsArt, _properties$find2, _properties$find3;
18579
18904
  var maskProperties = getPropertiesForFeatureNo((_catalogData$catalogM4 = (_catalogData$catalogM5 = catalogData.catalogMask) === null || _catalogData$catalogM5 === void 0 ? void 0 : _catalogData$catalogM5.properties) !== null && _catalogData$catalogM4 !== void 0 ? _catalogData$catalogM4 : [], undefined, codex, catalogData.api.getLanguage());
18580
18905
  var optionMask = (_catalogData$catalogM6 = (_catalogData$catalogM7 = catalogData.catalogMask) === null || _catalogData$catalogM7 === void 0 || (_catalogData$catalogM7 = _catalogData$catalogM7.options) === null || _catalogData$catalogM7 === void 0 ? void 0 : _catalogData$catalogM7[codex]) !== null && _catalogData$catalogM6 !== void 0 ? _catalogData$catalogM6 : codex.startsWith('OPT') ? (_catalogData$catalogM8 = catalogData.catalogMask) === null || _catalogData$catalogM8 === void 0 || (_catalogData$catalogM8 = _catalogData$catalogM8.options) === null || _catalogData$catalogM8 === void 0 ? void 0 : _catalogData$catalogM8[codex.substring(3)] : undefined;
18581
- var properties = [].concat(_toConsumableArray((_jsonOPT$Properties = jsonOPT.Properties) !== null && _jsonOPT$Properties !== void 0 ? _jsonOPT$Properties : []), _toConsumableArray(maskProperties !== null && maskProperties !== void 0 ? maskProperties : []));
18906
+ var properties = [].concat(_toConsumableArray(readProperties('option', jsonOPT.Properties, catalogData.api.getLanguage())), _toConsumableArray(maskProperties !== null && maskProperties !== void 0 ? maskProperties : []));
18582
18907
  var opt = {
18583
18908
  codex: codex,
18584
18909
  name: (_optionMask$name$cata = optionMask === null || optionMask === void 0 || (_optionMask$name = optionMask.name) === null || _optionMask$name === void 0 ? void 0 : _optionMask$name[catalogData.api.getLanguage()]) !== null && _optionMask$name$cata !== void 0 ? _optionMask$name$cata : jsonOPT.Name,
@@ -18590,9 +18915,9 @@ function getCatalogOptionDataType(codex, jsonOPT, catalogData) {
18590
18915
  invisible: jsonOPT.Invisible != undefined ? jsonOPT.Invisible : false,
18591
18916
  hiddenByMask: optionMask === null || optionMask === void 0 ? void 0 : optionMask.hidden,
18592
18917
  maskTabgroup: optionMask === null || optionMask === void 0 || (_optionMask$tabGroup = optionMask.tabGroup) === null || _optionMask$tabGroup === void 0 ? void 0 : _optionMask$tabGroup[catalogData.api.getLanguage()],
18593
- layout: (_ref = (_optionMask$layout = optionMask === null || optionMask === void 0 ? void 0 : optionMask.layout) !== null && _optionMask$layout !== void 0 ? _optionMask$layout : properties === null || properties === void 0 || (_properties$find = properties.find(function (p) {
18918
+ layout: (_ref = (_optionMask$layout = optionMask === null || optionMask === void 0 ? void 0 : optionMask.layout) !== null && _optionMask$layout !== void 0 ? _optionMask$layout : textOf(properties === null || properties === void 0 || (_properties$find = properties.find(function (p) {
18594
18919
  return p.Codex == 'LAYOUT';
18595
- })) === null || _properties$find === void 0 ? void 0 : _properties$find.Value) !== null && _ref !== void 0 ? _ref : jsonOPT.Layout != undefined ? jsonOPT.Layout : 'IMAGE',
18920
+ })) === null || _properties$find === void 0 ? void 0 : _properties$find.Value)) !== null && _ref !== void 0 ? _ref : jsonOPT.Layout != undefined ? jsonOPT.Layout : 'IMAGE',
18596
18921
  useMaxPriceOfGroup: jsonOPT.UseMaxPriceOfGroup != undefined ? Number(jsonOPT.UseMaxPriceOfGroup) : undefined,
18597
18922
  calcPercentOnOptions: jsonOPT.CalcPercentOnOptions,
18598
18923
  hideGroupNameInOrderText: jsonOPT.hideGroupNameInOrderText != undefined ? jsonOPT.hideGroupNameInOrderText == 'True' : false,
@@ -18623,11 +18948,11 @@ function initCatalogOptionValues(catalogData, jsonOptions) {
18623
18948
  return optionValues;
18624
18949
  }
18625
18950
  function getCatalogOptionValueDataType(codex, jsonOPV, catalogData) {
18626
- var _catalogData$catalogM9, _catalogData$catalogM10, _catalogData$catalogM11, _optionvalues$codex, _catalogData$catalogM12, _catalogData$catalogM13, _jsonOPV$Metadatas, _mask$name$catalogDat, _mask$name, _mask$name2, _mask$groupname$catal, _mask$groupname, _mask$groupname2, _mask$hiddenInFeature, _jsonOPV$MeasureStep, _jsonOPV$Value;
18951
+ var _catalogData$catalogM9, _catalogData$catalogM10, _catalogData$catalogM11, _optionvalues$codex, _catalogData$catalogM12, _catalogData$catalogM13, _mask$name$catalogDat, _mask$name, _mask$name2, _mask$groupname$catal, _mask$groupname, _mask$groupname2, _mask$hiddenInFeature, _jsonOPV$MeasureStep, _jsonOPV$Value;
18627
18952
  var optionvalues = (_catalogData$catalogM9 = (_catalogData$catalogM10 = catalogData.catalogMask) === null || _catalogData$catalogM10 === void 0 ? void 0 : _catalogData$catalogM10.optionvalues) !== null && _catalogData$catalogM9 !== void 0 ? _catalogData$catalogM9 : (_catalogData$catalogM11 = catalogData.catalogMask) === null || _catalogData$catalogM11 === void 0 ? void 0 : _catalogData$catalogM11.optionValues;
18628
18953
  var mask = (_optionvalues$codex = optionvalues === null || optionvalues === void 0 ? void 0 : optionvalues[codex]) !== null && _optionvalues$codex !== void 0 ? _optionvalues$codex : codex.startsWith('OPV') ? optionvalues === null || optionvalues === void 0 ? void 0 : optionvalues[codex.substring(3)] : undefined;
18629
18954
  var maskProperties = getPropertiesForOptionKey((_catalogData$catalogM12 = (_catalogData$catalogM13 = catalogData.catalogMask) === null || _catalogData$catalogM13 === void 0 ? void 0 : _catalogData$catalogM13.properties) !== null && _catalogData$catalogM12 !== void 0 ? _catalogData$catalogM12 : [], undefined, codex, catalogData.api.getLanguage());
18630
- var properties = [].concat(_toConsumableArray((_jsonOPV$Metadatas = jsonOPV.Metadatas) !== null && _jsonOPV$Metadatas !== void 0 ? _jsonOPV$Metadatas : []), _toConsumableArray(maskProperties !== null && maskProperties !== void 0 ? maskProperties : []));
18955
+ var properties = [].concat(_toConsumableArray(readProperties('optionValue', jsonOPV.Metadatas, catalogData.api.getLanguage())), _toConsumableArray(maskProperties !== null && maskProperties !== void 0 ? maskProperties : []));
18631
18956
  var opv = {
18632
18957
  codex: codex,
18633
18958
  vCodex: jsonOPV.VCodex,
@@ -18949,13 +19274,22 @@ function getImageURL(image, mediaUrl) {
18949
19274
  }
18950
19275
  return ret;
18951
19276
  }
19277
+
19278
+ /** Properties whose Value is a text (CE catalogs, the catalog mask) with their values read for the parser of `entity`. */
19279
+ function readProperties(entity, properties, lang) {
19280
+ return (properties !== null && properties !== void 0 ? properties : []).map(function (p) {
19281
+ return _objectSpread$r(_objectSpread$r({}, p), {}, {
19282
+ Value: readPropertyValue(entity, p.Codex, p.Value, lang)
19283
+ });
19284
+ });
19285
+ }
18952
19286
  function getPropertiesForFeatureNo(properties, typeNo, featureNo, lang) {
18953
19287
  return properties.filter(function (p) {
18954
19288
  var _p$featureNos, _p$optionKeys, _p$typeNos, _p$typeNos2;
18955
19289
  return ((_p$featureNos = p.featureNos) === null || _p$featureNos === void 0 ? void 0 : _p$featureNos.includes(featureNo)) && !((_p$optionKeys = p.optionKeys) !== null && _p$optionKeys !== void 0 && _p$optionKeys.length) && (!typeNo || !((_p$typeNos = p.typeNos) !== null && _p$typeNos !== void 0 && _p$typeNos.length) || ((_p$typeNos2 = p.typeNos) === null || _p$typeNos2 === void 0 ? void 0 : _p$typeNos2.includes(typeNo)));
18956
19290
  }).map(function (p) {
18957
19291
  return {
18958
- Value: DivaUtils.getLocals(p.value, lang),
19292
+ Value: readPropertyValue('option', p.key, p.value, lang),
18959
19293
  Codex: p.key,
18960
19294
  Name: DivaUtils.getLocals(p.name, lang),
18961
19295
  Value_locales: p.valueLocales
@@ -18970,7 +19304,7 @@ function getPropertiesForOptionKey(properties, featureNo, optionKey, lang) {
18970
19304
  })) === null || _p$optionKeys2 === void 0 ? void 0 : _p$optionKeys2.includes(optionKey));
18971
19305
  }).map(function (p) {
18972
19306
  return {
18973
- Value: DivaUtils.getLocals(p.value, lang),
19307
+ Value: readPropertyValue('optionValue', p.key, p.value, lang),
18974
19308
  Codex: p.key,
18975
19309
  Name: DivaUtils.getLocals(p.name, lang),
18976
19310
  Value_locales: p.valueLocales
@@ -18985,7 +19319,7 @@ function getPropertiesForSerieNo(properties, serieNo, lang) {
18985
19319
  .map(function (p) {
18986
19320
  return {
18987
19321
  Codex: p.key,
18988
- Value: DivaUtils.getLocals(p.value, lang),
19322
+ Value: readPropertyValue('catalog', p.key, p.value, lang),
18989
19323
  Name: DivaUtils.getLocals(p.name, lang),
18990
19324
  Value_locales: p.valueLocales
18991
19325
  };
@@ -18997,7 +19331,7 @@ function getPropertiesForItemNo(properties, itemNo, lang) {
18997
19331
  return (_p$typeNos3 = p.typeNos) === null || _p$typeNos3 === void 0 ? void 0 : _p$typeNos3.includes(itemNo);
18998
19332
  }).map(function (p) {
18999
19333
  return {
19000
- Value: DivaUtils.getLocals(p.value, lang),
19334
+ Value: readPropertyValue('article', p.key, p.value, lang),
19001
19335
  Codex: p.key,
19002
19336
  Name: DivaUtils.getLocals(p.name, lang),
19003
19337
  Value_locales: p.valueLocales
@@ -20340,14 +20674,14 @@ function getActionTargets(decisions, type) {
20340
20674
  return targets;
20341
20675
  }
20342
20676
  function getArticleOptionType(myOPT, set, articleCodex) {
20343
- var _set$CatalogData$cata, _set$CatalogData$cata2, _set$CatalogData$cata3, _set$CatalogData$cata4, _set$CatalogData$cata5, _myOPT$Properties;
20677
+ var _set$CatalogData$cata, _set$CatalogData$cata2, _set$CatalogData$cata3, _set$CatalogData$cata4, _set$CatalogData$cata5;
20344
20678
  var OP = myOPT.OCD ? myOPT.OCD : myOPT.Codex;
20345
20679
  var catOPT = set.CatalogData.getOption(OP);
20346
20680
  var optionMask = (_set$CatalogData$cata = (_set$CatalogData$cata2 = set.CatalogData.catalogMask) === null || _set$CatalogData$cata2 === void 0 || (_set$CatalogData$cata2 = _set$CatalogData$cata2.options) === null || _set$CatalogData$cata2 === void 0 ? void 0 : _set$CatalogData$cata2[OP]) !== null && _set$CatalogData$cata !== void 0 ? _set$CatalogData$cata : OP.startsWith('OPT') ? (_set$CatalogData$cata3 = set.CatalogData.catalogMask) === null || _set$CatalogData$cata3 === void 0 || (_set$CatalogData$cata3 = _set$CatalogData$cata3.options) === null || _set$CatalogData$cata3 === void 0 ? void 0 : _set$CatalogData$cata3[OP.substring(3)] : undefined;
20347
20681
  if (!catOPT) throw new Error('Option: ' + OP + ' not in CatalogData');
20348
20682
  var optHasOpg = myOPT.OPG && myOPT.OPG.length > 0;
20349
20683
  var maskProperties = getPropertiesForFeatureNo((_set$CatalogData$cata4 = (_set$CatalogData$cata5 = set.CatalogData.catalogMask) === null || _set$CatalogData$cata5 === void 0 ? void 0 : _set$CatalogData$cata5.properties) !== null && _set$CatalogData$cata4 !== void 0 ? _set$CatalogData$cata4 : [], articleCodex, OP, set.CatalogData.api.getLanguage());
20350
- var properties = [].concat(_toConsumableArray((_myOPT$Properties = myOPT.Properties) !== null && _myOPT$Properties !== void 0 ? _myOPT$Properties : []), _toConsumableArray(maskProperties !== null && maskProperties !== void 0 ? maskProperties : []));
20684
+ var properties = [].concat(_toConsumableArray(readProperties('option', myOPT.Properties, set.CatalogData.api.getLanguage())), _toConsumableArray(maskProperties !== null && maskProperties !== void 0 ? maskProperties : []));
20351
20685
  return {
20352
20686
  codex: myOPT.Codex,
20353
20687
  catalogOPT: catOPT,
@@ -21887,7 +22221,7 @@ function getCatalogFeatureType(feature, catalogArticleData, set, catalogData) {
21887
22221
  var featureClass = catalogData.getFeatureClass(catalogArticleData.featureClassRefNo);
21888
22222
  var optionMask = (_catalogData$catalogM = catalogData.catalogMask) === null || _catalogData$catalogM === void 0 || (_catalogData$catalogM = _catalogData$catalogM.options) === null || _catalogData$catalogM === void 0 ? void 0 : _catalogData$catalogM[feature.featureNo];
21889
22223
  var maskProperties = getPropertiesForFeatureNo((_catalogData$catalogM2 = (_catalogData$catalogM3 = catalogData.catalogMask) === null || _catalogData$catalogM3 === void 0 ? void 0 : _catalogData$catalogM3.properties) !== null && _catalogData$catalogM2 !== void 0 ? _catalogData$catalogM2 : [], undefined, feature.featureNo, catalogData.api.getLanguage());
21890
- var properties = [].concat(_toConsumableArray(convertProperties(feature.properties, set.api.getLanguageLowercase())), _toConsumableArray(maskProperties !== null && maskProperties !== void 0 ? maskProperties : []));
22224
+ var properties = [].concat(_toConsumableArray(convertProperties(feature.properties, set.api.getLanguageLowercase(), 'option')), _toConsumableArray(maskProperties !== null && maskProperties !== void 0 ? maskProperties : []));
21891
22225
  return {
21892
22226
  name: DivaUtils.getLocals(feature.featureText, set.api.getLanguageLowercase()),
21893
22227
  origName: DivaUtils.getLocals(feature.featureText, set.api.getLanguageLowercase()),
@@ -21960,7 +22294,7 @@ function getCatalogOptionType(option, set, catalogData) {
21960
22294
  var _catalogData$catalogM6, _catalogData$catalogM7, _option$detailInfos, _option$detailInfos2, _option$measureValue;
21961
22295
  var name = DivaUtils.getLocals(option.optionText, set.api.getLanguageLowercase());
21962
22296
  var maskProperties = getPropertiesForOptionKey((_catalogData$catalogM6 = (_catalogData$catalogM7 = catalogData.catalogMask) === null || _catalogData$catalogM7 === void 0 ? void 0 : _catalogData$catalogM7.properties) !== null && _catalogData$catalogM6 !== void 0 ? _catalogData$catalogM6 : [], undefined, option.optionKey, catalogData.api.getLanguage());
21963
- var properties = [].concat(_toConsumableArray(convertProperties(option.properties, catalogData.api.getLanguageLowercase())), _toConsumableArray(maskProperties !== null && maskProperties !== void 0 ? maskProperties : []));
22297
+ var properties = [].concat(_toConsumableArray(convertProperties(option.properties, catalogData.api.getLanguageLowercase(), 'optionValue')), _toConsumableArray(maskProperties !== null && maskProperties !== void 0 ? maskProperties : []));
21964
22298
  var opiton = {
21965
22299
  codex: option.optionKey,
21966
22300
  name: name,
@@ -22131,14 +22465,14 @@ function initIDMArticles(jsonItems, catalogData) {
22131
22465
  }
22132
22466
  }
22133
22467
  function getCatalogArticle(article, catalogData) {
22134
- var _catalogData$catalogM, _article$typeKey, _article$salesNumber, _articleMask$name, _articleMask$properti, _article$flatPrice, _article$depthBasicSh, _article$depthBasicSh2, _article$depthBasicSh3, _article$widthBasicSh, _article$widthBasicSh2, _article$widthBasicSh3, _article$heightBasicS, _article$heightBasicS2, _article$heightBasicS3, _article$weightNetto, _article$detailInfos, _article$detailInfos2, _article$detailInfos3, _ref, _ref2, _articleMask$groupnam;
22468
+ var _catalogData$catalogM, _article$typeKey, _article$salesNumber, _articleMask$name, _article$flatPrice, _article$depthBasicSh, _article$depthBasicSh2, _article$depthBasicSh3, _article$widthBasicSh, _article$widthBasicSh2, _article$widthBasicSh3, _article$heightBasicS, _article$heightBasicS2, _article$heightBasicS3, _article$weightNetto, _article$detailInfos, _article$detailInfos2, _article$detailInfos3, _ref, _ref2, _articleMask$groupnam;
22135
22469
  var articleMask = (_catalogData$catalogM = catalogData.catalogMask) === null || _catalogData$catalogM === void 0 || (_catalogData$catalogM = _catalogData$catalogM.articles) === null || _catalogData$catalogM === void 0 ? void 0 : _catalogData$catalogM[article.typeNo];
22136
22470
  var lang = catalogData.api.getLanguageLowercase();
22137
22471
  // empty locale objects ({} or only empty strings) are truthy, so ?? alone doesn't fall back
22138
22472
  var fullText = hasLocaleText(article.fullText) ? article.fullText : article.shortText;
22139
22473
  var shortText = hasLocaleText(article.shortText) ? article.shortText : article.fullText;
22140
- var featureProperties = convertProperties(article.properties, lang, 'featureNos');
22141
- var optionProperties = convertProperties(article.properties, lang, 'optionKeys');
22474
+ var featureProperties = convertProperties(article.properties, lang, 'option', 'featureNos');
22475
+ var optionProperties = convertProperties(article.properties, lang, 'optionValue', 'optionKeys');
22142
22476
  return {
22143
22477
  areOptionsLoaded: false,
22144
22478
  arePricesLoaded: false,
@@ -22168,7 +22502,7 @@ function getCatalogArticle(article, catalogData) {
22168
22502
  shortName: DivaUtils.getLocals(shortText, lang),
22169
22503
  origShortName: DivaUtils.getLocals(shortText, lang),
22170
22504
  shortName_locales: shortText,
22171
- properties: [].concat(_toConsumableArray(convertProperties(article.properties, lang)), _toConsumableArray((_articleMask$properti = articleMask === null || articleMask === void 0 ? void 0 : articleMask.properties) !== null && _articleMask$properti !== void 0 ? _articleMask$properti : [])),
22505
+ properties: [].concat(_toConsumableArray(convertProperties(article.properties, lang, 'article')), _toConsumableArray(readProperties('article', articleMask === null || articleMask === void 0 ? void 0 : articleMask.properties, lang))),
22172
22506
  optionProperties: optionProperties,
22173
22507
  featureProperties: featureProperties,
22174
22508
  // the service decides what is complete from the list - a missing feature class alone still leaves prices to load
@@ -22239,31 +22573,35 @@ function hasLocaleText(locales) {
22239
22573
  function getLowResUrl(url) {
22240
22574
  return url === null || url === void 0 ? void 0 : url.replace('.jpg', '_low.jpg').replace('.jpeg', '_low.jpeg').replace('.png', '_low.png');
22241
22575
  }
22576
+
22577
+ /** The properties for the parser of `entity`, their values read as it reads them (readPropertyValue). */
22242
22578
  function convertProperties() {
22243
22579
  var properties = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
22244
22580
  var lang = arguments.length > 1 ? arguments[1] : undefined;
22245
- var forCase = arguments.length > 2 ? arguments[2] : undefined;
22581
+ var entity = arguments.length > 2 ? arguments[2] : undefined;
22582
+ var forCase = arguments.length > 3 ? arguments[3] : undefined;
22246
22583
  switch (forCase) {
22247
22584
  case 'featureNos':
22248
22585
  return mapProp(properties.filter(function (p) {
22249
22586
  var _p$featureNos;
22250
22587
  return (_p$featureNos = p.featureNos) === null || _p$featureNos === void 0 ? void 0 : _p$featureNos.length;
22251
- }), lang);
22588
+ }), lang, entity);
22252
22589
  case 'optionKeys':
22253
22590
  return mapProp(properties.filter(function (p) {
22254
22591
  var _p$optionKeys;
22255
22592
  return (_p$optionKeys = p.optionKeys) === null || _p$optionKeys === void 0 ? void 0 : _p$optionKeys.length;
22256
- }), lang);
22593
+ }), lang, entity);
22257
22594
  default:
22258
- return mapProp(properties, lang);
22595
+ return mapProp(properties, lang, entity);
22259
22596
  }
22260
22597
  }
22261
22598
  function mapProp() {
22262
22599
  var properties = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
22263
22600
  var lang = arguments.length > 1 ? arguments[1] : undefined;
22601
+ var entity = arguments.length > 2 ? arguments[2] : undefined;
22264
22602
  return properties.map(function (p) {
22265
22603
  return {
22266
- Value: DivaUtils.getLocals(p.value, lang),
22604
+ Value: readPropertyValue(entity, p.key, p.value, lang),
22267
22605
  Codex: p.key,
22268
22606
  Name: DivaUtils.getLocals(p.name, lang),
22269
22607
  FeatureNos: p.featureNos,
@@ -22407,7 +22745,7 @@ Diese KLasse enthält Inforamtion zu einem Catalog (C)
22407
22745
  var LOG$j = DivaUtils.initLog('Planner', 'WEB-PLANNER-LOGIC');
22408
22746
  var DivaCatalogData = /*#__PURE__*/function () {
22409
22747
  function DivaCatalogData(json, catalogCodex, orderSet, api, articleJson, plannerElementsJson, isIDMFormat, additionalModelInfos) {
22410
- var _json$Properties, _ref, _json$properties, _this$catalogMask;
22748
+ var _ref, _json$properties, _this$catalogMask;
22411
22749
  _classCallCheck(this, DivaCatalogData);
22412
22750
  _defineProperty(this, "options", {});
22413
22751
  _defineProperty(this, "optionValues", void 0);
@@ -22589,7 +22927,7 @@ var DivaCatalogData = /*#__PURE__*/function () {
22589
22927
  };
22590
22928
  this._api = api;
22591
22929
  this.additionalModelInfos = additionalModelInfos;
22592
- var properties = [].concat(_toConsumableArray((_json$Properties = json.Properties) !== null && _json$Properties !== void 0 ? _json$Properties : []), _toConsumableArray(getPropertiesForSerieNo((_ref = (_json$properties = json.properties) !== null && _json$properties !== void 0 ? _json$properties : (_this$catalogMask = this.catalogMask) === null || _this$catalogMask === void 0 ? void 0 : _this$catalogMask.properties) !== null && _ref !== void 0 ? _ref : [], undefined, this.api.getLanguage())));
22930
+ var properties = [].concat(_toConsumableArray(readProperties('catalog', json.Properties, this.api.getLanguage())), _toConsumableArray(getPropertiesForSerieNo((_ref = (_json$properties = json.properties) !== null && _json$properties !== void 0 ? _json$properties : (_this$catalogMask = this.catalogMask) === null || _this$catalogMask === void 0 ? void 0 : _this$catalogMask.properties) !== null && _ref !== void 0 ? _ref : [], undefined, this.api.getLanguage())));
22593
22931
  if (properties.length) {
22594
22932
  var _json$properties2;
22595
22933
  this.origProperties = json.Properties || json.properties ? getPropertiesForSerieNo((_json$properties2 = json.properties) !== null && _json$properties2 !== void 0 ? _json$properties2 : [], undefined, this.api.getLanguage()) : [];
@@ -22625,9 +22963,9 @@ var DivaCatalogData = /*#__PURE__*/function () {
22625
22963
  initIDMArticles(articleJson, this);
22626
22964
  }
22627
22965
  if (this.origProperties) {
22628
- var _this$catalogMask$pro, _this$catalogMask2, _json$Properties2;
22966
+ var _this$catalogMask$pro, _this$catalogMask2;
22629
22967
  var maskProperties = getPropertiesForSerieNo((_this$catalogMask$pro = (_this$catalogMask2 = this.catalogMask) === null || _this$catalogMask2 === void 0 ? void 0 : _this$catalogMask2.properties) !== null && _this$catalogMask$pro !== void 0 ? _this$catalogMask$pro : [], 1, this.api.getLanguage());
22630
- this.initPropertiesAfterOptionsInit(catalogCodex, [].concat(_toConsumableArray((_json$Properties2 = json.Properties) !== null && _json$Properties2 !== void 0 ? _json$Properties2 : []), _toConsumableArray(maskProperties !== null && maskProperties !== void 0 ? maskProperties : [])));
22968
+ this.initPropertiesAfterOptionsInit(catalogCodex, [].concat(_toConsumableArray(readProperties('catalog', json.Properties, this.api.getLanguage())), _toConsumableArray(maskProperties !== null && maskProperties !== void 0 ? maskProperties : [])));
22631
22969
  }
22632
22970
  }
22633
22971
  return _createClass(DivaCatalogData, [{
@@ -23721,18 +24059,18 @@ var DivaCatalogData = /*#__PURE__*/function () {
23721
24059
  var _this2 = this;
23722
24060
  var diva3DRenderingIsSet = false;
23723
24061
  properties.forEach(function (item, index) {
23724
- var _item$Value;
24062
+ var _textOf, _textOf2, _textOf3, _jsonOf, _jsonOf2, _jsonOf3, _jsonOf4;
23725
24063
  //3D Allgemein
23726
24064
 
23727
24065
  var key = item.Codex;
23728
24066
  if (key.startsWith(catalogCodex + '__')) key = key.replace(catalogCodex + '__', '');
23729
24067
  switch (key) {
23730
24068
  case 'DIVA3D_ROOM':
23731
- _this2.catalogProps.diva3dRoom = item.Value;
24069
+ _this2.catalogProps.diva3dRoom = (_textOf = textOf(item.Value)) !== null && _textOf !== void 0 ? _textOf : '';
23732
24070
  if (_this2.catalogProps.diva3dRoom == 'raumatlantis') _this2.catalogProps.diva3dRoom = 'weissraumatlantis';
23733
24071
  break;
23734
24072
  case 'DIVA3D_RENDERING':
23735
- diva3DRenderingIsSet = item.Value == '1' || item.Value.toLowerCase() == 'true';
24073
+ diva3DRenderingIsSet = item.Value === true;
23736
24074
  if (_this2.isIDMFormat) {
23737
24075
  _this2.catalogProps.has3dModels = diva3DRenderingIsSet;
23738
24076
  }
@@ -23741,333 +24079,336 @@ var DivaCatalogData = /*#__PURE__*/function () {
23741
24079
  }
23742
24080
  break;
23743
24081
  case 'DIVA3D_AR_READY':
23744
- _this2.catalogProps.divaArReady = item.Value == '1';
24082
+ _this2.catalogProps.divaArReady = item.Value === true;
23745
24083
  break;
23746
24084
  case 'DIVA3D_AR_FORCERTV':
23747
- _this2.catalogProps.divaForceRTV = item.Value == '1';
24085
+ _this2.catalogProps.divaForceRTV = item.Value === true;
23748
24086
  break;
23749
24087
  case 'DIVA3D_USE_RTV_NEXT':
23750
- _this2.catalogProps.divaUseRtvNext = item.Value == '1';
24088
+ _this2.catalogProps.divaUseRtvNext = item.Value === true;
23751
24089
  break;
23752
24090
  case 'HEADER_DIMENSION_IDS':
23753
- _this2.catalogProps.headerDimensionIds = item.Value.split(';');
24091
+ _this2.catalogProps.headerDimensionIds = listOf(item.Value);
23754
24092
  break;
23755
24093
  case 'DONTCALCBASEPRICE':
23756
- _this2.catalogProps.dontShowBasePrice = item.Value == '1';
24094
+ _this2.catalogProps.dontShowBasePrice = item.Value === true;
23757
24095
  break;
23758
24096
  case 'DIVA3D_STATIC_BG_IMAGE_ROOMLIST':
23759
- _this2.catalogProps.roomList3DStaticBGImage.set('3D_STATBG_ROOMLIST', item.Value.split(';'));
24097
+ _this2.catalogProps.roomList3DStaticBGImage.set('3D_STATBG_ROOMLIST', listOf(item.Value));
23760
24098
  break;
23761
24099
  case 'DIVA3D_DISABLE_3DEXPORT':
23762
- _this2.catalogProps.disable3DExport = item.Value == '1';
24100
+ _this2.catalogProps.disable3DExport = item.Value === true;
23763
24101
  break;
23764
24102
  case '3D_COMPATIBLE_WITH_IMAGE_CACHE':
23765
- _this2.catalogProps.diva3dCompatibleWithImageCache = item.Value == '1';
24103
+ _this2.catalogProps.diva3dCompatibleWithImageCache = item.Value === true;
23766
24104
  break;
23767
24105
  case 'ENABLE_DO_SHOW_3DDIMENSIONS':
23768
- _this2.catalogProps.doShow3DDimensionLines = item.Value == '1' || item.Value.toLowerCase() == 'true';
24106
+ _this2.catalogProps.doShow3DDimensionLines = item.Value === true;
23769
24107
  break;
23770
24108
  case 'DO_SHOW_MAIN_DIMENSIONS':
23771
- _this2.catalogProps.doShowMainDimensions = item.Value == '1' || item.Value.toLowerCase() == 'true';
24109
+ _this2.catalogProps.doShowMainDimensions = item.Value === true;
23772
24110
  break;
23773
24111
  case 'DEFAULT_DO_SHOW_3DDIMENSIONS':
23774
- _this2.catalogProps.defaultDimensionsActive = '1' == item.Value || 'true' == item.Value.toLowerCase();
24112
+ _this2.catalogProps.defaultDimensionsActive = item.Value === true;
23775
24113
  break;
23776
24114
  case 'DIVA_KI_READY':
23777
- _this2.catalogProps.divaKiReady = item.Value == '1' || item.Value.toLowerCase() == 'true';
24115
+ _this2.catalogProps.divaKiReady = item.Value === true;
23778
24116
  break;
23779
24117
  // Planner Topics
23780
24118
  case 'IS_IDM3D_CAT':
23781
- _this2.catalogProps.isIDM3DCat = item.Value == '1' || item.Value.toLowerCase() == 'true';
24119
+ _this2.catalogProps.isIDM3DCat = item.Value === true;
23782
24120
  break;
23783
24121
  case 'IDM3D_ENVIRONMENT':
23784
- _this2.catalogProps.IDM3DEnvironment = (_item$Value = item.Value) !== null && _item$Value !== void 0 ? _item$Value : 'diva.ro';
24122
+ _this2.catalogProps.IDM3DEnvironment = (_textOf2 = textOf(item.Value)) !== null && _textOf2 !== void 0 ? _textOf2 : 'diva.ro';
23785
24123
  break;
23786
24124
  case 'IDM3D_CAT_CODEX':
23787
- _this2.catalogProps.IDM3DCatCodex = item.Value;
24125
+ _this2.catalogProps.IDM3DCatCodex = (_textOf3 = textOf(item.Value)) !== null && _textOf3 !== void 0 ? _textOf3 : '';
23788
24126
  break;
23789
24127
  case 'IDM3D_TRANSLATION':
23790
- try {
23791
- var translation = JSON.parse(item.Value);
24128
+ {
24129
+ var translation = jsonOf(item.Value);
23792
24130
  if (translation !== null && translation !== void 0 && translation.features && _typeof(translation.features) === 'object') _this2.catalogProps.IDM3DTranslation = translation;else LOG$j.warn('Invalid IDM3D_TRANSLATION meta tag - expected a JSON object with a features map');
23793
- } catch (e) {
23794
- LOG$j.warn('Invalid IDM3D_TRANSLATION meta tag - expected a JSON object with a features map', e);
24131
+ break;
23795
24132
  }
23796
- break;
23797
24133
  case 'DIVA3D_PLANER_DIGITS':
23798
24134
  _this2.catalogProps.divaPlanerDigits = Number(item.Value);
23799
24135
  break;
23800
24136
  case 'DIVA3D_PLANER_SHOW_ARTICLE_SVG':
23801
- _this2.catalogProps.diva3dPlanerShowArticleAsSvg = item.Value == '1';
24137
+ _this2.catalogProps.diva3dPlanerShowArticleAsSvg = item.Value === true;
23802
24138
  break;
23803
24139
  case 'SHOWTYPENRINPLANNER':
23804
- _this2.catalogProps.showTypeNrInPlanner = item.Value == '1';
24140
+ _this2.catalogProps.showTypeNrInPlanner = item.Value === true;
23805
24141
  break;
23806
24142
  case 'STARTFILTERPARAMS':
23807
- _this2.catalogProps.startFilterParams = String(item.Value);
24143
+ _this2.catalogProps.startFilterParams = listOf(item.Value).join(',');
23808
24144
  break;
23809
24145
  case 'STARTHIDEARTICLES':
23810
- _this2.catalogProps.startHideArticles = item.Value.split(';');
24146
+ _this2.catalogProps.startHideArticles = listOf(item.Value);
23811
24147
  break;
23812
24148
  case 'USEGLOBALSVGSCALE':
23813
- _this2.catalogProps.useGlobalSVGScale = item.Value == '1';
24149
+ _this2.catalogProps.useGlobalSVGScale = item.Value === true;
23814
24150
  break;
23815
24151
  case 'USEBOXPLANNER':
23816
- _this2.catalogProps.useBoxPlanner = item.Value == '1' ? true : item.Value.split(';');
23817
- break;
24152
+ {
24153
+ var boxPlanner = shapedJsonOf('USEBOXPLANNER', item.Value);
24154
+ if (boxPlanner) _this2.catalogProps.useBoxPlanner = boxPlanner.all === true || boxPlanner.only;
24155
+ break;
24156
+ }
23818
24157
  case 'ELEMENT_COPY_AVLR':
23819
- _this2.catalogProps.elementCopyAVLR = item.Value == '1' ? true : item.Value.split(';').map(function (o) {
23820
- return (!_this2.isIDMFormat ? 'OPT' : '') + o;
23821
- });
23822
- break;
24158
+ {
24159
+ var copyAVLR = shapedJsonOf('ELEMENT_COPY_AVLR', item.Value);
24160
+ if (copyAVLR) _this2.catalogProps.elementCopyAVLR = copyAVLR.all === true || copyAVLR.only.map(function (o) {
24161
+ return (!_this2.isIDMFormat ? 'OPT' : '') + o;
24162
+ });
24163
+ break;
24164
+ }
23823
24165
  case 'PLAN_2D_FONT_URL':
23824
- _this2.catalogProps.plan2DFontUrl = item.Value || undefined;
24166
+ _this2.catalogProps.plan2DFontUrl = textOf(item.Value) || undefined;
23825
24167
  break;
23826
24168
  case 'DIMENSION_CONFIG':
23827
24169
  // One catalog-level dictionary keyed by articleCodex; entries carry the 2D planner
23828
24170
  // dimension/annotation config (consumed structurally by the RTV-next bridge).
23829
- try {
23830
- _this2.catalogProps.dimensionConfig2D = JSON.parse(item.Value);
23831
- } catch (e) {
23832
- LOG$j.warn('Invalid DIMENSION_CONFIG meta tag - expected a JSON dictionary keyed by articleCodex', e);
23833
- }
24171
+ _this2.catalogProps.dimensionConfig2D = jsonOf(item.Value);
23834
24172
  break;
23835
24173
  case 'RTV_PRESET':
23836
24174
  // RTV-next environment preset bundle (profileMode/profiles/camera); overrides the
23837
24175
  // host's default preset (white-room). Later fed from a DB instead of the catalog.
23838
- try {
23839
- _this2.catalogProps.rtvPreset = JSON.parse(item.Value);
23840
- } catch (e) {
23841
- LOG$j.warn('Invalid RTV_PRESET meta tag - expected a JSON preset bundle (profileMode/profiles/camera)', e);
23842
- }
24176
+ _this2.catalogProps.rtvPreset = jsonOf(item.Value);
23843
24177
  break;
23844
24178
  case 'PLANNERTYPE':
23845
- _this2.catalogProps.plannerType = item.Value;
24179
+ _this2.catalogProps.plannerType = textOf(item.Value);
23846
24180
  break;
23847
24181
  case 'START_PLANNER_ARTICLE':
23848
- _this2.catalogProps.startPlannerArticle = item.Value;
24182
+ _this2.catalogProps.startPlannerArticle = listOf(item.Value).join(';');
23849
24183
  break;
23850
24184
  case 'HIDE_2D_PLANNER':
23851
- _this2.catalogProps.hide2DPlanner = item.Value == '1';
24185
+ _this2.catalogProps.hide2DPlanner = item.Value === true;
23852
24186
  break;
23853
24187
  case 'ACCESSOIRE_STEP_AS_PLANNER':
23854
- _this2.catalogProps.accessorieStepAsPlanner = item.Value == '1';
24188
+ _this2.catalogProps.accessorieStepAsPlanner = item.Value === true;
23855
24189
  break;
23856
24190
  case 'PLANNER_2DOT0':
23857
- _this2.catalogProps.planner2Dot0 = item.Value == '1';
24191
+ _this2.catalogProps.planner2Dot0 = item.Value === true;
23858
24192
  break;
23859
24193
  case 'DONT_SAVE_ALTERNATIVERENDERINGS':
23860
- _this2.catalogProps.dontSaveAlternativeRenderings = item.Value == '1';
24194
+ _this2.catalogProps.dontSaveAlternativeRenderings = item.Value === true;
23861
24195
  break;
23862
24196
  case 'SHOW_ALL_ITEMS_IN_PLANNER':
23863
- _this2.catalogProps.showAllItemsInPlanner = item.Value == '1';
24197
+ _this2.catalogProps.showAllItemsInPlanner = item.Value === true;
23864
24198
  break;
23865
24199
  case 'HIDE_AV_BUTTONS':
23866
- _this2.catalogProps.hideAVButtons = item.Value;
24200
+ _this2.catalogProps.hideAVButtons = listOf(item.Value).join(';');
23867
24201
  break;
23868
24202
  case 'PLANNER_REPLACE_MODE':
23869
- _this2.catalogProps.replaceModeActive = item.Value == '1';
24203
+ _this2.catalogProps.replaceModeActive = item.Value === true;
23870
24204
  break;
23871
24205
  case 'HIDE_PLANNER_UI_ICONS':
23872
- _this2.catalogProps.hidePlannerUiIcons = item.Value == '1';
24206
+ _this2.catalogProps.hidePlannerUiIcons = item.Value === true;
23873
24207
  break;
23874
24208
  case 'DONT_SET_POSNR_FROM_PLANNER':
23875
- _this2.catalogProps.dontSetPosNrFromPlanner = item.Value == '1';
24209
+ _this2.catalogProps.dontSetPosNrFromPlanner = item.Value === true;
23876
24210
  break;
23877
24211
  case 'SHOW_AI_ROOM_RENDERING_SUMMARY':
23878
- _this2.catalogProps.showAiRoomRenderingInSummary = item.Value == '1';
24212
+ _this2.catalogProps.showAiRoomRenderingInSummary = item.Value === true;
23879
24213
  break;
23880
24214
  case 'ARTICLE_NR':
23881
- _this2.catalogProps.retailArticleNr = item.Value;
24215
+ _this2.catalogProps.retailArticleNr = textOf(item.Value);
23882
24216
  break;
23883
24217
  case 'PROGRAM_NR':
23884
- _this2.catalogProps.retailCatalogNr = item.Value;
24218
+ _this2.catalogProps.retailCatalogNr = textOf(item.Value);
23885
24219
  break;
23886
24220
  // Warnings
23887
24221
  case 'HIDECONSTRUCTIONWARNING':
23888
- _this2.catalogProps.doCheckConstructionWarnings = item.Value == '0';
24222
+ _this2.catalogProps.doCheckConstructionWarnings = item.Value !== true;
23889
24223
  break;
23890
24224
  case 'FORCECONSTRUCTIONWARNINGARTICLES':
23891
- _this2.catalogProps.forceConstructionWarningForArticles = item.Value.split(';');
24225
+ _this2.catalogProps.forceConstructionWarningForArticles = listOf(item.Value);
23892
24226
  break;
23893
24227
  case 'HIDECOMPLETENESSWARNING':
23894
- _this2.catalogProps.hideCompletenessWarning = item.Value == '1';
24228
+ _this2.catalogProps.hideCompletenessWarning = item.Value === true;
23895
24229
  break;
23896
24230
  // DP Logic
23897
24231
  case 'IGNORELAYERAVC':
23898
- _this2.catalogProps.ignoreLayerAVC = item.Value == '1';
24232
+ _this2.catalogProps.ignoreLayerAVC = item.Value === true;
23899
24233
  break;
23900
24234
  case 'IGNORELAYERAVOAVU':
23901
- _this2.catalogProps.ignoreLayerAVOAVU = item.Value == '1';
24235
+ _this2.catalogProps.ignoreLayerAVOAVU = item.Value === true;
23902
24236
  break;
23903
24237
  case 'IGNORELAYERAVNAVS':
23904
- _this2.catalogProps.ignoreLayerAVNAVS = item.Value == '1';
24238
+ _this2.catalogProps.ignoreLayerAVNAVS = item.Value === true;
23905
24239
  break;
23906
24240
  case 'IGNOREDOCKINGNUMBER':
23907
- _this2.catalogProps.ignoreDockingNumber = item.Value == '1';
24241
+ _this2.catalogProps.ignoreDockingNumber = item.Value === true;
23908
24242
  break;
23909
24243
  case 'CHECK_COLLISION_DIFFERENT_LAYERS':
23910
- _this2.catalogProps.checkCollisionForDifferentLayers = item.Value.split(';').map(function (t) {
24244
+ _this2.catalogProps.checkCollisionForDifferentLayers = listOf(item.Value).map(function (t) {
23911
24245
  return parseInt(t);
23912
24246
  });
23913
24247
  break;
23914
24248
  case 'DOCKACCONAVOONLY':
23915
- _this2.catalogProps.dockAccOnAvoOnly = item.Value == '1';
24249
+ _this2.catalogProps.dockAccOnAvoOnly = item.Value === true;
23916
24250
  break;
23917
24251
  case 'SHOWACCONDPONLY':
23918
- _this2.catalogProps.showAccOnDpOnly = item.Value == '1';
24252
+ _this2.catalogProps.showAccOnDpOnly = item.Value === true;
23919
24253
  break;
23920
24254
  case 'RECONFIG_AFTER_ARTICLE_DOCKED':
23921
- _this2.catalogProps.reconfigAfterArticleDocked = item.Value == '1';
24255
+ _this2.catalogProps.reconfigAfterArticleDocked = item.Value === true;
23922
24256
  break;
23923
24257
  // Configuration
23924
24258
 
23925
24259
  case 'USE_SHORT_NAME_AS_NAME':
23926
- _this2.catalogProps.useShortNameAsName = item.Value == '1';
24260
+ _this2.catalogProps.useShortNameAsName = item.Value === true;
23927
24261
  break;
23928
24262
  case 'USE_DIOMEX_CONFIG_LOGIC':
23929
- _this2.catalogProps.useDiomexConfigLogic = item.Value == '1';
24263
+ _this2.catalogProps.useDiomexConfigLogic = item.Value === true;
23930
24264
  break;
23931
24265
  case 'USEPRGASOPVARTICLENR':
23932
- _this2.catalogProps.UsePrgAsOpvArticleNr = item.Value == '1';
24266
+ _this2.catalogProps.UsePrgAsOpvArticleNr = item.Value === true;
23933
24267
  break;
23934
24268
  case 'ARTICLECONFIGSINGLE':
23935
- _this2.catalogProps.articleConfigSingle = item.Value == '1';
24269
+ _this2.catalogProps.articleConfigSingle = item.Value === true;
23936
24270
  break;
23937
24271
  case 'DEFAULT_GROUPS_CLOSED':
23938
- if (item.Value != '1' && item.Value != '0') {
23939
- _this2.catalogProps.defaultGroupsClosed = item.Value.split(';');
23940
- } else {
23941
- _this2.catalogProps.defaultGroupsClosed = item.Value == '1';
24272
+ {
24273
+ var _groupsClosed$only;
24274
+ var groupsClosed = shapedJsonOf('DEFAULT_GROUPS_CLOSED', item.Value);
24275
+ if (groupsClosed) _this2.catalogProps.defaultGroupsClosed = (_groupsClosed$only = groupsClosed.only) !== null && _groupsClosed$only !== void 0 ? _groupsClosed$only : groupsClosed.all;
24276
+ break;
23942
24277
  }
23943
- break;
23944
24278
  case 'ARTICLECONFIGALL':
23945
- _this2.catalogProps.articleConfigAll = item.Value == '1';
24279
+ _this2.catalogProps.articleConfigAll = item.Value === true;
23946
24280
  break;
23947
24281
  case 'AUTO_OPEN_CONTENTITEM':
23948
- _this2.catalogProps.autoOpenContentItem = item.Value == '1' ? true : item.Value.split(';').map(function (o) {
23949
- return (!_this2.isIDMFormat ? 'OPT' : '') + o;
23950
- });
23951
- break;
24282
+ {
24283
+ var autoOpen = shapedJsonOf('AUTO_OPEN_CONTENTITEM', item.Value);
24284
+ if (autoOpen) _this2.catalogProps.autoOpenContentItem = autoOpen.all === true || autoOpen.only.map(function (o) {
24285
+ return (!_this2.isIDMFormat ? 'OPT' : '') + o;
24286
+ });
24287
+ break;
24288
+ }
23952
24289
  case 'HIDE_PRICE_GROUPS_OF_OPGS':
23953
- _this2.catalogProps.hidePriceGroupsOfOPGs = item.Value == '1';
24290
+ _this2.catalogProps.hidePriceGroupsOfOPGs = item.Value === true;
23954
24291
  break;
23955
24292
  case 'DONTHIDEOPTION':
23956
- _this2.catalogProps.dontHideOption = String(item.Value).split(',');
24293
+ _this2.catalogProps.dontHideOption = listOf(item.Value);
23957
24294
  break;
23958
24295
  case 'SHOW_AI_ROOM_RENDERING_IN_SUMMARY':
23959
- _this2.catalogProps.showAiRoomRenderingInSummary = item.Value == '1';
24296
+ _this2.catalogProps.showAiRoomRenderingInSummary = item.Value === true;
23960
24297
  break;
23961
24298
  case 'SHOWACCESSOIREONLASTTAB':
23962
- _this2.catalogProps.showAccessioreOnLastTab = item.Value == '1';
24299
+ _this2.catalogProps.showAccessioreOnLastTab = item.Value === true;
23963
24300
  break;
23964
24301
  case 'FORCE_CONFIG_ALL_ACCESSOIRES':
23965
- _this2.catalogProps.forceConfigAllAccessoires = item.Value == '1';
24302
+ _this2.catalogProps.forceConfigAllAccessoires = item.Value === true;
23966
24303
  break;
23967
24304
  case 'CONFIG_ACCESSOIRES':
23968
- _this2.catalogProps.configAccessoires = item.Value == '1';
24305
+ _this2.catalogProps.configAccessoires = item.Value === true;
23969
24306
  break;
23970
24307
  case 'CONFIG_ONLY_ACCESSOIRES':
23971
- _this2.catalogProps.configOnlyAccessoires = item.Value == '1';
24308
+ _this2.catalogProps.configOnlyAccessoires = item.Value === true;
23972
24309
  break;
23973
24310
  case 'IGNORE_ARTICLERELATIONS':
23974
- _this2.catalogProps.ignoreArticleRelations = item.Value == '1';
24311
+ _this2.catalogProps.ignoreArticleRelations = item.Value === true;
23975
24312
  break;
23976
24313
  case 'REPAIR_VARIANT_VALUES':
23977
- var enties = item.Value.split(';;');
23978
- _this2.catalogProps.repairVariantValues = {};
23979
- for (var k = 0; k < enties.length; k++) {
23980
- var vals = enties[k].split(';');
23981
- _this2.catalogProps.repairVariantValues['OPT' + vals[0].replace(':', ':OPV')] = 'OPT' + vals[1].replace(':', ':OPV');
24314
+ {
24315
+ var repairs = shapedJsonOf('REPAIR_VARIANT_VALUES', item.Value);
24316
+ if (!repairs) break;
24317
+ _this2.catalogProps.repairVariantValues = {};
24318
+ for (var _i = 0, _Object$entries = Object.entries(repairs); _i < _Object$entries.length; _i++) {
24319
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
24320
+ from = _Object$entries$_i[0],
24321
+ to = _Object$entries$_i[1];
24322
+ _this2.catalogProps.repairVariantValues['OPT' + from.replace(':', ':OPV')] = 'OPT' + to.replace(':', ':OPV');
24323
+ }
24324
+ break;
23982
24325
  }
23983
- break;
23984
24326
  case 'FILTER_FOR_CHECKOUT_BUTTONS':
23985
- _this2.catalogProps.filterForCheckoutButtons = item.Value.split(';').map(function (t) {
23986
- return t;
23987
- });
24327
+ _this2.catalogProps.filterForCheckoutButtons = listOf(item.Value);
23988
24328
  break;
23989
24329
  case 'DO_USE_RULEDESC_FOR_PARTLIST':
23990
- _this2.catalogProps.doUseRuleDescForPartListArticles = '1' == item.Value;
24330
+ _this2.catalogProps.doUseRuleDescForPartListArticles = item.Value === true;
23991
24331
  break;
23992
24332
  case 'USEPOSCOUNTVALUE':
23993
- _this2.catalogProps.usePosCountValue = '1' == item.Value;
24333
+ _this2.catalogProps.usePosCountValue = item.Value === true;
23994
24334
  break;
23995
24335
  case 'USE_DECISION_POS_COUNT_VALUE':
23996
- _this2.catalogProps.useDecisionPosCountValue = '1' == item.Value;
24336
+ _this2.catalogProps.useDecisionPosCountValue = item.Value === true;
23997
24337
  break;
23998
24338
  case 'USE_SHELFPLANNER_RTV':
23999
- _this2.catalogProps.useShelfPlannerRTV = '1' == item.Value;
24339
+ _this2.catalogProps.useShelfPlannerRTV = item.Value === true;
24000
24340
  break;
24001
24341
  case 'DONT_SHOW_ACC_STEP':
24002
- _this2.catalogProps.dontShowAccStep = '1' == item.Value;
24342
+ _this2.catalogProps.dontShowAccStep = item.Value === true;
24003
24343
  break;
24004
24344
  case 'MERGE_OPTIONS_TO_SAME_OPTION':
24005
- _this2.catalogProps.mergeOptionsToSameOption = [];
24006
- for (var V = item.Value.split(';'), T = 0; T < V.length; T++) _this2.catalogProps.mergeOptionsToSameOption.push(V[T].split(','));
24007
- break;
24345
+ {
24346
+ var merges = shapedJsonOf('MERGE_OPTIONS_TO_SAME_OPTION', item.Value);
24347
+ if (merges) _this2.catalogProps.mergeOptionsToSameOption = merges;
24348
+ break;
24349
+ }
24008
24350
  case 'FORCE_CONFIG_SINGLE':
24009
- _this2.catalogProps.forceConfigSingle = '1' == item.Value;
24351
+ _this2.catalogProps.forceConfigSingle = item.Value === true;
24010
24352
  break;
24011
24353
  case 'SHOW_PRICEPREVIEW_ON_OPTIONS':
24012
- _this2.catalogProps.showPricePreviewOnlyOnOptions = item.Value.split(';').map(function (t) {
24013
- return t;
24014
- });
24354
+ _this2.catalogProps.showPricePreviewOnlyOnOptions = listOf(item.Value);
24015
24355
  break;
24016
24356
  case 'HIDE_PRICEPREVIEW_ON_OPTIONS':
24017
- _this2.catalogProps.hidePricePreviewOnlyOnOptions = item.Value.split(';').map(function (t) {
24018
- return t;
24019
- });
24357
+ _this2.catalogProps.hidePricePreviewOnlyOnOptions = listOf(item.Value);
24020
24358
  break;
24021
24359
  case 'INIT_OPTIONTREE_TWICE':
24022
- _this2.catalogProps.initOptionTreeTwice = '1' == item.Value;
24360
+ _this2.catalogProps.initOptionTreeTwice = item.Value === true;
24023
24361
  break;
24024
24362
  case 'USE_TYPENR_AS_ARTICLENR_EKTEXT':
24025
- _this2.catalogProps.useTypeNrAsArticleNrEKText = '1' == item.Value;
24363
+ _this2.catalogProps.useTypeNrAsArticleNrEKText = item.Value === true;
24026
24364
  break;
24027
24365
  case 'HIDE_SUBPOS_ARTICLECODEX_EKTEXT':
24028
- _this2.catalogProps.hideSubPosArticleCodexEKText = '1' == item.Value;
24366
+ _this2.catalogProps.hideSubPosArticleCodexEKText = item.Value === true;
24029
24367
  break;
24030
24368
  case 'ADD_POS_INVISIBILITY_TO_OL':
24031
- _this2.catalogProps.addPosInvisibilityToOL = '1' == item.Value;
24369
+ _this2.catalogProps.addPosInvisibilityToOL = item.Value === true;
24032
24370
  break;
24033
24371
  case 'ADD_NEW_LINE_BEFOR_RULEDESC':
24034
- _this2.catalogProps.addNewLineBeforRuleDesc = '1' == item.Value;
24372
+ _this2.catalogProps.addNewLineBeforRuleDesc = item.Value === true;
24035
24373
  break;
24036
24374
  case 'ONCONFIG_SINGLE_DONT_GENERALIZE':
24037
- _this2.catalogProps.onConfigSingleDontGeneralize = '1' == item.Value;
24375
+ _this2.catalogProps.onConfigSingleDontGeneralize = item.Value === true;
24038
24376
  break;
24039
24377
  case 'SUMMARY_TABGROUP_POSITION':
24040
- _this2.catalogProps.summaryTabGroupPosition = item.Value.split(';');
24378
+ _this2.catalogProps.summaryTabGroupPosition = listOf(item.Value);
24041
24379
  break;
24042
24380
  case 'BUNDLE_RULES':
24043
- _this2.catalogProps.bundleRules = JSON.parse(item.Value);
24381
+ _this2.catalogProps.bundleRules = (_jsonOf = jsonOf(item.Value)) !== null && _jsonOf !== void 0 ? _jsonOf : [];
24044
24382
  break;
24045
24383
  case 'NOTIFICATIONS':
24046
- _this2.catalogProps.notificationsRules = JSON.parse(item.Value);
24384
+ _this2.catalogProps.notificationsRules = (_jsonOf2 = jsonOf(item.Value)) !== null && _jsonOf2 !== void 0 ? _jsonOf2 : [];
24047
24385
  break;
24048
24386
  case 'WARNINGS':
24049
- _this2.catalogProps.warningRules = JSON.parse(item.Value);
24387
+ _this2.catalogProps.warningRules = (_jsonOf3 = jsonOf(item.Value)) !== null && _jsonOf3 !== void 0 ? _jsonOf3 : [];
24050
24388
  break;
24051
24389
  case 'BANNER':
24052
- _this2.catalogProps.bannerRules = JSON.parse(item.Value);
24390
+ _this2.catalogProps.bannerRules = (_jsonOf4 = jsonOf(item.Value)) !== null && _jsonOf4 !== void 0 ? _jsonOf4 : [];
24053
24391
  break;
24054
24392
  case 'IGNORE_MAX_PRICE_AS_BASEPRICE':
24055
- _this2.catalogProps.ignoreMaxPriceAsBP = '1' == item.Value;
24393
+ _this2.catalogProps.ignoreMaxPriceAsBP = item.Value === true;
24056
24394
  break;
24057
24395
  case 'DONT_USE_VCODEX_FOR_BASKET':
24058
- _this2.catalogProps.dontUseVCodexInBasket = '1' == item.Value;
24396
+ _this2.catalogProps.dontUseVCodexInBasket = item.Value === true;
24059
24397
  break;
24060
24398
  case 'IGNORE_ISDEFINED_CHECK':
24061
- _this2.catalogProps.ignoreIsDefinedCheck = '1' == item.Value;
24399
+ _this2.catalogProps.ignoreIsDefinedCheck = item.Value === true;
24062
24400
  break;
24063
24401
  case 'PARTLIST_POSTFIX':
24064
- _this2.catalogProps.partlistPostFix = item.Value.split(';').map(function (i) {
24065
- return {
24066
- rule: i.split(':')[0],
24067
- postFix: i.split(':')[1]
24068
- };
24069
- });
24070
- break;
24402
+ {
24403
+ var postfixes = shapedJsonOf('PARTLIST_POSTFIX', item.Value);
24404
+ if (postfixes) _this2.catalogProps.partlistPostFix = postfixes.map(function (entry) {
24405
+ return {
24406
+ rule: entry.rule,
24407
+ postFix: entry.postfix
24408
+ };
24409
+ });
24410
+ break;
24411
+ }
24071
24412
  case 'ADD_PA_ON_EDO':
24072
24413
  _this2.handleEdoArticles(properties, item);
24073
24414
  break;
@@ -24090,9 +24431,10 @@ var DivaCatalogData = /*#__PURE__*/function () {
24090
24431
  if (key.startsWith('3D_STATBG_ROOMLIST')) {
24091
24432
  // item.Value =
24092
24433
  // "weissraum_LUECK;backgroundimgroom_lueck_modern;backgroundimgroom_lueck_romantic;backgroundimgroom_lueck_loft;backgroundimgroom_lueck_night";
24093
- _this3.catalogProps.roomList3DStaticBGImage.set(item.Codex, item.Value.split(';'));
24434
+ _this3.catalogProps.roomList3DStaticBGImage.set(item.Codex, propertyTexts(item.Value));
24094
24435
  } else if (key.startsWith('3D_STANDARD_WHITEROOM')) {
24095
- _this3.catalogProps.diva3dStandardWhiteroom = item.Value;
24436
+ var _textOf4;
24437
+ _this3.catalogProps.diva3dStandardWhiteroom = (_textOf4 = textOf(item.Value)) !== null && _textOf4 !== void 0 ? _textOf4 : '';
24096
24438
  } else if (key.startsWith('DIVA3D_IMAGE')) {
24097
24439
  _this3.handleDIVA3DMetaTag(item);
24098
24440
  }
@@ -24101,14 +24443,16 @@ var DivaCatalogData = /*#__PURE__*/function () {
24101
24443
  }, {
24102
24444
  key: "handleDIVA3DMetaTag",
24103
24445
  value: function handleDIVA3DMetaTag(item) {
24446
+ var _textOf5;
24104
24447
  //this.Value = "ON.ZUBEHOER_KORPUS1;ON.ZUBEHOER_KORPUS2;ON.ZUBEHOER_KORPUS3:HIDEOPTIONS.FAF;PANEEL;ACP:VIEWPOINTNAME.START_RECHTS";
24105
24448
  //Diese Regel gilt für Optionen ZUBEHOER_KORPUS1, ZUBEHOER_KORPUS2 und ZUBEHOER_KORPUS3
24106
24449
 
24107
24450
  //this.Value: "ON.ZUBEHOER*:HIDEOPTIONS.TUER*;TUER_FARB_AF*;TUEREN*;GRIFF_AF*;GRIFF_AF_KOMBI*"
24108
24451
  //Diese Regel gilt für alle Optionen beginnend mit ZUBEHOER*
24109
24452
 
24110
- var alternateRenderInfo = item.Value.split(':');
24111
- if (alternateRenderInfo.length > 0) {
24453
+ var alternateRenderInfo = ((_textOf5 = textOf(item.Value)) !== null && _textOf5 !== void 0 ? _textOf5 : '').split(':');
24454
+ // A rule without the options to hide after the ':' is no rule
24455
+ if (alternateRenderInfo.length > 1) {
24112
24456
  var onValues = alternateRenderInfo[0].split(';');
24113
24457
  var hideOptionValues = alternateRenderInfo[1].split(';');
24114
24458
  var viewPointName = undefined;
@@ -24220,9 +24564,9 @@ var DivaCatalogData = /*#__PURE__*/function () {
24220
24564
  key: "handleEdoArticles",
24221
24565
  value: function handleEdoArticles(properties, item) {
24222
24566
  var _properties$find;
24223
- var thisCodex = (_properties$find = properties.find(function (item) {
24567
+ var thisCodex = textOf((_properties$find = properties.find(function (item) {
24224
24568
  return item.Codex == 'ADD_PA_ON_EDO_ARTICLECODEX';
24225
- })) === null || _properties$find === void 0 ? void 0 : _properties$find.Value;
24569
+ })) === null || _properties$find === void 0 ? void 0 : _properties$find.Value);
24226
24570
  var thisPropertie;
24227
24571
  if (!thisCodex) {
24228
24572
  console.error('ADD_PA_ON_EDO_ARTICLECODEX not defined!');
@@ -28446,18 +28790,10 @@ var IDMEngine = /*#__PURE__*/function () {
28446
28790
  var ops = this.article.getArticleOptionState(action.featureNo.toString());
28447
28791
  if (ops && (isNull && ops.val === undefined || !isNull && (ops.val === undefined || !ops.valueWasSet))) {
28448
28792
  if (action.formulaRef) {
28449
- var _action$featureNo, _this$article$Catalog;
28450
- var _ops2 = this.article.getArticleOptionState((_action$featureNo = action.featureNo) === null || _action$featureNo === void 0 ? void 0 : _action$featureNo.toString());
28451
- var option = _ops2 === null || _ops2 === void 0 ? void 0 : _ops2.val;
28452
- var formula = (_this$article$Catalog = this.article.CatalogData.idmFormulas) === null || _this$article$Catalog === void 0 ? void 0 : _this$article$Catalog[action.formulaRef.formulaKey];
28453
- if (!formula) throw new Error('formula ' + action.formulaRef.formulaKey + ' not found in catalog but used in decision: ' + decision.decisionNo);
28454
- var freeText = this.evalMeasureFormula(formula);
28455
- if (option) {
28456
- this.updateArtOPV(option, action.featureNo.toString(), _ops2, freeText, freeText ? Number(freeText) : undefined);
28457
- }
28793
+ this.applyFormulaRef(action.featureNo.toString(), action.formulaRef.formulaKey, decision);
28458
28794
  } else if (action.featureRef) {
28459
- var _ops3 = this.article.getArticleOptionState(action.featureRef.featureNo);
28460
- if (_ops3 !== null && _ops3 !== void 0 && _ops3.valCodex) this.assignOptionValue(action.featureNo.toString(), _ops3.valCodex, 'default', _ops3);
28795
+ var _ops2 = this.article.getArticleOptionState(action.featureRef.featureNo);
28796
+ if (_ops2 !== null && _ops2 !== void 0 && _ops2.valCodex) this.assignOptionValue(action.featureNo.toString(), _ops2.valCodex, 'default', _ops2);
28461
28797
  } else if (action.optionRef) {
28462
28798
  this.assignOptionValue(action.featureNo.toString(), action.optionRef.optionKey, 'default');
28463
28799
  } else {
@@ -28479,46 +28815,38 @@ var IDMEngine = /*#__PURE__*/function () {
28479
28815
  _step19;
28480
28816
  try {
28481
28817
  for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {
28482
- var _action$featureNo2;
28818
+ var _action$featureNo;
28483
28819
  var action = _step19.value;
28484
- if (!this.article.getArticleOptionState((_action$featureNo2 = action.featureNo) === null || _action$featureNo2 === void 0 ? void 0 : _action$featureNo2.toString()) || !action.featureNo) {
28820
+ if (!this.article.getArticleOptionState((_action$featureNo = action.featureNo) === null || _action$featureNo === void 0 ? void 0 : _action$featureNo.toString()) || !action.featureNo) {
28485
28821
  //usecase is that it want to be set on partlistarticle that is not currently loaded so its not found
28486
28822
  LOG$g.debug('evalSetFeature decision ' + decision.decisionNo + ' (isFixed=' + isFixed + '): target feature ' + action.featureNo + ' has no option state on article ' + this.article.articleCodex + ' - action skipped');
28487
28823
  continue;
28488
28824
  }
28489
28825
  if (action.formulaRef) {
28490
- var _action$featureNo3, _this$article$Catalog2;
28491
- var ops = this.article.getArticleOptionState((_action$featureNo3 = action.featureNo) === null || _action$featureNo3 === void 0 ? void 0 : _action$featureNo3.toString());
28492
- var option = ops === null || ops === void 0 ? void 0 : ops.val;
28493
- var formula = (_this$article$Catalog2 = this.article.CatalogData.idmFormulas) === null || _this$article$Catalog2 === void 0 ? void 0 : _this$article$Catalog2[action.formulaRef.formulaKey];
28494
- if (!formula) throw new Error('formula ' + action.formulaRef.formulaKey + ' not found in catalog but used in decision: ' + decision.decisionNo);
28495
- var freeText = this.evalMeasureFormula(formula);
28496
- if (option) {
28497
- this.updateArtOPV(option, action.featureNo.toString(), ops, freeText, freeText ? Number(freeText) : undefined);
28498
- }
28826
+ this.applyFormulaRef(action.featureNo.toString(), action.formulaRef.formulaKey, decision);
28499
28827
  } else if (action.featureRef) {
28500
- var _ops4 = this.article.getArticleOptionState(action.featureRef.featureNo);
28828
+ var ops = this.article.getArticleOptionState(action.featureRef.featureNo);
28501
28829
  var targetOps = this.article.getArticleOptionState(action.featureNo.toString());
28502
- var targetHasSourceValue = _ops4 !== null && _ops4 !== void 0 && _ops4.valCodex ? !!(targetOps !== null && targetOps !== void 0 && targetOps.visibleOptionValues.get(_ops4.valCodex)) : undefined;
28830
+ var targetHasSourceValue = ops !== null && ops !== void 0 && ops.valCodex ? !!(targetOps !== null && targetOps !== void 0 && targetOps.visibleOptionValues.get(ops.valCodex)) : undefined;
28503
28831
  LOG$g.debug('evalSetFeature(featureRef) decision ' + decision.decisionNo + ': set feature ' + action.featureNo + ' from feature ' + action.featureRef.featureNo, {
28504
28832
  sourceFeatureNo: action.featureRef.featureNo,
28505
- sourceFeatureFound: !!_ops4,
28506
- sourceValCodex: _ops4 === null || _ops4 === void 0 ? void 0 : _ops4.valCodex,
28507
- sourceVisibleKeys: _ops4 ? _ops4.visibleOPVKeys : undefined,
28833
+ sourceFeatureFound: !!ops,
28834
+ sourceValCodex: ops === null || ops === void 0 ? void 0 : ops.valCodex,
28835
+ sourceVisibleKeys: ops ? ops.visibleOPVKeys : undefined,
28508
28836
  targetFeatureNo: action.featureNo,
28509
28837
  targetFeatureFound: !!targetOps,
28510
28838
  targetHasSourceValue: targetHasSourceValue,
28511
28839
  targetVisibleKeys: targetOps ? Array.from(targetOps.visibleOptionValues.keys()) : undefined
28512
28840
  });
28513
- if (!_ops4) {
28841
+ if (!ops) {
28514
28842
  LOG$g.warn('evalSetFeature(featureRef) decision ' + decision.decisionNo + ': referenced source feature ' + action.featureRef.featureNo + ' has no option state on article ' + this.article.articleCodex + ' - target feature ' + action.featureNo + ' will NOT be set (price relevant)');
28515
- } else if (!_ops4.valCodex) {
28843
+ } else if (!ops.valCodex) {
28516
28844
  LOG$g.warn('evalSetFeature(featureRef) decision ' + decision.decisionNo + ': referenced source feature ' + action.featureRef.featureNo + ' has no selected value (valCodex undefined) - target feature ' + action.featureNo + ' will NOT be set (price relevant)');
28517
28845
  } else if (!targetHasSourceValue) {
28518
- LOG$g.warn('evalSetFeature(featureRef) decision ' + decision.decisionNo + ': target feature ' + action.featureNo + ' does not have source feature ' + action.featureRef.featureNo + "'s value '" + _ops4.valCodex + "' among its visible option values - assignOptionValue will be a no-op (price relevant). Target visible values: " + (targetOps ? Array.from(targetOps.visibleOptionValues.keys()).join(', ') : '<no target>'));
28846
+ LOG$g.warn('evalSetFeature(featureRef) decision ' + decision.decisionNo + ': target feature ' + action.featureNo + ' does not have source feature ' + action.featureRef.featureNo + "'s value '" + ops.valCodex + "' among its visible option values - assignOptionValue will be a no-op (price relevant). Target visible values: " + (targetOps ? Array.from(targetOps.visibleOptionValues.keys()).join(', ') : '<no target>'));
28519
28847
  }
28520
28848
  // The typed number travels with the option key, or the target shows the option without the user's entry.
28521
- if (_ops4 !== null && _ops4 !== void 0 && _ops4.valCodex) this.assignOptionValue(action.featureNo.toString(), _ops4.valCodex, isFixed ? 'fix' : 'set', _ops4);
28849
+ if (ops !== null && ops !== void 0 && ops.valCodex) this.assignOptionValue(action.featureNo.toString(), ops.valCodex, isFixed ? 'fix' : 'set', ops);
28522
28850
  } else if (action.optionRef) {
28523
28851
  this.assignOptionValue(action.featureNo.toString(), action.optionRef.optionKey, isFixed ? 'fix' : 'set');
28524
28852
  } else {
@@ -28531,6 +28859,41 @@ var IDMEngine = /*#__PURE__*/function () {
28531
28859
  _iterator19.f();
28532
28860
  }
28533
28861
  }
28862
+ }, {
28863
+ key: "applyFormulaRef",
28864
+ value: function applyFormulaRef(featureNo, formulaKey, decision) {
28865
+ var _this$article$Catalog;
28866
+ var formula = (_this$article$Catalog = this.article.CatalogData.idmFormulas) === null || _this$article$Catalog === void 0 ? void 0 : _this$article$Catalog[formulaKey];
28867
+ if (!formula) throw new Error('formula ' + formulaKey + ' not found in catalog but used in decision: ' + decision.decisionNo);
28868
+ var ops = this.article.getArticleOptionState(featureNo);
28869
+ var freeText = this.evalMeasureFormula(formula);
28870
+ var option = ops === null || ops === void 0 ? void 0 : ops.val;
28871
+ var isThisWarning = function isThisWarning(error) {
28872
+ var _error$custom, _error$custom2;
28873
+ return error.code === 'WC_0020' && ((_error$custom = error.custom) === null || _error$custom === void 0 ? void 0 : _error$custom.decisionNo) === decision.decisionNo && ((_error$custom2 = error.custom) === null || _error$custom2 === void 0 ? void 0 : _error$custom2.featureNo) === featureNo;
28874
+ };
28875
+ if (option) {
28876
+ this.updateArtOPV(option, featureNo, ops, freeText, freeText ? Number(freeText) : undefined);
28877
+ // an earlier convergence pass may have reported it before the feature got its option
28878
+ var reported = this.article.dataCreationErrors.findIndex(isThisWarning);
28879
+ if (reported >= 0) this.article.dataCreationErrors.splice(reported, 1);
28880
+ return;
28881
+ }
28882
+ if (this.article.dataCreationErrors.some(isThisWarning)) return;
28883
+ this.article.pushDataCreationError({
28884
+ code: 'WC_0020',
28885
+ message: "Formula '".concat(formulaKey, "' of decision ").concat(decision.decisionNo, " computed ").concat(freeText, ", but feature ").concat(featureNo, " has no selected value to hold it - the result is dropped (give the feature an option value)"),
28886
+ severity: 'warning',
28887
+ custom: {
28888
+ decisionNo: decision.decisionNo,
28889
+ featureNo: featureNo,
28890
+ formulaKey: formulaKey,
28891
+ result: freeText,
28892
+ catalogCodex: this.article.catalogCodex,
28893
+ articleCodex: this.article.articleCodex
28894
+ }
28895
+ });
28896
+ }
28534
28897
 
28535
28898
  /** Selects an option on a feature; a FEATURE_REF passes its `source`, whose typed text and formula measure (cm) come along. */
28536
28899
  }, {
@@ -29096,8 +29459,8 @@ var IDMEngine = /*#__PURE__*/function () {
29096
29459
  key: "isShadowedRowReported",
29097
29460
  value: function isShadowedRowReported(decisionNo, ruleSet, combinationIndex) {
29098
29461
  return this.article.dataCreationErrors.some(function (error) {
29099
- var _error$custom, _error$custom2, _error$custom3;
29100
- return error.code === 'WC_0012' && ((_error$custom = error.custom) === null || _error$custom === void 0 ? void 0 : _error$custom.decisionNo) === decisionNo && ((_error$custom2 = error.custom) === null || _error$custom2 === void 0 ? void 0 : _error$custom2.ruleSet) === ruleSet && ((_error$custom3 = error.custom) === null || _error$custom3 === void 0 ? void 0 : _error$custom3.combinationIndex) === combinationIndex;
29462
+ var _error$custom3, _error$custom4, _error$custom5;
29463
+ return error.code === 'WC_0012' && ((_error$custom3 = error.custom) === null || _error$custom3 === void 0 ? void 0 : _error$custom3.decisionNo) === decisionNo && ((_error$custom4 = error.custom) === null || _error$custom4 === void 0 ? void 0 : _error$custom4.ruleSet) === ruleSet && ((_error$custom5 = error.custom) === null || _error$custom5 === void 0 ? void 0 : _error$custom5.combinationIndex) === combinationIndex;
29101
29464
  });
29102
29465
  }
29103
29466
  }, {
@@ -29176,9 +29539,9 @@ var IDMEngine = /*#__PURE__*/function () {
29176
29539
  _step22;
29177
29540
  try {
29178
29541
  for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {
29179
- var _action$featureNo4, _byFeature$get;
29542
+ var _action$featureNo2, _byFeature$get;
29180
29543
  var action = _step22.value;
29181
- var featureNo = (_action$featureNo4 = action.featureNo) === null || _action$featureNo4 === void 0 ? void 0 : _action$featureNo4.toString();
29544
+ var featureNo = (_action$featureNo2 = action.featureNo) === null || _action$featureNo2 === void 0 ? void 0 : _action$featureNo2.toString();
29182
29545
  if (!featureNo) continue;
29183
29546
  var list = (_byFeature$get = byFeature.get(featureNo)) !== null && _byFeature$get !== void 0 ? _byFeature$get : [];
29184
29547
  if (!list.includes(decision)) list.push(decision);
@@ -29745,7 +30108,7 @@ function _createForOfIteratorHelper$f(r, e) { var t = "undefined" != typeof Symb
29745
30108
  function _unsupportedIterableToArray$f(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$f(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$f(r, a) : void 0; } }
29746
30109
  function _arrayLikeToArray$f(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
29747
30110
  /**
29748
- * Feature property naming the Diomex properties a feature feeds, e.g. `13,15/L2`. `<group>@@<property>` scopes a
30111
+ * Feature property listing the Diomex properties a feature feeds, e.g. `["13", "15/L2"]`. `<group>@@<property>` scopes a
29749
30112
  * property to one partlist group of the set, e.g. `PrRef_Füsse@@13` for the wood of the feet only.
29750
30113
  */
29751
30114
  var IDM3D_TARGET = 'IDM3D_TARGET';
@@ -29758,7 +30121,7 @@ var GROUP_SEPARATOR = '@@';
29758
30121
  var IDM3D_VALUE = 'IDM3D_VALUE';
29759
30122
  var IDM3D_SKIP = 'SKIP';
29760
30123
 
29761
- /** One selected value of the article tree together with its raw feature and value properties. */
30124
+ /** One selected value of the article tree together with its feature and value properties. */
29762
30125
 
29763
30126
  // the parsers also accept the codex prefixed with its catalog codex (`<catalogCodex>__IDM3D_TARGET`)
29764
30127
  var findProperty = function findProperty(properties, codex) {
@@ -29808,21 +30171,19 @@ function translateToIDM3DConfig(sources, model, translation) {
29808
30171
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
29809
30172
  var source = _step.value;
29810
30173
  var tier = source.hidden ? 2 : 0;
29811
- var override = findProperty(source.valueProperties, IDM3D_VALUE);
30174
+ var override = textOf(findProperty(source.valueProperties, IDM3D_VALUE));
29812
30175
  if (override === IDM3D_SKIP) continue;
29813
30176
  if (override !== null && override !== void 0 && override.includes('=')) {
29814
30177
  var _tiers$tier;
29815
30178
  (_tiers$tier = tiers[tier]).push.apply(_tiers$tier, _toConsumableArray(parsePairs(override)));
29816
30179
  continue;
29817
30180
  }
29818
- var targets = findProperty(source.featureProperties, IDM3D_TARGET);
29819
- if (!targets) continue;
29820
- var _iterator3 = _createForOfIteratorHelper$f(targets.split(',')),
30181
+ var _iterator3 = _createForOfIteratorHelper$f(listOf(findProperty(source.featureProperties, IDM3D_TARGET))),
29821
30182
  _step3;
29822
30183
  try {
29823
30184
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
29824
30185
  var target = _step3.value;
29825
- tiers[tier + 1].push({
30186
+ if (target.trim()) tiers[tier + 1].push({
29826
30187
  target: target.trim(),
29827
30188
  value: override !== null && override !== void 0 ? override : source.value
29828
30189
  });
@@ -32887,7 +33248,7 @@ var DivaArticle = /*#__PURE__*/function () {
32887
33248
  break;
32888
33249
  }
32889
33250
  _context.next = 4;
32890
- return import('./ShelfPlanner-4d988daa.js');
33251
+ return import('./ShelfPlanner-93e07971.js');
32891
33252
  case 4:
32892
33253
  _yield$import = _context.sent;
32893
33254
  ShelfPlanner = _yield$import["default"];
@@ -41609,7 +41970,7 @@ var DivaSet = /*#__PURE__*/function () {
41609
41970
  break;
41610
41971
  }
41611
41972
  _context5.next = 3;
41612
- return import('./DoorPlanner-34fcedfe.js');
41973
+ return import('./DoorPlanner-599bd2a0.js');
41613
41974
  case 3:
41614
41975
  _yield$import = _context5.sent;
41615
41976
  DoorPlanner = _yield$import["default"];
@@ -49580,7 +49941,7 @@ var DivaBasketHandler = /*#__PURE__*/function () {
49580
49941
  break;
49581
49942
  case 3:
49582
49943
  _context12.next = 5;
49583
- return import('./PfisterWWSHandler-d5129b6b.js');
49944
+ return import('./PfisterWWSHandler-aeeeca0a.js');
49584
49945
  case 5:
49585
49946
  _yield$import = _context12.sent;
49586
49947
  PfisterWWSHandler = _yield$import["default"];
@@ -49588,7 +49949,7 @@ var DivaBasketHandler = /*#__PURE__*/function () {
49588
49949
  return _context12.abrupt("break", 27);
49589
49950
  case 9:
49590
49951
  _context12.next = 11;
49591
- return import('./LiviqueWWSHandler-08e0fd3f.js');
49952
+ return import('./LiviqueWWSHandler-443dd9fb.js');
49592
49953
  case 11:
49593
49954
  _yield$import2 = _context12.sent;
49594
49955
  LiviqueWWSHandler = _yield$import2["default"];
@@ -49596,7 +49957,7 @@ var DivaBasketHandler = /*#__PURE__*/function () {
49596
49957
  return _context12.abrupt("break", 27);
49597
49958
  case 15:
49598
49959
  _context12.next = 17;
49599
- return import('./SeriousBasketHandler-fadb9e59.js');
49960
+ return import('./SeriousBasketHandler-8e25438e.js');
49600
49961
  case 17:
49601
49962
  _yield$import3 = _context12.sent;
49602
49963
  SeriousWWSHandler = _yield$import3["default"];
@@ -49604,7 +49965,7 @@ var DivaBasketHandler = /*#__PURE__*/function () {
49604
49965
  return _context12.abrupt("break", 27);
49605
49966
  case 21:
49606
49967
  _context12.next = 23;
49607
- return import('./StandardWWSHandler-1b06b955.js');
49968
+ return import('./StandardWWSHandler-d71f9500.js');
49608
49969
  case 23:
49609
49970
  _yield$import4 = _context12.sent;
49610
49971
  StandardWWSHandler = _yield$import4["default"];
@@ -50991,7 +51352,7 @@ var PlannerHandler3D = /*#__PURE__*/function () {
50991
51352
  //If we need real time rendering initialize the SignalR and 3D host connection Handler
50992
51353
  bootMark('signalr: chunk import start');
50993
51354
  _context3.next = 3;
50994
- return import('./Host3DSignalR-06a154e9.js');
51355
+ return import('./Host3DSignalR-c12d1c95.js');
50995
51356
  case 3:
50996
51357
  _yield$import = _context3.sent;
50997
51358
  Host3DSignalR = _yield$import["default"];
@@ -52736,7 +53097,7 @@ var DivaPlannerHandler = /*#__PURE__*/function () {
52736
53097
  break;
52737
53098
  case 8:
52738
53099
  _context5.next = 10;
52739
- return import('./DivaStandardPlanner-34cb94ca.js');
53100
+ return import('./DivaStandardPlanner-cde0a04a.js');
52740
53101
  case 10:
52741
53102
  _yield$import = _context5.sent;
52742
53103
  DivaStandardPlanner = _yield$import["default"];
@@ -52747,7 +53108,7 @@ var DivaPlannerHandler = /*#__PURE__*/function () {
52747
53108
  return _context5.abrupt("break", 21);
52748
53109
  case 15:
52749
53110
  _context5.next = 17;
52750
- return import('./DivaBoxPlanner-e86a9c78.js');
53111
+ return import('./DivaBoxPlanner-7291fc69.js');
52751
53112
  case 17:
52752
53113
  _yield$import2 = _context5.sent;
52753
53114
  DivaBoxPlanner = _yield$import2["default"];
@@ -59505,265 +59866,6 @@ var PlannerElementData = /*#__PURE__*/function () {
59505
59866
  }]);
59506
59867
  }();
59507
59868
 
59508
- /**
59509
- * The VALUE ENCODING of every catalog/article/option/option-value property, keyed by codex.
59510
- *
59511
- * A property's `Value` travels as a STRING and each property decides how that string is read - '1' for one flag,
59512
- * 'true' for the next, a ';' list for a third. This table records which, so an editor can offer the right control
59513
- * and write back exactly what the parser reads, and so a caller can validate a value before storing it.
59514
- *
59515
- * GENERATED from the four parsers - do not hand-edit; regenerate when a `case` is added there:
59516
- * CatalogData.ts | CatalogArticleData.ts | CatalogOptionData.ts | CatalogOptionValueData.ts
59517
- * `propertyValueCodec.test.ts` fails when a parser case has no entry here.
59518
- */
59519
-
59520
- /** The entity a property hangs on; the same codex can mean different things on different entities. */
59521
-
59522
- /**
59523
- * How the raw string is turned into a value. The boolean variants are NOT interchangeable: writing 'true' where
59524
- * the parser tests `== '1'` silently yields false. `boolean:on` is read by isPropertyOn: empty, '0' and 'false'
59525
- * are off, any other value is on.
59526
- */
59527
-
59528
- /** The encoding per property codex, for one entity. */
59529
-
59530
- /** 96 properties parsed on the catalog entity. */
59531
- var CATALOG_PROPERTIES = {
59532
- '3D_COMPATIBLE_WITH_IMAGE_CACHE': 'boolean:1',
59533
- ACCESSOIRE_STEP_AS_PLANNER: 'boolean:1',
59534
- ADD_NEW_LINE_BEFOR_RULEDESC: 'boolean:1',
59535
- ADD_PA_ON_EDO: 'opaque',
59536
- ADD_POS_INVISIBILITY_TO_OL: 'boolean:1',
59537
- ARTICLECONFIGALL: 'boolean:1',
59538
- ARTICLECONFIGSINGLE: 'boolean:1',
59539
- ARTICLE_NR: 'string',
59540
- AUTO_OPEN_CONTENTITEM: 'all-or-list:;',
59541
- BANNER: 'json',
59542
- BUNDLE_RULES: 'json',
59543
- CHECK_COLLISION_DIFFERENT_LAYERS: 'list:;',
59544
- CONFIG_ACCESSOIRES: 'boolean:1',
59545
- CONFIG_ONLY_ACCESSOIRES: 'boolean:1',
59546
- DEFAULT_DO_SHOW_3DDIMENSIONS: 'boolean:1|true',
59547
- DEFAULT_GROUPS_CLOSED: 'boolean-or-list:;',
59548
- DIMENSION_CONFIG: 'json',
59549
- DIVA3D_AR_FORCERTV: 'boolean:1',
59550
- DIVA3D_AR_READY: 'boolean:1',
59551
- DIVA3D_DISABLE_3DEXPORT: 'boolean:1',
59552
- DIVA3D_PLANER_DIGITS: 'number',
59553
- DIVA3D_PLANER_SHOW_ARTICLE_SVG: 'boolean:1',
59554
- DIVA3D_RENDERING: 'boolean:1|true',
59555
- DIVA3D_ROOM: 'string',
59556
- DIVA3D_STATIC_BG_IMAGE_ROOMLIST: 'list:;',
59557
- DIVA3D_USE_RTV_NEXT: 'boolean:1',
59558
- DIVA_KI_READY: 'boolean:1|true',
59559
- DOCKACCONAVOONLY: 'boolean:1',
59560
- DONTCALCBASEPRICE: 'boolean:1',
59561
- DONTHIDEOPTION: 'list:,',
59562
- DONT_SAVE_ALTERNATIVERENDERINGS: 'boolean:1',
59563
- DONT_SET_POSNR_FROM_PLANNER: 'boolean:1',
59564
- DONT_SHOW_ACC_STEP: 'boolean:1',
59565
- DONT_USE_VCODEX_FOR_BASKET: 'boolean:1',
59566
- DO_SHOW_MAIN_DIMENSIONS: 'boolean:1|true',
59567
- DO_USE_RULEDESC_FOR_PARTLIST: 'boolean:1',
59568
- ELEMENT_COPY_AVLR: 'all-or-list:;',
59569
- ENABLE_DO_SHOW_3DDIMENSIONS: 'boolean:1|true',
59570
- FILTER_FOR_CHECKOUT_BUTTONS: 'list:;',
59571
- FORCECONSTRUCTIONWARNINGARTICLES: 'list:;',
59572
- FORCE_CONFIG_ALL_ACCESSOIRES: 'boolean:1',
59573
- FORCE_CONFIG_SINGLE: 'boolean:1',
59574
- HEADER_DIMENSION_IDS: 'list:;',
59575
- HIDECOMPLETENESSWARNING: 'boolean:1',
59576
- HIDECONSTRUCTIONWARNING: 'opaque',
59577
- HIDE_2D_PLANNER: 'boolean:1',
59578
- HIDE_AV_BUTTONS: 'string',
59579
- HIDE_PLANNER_UI_ICONS: 'boolean:1',
59580
- HIDE_PRICEPREVIEW_ON_OPTIONS: 'list:;',
59581
- HIDE_PRICE_GROUPS_OF_OPGS: 'boolean:1',
59582
- HIDE_SUBPOS_ARTICLECODEX_EKTEXT: 'boolean:1',
59583
- IDM3D_CAT_CODEX: 'string',
59584
- IDM3D_ENVIRONMENT: 'string',
59585
- IDM3D_TRANSLATION: 'json',
59586
- IGNOREDOCKINGNUMBER: 'boolean:1',
59587
- IGNORELAYERAVC: 'boolean:1',
59588
- IGNORELAYERAVNAVS: 'boolean:1',
59589
- IGNORELAYERAVOAVU: 'boolean:1',
59590
- IGNORE_ARTICLERELATIONS: 'boolean:1',
59591
- IGNORE_ISDEFINED_CHECK: 'boolean:1',
59592
- IGNORE_MAX_PRICE_AS_BASEPRICE: 'boolean:1',
59593
- INIT_OPTIONTREE_TWICE: 'boolean:1',
59594
- IS_IDM3D_CAT: 'boolean:1|true',
59595
- MERGE_OPTIONS_TO_SAME_OPTION: 'list:;',
59596
- NOTIFICATIONS: 'json',
59597
- ONCONFIG_SINGLE_DONT_GENERALIZE: 'boolean:1',
59598
- PARTLIST_POSTFIX: 'list:;',
59599
- PLANNERTYPE: 'string',
59600
- PLANNER_2DOT0: 'boolean:1',
59601
- PLANNER_REPLACE_MODE: 'boolean:1',
59602
- PLAN_2D_FONT_URL: 'string',
59603
- PROGRAM_NR: 'string',
59604
- RECONFIG_AFTER_ARTICLE_DOCKED: 'boolean:1',
59605
- REPAIR_VARIANT_VALUES: 'opaque',
59606
- RTV_PRESET: 'json',
59607
- SHOWACCESSOIREONLASTTAB: 'boolean:1',
59608
- SHOWACCONDPONLY: 'boolean:1',
59609
- SHOWTYPENRINPLANNER: 'boolean:1',
59610
- SHOW_AI_ROOM_RENDERING_IN_SUMMARY: 'boolean:1',
59611
- SHOW_AI_ROOM_RENDERING_SUMMARY: 'boolean:1',
59612
- SHOW_ALL_ITEMS_IN_PLANNER: 'boolean:1',
59613
- SHOW_PRICEPREVIEW_ON_OPTIONS: 'list:;',
59614
- STARTFILTERPARAMS: 'string',
59615
- STARTHIDEARTICLES: 'list:;',
59616
- START_PLANNER_ARTICLE: 'string',
59617
- SUMMARY_TABGROUP_POSITION: 'list:;',
59618
- USEBOXPLANNER: 'all-or-list:;',
59619
- USEGLOBALSVGSCALE: 'boolean:1',
59620
- USEPOSCOUNTVALUE: 'boolean:1',
59621
- USEPRGASOPVARTICLENR: 'boolean:1',
59622
- USE_DECISION_POS_COUNT_VALUE: 'boolean:1',
59623
- USE_DIOMEX_CONFIG_LOGIC: 'boolean:1',
59624
- USE_SHELFPLANNER_RTV: 'boolean:1',
59625
- USE_SHORT_NAME_AS_NAME: 'boolean:1',
59626
- USE_TYPENR_AS_ARTICLENR_EKTEXT: 'boolean:1',
59627
- WARNINGS: 'json'
59628
- };
59629
-
59630
- /** 31 properties parsed on the article entity. */
59631
- var ARTICLE_PROPERTIES = {
59632
- '3DMODELNAME': 'string',
59633
- ACCESSOIRE_POS_PRIO: 'number',
59634
- ADD_AS_ZKAT: 'boolean:1|true',
59635
- BASIC_UNIT_PRICE: 'number',
59636
- BUNDLE_RULES: 'json',
59637
- CONTENT_ITEM: 'string',
59638
- DEPTH_HAS_PRICE: 'boolean:on',
59639
- DO_NOT_DEL_ACC_IF_NOT_DOCKED: 'boolean:on',
59640
- GROUP_CONTENT_ITEM: 'string',
59641
- HAS3D: 'boolean:on',
59642
- HEIGHTGRIDABOVE: 'number',
59643
- HEIGHTGRIDBELOW: 'number',
59644
- HEIGHTGRIDUSED: 'number',
59645
- HEIGHT_HAS_PRICE: 'boolean:on',
59646
- HIDE_IN_PLANNERSTEP: 'boolean:on',
59647
- IDM3D_SKIP: 'boolean:1|true',
59648
- INVALID_ACCESSORIES: 'list:,',
59649
- MAX_PLANNING_COUNT: 'number',
59650
- ON_CONFIG_OPTION: 'string',
59651
- ON_SET_CONFIG_OPTION: 'string',
59652
- OPTIONS_FOR_PRINT: 'list:;',
59653
- ORDER_POSNR: 'string',
59654
- OVERWRITE_PARENT_DEPTH: 'boolean:on',
59655
- OVERWRITE_PARENT_HEIGHT: 'boolean:on',
59656
- OVERWRITE_PARENT_WIDTH: 'boolean:on',
59657
- RETAIL_PREFIX: 'string',
59658
- TABGROUP: 'string',
59659
- TABGROUP_OPTIONS: 'string',
59660
- TYPE_NO: 'string',
59661
- WIDTH_HAS_PRICE: 'boolean:on',
59662
- ZUBEHOER_FAMILIE: 'string'
59663
- };
59664
-
59665
- /** 41 properties parsed on the option entity. */
59666
- var OPTION_PROPERTIES = {
59667
- ADDITIONAL_GROUP_FILTER: 'json',
59668
- ADD_OPT_TO_TABGROUP_IN_PL_SUM: 'string',
59669
- ADD_TO_WWS: 'boolean:on',
59670
- CHECK_FOR_REVERSE_CHANGES: 'list:;',
59671
- CONTENT_ITEM: 'string',
59672
- CONTENT_ITEM_TEASER: 'json',
59673
- CUSTOM_DIMENSION: 'boolean:on',
59674
- CUSTOM_DIMENSION_TEXT: 'string',
59675
- DEFAULT_SIBLING_OPTION: 'string',
59676
- DESCRIPTION: 'string',
59677
- DIAMETER: 'boolean:on',
59678
- EshopCategoryMapping: 'ignored',
59679
- EshopSearchRelevant: 'ignored',
59680
- FEATURE_TYPE: 'ignored',
59681
- FREETEXT_DEFAULT_VALUE: 'string',
59682
- GROUP_OPTIONS_LEFT_AND_RIGHT: 'list:;',
59683
- HIDE_OPTION_IN_CONFIGURATOR: 'boolean:on',
59684
- IDM3D_TARGET: 'list:,',
59685
- IGNORE_GROUPS: 'boolean:1',
59686
- IGNORE_PGR_GROUP_POSITION: 'boolean:1',
59687
- INFO_PDF: 'string',
59688
- INFO_URL: 'string',
59689
- ION_COMMENT_TEXT: 'ignored',
59690
- ISDEFAULTVALUEFOROPTIONS: 'string',
59691
- IS_MAIN_COLOR: 'boolean:on',
59692
- IS_STATE: 'boolean:on',
59693
- IsArtName: 'ignored',
59694
- IsSalesText: 'ignored',
59695
- MERGE_IDM_TO_OPG: 'string',
59696
- ONLY_VISIBLE_IF_CONFIG_ALL: 'boolean:on',
59697
- ONLY_VISIBLE_IF_CONFIG_SINGLE: 'boolean:on',
59698
- ONLY_VISIBLE_IF_NOT_UNDOCK: 'boolean:on',
59699
- REQUIRED_OPTION: 'boolean:on',
59700
- REQUIRES_USER_INPUT: 'boolean:on',
59701
- SETNAME: 'boolean:on',
59702
- SHOW_FILTER: 'boolean:1',
59703
- SHOW_IN_BASKET_WHEN_HAS_PRICE: 'ignored',
59704
- SHOW_IN_VARIANTDESC: 'boolean:on',
59705
- SHOW_SEARCHBAR: 'boolean:1',
59706
- SHOW_SEPARAT_ON_TABGROUP: 'string',
59707
- SUGGESTED_OPTION: 'boolean:on'
59708
- };
59709
-
59710
- /** 31 properties parsed on the optionValue entity. */
59711
- var OPTIONVALUE_PROPERTIES = {
59712
- ADD_TO_MEASURE: 'list:;',
59713
- CONTENT_ITEM: 'string',
59714
- CUSTOM_DIMENSION: 'opaque',
59715
- DEFAULT_VALUE: 'boolean:on',
59716
- EshopCategoryMapping: 'ignored',
59717
- GROUP_CONTENT_ITEM: 'string',
59718
- HIDE_IN_SUMMARY: 'boolean:on',
59719
- IDM3D_VALUE: 'string',
59720
- INFO_PDF: 'string',
59721
- INFO_URL: 'string',
59722
- ION_COMMENT_TEXT: 'ignored',
59723
- IS_NOT_RELEVANT: 'boolean:on',
59724
- IsArtName: 'ignored',
59725
- IsVariantAttribute: 'boolean:1',
59726
- MEASURE_MAXIMUM: 'string',
59727
- MEASURE_MINIMUM: 'string',
59728
- MEASURE_STEP: 'string',
59729
- MEASURE_UNIT: 'string',
59730
- ONLY_VISIBLE_IF_NOT_UNDOCK: 'string',
59731
- ON_RULE: 'string',
59732
- OPTION_FREE_TEXT: 'boolean:on',
59733
- PIMFlatValues: 'boolean:1',
59734
- PRICE_UNIT: 'string',
59735
- PriceTageRelevant: 'ignored',
59736
- SAME_OPV: 'string',
59737
- SETNAME: 'string',
59738
- SET_BY_RULE: 'string',
59739
- SET_CONFIG: 'string',
59740
- SUMMARY_CODEX: 'string',
59741
- TopFilterAttribute: 'ignored',
59742
- VIEWPOINTNAME: 'string'
59743
- };
59744
- var PROPERTY_SCHEMAS = {
59745
- catalog: CATALOG_PROPERTIES,
59746
- article: ARTICLE_PROPERTIES,
59747
- option: OPTION_PROPERTIES,
59748
- optionValue: OPTIONVALUE_PROPERTIES
59749
- };
59750
-
59751
- /**
59752
- * The encoding of one property, or undefined when the codex is not one the engine parses - an organization's own
59753
- * key, which stays free text. A catalog-prefixed codex ('MYCAT__USEBOXPLANNER') resolves to its bare form, the
59754
- * same way the parsers strip it.
59755
- */
59756
- function propertyEncodingOf(codex, entity) {
59757
- var bare = codex.includes('__') ? codex.slice(codex.indexOf('__') + 2) : codex;
59758
- var entities = entity ? [entity] : ['catalog', 'article', 'option', 'optionValue'];
59759
- for (var _i = 0, _entities = entities; _i < _entities.length; _i++) {
59760
- var candidate = _entities[_i];
59761
- // Own keys only: a codex like 'constructor' or 'toString' would otherwise resolve to an inherited function.
59762
- if (Object.prototype.hasOwnProperty.call(PROPERTY_SCHEMAS[candidate], bare)) return PROPERTY_SCHEMAS[candidate][bare];
59763
- }
59764
- return undefined;
59765
- }
59766
-
59767
59869
  /**
59768
59870
  * Placeholder for the set name in the Serious checkout. API2 bed catalogs yield "<headboard> - <width> X <length>" from the
59769
59871
  * OPTBR / OPTLAE options and the headboard partlist article. IDM catalogs have none of these, so the selected values of the
@@ -77000,4 +77102,4 @@ function _withTimeout() {
77000
77102
  return _withTimeout.apply(this, arguments);
77001
77103
  }
77002
77104
 
77003
- export { collectStructureStepKeys as A, BoundingBox as B, Cell as C, DivaWebPlanner as D, runHeadlessArtifactPass as E, runHeadlessArtifactPassBatch as F, Grid as G, HQRenderScript as H, ArtifactGenerationError as I, JsonDataCache as J, OptionCatalogData as O, PlannerElementData as P, Rendering as R, SVGUtils as S, Vector3 as V, articleHandlerInstance as a, setHandlerInstance as b, Vector2 as c, bootMark as d, DivaArticle as e, DivaCatalogData as f, DivaBasketHandler as g, CatalogPlannerArticleData as h, PROPERTY_SCHEMAS as i, decodePropertyValue as j, encodePropertyValue as k, loadAndRepairBasket as l, propertyValueProblem as m, editorKindOf as n, getSeriousSetNamePlaceholder as o, propertyEncodingOf as p, bootMarksEnabled as q, rawStringOf as r, summaryHandlerInstance as s, bootNetworkMark as t, bootNow as u, bootRequestName as v, Vector4 as w, creatRenderOrders as x, getOrigProductId as y, headlessSession as z };
77105
+ export { ArtifactGenerationError as A, BoundingBox as B, Cell as C, DivaWebPlanner as D, Grid as G, HQRenderScript as H, JsonDataCache as J, OptionCatalogData as O, PlannerElementData as P, Rendering as R, SVGUtils as S, Vector3 as V, articleHandlerInstance as a, setHandlerInstance as b, Vector2 as c, bootMark as d, DivaArticle as e, DivaCatalogData as f, DivaBasketHandler as g, CatalogPlannerArticleData as h, PROPERTY_SCHEMAS as i, getSeriousSetNamePlaceholder as j, bootMarksEnabled as k, loadAndRepairBasket as l, bootNetworkMark as m, bootNow as n, bootRequestName as o, propertyEncodingOf as p, Vector4 as q, creatRenderOrders as r, summaryHandlerInstance as s, getOrigProductId as t, headlessSession as u, collectStructureStepKeys as v, runHeadlessArtifactPass as w, runHeadlessArtifactPassBatch as x };