@crystaldesign/web-planner-logic 26.11.0-beta.2 → 26.11.0-beta.21

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 (108) hide show
  1. package/build/cjs/{DivaBoxPlanner-68cc1bd1.js → DivaBoxPlanner-051e3b01.js} +134 -47
  2. package/build/cjs/{DivaStandardPlanner-d44ae0e7.js → DivaStandardPlanner-40846a4f.js} +340 -190
  3. package/build/cjs/{DoorPlanner-1719cbe1.js → DoorPlanner-51477bb2.js} +3 -1
  4. package/build/cjs/{Host3DSignalR-a456221e.js → Host3DSignalR-72511b72.js} +41 -24
  5. package/build/cjs/{LiviqueWWSHandler-f2afb4eb.js → LiviqueWWSHandler-fbfeeb05.js} +3 -1
  6. package/build/cjs/{PfisterWWSHandler-8f522ab6.js → PfisterWWSHandler-a7ac983b.js} +3 -1
  7. package/build/cjs/PlannerHandler2D-e2c83aec.js +544 -0
  8. package/build/cjs/{SeriousBasketHandler-b39f0556.js → SeriousBasketHandler-60853c54.js} +3 -1
  9. package/build/cjs/{ShelfPlanner-1dde2d7c.js → ShelfPlanner-a901f6da.js} +262 -148
  10. package/build/cjs/{StandardWWSHandler-62ec343d.js → StandardWWSHandler-3a8a3685.js} +3 -1
  11. package/build/cjs/{index-d63749e4.js → index-7d87a838.js} +15132 -13899
  12. package/build/cjs/index.js +13 -2
  13. package/build/esm/{DivaBoxPlanner-a347ef5d.js → DivaBoxPlanner-a76550ee.js} +134 -47
  14. package/build/esm/{DivaStandardPlanner-a8f0d722.js → DivaStandardPlanner-56c260dc.js} +339 -190
  15. package/build/esm/{DoorPlanner-60c065e5.js → DoorPlanner-a40a4342.js} +3 -1
  16. package/build/esm/{Host3DSignalR-0c7e84a7.js → Host3DSignalR-6f824d99.js} +41 -24
  17. package/build/esm/{LiviqueWWSHandler-3df03404.js → LiviqueWWSHandler-2f1189d0.js} +3 -1
  18. package/build/esm/{PfisterWWSHandler-28b609ef.js → PfisterWWSHandler-81238c20.js} +3 -1
  19. package/build/esm/PlannerHandler2D-d93ae013.js +526 -0
  20. package/build/esm/{SeriousBasketHandler-276a8035.js → SeriousBasketHandler-bca9210d.js} +3 -1
  21. package/build/esm/{ShelfPlanner-7380b831.js → ShelfPlanner-539f1b08.js} +262 -148
  22. package/build/esm/{StandardWWSHandler-1d13f6a3.js → StandardWWSHandler-cdc4c837.js} +3 -1
  23. package/build/esm/{index-358c0a3c.js → index-b755400a.js} +15128 -13899
  24. package/build/esm/index.js +3 -1
  25. package/build/types/web-planner-logic/src/index.d.ts +8 -3
  26. package/build/types/web-planner-logic/src/index.d.ts.map +1 -1
  27. package/build/types/web-planner-logic/src/interface/Articles/ArticleDataType.d.ts +13 -0
  28. package/build/types/web-planner-logic/src/interface/Articles/ArticleDataType.d.ts.map +1 -1
  29. package/build/types/web-planner-logic/src/interface/Articles/ArticleInfoType.d.ts +13 -0
  30. package/build/types/web-planner-logic/src/interface/Articles/ArticleInfoType.d.ts.map +1 -1
  31. package/build/types/web-planner-logic/src/interface/Articles/CatalogArticleDataType.d.ts +3 -0
  32. package/build/types/web-planner-logic/src/interface/Articles/CatalogArticleDataType.d.ts.map +1 -1
  33. package/build/types/web-planner-logic/src/interface/DivaCatalogDataType.d.ts +5 -0
  34. package/build/types/web-planner-logic/src/interface/DivaCatalogDataType.d.ts.map +1 -1
  35. package/build/types/web-planner-logic/src/interface/IDM/ArticleApi.d.ts +19 -18
  36. package/build/types/web-planner-logic/src/interface/IDM/ArticleApi.d.ts.map +1 -1
  37. package/build/types/web-planner-logic/src/interface/Planner/ISaveSetPlanner.d.ts +37 -0
  38. package/build/types/web-planner-logic/src/interface/Planner/ISaveSetPlanner.d.ts.map +1 -1
  39. package/build/types/web-planner-logic/src/interface/ShelfPlanner/ShelfAccessoiresView.d.ts +5 -0
  40. package/build/types/web-planner-logic/src/interface/ShelfPlanner/ShelfAccessoiresView.d.ts.map +1 -1
  41. package/build/types/web-planner-logic/src/interface/webPlannerParams/WebPlannerParamsType.d.ts +46 -2
  42. package/build/types/web-planner-logic/src/interface/webPlannerParams/WebPlannerParamsType.d.ts.map +1 -1
  43. package/build/types/web-planner-logic/src/logic/Article/DivaArticle.d.ts.map +1 -1
  44. package/build/types/web-planner-logic/src/logic/Article/Engine/ArticleEngine.d.ts +4 -0
  45. package/build/types/web-planner-logic/src/logic/Article/Engine/ArticleEngine.d.ts.map +1 -1
  46. package/build/types/web-planner-logic/src/logic/Article/Engine/IDMArticleEngine.d.ts +12 -2
  47. package/build/types/web-planner-logic/src/logic/Article/Engine/IDMArticleEngine.d.ts.map +1 -1
  48. package/build/types/web-planner-logic/src/logic/ConfigTree/Shelfplanner/ShelfPlanner.d.ts +20 -0
  49. package/build/types/web-planner-logic/src/logic/ConfigTree/Shelfplanner/ShelfPlanner.d.ts.map +1 -1
  50. package/build/types/web-planner-logic/src/logic/ConfigTree/Shelfplanner/ShelfPlannerGrid.d.ts +31 -1
  51. package/build/types/web-planner-logic/src/logic/ConfigTree/Shelfplanner/ShelfPlannerGrid.d.ts.map +1 -1
  52. package/build/types/web-planner-logic/src/logic/DivaApiHandler.d.ts +25 -0
  53. package/build/types/web-planner-logic/src/logic/DivaApiHandler.d.ts.map +1 -1
  54. package/build/types/web-planner-logic/src/logic/DivaCatalogHandler.d.ts +1 -0
  55. package/build/types/web-planner-logic/src/logic/DivaCatalogHandler.d.ts.map +1 -1
  56. package/build/types/web-planner-logic/src/logic/DivaWebPlanner.d.ts +149 -95
  57. package/build/types/web-planner-logic/src/logic/DivaWebPlanner.d.ts.map +1 -1
  58. package/build/types/web-planner-logic/src/logic/Planner/BoxPlanner/ConstructionRulesHandler.d.ts +19 -0
  59. package/build/types/web-planner-logic/src/logic/Planner/BoxPlanner/ConstructionRulesHandler.d.ts.map +1 -1
  60. package/build/types/web-planner-logic/src/logic/Planner/BoxPlanner/DivaBoxPlanner.d.ts +15 -1
  61. package/build/types/web-planner-logic/src/logic/Planner/BoxPlanner/DivaBoxPlanner.d.ts.map +1 -1
  62. package/build/types/web-planner-logic/src/logic/Planner/DivaPlannerHandler.d.ts +11 -1
  63. package/build/types/web-planner-logic/src/logic/Planner/DivaPlannerHandler.d.ts.map +1 -1
  64. package/build/types/web-planner-logic/src/logic/Planner/DivaStandardPlanner.d.ts +28 -1
  65. package/build/types/web-planner-logic/src/logic/Planner/DivaStandardPlanner.d.ts.map +1 -1
  66. package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/DockingPointHandler.d.ts +9 -114
  67. package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/DockingPointHandler.d.ts.map +1 -1
  68. package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/PlannerHandler2D.d.ts +5 -7
  69. package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/PlannerHandler2D.d.ts.map +1 -1
  70. package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/SVGUtils.d.ts +5 -6
  71. package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/SVGUtils.d.ts.map +1 -1
  72. package/build/types/web-planner-logic/src/logic/Planner/Rendering/Host3DSignalR.d.ts.map +1 -1
  73. package/build/types/web-planner-logic/src/logic/Planner/Rendering/PlannerHandler3D.d.ts +17 -1
  74. package/build/types/web-planner-logic/src/logic/Planner/Rendering/PlannerHandler3D.d.ts.map +1 -1
  75. package/build/types/web-planner-logic/src/logic/Set/DivaSet.d.ts +2 -2
  76. package/build/types/web-planner-logic/src/logic/Set/DivaSet.d.ts.map +1 -1
  77. package/build/types/web-planner-logic/src/logic/Set/DivaSetHandler.d.ts +31 -3
  78. package/build/types/web-planner-logic/src/logic/Set/DivaSetHandler.d.ts.map +1 -1
  79. package/build/types/web-planner-logic/src/logic/Set/catalogXml/articleGeo.d.ts +9 -0
  80. package/build/types/web-planner-logic/src/logic/Set/catalogXml/articleGeo.d.ts.map +1 -0
  81. package/build/types/web-planner-logic/src/logic/Set/catalogXml/parseCatalogXml.d.ts +12 -0
  82. package/build/types/web-planner-logic/src/logic/Set/catalogXml/parseCatalogXml.d.ts.map +1 -0
  83. package/build/types/web-planner-logic/src/logic/Set/catalogXml/types.d.ts +66 -0
  84. package/build/types/web-planner-logic/src/logic/Set/catalogXml/types.d.ts.map +1 -0
  85. package/build/types/web-planner-logic/src/logic/bootMark.d.ts +71 -0
  86. package/build/types/web-planner-logic/src/logic/bootMark.d.ts.map +1 -0
  87. package/build/types/web-planner-logic/src/model/Articles/Article/CatalogArticleData.d.ts +1 -0
  88. package/build/types/web-planner-logic/src/model/Articles/Article/CatalogArticleData.d.ts.map +1 -1
  89. package/build/types/web-planner-logic/src/model/Articles/Article/IDMCatalogArticle.d.ts +11 -0
  90. package/build/types/web-planner-logic/src/model/Articles/Article/IDMCatalogArticle.d.ts.map +1 -1
  91. package/build/types/web-planner-logic/src/model/Catalog/CatalogData.d.ts +13 -0
  92. package/build/types/web-planner-logic/src/model/Catalog/CatalogData.d.ts.map +1 -1
  93. package/build/types/web-planner-logic/src/model/Catalog/IDMCatalogData.d.ts.map +1 -1
  94. package/build/types/web-planner-logic/src/model/Planner/DockingPoint.d.ts +1 -44
  95. package/build/types/web-planner-logic/src/model/Planner/DockingPoint.d.ts.map +1 -1
  96. package/build/types/web-planner-logic/src/model/Planner/PlannerElementData.d.ts +6 -1
  97. package/build/types/web-planner-logic/src/model/Planner/PlannerElementData.d.ts.map +1 -1
  98. package/build/types/web-planner-logic/src/test/engineFeatureDefaults.test.d.ts +2 -0
  99. package/build/types/web-planner-logic/src/test/engineFeatureDefaults.test.d.ts.map +1 -0
  100. package/build/types/web-planner-logic/src/test/idmPlannerPaletteView.test.d.ts +2 -0
  101. package/build/types/web-planner-logic/src/test/idmPlannerPaletteView.test.d.ts.map +1 -0
  102. package/build/types/web-planner-logic/src/test/parseSvgOltGeometry.test.d.ts +2 -0
  103. package/build/types/web-planner-logic/src/test/parseSvgOltGeometry.test.d.ts.map +1 -0
  104. package/build/types/web-planner-logic/src/test/stretchGoldenMaster.test.d.ts +2 -0
  105. package/build/types/web-planner-logic/src/test/stretchGoldenMaster.test.d.ts.map +1 -0
  106. package/package.json +5 -5
  107. package/build/cjs/PlannerHandler2D-dbe1d858.js +0 -2470
  108. package/build/esm/PlannerHandler2D-f8657005.js +0 -2455
@@ -1,30 +1,32 @@
1
1
  'use strict';
2
2
 
3
+ var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
3
4
  var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');
4
5
  var _classCallCheck = require('@babel/runtime/helpers/classCallCheck');
5
6
  var _createClass = require('@babel/runtime/helpers/createClass');
6
7
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
7
8
  var _regeneratorRuntime = require('@babel/runtime/regenerator');
8
- var index = require('./index-d63749e4.js');
9
+ var index = require('./index-7d87a838.js');
9
10
  var DivaUtils = require('@crystaldesign/diva-utils');
10
- var PlannerHandler2D = require('./PlannerHandler2D-dbe1d858.js');
11
+ var planner2dCore = require('@crystaldesign/planner-2d-core');
12
+ var PlannerHandler2D = require('./PlannerHandler2D-e2c83aec.js');
11
13
  require('@babel/runtime/helpers/slicedToArray');
12
14
  require('@babel/runtime/helpers/objectWithoutProperties');
13
- require('@babel/runtime/helpers/toConsumableArray');
14
15
  require('axios');
15
16
  require('@crystaldesign/basket-model');
16
17
  require('@babel/runtime/helpers/typeof');
18
+ require('fast-xml-parser');
17
19
  require('@babel/runtime/helpers/possibleConstructorReturn');
18
20
  require('@babel/runtime/helpers/getPrototypeOf');
19
21
  require('@babel/runtime/helpers/inherits');
20
22
  require('@babel/runtime/helpers/wrapNativeSuper');
21
23
  require('@crystaldesign/basket-handler');
22
24
  require('socket.io-client');
23
- require('fabric');
24
- require('w3c-xmlserializer');
25
+ require('@babel/runtime/helpers/get');
25
26
 
26
27
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
27
28
 
29
+ var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
28
30
  var _asyncToGenerator__default = /*#__PURE__*/_interopDefaultLegacy(_asyncToGenerator);
29
31
  var _classCallCheck__default = /*#__PURE__*/_interopDefaultLegacy(_classCallCheck);
30
32
  var _createClass__default = /*#__PURE__*/_interopDefaultLegacy(_createClass);
@@ -32,6 +34,26 @@ var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_definePropert
32
34
  var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultLegacy(_regeneratorRuntime);
33
35
  var DivaUtils__default = /*#__PURE__*/_interopDefaultLegacy(DivaUtils);
34
36
 
37
+ /** Configurator 2.0 set planner payload (`SetPlanData` after base64 decode). */
38
+
39
+ /** Legacy planner 1.x payload (no `v: 2` wrapper). */
40
+
41
+ function parseSetPlanData(setPlanData) {
42
+ var planDataString = DivaUtils__default["default"].decodeBase64(setPlanData);
43
+ return JSON.parse(planDataString);
44
+ }
45
+ function isSavePlannerV2(planData) {
46
+ return planData.v === 2;
47
+ }
48
+
49
+ /** Article codex from a V2 or legacy element record. */
50
+ function saveElementArticleCodex(element) {
51
+ return element.articleCodex || element.Codex;
52
+ }
53
+
54
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(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; } } }; }
55
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(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(r, a) : void 0; } }
56
+ function _arrayLikeToArray(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; }
35
57
  var LOG = DivaUtils__default["default"].initLog('Planner', 'WEB-PLANNER-LOGIC');
36
58
  var ACC_DOCK_TYPES = ['AVO', 'AVU', 'AVC', 'AVS', 'AVN'];
37
59
  var DivaStandardPlanner = /*#__PURE__*/function () {
@@ -61,7 +83,13 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
61
83
  _defineProperty__default["default"](this, "nextElementId", 1);
62
84
  _defineProperty__default["default"](this, "collisionHandler", void 0);
63
85
  _defineProperty__default["default"](this, "dockToAVUorAVOororAVNorAVSorAVC", function (plannerElement, targetElements) {
64
- if (plannerElement.HasAVU) {
86
+ // Capability comes from the SVG-parsed docking points, not the catalog metadata counts
87
+ // (countAV*): the parsed SVG is the same source the targeted dock (tryDockElementToDP) uses, so
88
+ // auto-dock stays consistent with it even when the catalog's SVG detail info misses the counts.
89
+ var hasFreeDP = function hasFreeDP(type) {
90
+ return plannerElement.getFreeDockingPointsByType(type).length > 0;
91
+ };
92
+ if (hasFreeDP('AVU')) {
65
93
  //Try to dock Element to free AVR
66
94
  var successDP = PlannerHandler2D.dockingPointHandlerInst.tryDockElement(plannerElement, 'AVU', targetElements);
67
95
  if (successDP) {
@@ -77,28 +105,28 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
77
105
  if (_successDP) return true;
78
106
  }
79
107
  }
80
- if (plannerElement.HasAVO) {
108
+ if (hasFreeDP('AVO')) {
81
109
  var _successDP2 = PlannerHandler2D.dockingPointHandlerInst.tryDockElement(plannerElement, 'AVO', targetElements);
82
110
  if (_successDP2) {
83
111
  _this.updateWorldPos(plannerElement, _successDP2);
84
112
  return true;
85
113
  }
86
114
  }
87
- if (plannerElement.HasAVN) {
115
+ if (hasFreeDP('AVN')) {
88
116
  var _successDP3 = PlannerHandler2D.dockingPointHandlerInst.tryDockElement(plannerElement, 'AVN', targetElements);
89
117
  if (_successDP3) {
90
118
  _this.updateWorldPos(plannerElement, _successDP3);
91
119
  return true;
92
120
  }
93
121
  }
94
- if (plannerElement.HasAVS) {
122
+ if (hasFreeDP('AVS')) {
95
123
  var _successDP4 = PlannerHandler2D.dockingPointHandlerInst.tryDockElement(plannerElement, 'AVS', targetElements);
96
124
  if (_successDP4) {
97
125
  _this.updateWorldPos(plannerElement, _successDP4);
98
126
  return true;
99
127
  }
100
128
  }
101
- if (plannerElement.HasAVC) {
129
+ if (hasFreeDP('AVC')) {
102
130
  var _successDP5 = PlannerHandler2D.dockingPointHandlerInst.tryDockElement(plannerElement, 'AVC', targetElements);
103
131
  if (_successDP5) {
104
132
  _this.updateWorldPos(plannerElement, _successDP5);
@@ -231,30 +259,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
231
259
  var refElement = this.plannerElements.get(dockingPoint.OnElementId);
232
260
  var refDockingPoint = refElement.getDockingPointById(dockingPoint.OnDP.DpId);
233
261
  if (refDockingPoint == undefined) return updateConfig;
234
- var worldPosNewElement = new index.Vector3(0, 0, 0);
235
- var worldPosNewElementIgnoreOLF = new index.Vector3(0, 0, 0);
236
-
237
- // DP LocalWorldPos is OLF-corner-relative when HasOLFPolygon (from SVG). Convert to OLT-corner-relative for WorldPosCornerIgnoreOLF.
238
- var refDPLocalOlt = refElement.HasOLFPolygon ? new index.Vector2(refDockingPoint.LocalWorldPos.x - refElement.getOltLeft(), refDockingPoint.LocalWorldPos.z - refElement.getOltTop()) : new index.Vector2(refDockingPoint.LocalWorldPos.x, refDockingPoint.LocalWorldPos.z);
239
- var newDPLocalOlt = plannerElement.HasOLFPolygon ? new index.Vector2(dockingPoint.LocalWorldPos.x - plannerElement.getOltLeft(), dockingPoint.LocalWorldPos.z - plannerElement.getOltTop()) : new index.Vector2(dockingPoint.LocalWorldPos.x, dockingPoint.LocalWorldPos.z);
240
- var rotatedLocalRefDP = new index.Vector2(refDockingPoint.LocalWorldPos.x, refDockingPoint.LocalWorldPos.z);
241
- rotatedLocalRefDP = index.Vector2.rotateOrigin(rotatedLocalRefDP, refElement.RotDeg);
242
- var angleToRot = refElement.RotDeg + refDockingPoint.RotDeg - dockingPoint.RotDeg;
243
- plannerElement.RotDeg = angleToRot;
244
- var refWorldPosCor = refElement.WorldPosCorner;
245
- // For ref without OLF: use same corner for both alignments (no OLF/OLT split; WorldPosCornerIgnoreOLF getter also does this).
246
- var refWorldPosCorIgnoreOLF = refElement.HasOLFPolygon ? refElement.WorldPosCornerIgnoreOLF : refWorldPosCor;
247
- var rotatedLocalDP2D = index.Vector2.rotateOrigin(new index.Vector2(dockingPoint.LocalWorldPos.x, dockingPoint.LocalWorldPos.z), angleToRot);
248
- worldPosNewElement.x = refWorldPosCor.x + rotatedLocalRefDP.x - rotatedLocalDP2D.x;
249
- worldPosNewElement.y = refWorldPosCor.y + refDockingPoint.LocalWorldPos.y - dockingPoint.LocalWorldPos.y;
250
- worldPosNewElement.z = refWorldPosCor.z + rotatedLocalRefDP.y - rotatedLocalDP2D.y;
251
- var rotatedRefDPOlt = index.Vector2.rotateOrigin(refDPLocalOlt, refElement.RotDeg);
252
- var rotatedNewDPOlt = index.Vector2.rotateOrigin(newDPLocalOlt, angleToRot);
253
- worldPosNewElementIgnoreOLF.x = refWorldPosCorIgnoreOLF.x + rotatedRefDPOlt.x - rotatedNewDPOlt.x;
254
- worldPosNewElementIgnoreOLF.z = refWorldPosCorIgnoreOLF.z + rotatedRefDPOlt.y - rotatedNewDPOlt.y;
255
- worldPosNewElementIgnoreOLF.y = refWorldPosCorIgnoreOLF.y + refDockingPoint.LocalWorldPos.y - dockingPoint.LocalWorldPos.y;
256
- plannerElement.WorldPosCorner = worldPosNewElement;
257
- plannerElement.WorldPosCornerIgnoreOLF = worldPosNewElementIgnoreOLF;
262
+ this.applyDockTransform(plannerElement, refElement, dockingPoint, refDockingPoint);
258
263
  updateConfig = this.set.onDockingChanged(plannerElement.ElementId, refElement.ElementId, 'DOCK', dockingPoint.Type);
259
264
  var data = this.set.getPlannerData(plannerElement.ElementId);
260
265
  plannerElement.updatePlannerData(data);
@@ -263,15 +268,81 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
263
268
  return updateConfig;
264
269
  }
265
270
 
271
+ /**
272
+ * Positions `plannerElement` so its `dockingPoint` aligns to `refElement`'s `refDockingPoint`
273
+ * (rotation + OLF/OLT-aware translation). Mutates only the element's world position and rotation —
274
+ * NOT the docking relations — so it is reusable for a non-committing snap preview
275
+ * ({@link getDockSnapPreview}) as well as the real dock ({@link updateWorldPos}).
276
+ */
277
+ }, {
278
+ key: "applyDockTransform",
279
+ value: function applyDockTransform(plannerElement, refElement, dockingPoint, refDockingPoint) {
280
+ var dockedTransform = planner2dCore.computeDockedTransform(refElement, refDockingPoint, plannerElement, dockingPoint);
281
+ plannerElement.RotDeg = dockedTransform.rotDeg;
282
+ plannerElement.WorldPosCorner = new index.Vector3(dockedTransform.worldPosCorner.x, dockedTransform.worldPosCorner.y, dockedTransform.worldPosCorner.z);
283
+ plannerElement.WorldPosCornerIgnoreOLF = new index.Vector3(dockedTransform.worldPosCornerIgnoreOLF.x, dockedTransform.worldPosCornerIgnoreOLF.y, dockedTransform.worldPosCornerIgnoreOLF.z);
284
+ }
285
+
286
+ /**
287
+ * Non-committing preview of where `elementId` would auto-snap if released now: runs the same
288
+ * dockable-pair search as END, and for the closest pair computes the docked transform via
289
+ * {@link applyDockTransform} (apply → read → restore, no docking relations touched). Returns the
290
+ * delta from the element's current transform (cm / deg), or null if nothing is in snapping range.
291
+ * `excludeElementIds` skips the element's own move-group so it doesn't "snap" to siblings that
292
+ * are translating with it.
293
+ */
294
+ }, {
295
+ key: "getDockSnapPreview",
296
+ value: function getDockSnapPreview(elementId, autoDockingDistance) {
297
+ var excludeElementIds = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
298
+ var element = this.plannerElements.get(elementId);
299
+ if (!element) return null;
300
+ var targets = this.getAllPlannerElements().filter(function (e) {
301
+ return e.getElementId() !== elementId && !excludeElementIds.includes(e.getElementId());
302
+ });
303
+ var pairs = PlannerHandler2D.dockingPointHandlerInst.searchDockableElementsInArea(element, targets, autoDockingDistance);
304
+ if (!pairs || pairs.size === 0) return null;
305
+ var best;
306
+ pairs.forEach(function (p) {
307
+ if (best == undefined || p.distance < best.distance) best = p;
308
+ });
309
+ if (best == undefined) return null;
310
+ var targetElement = this.plannerElements.get(best.targetDP.ElementId);
311
+ if (!targetElement) return null;
312
+ var savedRot = element.RotDeg;
313
+ var savedCenter = element.WorldPosCenter;
314
+ var savedX = savedCenter.x,
315
+ savedY = savedCenter.y,
316
+ savedZ = savedCenter.z;
317
+ this.applyDockTransform(element, targetElement, best.sourceDP, best.targetDP);
318
+ var snapped = element.WorldPosCenter;
319
+ var result = {
320
+ dx: snapped.x - savedX,
321
+ dz: snapped.z - savedZ,
322
+ dRotDeg: element.RotDeg - savedRot
323
+ };
324
+ // Restore — the preview must leave the planner state untouched.
325
+ element.RotDeg = savedRot;
326
+ element.WorldPosCenter = new index.Vector3(savedX, savedY, savedZ);
327
+ return result;
328
+ }
329
+
266
330
  /**
267
331
  * This function updates the position information of all elements. It is called after updating the SVG of 1 element.
268
332
  * The position is updated based on the posNr.
269
333
  * At the end - the collision is calculated
334
+ * @param changedElementIds elements whose SVG was reloaded this cycle (their docking geometry may
335
+ * have moved, e.g. an AVC shifted by stretch areas). Elements docked - directly or transitively -
336
+ * to one of them are re-anchored to the moved partner after the PosNr walk, which on its own only
337
+ * propagates forward in PosNr order and prefers AVL over AVC anchors.
270
338
  */
271
339
  }, {
272
340
  key: "updateAllElementsWorldPos",
273
- value: function updateAllElementsWorldPos(checkCollisionSingleElementId) {
341
+ value: function updateAllElementsWorldPos(checkCollisionSingleElementId, changedElementIds) {
274
342
  if (this.doDisablePlanner2D) return false;
343
+ var getDockedDPsInPriorityOrder = function getDockedDPsInPriorityOrder(element) {
344
+ return element.getDockingDockingPointsByType('AVL').concat(element.getDockingDockingPointsByType('AVR')).concat(element.getDockingDockingPointsByType('AVU')).concat(element.getDockingDockingPointsByType('AVO')).concat(element.getDockingDockingPointsByType('AVN')).concat(element.getDockingDockingPointsByType('AVS')).concat(element.getDockingDockingPointsByType('AVC'));
345
+ };
275
346
  var updateConfig = false;
276
347
  var sortedPlannerElementsbyPosNr = [];
277
348
  var accElems = [];
@@ -292,7 +363,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
292
363
  var element = sortedPlannerElementsbyPosNr[i];
293
364
  alreadyCorrectedId.push(element.ElementId);
294
365
  if (i > firstI) {
295
- var dockingPoints = element.getDockingDockingPointsByType('AVL').concat(element.getDockingDockingPointsByType('AVR')).concat(element.getDockingDockingPointsByType('AVU')).concat(element.getDockingDockingPointsByType('AVO')).concat(element.getDockingDockingPointsByType('AVN')).concat(element.getDockingDockingPointsByType('AVS')).concat(element.getDockingDockingPointsByType('AVC'));
366
+ var dockingPoints = getDockedDPsInPriorityOrder(element);
296
367
  for (var j = 0; j < dockingPoints.length; j++) {
297
368
  //Nur wenn er auf ein element schaut das schon gedockt ist korrigieren
298
369
  if (alreadyCorrectedId.indexOf(dockingPoints[j].OnElementId) >= 0) {
@@ -303,6 +374,38 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
303
374
  }
304
375
  }
305
376
  }
377
+
378
+ // The walk above anchors each element to its FIRST docked partner in AVL-first priority and
379
+ // only propagates forward in PosNr order - both hide a geometry change in a reloaded partner
380
+ // (e.g. an AVC line shifted by stretch areas). Sweep outward from the reloaded elements:
381
+ // re-anchor every element docked - directly or transitively - to a moved partner, until stable.
382
+ if (changedElementIds && changedElementIds.length > 0) {
383
+ var moved = new Set(changedElementIds);
384
+ var progressed = true;
385
+ while (progressed) {
386
+ progressed = false;
387
+ var _iterator = _createForOfIteratorHelper(sortedPlannerElementsbyPosNr),
388
+ _step;
389
+ try {
390
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
391
+ var _element = _step.value;
392
+ if (!_element || moved.has(_element.ElementId)) continue;
393
+ var dpToMovedPartner = getDockedDPsInPriorityOrder(_element).find(function (dp) {
394
+ return moved.has(dp.OnElementId);
395
+ });
396
+ if (dpToMovedPartner) {
397
+ updateConfig = this.updateWorldPos(_element, dpToMovedPartner) || updateConfig;
398
+ moved.add(_element.ElementId);
399
+ progressed = true;
400
+ }
401
+ }
402
+ } catch (err) {
403
+ _iterator.e(err);
404
+ } finally {
405
+ _iterator.f();
406
+ }
407
+ }
408
+ }
306
409
  this.checkCollision(false, checkCollisionSingleElementId);
307
410
  return updateConfig;
308
411
  }
@@ -789,7 +892,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
789
892
  elementsToDelete.push(elementsLostDockingRelation[i].ElementId);
790
893
  }
791
894
  }
792
- this.updateAllElementsWorldPos();
895
+ this.updateAllElementsWorldPos(undefined, elemtsWhereSomethingChanged);
793
896
  this.updatePlannerPosNr();
794
897
  this.updatePlannerBoundingBox();
795
898
  }
@@ -819,14 +922,13 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
819
922
  key: "extendPlanner",
820
923
  value: (function () {
821
924
  var _extendPlanner = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee4(setPlanData, globalBoundingBox) {
822
- var planDataString, planData, jsonElements, elementsSortedbyPosNr, accElements, oldElementidMapping, i, _jsonElement$Accessoi, jsonElement, catalogArticle, plannerElement, data, curElement, DPsInfo, j, dpInfo, sourceDP, targetElement, targetDP;
925
+ var planData, jsonElements, elementsSortedbyPosNr, accElements, oldElementidMapping, i, _saveElementArticleCo, _jsonElement$Accessoi, jsonElement, catalogArticle, plannerElement, data, elementsForDockingExtend, row, curElement, DPsInfo, j, dpInfo, sourceDP, targetElement, targetDP;
823
926
  return _regeneratorRuntime__default["default"].wrap(function _callee4$(_context4) {
824
927
  while (1) switch (_context4.prev = _context4.next) {
825
928
  case 0:
826
- planDataString = DivaUtils__default["default"].decodeBase64(setPlanData);
827
- planData = JSON.parse(planDataString);
828
- if (!(planData.v != null && planData.v == 2)) {
829
- _context4.next = 40;
929
+ planData = parseSetPlanData(setPlanData);
930
+ if (!isSavePlannerV2(planData)) {
931
+ _context4.next = 39;
830
932
  break;
831
933
  }
832
934
  jsonElements = planData.set.elements;
@@ -834,70 +936,70 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
834
936
  accElements = [];
835
937
  oldElementidMapping = new Map(); //First reset planner element values in jsonElement so that every set is planned to be set to origin
836
938
  i = 0;
837
- case 8:
939
+ case 7:
838
940
  if (!(i < jsonElements.length)) {
839
- _context4.next = 36;
941
+ _context4.next = 35;
840
942
  break;
841
943
  }
842
- _context4.prev = 9;
944
+ _context4.prev = 8;
843
945
  jsonElement = jsonElements[i];
844
- catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex(jsonElement.articleCodex || jsonElement.Codex);
946
+ catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex((_saveElementArticleCo = saveElementArticleCodex(jsonElement)) !== null && _saveElementArticleCo !== void 0 ? _saveElementArticleCo : '');
845
947
  if (!(!catalogArticle && (_jsonElement$Accessoi = jsonElement.AccessoireInitParams) !== null && _jsonElement$Accessoi !== void 0 && _jsonElement$Accessoi.RelatedToBasketID && !this.set.getSetState.onlyRunLogic)) {
846
- _context4.next = 15;
948
+ _context4.next = 14;
847
949
  break;
848
950
  }
849
951
  LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
850
952
  code: 'WC_0012'
851
953
  }));
852
- return _context4.abrupt("continue", 33);
853
- case 15:
954
+ return _context4.abrupt("continue", 32);
955
+ case 14:
854
956
  plannerElement = new index.PlannerElementData(this.set.getSetId(), jsonElement.basketID, this.nextElementId, DivaStandardPlanner.plannerType);
855
- oldElementidMapping.set(parseInt(jsonElement.elementID), plannerElement);
957
+ oldElementidMapping.set(jsonElement.elementID, plannerElement);
856
958
  this.nextElementId = plannerElement.getElementId() + 1;
857
959
  this.plannerElements.set(plannerElement.ElementId, plannerElement);
858
960
  this.set.setElementId(jsonElement.basketID, plannerElement.ElementId);
859
961
  data = this.set.getPlannerData(plannerElement.ElementId);
860
962
  plannerElement.updatePlannerData(data);
861
963
  if (this.doDisablePlanner2D) {
862
- _context4.next = 25;
964
+ _context4.next = 24;
863
965
  break;
864
966
  }
865
- _context4.next = 25;
967
+ _context4.next = 24;
866
968
  return PlannerHandler2D.handler2D.loadSVG(plannerElement, this.set);
867
- case 25:
969
+ case 24:
868
970
  plannerElement.WorldPosCenter = new index.Vector3(globalBoundingBox.WorldPos.x + globalBoundingBox.Size.x + jsonElement.x + 100, globalBoundingBox.WorldPos.y + jsonElement.y, globalBoundingBox.WorldPos.z + jsonElement.z);
869
971
  plannerElement.RotDeg = jsonElement.rot;
870
972
  if (plannerElement.IsDockedAccessoire) {
871
973
  accElements.push(jsonElement);
872
974
  plannerElement.PosNr = jsonElement.posNr;
873
- plannerElement.AccessoirePosNr = jsonElement.accNr;
975
+ if (jsonElement.accNr != null) plannerElement.AccessoirePosNr = jsonElement.accNr;
874
976
  } else {
875
977
  elementsSortedbyPosNr[jsonElement.posNr - 1] = jsonElement;
876
978
  plannerElement.PosNr = jsonElement.posNr;
877
979
  }
878
- _context4.next = 33;
980
+ _context4.next = 32;
879
981
  break;
880
- case 30:
881
- _context4.prev = 30;
882
- _context4.t0 = _context4["catch"](9);
982
+ case 29:
983
+ _context4.prev = 29;
984
+ _context4.t0 = _context4["catch"](8);
883
985
  LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
884
986
  cause: _context4.t0,
885
987
  code: 'WC_0012'
886
988
  }));
887
- case 33:
989
+ case 32:
888
990
  i++;
889
- _context4.next = 8;
991
+ _context4.next = 7;
890
992
  break;
891
- case 36:
892
- elementsSortedbyPosNr = elementsSortedbyPosNr.concat(accElements);
893
- for (i = 0; i < elementsSortedbyPosNr.length; i++) {
894
- curElement = oldElementidMapping.get(elementsSortedbyPosNr[i].elementID);
895
- if (elementsSortedbyPosNr.length > 1) {
896
- //This is the case when a complex product is loaded
897
- //First element is already positioned correctly not docket
993
+ case 35:
994
+ elementsForDockingExtend = [].concat(_toConsumableArray__default["default"](elementsSortedbyPosNr.filter(function (e) {
995
+ return e != null;
996
+ })), accElements);
997
+ for (i = 0; i < elementsForDockingExtend.length; i++) {
998
+ row = elementsForDockingExtend[i];
999
+ curElement = oldElementidMapping.get(row.elementID);
1000
+ if (elementsForDockingExtend.length > 1) {
898
1001
  if (i > 0) {
899
- //The other elements are docked to the First element.
900
- DPsInfo = elementsSortedbyPosNr[i].DP;
1002
+ DPsInfo = row.DP;
901
1003
  for (j = 0; j < DPsInfo.length; j++) {
902
1004
  dpInfo = DPsInfo[j];
903
1005
  sourceDP = curElement === null || curElement === void 0 ? void 0 : curElement.getDockingPointById(dpInfo.id);
@@ -910,17 +1012,17 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
910
1012
  }
911
1013
  }
912
1014
  }
913
- _context4.next = 41;
1015
+ _context4.next = 40;
914
1016
  break;
915
- case 40:
1017
+ case 39:
916
1018
  LOG.error(new DivaUtils.DivaError('The function extend Planner works only with products that are saved in the configurator 2.0', {
917
1019
  code: 'WC_0012'
918
1020
  }));
919
- case 41:
1021
+ case 40:
920
1022
  case "end":
921
1023
  return _context4.stop();
922
1024
  }
923
- }, _callee4, this, [[9, 30]]);
1025
+ }, _callee4, this, [[8, 29]]);
924
1026
  }));
925
1027
  function extendPlanner(_x7, _x8) {
926
1028
  return _extendPlanner.apply(this, arguments);
@@ -931,46 +1033,44 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
931
1033
  key: "initPlanner",
932
1034
  value: function () {
933
1035
  var _initPlanner = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee5(setPlanData) {
934
- var planDataString, planData, jsonElements, elementsSortedbyPosNr, accElements, i, _jsonElement$Accessoi2, jsonElement, catalogArticle, elementID, plannerElement, data, onlyOneBaseElement, _jsonElement, hasSavedPos, element, DPsInfo, j, dpInfo, sourceElement, sourceDP, targetElement, targetDP, _jsonElements, _elementsSortedbyPosNr, _accElements, _jsonElement2$Accesso, _jsonElement2, _catalogArticle, basketID, elementId, _plannerElement, _data, centerWorldPos, parentPosNr, accPosNr, _DPsInfo, _dpInfo, _this$plannerElements, targetElementId, dpType, curElement, _targetElement;
1036
+ var planData, _planData$set, jsonElements, elementsSortedbyPosNr, accElements, i, _saveElementArticleCo2, _jsonElement$Accessoi2, jsonElement, catalogArticle, elementID, plannerElement, data, onlyOneBaseElement, elementsForDocking, row, _jsonElement, hasSavedPos, element, DPsInfo, j, dpInfo, sourceElement, sourceDP, targetElement, targetDP, alreadyDocked, docked, _elementsForDocking$i, elementId, _planData$Sets, _legacySet$Elements, legacySet, _jsonElements, _elementsSortedbyPosNr, _accElements, _saveElementArticleCo3, _jsonElement2$Accesso, _jsonElement2, _catalogArticle, basketID, _elementId, _plannerElement, _data, centerWorldPos, parentPosNr, accPosNr, elementsForDockingV1, _row, _DPsInfo, _dpInfo, _this$plannerElements, targetElementId, dpType, curElement, _targetElement, anchorElement;
935
1037
  return _regeneratorRuntime__default["default"].wrap(function _callee5$(_context5) {
936
1038
  while (1) switch (_context5.prev = _context5.next) {
937
1039
  case 0:
938
- planDataString = DivaUtils__default["default"].decodeBase64(setPlanData);
939
- planData = JSON.parse(planDataString);
940
- if (!(planData.v != null && planData.v == 2)) {
941
- _context5.next = 62;
1040
+ planData = parseSetPlanData(setPlanData);
1041
+ if (!isSavePlannerV2(planData)) {
1042
+ _context5.next = 63;
942
1043
  break;
943
1044
  }
944
1045
  LOG.debug('Initialize set Plan Data - V2\n' + planData, 'DivaStandardPlanner initPlanner');
945
- if (!(!planData.set || !planData.set.elements || planData.set.elements.length == 0)) {
946
- _context5.next = 6;
1046
+ if ((_planData$set = planData.set) !== null && _planData$set !== void 0 && (_planData$set = _planData$set.elements) !== null && _planData$set !== void 0 && _planData$set.length) {
1047
+ _context5.next = 5;
947
1048
  break;
948
1049
  }
949
1050
  return _context5.abrupt("return");
950
- case 6:
951
- //Init new saved Plannings
1051
+ case 5:
952
1052
  jsonElements = planData.set.elements;
953
1053
  elementsSortedbyPosNr = [];
954
1054
  accElements = [];
955
1055
  i = 0;
956
- case 10:
1056
+ case 9:
957
1057
  if (!(i < jsonElements.length)) {
958
- _context5.next = 38;
1058
+ _context5.next = 37;
959
1059
  break;
960
1060
  }
961
- _context5.prev = 11;
1061
+ _context5.prev = 10;
962
1062
  jsonElement = jsonElements[i];
963
- catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex(jsonElement.articleCodex || jsonElement.Codex);
1063
+ catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex((_saveElementArticleCo2 = saveElementArticleCodex(jsonElement)) !== null && _saveElementArticleCo2 !== void 0 ? _saveElementArticleCo2 : '');
964
1064
  if (!(!catalogArticle && (_jsonElement$Accessoi2 = jsonElement.AccessoireInitParams) !== null && _jsonElement$Accessoi2 !== void 0 && _jsonElement$Accessoi2.RelatedToBasketID && !this.set.getSetState.onlyRunLogic)) {
965
- _context5.next = 17;
1065
+ _context5.next = 16;
966
1066
  break;
967
1067
  }
968
1068
  LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
969
1069
  code: 'WC_0012'
970
1070
  }));
971
- return _context5.abrupt("continue", 35);
972
- case 17:
973
- elementID = parseInt(jsonElement.elementID);
1071
+ return _context5.abrupt("continue", 34);
1072
+ case 16:
1073
+ elementID = jsonElement.elementID;
974
1074
  plannerElement = new index.PlannerElementData(this.set.getSetId(), jsonElement.basketID, elementID, DivaStandardPlanner.plannerType);
975
1075
  this.nextElementId = elementID + 1;
976
1076
  this.plannerElements.set(plannerElement.ElementId, plannerElement);
@@ -978,12 +1078,12 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
978
1078
  data = this.set.getPlannerData(plannerElement.ElementId);
979
1079
  plannerElement.updatePlannerData(data);
980
1080
  if (this.doDisablePlanner2D) {
981
- _context5.next = 27;
1081
+ _context5.next = 26;
982
1082
  break;
983
1083
  }
984
- _context5.next = 27;
1084
+ _context5.next = 26;
985
1085
  return PlannerHandler2D.handler2D.loadSVG(plannerElement, this.set);
986
- case 27:
1086
+ case 26:
987
1087
  //Im neuen speichern ist die Position hinten link - nicht mehr im Centrum wie im alten Planer
988
1088
  //plannerElement.WorldPosCenter = new Vector3(jsonElement.x, jsonElement.y, jsonElement.z);
989
1089
  plannerElement.WorldPosCenter = new index.Vector3(this.plannerBoundingBox.WorldPos.x + jsonElement.x, this.plannerBoundingBox.WorldPos.y + jsonElement.y, this.plannerBoundingBox.WorldPos.z + jsonElement.z);
@@ -991,141 +1091,151 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
991
1091
  if (plannerElement.IsDockedAccessoire) {
992
1092
  accElements.push(jsonElement);
993
1093
  plannerElement.PosNr = jsonElement.posNr;
994
- plannerElement.AccessoirePosNr = jsonElement.accNr;
1094
+ if (jsonElement.accNr != null) plannerElement.AccessoirePosNr = jsonElement.accNr;
995
1095
  } else {
996
1096
  elementsSortedbyPosNr[jsonElement.posNr - 1] = jsonElement;
997
1097
  plannerElement.PosNr = jsonElement.posNr;
998
1098
  }
999
- _context5.next = 35;
1099
+ _context5.next = 34;
1000
1100
  break;
1001
- case 32:
1002
- _context5.prev = 32;
1003
- _context5.t0 = _context5["catch"](11);
1101
+ case 31:
1102
+ _context5.prev = 31;
1103
+ _context5.t0 = _context5["catch"](10);
1004
1104
  LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
1005
1105
  cause: _context5.t0,
1006
1106
  code: 'WC_0012'
1007
1107
  }));
1008
- case 35:
1108
+ case 34:
1009
1109
  i++;
1010
- _context5.next = 10;
1110
+ _context5.next = 9;
1011
1111
  break;
1012
- case 38:
1013
- onlyOneBaseElement = elementsSortedbyPosNr.length == 1; //Saves if only one base element is in the planning. All the others are only accessoires
1014
- elementsSortedbyPosNr = elementsSortedbyPosNr.concat(accElements);
1112
+ case 37:
1113
+ onlyOneBaseElement = elementsSortedbyPosNr.filter(Boolean).length == 1; //Saves if only one base element is in the planning. All the others are only accessoires
1114
+ elementsForDocking = [].concat(_toConsumableArray__default["default"](elementsSortedbyPosNr.filter(function (e) {
1115
+ return e != null;
1116
+ })), accElements);
1015
1117
  i = 0;
1016
- case 41:
1017
- if (!(i < elementsSortedbyPosNr.length)) {
1018
- _context5.next = 60;
1118
+ case 40:
1119
+ if (!(i < elementsForDocking.length)) {
1120
+ _context5.next = 61;
1019
1121
  break;
1020
1122
  }
1021
- _context5.prev = 42;
1123
+ _context5.prev = 41;
1124
+ row = elementsForDocking[i];
1022
1125
  if (!(i == 0 && onlyOneBaseElement && this.plannerHasStaticBackground)) {
1023
1126
  _context5.next = 48;
1024
1127
  break;
1025
1128
  }
1026
1129
  //if the planner has a static background room and there is only one base element (ignore docked ACCs) then it should be forced positioned in the center of the room.
1027
1130
  //Only do this for fresh plannings - if the saved planData already contains a position, keep it.
1131
+ //if the planner has a static background room and there is only one base element (ignore docked ACCs) then it should be forced positioned in the center of the room
1028
1132
  _jsonElement = elementsSortedbyPosNr[i];
1029
- hasSavedPos = _jsonElement.x != null || _jsonElement.y != null || _jsonElement.z != null;
1133
+ hasSavedPos = (_jsonElement === null || _jsonElement === void 0 ? void 0 : _jsonElement.x) != null || (_jsonElement === null || _jsonElement === void 0 ? void 0 : _jsonElement.y) != null || (_jsonElement === null || _jsonElement === void 0 ? void 0 : _jsonElement.z) != null;
1030
1134
  if (!hasSavedPos) {
1031
- element = this.plannerElements.get(_jsonElement.elementID);
1135
+ element = this.plannerElements.get(row.elementID);
1032
1136
  if (element) element.WorldPosCenter = new index.Vector3(0, element.Height / 2, element.Depth / 2);
1033
1137
  }
1034
- return _context5.abrupt("continue", 57);
1138
+ return _context5.abrupt("continue", 58);
1035
1139
  case 48:
1036
- if (!(elementsSortedbyPosNr[i].DP == null || elementsSortedbyPosNr[i].DP.length == 0)) {
1140
+ if (!(row.DP == null || row.DP.length == 0)) {
1037
1141
  _context5.next = 50;
1038
1142
  break;
1039
1143
  }
1040
- return _context5.abrupt("continue", 57);
1144
+ return _context5.abrupt("continue", 58);
1041
1145
  case 50:
1042
- DPsInfo = elementsSortedbyPosNr[i].DP;
1146
+ DPsInfo = row.DP;
1043
1147
  for (j = 0; j < DPsInfo.length; j++) {
1044
1148
  dpInfo = DPsInfo[j];
1045
- if (dpInfo.id && dpInfo.id != '' && dpInfo.onID && dpInfo.onID != '' && dpInfo.onDPID && dpInfo.onDPID != '') {
1046
- sourceElement = this.plannerElements.get(elementsSortedbyPosNr[i].elementID);
1149
+ if (dpInfo.id && dpInfo.onID != null && dpInfo.onDPID) {
1150
+ sourceElement = this.plannerElements.get(row.elementID);
1047
1151
  sourceDP = sourceElement === null || sourceElement === void 0 ? void 0 : sourceElement.getDockingPointById(dpInfo.id);
1048
1152
  targetElement = this.plannerElements.get(dpInfo.onID);
1049
1153
  targetDP = targetElement === null || targetElement === void 0 ? void 0 : targetElement.getDockingPointById(dpInfo.onDPID);
1050
1154
  if (sourceDP && targetDP) {
1051
- PlannerHandler2D.dockingPointHandlerInst.tryDockElementDPToDP(sourceElement, targetElement, sourceDP, targetDP);
1155
+ // Saved plans store each relation on both sides - skip the mirror entry of an already established pair.
1156
+ alreadyDocked = sourceDP.IsDocking && sourceDP.OnDP == targetDP;
1157
+ docked = alreadyDocked || PlannerHandler2D.dockingPointHandlerInst.tryDockElementDPToDP(sourceElement, targetElement, sourceDP, targetDP);
1158
+ if (!docked && !this.doDisablePlanner2D) LOG.error(new DivaUtils.DivaError('Saved docking relation rejected on init: ' + dpInfo.id + ' (elem ' + (sourceElement === null || sourceElement === void 0 ? void 0 : sourceElement.ElementId) + ') -> ' + dpInfo.onDPID + ' (elem ' + (targetElement === null || targetElement === void 0 ? void 0 : targetElement.ElementId) + ')', {
1159
+ code: 'WC_0012'
1160
+ }));
1052
1161
  } else {
1053
1162
  if (!this.doDisablePlanner2D) LOG.error(new DivaUtils.DivaError('Error initializing docking point between source element with id: ' + (sourceElement === null || sourceElement === void 0 ? void 0 : sourceElement.ElementId) + ' and target Element with id: ' + (targetElement === null || targetElement === void 0 ? void 0 : targetElement.ElementId) + '. SourceDPID: ' + dpInfo.id + '; targetDPID: ' + dpInfo.onDPID));
1054
1163
  }
1055
1164
  }
1056
1165
  }
1057
- _context5.next = 57;
1166
+ _context5.next = 58;
1058
1167
  break;
1059
1168
  case 54:
1060
1169
  _context5.prev = 54;
1061
- _context5.t1 = _context5["catch"](42);
1062
- LOG.error(new DivaUtils.DivaError('Error initializing dockingPoints of element with elementID ' + elementsSortedbyPosNr[i].elementID, {
1170
+ _context5.t1 = _context5["catch"](41);
1171
+ elementId = (_elementsForDocking$i = elementsForDocking[i]) === null || _elementsForDocking$i === void 0 ? void 0 : _elementsForDocking$i.elementID;
1172
+ LOG.error(new DivaUtils.DivaError('Error initializing dockingPoints of element with elementID ' + elementId, {
1063
1173
  cause: _context5.t1,
1064
1174
  code: 'WC_0012'
1065
1175
  }));
1066
- case 57:
1176
+ case 58:
1067
1177
  i++;
1068
- _context5.next = 41;
1178
+ _context5.next = 40;
1069
1179
  break;
1070
- case 60:
1071
- _context5.next = 113;
1180
+ case 61:
1181
+ _context5.next = 116;
1072
1182
  break;
1073
- case 62:
1183
+ case 63:
1074
1184
  LOG.debug('Initialize set Plan Data - old V1\n' + planData, 'DivaStandardPlanner initPlanner');
1075
- if (!(!planData.Sets || planData.Sets.length == 0 || !planData.Sets[0].Elements || planData.Sets[0].Elements.length == 0)) {
1076
- _context5.next = 65;
1185
+ legacySet = (_planData$Sets = planData.Sets) === null || _planData$Sets === void 0 ? void 0 : _planData$Sets[0];
1186
+ if (legacySet !== null && legacySet !== void 0 && (_legacySet$Elements = legacySet.Elements) !== null && _legacySet$Elements !== void 0 && _legacySet$Elements.length) {
1187
+ _context5.next = 67;
1077
1188
  break;
1078
1189
  }
1079
1190
  return _context5.abrupt("return");
1080
- case 65:
1081
- //Init old Plannings - saved with the old planner
1082
- _jsonElements = planData.Sets[0].Elements;
1191
+ case 67:
1192
+ _jsonElements = legacySet.Elements;
1083
1193
  _elementsSortedbyPosNr = [];
1084
1194
  _accElements = []; //Zuerst initialisiere alle Elemente
1085
1195
  //Dann positioniere sie richtig
1086
1196
  i = 0;
1087
- case 69:
1197
+ case 71:
1088
1198
  if (!(i < _jsonElements.length)) {
1089
- _context5.next = 103;
1199
+ _context5.next = 105;
1090
1200
  break;
1091
1201
  }
1092
- _context5.prev = 70;
1202
+ _context5.prev = 72;
1093
1203
  _jsonElement2 = _jsonElements[i];
1094
- _catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex(_jsonElement2.articleCodex || _jsonElement2.Codex);
1204
+ _catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex((_saveElementArticleCo3 = saveElementArticleCodex(_jsonElement2)) !== null && _saveElementArticleCo3 !== void 0 ? _saveElementArticleCo3 : '');
1095
1205
  if (!(!_catalogArticle && (_jsonElement2$Accesso = _jsonElement2.AccessoireInitParams) !== null && _jsonElement2$Accesso !== void 0 && _jsonElement2$Accesso.RelatedToBasketID && !this.set.getSetState.onlyRunLogic)) {
1096
- _context5.next = 76;
1206
+ _context5.next = 78;
1097
1207
  break;
1098
1208
  }
1099
- LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
1209
+ LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V1', {
1100
1210
  code: 'WC_0012'
1101
1211
  }));
1102
- return _context5.abrupt("continue", 100);
1103
- case 76:
1212
+ return _context5.abrupt("continue", 102);
1213
+ case 78:
1104
1214
  basketID = _jsonElement2.BasketID;
1105
1215
  if (this.set.getElementId(basketID) == -1) this.set.setElementId(basketID, Number(_jsonElement2.ID));
1106
- elementId = this.set.getElementId(basketID);
1107
- _jsonElement2.elementId = elementId;
1108
- if (!(elementId == -1)) {
1109
- _context5.next = 83;
1216
+ _elementId = this.set.getElementId(basketID);
1217
+ _jsonElement2.elementId = _elementId;
1218
+ if (!(_elementId == -1)) {
1219
+ _context5.next = 85;
1110
1220
  break;
1111
1221
  }
1112
1222
  LOG.error(new DivaUtils.DivaError('Error when initializing planner. The elementID Was not saved in the article. ', {
1113
1223
  code: 'WC_0012'
1114
1224
  }));
1115
- return _context5.abrupt("continue", 100);
1116
- case 83:
1117
- _plannerElement = new index.PlannerElementData(this.set.getSetId(), basketID, elementId, DivaStandardPlanner.plannerType);
1118
- this.nextElementId = elementId + 1;
1225
+ return _context5.abrupt("continue", 102);
1226
+ case 85:
1227
+ _plannerElement = new index.PlannerElementData(this.set.getSetId(), basketID, _elementId, DivaStandardPlanner.plannerType);
1228
+ this.nextElementId = _elementId + 1;
1119
1229
  this.plannerElements.set(_plannerElement.ElementId, _plannerElement);
1120
1230
  _data = this.set.getPlannerData(_plannerElement.ElementId);
1121
1231
  _plannerElement.updatePlannerData(_data);
1122
1232
  if (this.doDisablePlanner2D) {
1123
- _context5.next = 91;
1233
+ _context5.next = 93;
1124
1234
  break;
1125
1235
  }
1126
- _context5.next = 91;
1236
+ _context5.next = 93;
1127
1237
  return PlannerHandler2D.handler2D.loadSVG(_plannerElement, this.set);
1128
- case 91:
1238
+ case 93:
1129
1239
  //Achtung die Pos Infos im alten Planer waren Zentrumskoordinaten!!! Nicht hinten oben.
1130
1240
  centerWorldPos = new index.Vector3(_jsonElement2.PosX, _jsonElement2.PosZ, _jsonElement2.PosY);
1131
1241
  _plannerElement.WorldPosCenter = new index.Vector3(this.plannerBoundingBox.WorldPos.x + centerWorldPos.x, this.plannerBoundingBox.WorldPos.y + centerWorldPos.y, this.plannerBoundingBox.WorldPos.z + centerWorldPos.z);
@@ -1135,70 +1245,75 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1135
1245
  if (_jsonElement2.PosNum.toString().indexOf('.') > 0) {
1136
1246
  parentPosNr = _jsonElement2.PosNum.toString().split('.')[0];
1137
1247
  accPosNr = _jsonElement2.PosNum.toString().split('.')[1];
1138
- _plannerElement.PosNr = parentPosNr;
1139
- _plannerElement.AccessoirePosNr = accPosNr;
1248
+ _plannerElement.PosNr = Number(parentPosNr);
1249
+ _plannerElement.AccessoirePosNr = Number(accPosNr);
1140
1250
  }
1141
1251
  } else {
1142
1252
  _elementsSortedbyPosNr[_jsonElement2.PosNum - 1] = _jsonElement2;
1143
1253
  _plannerElement.PosNr = _jsonElement2.PosNum;
1144
1254
  }
1145
- _context5.next = 100;
1255
+ _context5.next = 102;
1146
1256
  break;
1147
- case 97:
1148
- _context5.prev = 97;
1149
- _context5.t2 = _context5["catch"](70);
1257
+ case 99:
1258
+ _context5.prev = 99;
1259
+ _context5.t2 = _context5["catch"](72);
1150
1260
  LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner - Plan Data old Planner', {
1151
1261
  cause: _context5.t2,
1152
1262
  code: 'WC_0012'
1153
1263
  }));
1154
- case 100:
1264
+ case 102:
1155
1265
  i++;
1156
- _context5.next = 69;
1266
+ _context5.next = 71;
1157
1267
  break;
1158
- case 103:
1159
- _elementsSortedbyPosNr = _elementsSortedbyPosNr.concat(_accElements);
1160
- //Dann werden die DockingPoints durchgegangen und die jeweils richtigen müssen gesucht werden.
1161
- i = 0;
1162
1268
  case 105:
1163
- if (!(i < _elementsSortedbyPosNr.length)) {
1164
- _context5.next = 113;
1269
+ elementsForDockingV1 = [].concat(_toConsumableArray__default["default"](_elementsSortedbyPosNr.filter(function (e) {
1270
+ return e != null;
1271
+ })), _accElements);
1272
+ i = 0;
1273
+ case 107:
1274
+ if (!(i < elementsForDockingV1.length)) {
1275
+ _context5.next = 116;
1165
1276
  break;
1166
1277
  }
1167
- if (!(_elementsSortedbyPosNr[i].DP == null || _elementsSortedbyPosNr[i].DP.length == 0)) {
1168
- _context5.next = 108;
1278
+ _row = elementsForDockingV1[i];
1279
+ if (!(_row.DP == null || _row.DP.length == 0)) {
1280
+ _context5.next = 111;
1169
1281
  break;
1170
1282
  }
1171
- return _context5.abrupt("continue", 110);
1172
- case 108:
1173
- _DPsInfo = _elementsSortedbyPosNr[i].DP;
1283
+ return _context5.abrupt("continue", 113);
1284
+ case 111:
1285
+ _DPsInfo = _row.DP;
1174
1286
  for (j = 0; j < _DPsInfo.length; j++) {
1175
1287
  _dpInfo = _DPsInfo[j];
1176
1288
  if (_dpInfo.DP && _dpInfo.DP != '' && _dpInfo.onID && _dpInfo.onID != '') {
1177
- targetElementId = parseInt(_dpInfo.onID);
1289
+ targetElementId = parseInt(String(_dpInfo.onID));
1178
1290
  dpType = _dpInfo.DP;
1179
- curElement = this.plannerElements.get(_elementsSortedbyPosNr[i].elementId);
1291
+ curElement = _row.elementId != null ? this.plannerElements.get(_row.elementId) : undefined;
1180
1292
  _targetElement = (_this$plannerElements = this.plannerElements.get(targetElementId)) !== null && _this$plannerElements !== void 0 ? _this$plannerElements : this.getPlannerElementByIndex(targetElementId - 1);
1181
1293
  if (curElement && _targetElement) {
1182
1294
  PlannerHandler2D.dockingPointHandlerInst.initDockingPointRelationByArea(curElement, _targetElement, dpType);
1183
1295
  } else {
1184
- LOG.error(new DivaUtils.DivaError('Error initializing dockingPoints of element with elementID ' + _elementsSortedbyPosNr[i].elementId, {
1296
+ LOG.error(new DivaUtils.DivaError('Error initializing dockingPoints of element with elementID ' + _row.elementId, {
1185
1297
  code: 'WC_0012'
1186
1298
  }));
1187
1299
  }
1188
1300
  }
1189
1301
  }
1190
- case 110:
1302
+ case 113:
1191
1303
  i++;
1192
- _context5.next = 105;
1304
+ _context5.next = 107;
1193
1305
  break;
1194
- case 113:
1195
- this.updateAllElementsWorldPos();
1306
+ case 116:
1307
+ this.plannerElements.forEach(function (el) {
1308
+ if (!el.IsDockedAccessoire && (anchorElement == undefined || el.PosNr < anchorElement.PosNr)) anchorElement = el;
1309
+ });
1310
+ this.updateAllElementsWorldPos(undefined, anchorElement ? [anchorElement.ElementId] : undefined);
1196
1311
  this.updatePlannerPosNr();
1197
- case 115:
1312
+ case 119:
1198
1313
  case "end":
1199
1314
  return _context5.stop();
1200
1315
  }
1201
- }, _callee5, this, [[11, 32], [42, 54], [70, 97]]);
1316
+ }, _callee5, this, [[10, 31], [41, 54], [72, 99]]);
1202
1317
  }));
1203
1318
  function initPlanner(_x9) {
1204
1319
  return _initPlanner.apply(this, arguments);
@@ -1307,27 +1422,61 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1307
1422
  key: "copyPlannerElement",
1308
1423
  value: (function () {
1309
1424
  var _copyPlannerElement = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee7(articleCopyRelation, copyInfo) {
1310
- var articlesToLoad, i;
1425
+ var i, _copyInfo$copyIndex, rel, dirX, sourceElement, targetDP;
1311
1426
  return _regeneratorRuntime__default["default"].wrap(function _callee7$(_context7) {
1312
1427
  while (1) switch (_context7.prev = _context7.next) {
1313
1428
  case 0:
1314
- articlesToLoad = [];
1315
- articleCopyRelation.forEach(function (rel) {
1316
- if (copyInfo == undefined) articlesToLoad.push(rel.value);
1317
- });
1318
1429
  i = 0;
1319
- case 3:
1320
- if (!(i < articlesToLoad.length)) {
1321
- _context7.next = 9;
1430
+ case 1:
1431
+ if (!(i < articleCopyRelation.length)) {
1432
+ _context7.next = 24;
1433
+ break;
1434
+ }
1435
+ rel = articleCopyRelation[i];
1436
+ if (!(copyInfo == undefined)) {
1437
+ _context7.next = 7;
1322
1438
  break;
1323
1439
  }
1324
1440
  _context7.next = 6;
1325
- return this.addPlannerElement(articlesToLoad[i], {});
1441
+ return this.addPlannerElement(rel.value, {});
1326
1442
  case 6:
1443
+ return _context7.abrupt("continue", 21);
1444
+ case 7:
1445
+ //Directional copy (copyIndex.x = -1 left / 1 right): dock the copy at the source element's free AVL/AVR
1446
+ dirX = (_copyInfo$copyIndex = copyInfo.copyIndex) === null || _copyInfo$copyIndex === void 0 ? void 0 : _copyInfo$copyIndex.x;
1447
+ if (!(dirX != -1 && dirX != 1)) {
1448
+ _context7.next = 12;
1449
+ break;
1450
+ }
1451
+ _context7.next = 11;
1452
+ return this.addPlannerElement(rel.value, {});
1453
+ case 11:
1454
+ return _context7.abrupt("continue", 21);
1455
+ case 12:
1456
+ sourceElement = this.plannerElements.get(rel.key);
1457
+ targetDP = sourceElement === null || sourceElement === void 0 ? void 0 : sourceElement.getFreeDockingPointsByType(dirX == -1 ? 'AVL' : 'AVR').find(function (dp) {
1458
+ return !dp.IsDisabled;
1459
+ });
1460
+ if (!(sourceElement && targetDP)) {
1461
+ _context7.next = 19;
1462
+ break;
1463
+ }
1464
+ _context7.next = 17;
1465
+ return this.addPlannerElement(rel.value, {
1466
+ targetElemIdToDock: sourceElement.ElementId,
1467
+ targetDockingPointId: targetDP.DpId
1468
+ });
1469
+ case 17:
1470
+ _context7.next = 21;
1471
+ break;
1472
+ case 19:
1473
+ _context7.next = 21;
1474
+ return this.addPlannerElement(rel.value, {});
1475
+ case 21:
1327
1476
  i++;
1328
- _context7.next = 3;
1477
+ _context7.next = 1;
1329
1478
  break;
1330
- case 9:
1479
+ case 24:
1331
1480
  case "end":
1332
1481
  return _context7.stop();
1333
1482
  }
@@ -1352,7 +1501,8 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1352
1501
  }, {
1353
1502
  key: "getPlannerElementsInfluencedByCopy",
1354
1503
  value: function getPlannerElementsInfluencedByCopy(elementId, copyInfo) {
1355
- if (!copyInfo || copyInfo.copyType != 'BoxPlanner_backside') throw new Error('copyType needs to be BoxPlanner_backside here');
1504
+ //STD = directional AVL/AVR copy of a single element; only the element itself is influenced
1505
+ if (!copyInfo || copyInfo.copyType != 'BoxPlanner_backside' && copyInfo.copyType != 'STD') throw new Error('copyType needs to be BoxPlanner_backside or STD here');
1356
1506
  if (this.plannerElements.has(elementId)) return [elementId];
1357
1507
  return [];
1358
1508
  }
@@ -1554,12 +1704,12 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1554
1704
  */
1555
1705
  }, {
1556
1706
  key: "updatePlannerTrans",
1557
- value: function updatePlannerTrans(elementId, deltaMove, deltaAngleDeg, rotCorrection, transState, autoDockingDistance) {
1707
+ value: function updatePlannerTrans(elementId, deltaMove, deltaAngleDeg, rotCorrection, transState, autoDockingDistance, turningPoint) {
1558
1708
  var _this3 = this;
1559
1709
  var updateConfig = false;
1560
1710
  if (this.plannerElements.has(elementId)) {
1561
1711
  var plannerElement = this.plannerElements.get(elementId);
1562
- plannerElement === null || plannerElement === void 0 || plannerElement.updateDeltaTrans(deltaMove, deltaAngleDeg, rotCorrection, transState == 'END');
1712
+ plannerElement === null || plannerElement === void 0 || plannerElement.updateDeltaTrans(deltaMove, deltaAngleDeg, rotCorrection, transState == 'END', turningPoint);
1563
1713
  if (transState == 'START') {
1564
1714
  if (plannerElement) {
1565
1715
  var dpsToUndock = ['AVR', 'AVL'];