@crystaldesign/web-planner-logic 26.11.0-beta.3 → 26.11.0-beta.30

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 (119) hide show
  1. package/build/cjs/{DivaBoxPlanner-68cc1bd1.js → DivaBoxPlanner-c57ed0e3.js} +134 -47
  2. package/build/cjs/{DivaStandardPlanner-d44ae0e7.js → DivaStandardPlanner-6e46651d.js} +586 -332
  3. package/build/cjs/{DoorPlanner-1719cbe1.js → DoorPlanner-f86e825b.js} +3 -1
  4. package/build/cjs/{Host3DSignalR-a456221e.js → Host3DSignalR-9ae7bc58.js} +41 -24
  5. package/build/cjs/{LiviqueWWSHandler-f2afb4eb.js → LiviqueWWSHandler-a4f6eaa0.js} +3 -1
  6. package/build/cjs/{PfisterWWSHandler-8f522ab6.js → PfisterWWSHandler-b85b5d9c.js} +3 -1
  7. package/build/cjs/PlannerHandler2D-bec57353.js +544 -0
  8. package/build/cjs/{SeriousBasketHandler-b39f0556.js → SeriousBasketHandler-0fd56d93.js} +3 -1
  9. package/build/cjs/{ShelfPlanner-1dde2d7c.js → ShelfPlanner-0efb6dda.js} +262 -148
  10. package/build/cjs/{StandardWWSHandler-62ec343d.js → StandardWWSHandler-e535e9ab.js} +3 -1
  11. package/build/cjs/{index-d63749e4.js → index-21cc42e9.js} +10715 -9129
  12. package/build/cjs/index.js +13 -2
  13. package/build/esm/{DivaBoxPlanner-a347ef5d.js → DivaBoxPlanner-9a2e33e5.js} +134 -47
  14. package/build/esm/{DivaStandardPlanner-a8f0d722.js → DivaStandardPlanner-d9cad991.js} +585 -332
  15. package/build/esm/{DoorPlanner-60c065e5.js → DoorPlanner-d430b797.js} +3 -1
  16. package/build/esm/{Host3DSignalR-0c7e84a7.js → Host3DSignalR-f16742ea.js} +41 -24
  17. package/build/esm/{LiviqueWWSHandler-3df03404.js → LiviqueWWSHandler-4ebe33ed.js} +3 -1
  18. package/build/esm/{PfisterWWSHandler-28b609ef.js → PfisterWWSHandler-04416bc8.js} +3 -1
  19. package/build/esm/PlannerHandler2D-2fc26200.js +526 -0
  20. package/build/esm/{SeriousBasketHandler-276a8035.js → SeriousBasketHandler-c802bd9b.js} +3 -1
  21. package/build/esm/{ShelfPlanner-7380b831.js → ShelfPlanner-557172d3.js} +262 -148
  22. package/build/esm/{StandardWWSHandler-1d13f6a3.js → StandardWWSHandler-bdd24590.js} +3 -1
  23. package/build/esm/{index-358c0a3c.js → index-024475bf.js} +10711 -9129
  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/ArticleOptionStateType.d.ts +1 -0
  28. package/build/types/web-planner-logic/src/interface/ArticleOptionStateType.d.ts.map +1 -1
  29. package/build/types/web-planner-logic/src/interface/Articles/ArticleDataType.d.ts +13 -0
  30. package/build/types/web-planner-logic/src/interface/Articles/ArticleDataType.d.ts.map +1 -1
  31. package/build/types/web-planner-logic/src/interface/Articles/ArticleInfoType.d.ts +13 -0
  32. package/build/types/web-planner-logic/src/interface/Articles/ArticleInfoType.d.ts.map +1 -1
  33. package/build/types/web-planner-logic/src/interface/Articles/CatalogArticleDataType.d.ts +3 -0
  34. package/build/types/web-planner-logic/src/interface/Articles/CatalogArticleDataType.d.ts.map +1 -1
  35. package/build/types/web-planner-logic/src/interface/DivaCatalogDataType.d.ts +6 -1
  36. package/build/types/web-planner-logic/src/interface/DivaCatalogDataType.d.ts.map +1 -1
  37. package/build/types/web-planner-logic/src/interface/IDM/ArticleApi.d.ts +19 -18
  38. package/build/types/web-planner-logic/src/interface/IDM/ArticleApi.d.ts.map +1 -1
  39. package/build/types/web-planner-logic/src/interface/IDM/Decision.d.ts +1 -0
  40. package/build/types/web-planner-logic/src/interface/IDM/Decision.d.ts.map +1 -1
  41. package/build/types/web-planner-logic/src/interface/Planner/ISaveSetPlanner.d.ts +37 -0
  42. package/build/types/web-planner-logic/src/interface/Planner/ISaveSetPlanner.d.ts.map +1 -1
  43. package/build/types/web-planner-logic/src/interface/ShelfPlanner/ShelfAccessoiresView.d.ts +5 -0
  44. package/build/types/web-planner-logic/src/interface/ShelfPlanner/ShelfAccessoiresView.d.ts.map +1 -1
  45. package/build/types/web-planner-logic/src/interface/webPlannerParams/WebPlannerParamsType.d.ts +46 -2
  46. package/build/types/web-planner-logic/src/interface/webPlannerParams/WebPlannerParamsType.d.ts.map +1 -1
  47. package/build/types/web-planner-logic/src/logic/Article/ArticleOptionState.d.ts +2 -0
  48. package/build/types/web-planner-logic/src/logic/Article/ArticleOptionState.d.ts.map +1 -1
  49. package/build/types/web-planner-logic/src/logic/Article/DivaArticle.d.ts.map +1 -1
  50. package/build/types/web-planner-logic/src/logic/Article/DivaArticleHandler.d.ts.map +1 -1
  51. package/build/types/web-planner-logic/src/logic/Article/Engine/ArticleEngine.d.ts +4 -0
  52. package/build/types/web-planner-logic/src/logic/Article/Engine/ArticleEngine.d.ts.map +1 -1
  53. package/build/types/web-planner-logic/src/logic/Article/Engine/DivaArticleEngine.d.ts +2 -0
  54. package/build/types/web-planner-logic/src/logic/Article/Engine/DivaArticleEngine.d.ts.map +1 -1
  55. package/build/types/web-planner-logic/src/logic/Article/Engine/IDMArticleEngine.d.ts +39 -2
  56. package/build/types/web-planner-logic/src/logic/Article/Engine/IDMArticleEngine.d.ts.map +1 -1
  57. package/build/types/web-planner-logic/src/logic/ConfigTree/Shelfplanner/ShelfPlanner.d.ts +20 -0
  58. package/build/types/web-planner-logic/src/logic/ConfigTree/Shelfplanner/ShelfPlanner.d.ts.map +1 -1
  59. package/build/types/web-planner-logic/src/logic/ConfigTree/Shelfplanner/ShelfPlannerGrid.d.ts +31 -1
  60. package/build/types/web-planner-logic/src/logic/ConfigTree/Shelfplanner/ShelfPlannerGrid.d.ts.map +1 -1
  61. package/build/types/web-planner-logic/src/logic/DivaApiHandler.d.ts +25 -0
  62. package/build/types/web-planner-logic/src/logic/DivaApiHandler.d.ts.map +1 -1
  63. package/build/types/web-planner-logic/src/logic/DivaCatalogHandler.d.ts +1 -0
  64. package/build/types/web-planner-logic/src/logic/DivaCatalogHandler.d.ts.map +1 -1
  65. package/build/types/web-planner-logic/src/logic/DivaWebPlanner.d.ts +149 -95
  66. package/build/types/web-planner-logic/src/logic/DivaWebPlanner.d.ts.map +1 -1
  67. package/build/types/web-planner-logic/src/logic/Planner/BoxPlanner/ConstructionRulesHandler.d.ts +19 -0
  68. package/build/types/web-planner-logic/src/logic/Planner/BoxPlanner/ConstructionRulesHandler.d.ts.map +1 -1
  69. package/build/types/web-planner-logic/src/logic/Planner/BoxPlanner/DivaBoxPlanner.d.ts +15 -1
  70. package/build/types/web-planner-logic/src/logic/Planner/BoxPlanner/DivaBoxPlanner.d.ts.map +1 -1
  71. package/build/types/web-planner-logic/src/logic/Planner/DivaPlannerHandler.d.ts +11 -1
  72. package/build/types/web-planner-logic/src/logic/Planner/DivaPlannerHandler.d.ts.map +1 -1
  73. package/build/types/web-planner-logic/src/logic/Planner/DivaStandardPlanner.d.ts +31 -1
  74. package/build/types/web-planner-logic/src/logic/Planner/DivaStandardPlanner.d.ts.map +1 -1
  75. package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/DockingPointHandler.d.ts +9 -114
  76. package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/DockingPointHandler.d.ts.map +1 -1
  77. package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/PlannerHandler2D.d.ts +5 -7
  78. package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/PlannerHandler2D.d.ts.map +1 -1
  79. package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/SVGUtils.d.ts +5 -6
  80. package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/SVGUtils.d.ts.map +1 -1
  81. package/build/types/web-planner-logic/src/logic/Planner/Rendering/Host3DSignalR.d.ts.map +1 -1
  82. package/build/types/web-planner-logic/src/logic/Planner/Rendering/PlannerHandler3D.d.ts +17 -1
  83. package/build/types/web-planner-logic/src/logic/Planner/Rendering/PlannerHandler3D.d.ts.map +1 -1
  84. package/build/types/web-planner-logic/src/logic/Set/DivaSet.d.ts +2 -2
  85. package/build/types/web-planner-logic/src/logic/Set/DivaSet.d.ts.map +1 -1
  86. package/build/types/web-planner-logic/src/logic/Set/DivaSetHandler.d.ts +31 -3
  87. package/build/types/web-planner-logic/src/logic/Set/DivaSetHandler.d.ts.map +1 -1
  88. package/build/types/web-planner-logic/src/logic/Set/catalogXml/articleGeo.d.ts +9 -0
  89. package/build/types/web-planner-logic/src/logic/Set/catalogXml/articleGeo.d.ts.map +1 -0
  90. package/build/types/web-planner-logic/src/logic/Set/catalogXml/parseCatalogXml.d.ts +12 -0
  91. package/build/types/web-planner-logic/src/logic/Set/catalogXml/parseCatalogXml.d.ts.map +1 -0
  92. package/build/types/web-planner-logic/src/logic/Set/catalogXml/types.d.ts +66 -0
  93. package/build/types/web-planner-logic/src/logic/Set/catalogXml/types.d.ts.map +1 -0
  94. package/build/types/web-planner-logic/src/logic/bootMark.d.ts +71 -0
  95. package/build/types/web-planner-logic/src/logic/bootMark.d.ts.map +1 -0
  96. package/build/types/web-planner-logic/src/model/Articles/Article/CatalogArticleData.d.ts +1 -0
  97. package/build/types/web-planner-logic/src/model/Articles/Article/CatalogArticleData.d.ts.map +1 -1
  98. package/build/types/web-planner-logic/src/model/Articles/Article/IDMCatalogArticle.d.ts +12 -0
  99. package/build/types/web-planner-logic/src/model/Articles/Article/IDMCatalogArticle.d.ts.map +1 -1
  100. package/build/types/web-planner-logic/src/model/Catalog/CatalogData.d.ts +13 -0
  101. package/build/types/web-planner-logic/src/model/Catalog/CatalogData.d.ts.map +1 -1
  102. package/build/types/web-planner-logic/src/model/Catalog/IDMCatalogData.d.ts.map +1 -1
  103. package/build/types/web-planner-logic/src/model/Planner/DockingPoint.d.ts +1 -44
  104. package/build/types/web-planner-logic/src/model/Planner/DockingPoint.d.ts.map +1 -1
  105. package/build/types/web-planner-logic/src/model/Planner/PlannerElementData.d.ts +6 -1
  106. package/build/types/web-planner-logic/src/model/Planner/PlannerElementData.d.ts.map +1 -1
  107. package/build/types/web-planner-logic/src/test/engineFeatureDefaults.test.d.ts +2 -0
  108. package/build/types/web-planner-logic/src/test/engineFeatureDefaults.test.d.ts.map +1 -0
  109. package/build/types/web-planner-logic/src/test/idmPlannerPaletteView.test.d.ts +2 -0
  110. package/build/types/web-planner-logic/src/test/idmPlannerPaletteView.test.d.ts.map +1 -0
  111. package/build/types/web-planner-logic/src/test/parseSvgOltGeometry.test.d.ts +2 -0
  112. package/build/types/web-planner-logic/src/test/parseSvgOltGeometry.test.d.ts.map +1 -0
  113. package/build/types/web-planner-logic/src/test/partlistPosCountDecision.test.d.ts +2 -0
  114. package/build/types/web-planner-logic/src/test/partlistPosCountDecision.test.d.ts.map +1 -0
  115. package/build/types/web-planner-logic/src/test/stretchGoldenMaster.test.d.ts +2 -0
  116. package/build/types/web-planner-logic/src/test/stretchGoldenMaster.test.d.ts.map +1 -0
  117. package/package.json +5 -5
  118. package/build/cjs/PlannerHandler2D-dbe1d858.js +0 -2470
  119. 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-21cc42e9.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-bec57353.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
  }
@@ -345,39 +448,39 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
345
448
  plannerElement.WorldPosCenter = setToTransform.transform.worldPosCenter;
346
449
  plannerElement.RotDeg = setToTransform.transform.rotDeg;
347
450
  this.set.onDockingChanged(plannerElement.ElementId, -1, 'NOT_DOCKED');
348
- _context.next = 47;
451
+ _context.next = 48;
349
452
  break;
350
453
  case 8:
351
454
  //Nun unterscheidet man, ob man das Element zu einem bestimmten vorselektierten Element Docken will , zu einem vorselektierten DockingPoint oder an eine Freie Planung.
352
455
  dockingFound = false;
353
456
  if (!dockingPointInfos) {
354
- _context.next = 46;
457
+ _context.next = 47;
355
458
  break;
356
459
  }
357
460
  i = 0;
358
461
  case 11:
359
462
  if (!(i < dockingPointInfos.length)) {
360
- _context.next = 46;
463
+ _context.next = 47;
361
464
  break;
362
465
  }
363
466
  targetElemIdToDock = dockingPointInfos[i].targetElemIdToDock;
364
467
  targetDockingPointId = dockingPointInfos[i].targetDockingPointId;
365
468
  if (!(targetElemIdToDock && targetElemIdToDock > -1 && this.plannerElements.has(targetElemIdToDock))) {
366
- _context.next = 43;
469
+ _context.next = 44;
367
470
  break;
368
471
  }
369
472
  if (!(targetDockingPointId && targetDockingPointId != '')) {
370
- _context.next = 31;
473
+ _context.next = 32;
371
474
  break;
372
475
  }
373
476
  targetElem = this.plannerElements.get(targetElemIdToDock);
374
477
  if (!targetElem) {
375
- _context.next = 29;
478
+ _context.next = 30;
376
479
  break;
377
480
  }
378
481
  targetDP = targetElem.getDockingPointById(targetDockingPointId);
379
482
  if (!targetDP) {
380
- _context.next = 29;
483
+ _context.next = 30;
381
484
  break;
382
485
  }
383
486
  successDP = PlannerHandler2D.dockingPointHandlerInst.tryDockElementToDP(plannerElement, targetElem, targetDP);
@@ -387,17 +490,21 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
387
490
  }
388
491
  this.updateWorldPos(plannerElement, successDP);
389
492
  dockingFound = true;
390
- _context.next = 29;
493
+ _context.next = 30;
391
494
  break;
392
495
  case 26:
393
496
  _context.next = 28;
394
497
  return this.tryToDockWithDifferentSVGWithFormula(plannerElement, targetElemIdToDock);
395
498
  case 28:
396
- success = _context.sent;
397
- case 29:
398
- _context.next = 43;
499
+ if (!_context.sent) {
500
+ _context.next = 30;
501
+ break;
502
+ }
503
+ dockingFound = true;
504
+ case 30:
505
+ _context.next = 44;
399
506
  break;
400
- case 31:
507
+ case 32:
401
508
  success = false;
402
509
  if (plannerElement.HasAVL || plannerElement.HasAVR) {
403
510
  success = this.dockToAVLorAVR(plannerElement, [this.plannerElements.get(targetElemIdToDock)]);
@@ -406,28 +513,28 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
406
513
  success = this.dockToAVUorAVOororAVNorAVSorAVC(plannerElement, [this.plannerElements.get(targetElemIdToDock)]);
407
514
  }
408
515
  if (success) {
409
- _context.next = 42;
516
+ _context.next = 43;
410
517
  break;
411
518
  }
412
- _context.next = 37;
519
+ _context.next = 38;
413
520
  return this.tryToDockWithDifferentSVGWithFormula(plannerElement, targetElemIdToDock);
414
- case 37:
521
+ case 38:
415
522
  success = _context.sent;
416
523
  if (success) {
417
- _context.next = 42;
524
+ _context.next = 43;
418
525
  break;
419
526
  }
420
- _context.next = 41;
527
+ _context.next = 42;
421
528
  return this.addElementToWorld(plannerElement, undefined, undefined, undefined, 50);
422
- case 41:
423
- return _context.abrupt("return");
424
529
  case 42:
425
- if (success) dockingFound = true;
530
+ return _context.abrupt("return");
426
531
  case 43:
532
+ if (success) dockingFound = true;
533
+ case 44:
427
534
  i++;
428
535
  _context.next = 11;
429
536
  break;
430
- case 46:
537
+ case 47:
431
538
  if (!dockingFound) {
432
539
  allPlannerElements = this.getAllPlannerElements();
433
540
  _success = this.dockToAVLorAVR(plannerElement, allPlannerElements);
@@ -448,13 +555,13 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
448
555
  }
449
556
  }
450
557
  }
451
- case 47:
558
+ case 48:
452
559
  this.updatePlannerPosNr();
453
560
  this.updateAllElementsWorldPos();
454
561
  this.updatePlannerPosNr();
455
562
  this.checkCollision(false, plannerElement.getElementId());
456
563
  this.updatePlannerBoundingBox();
457
- case 52:
564
+ case 53:
458
565
  case "end":
459
566
  return _context.stop();
460
567
  }
@@ -469,7 +576,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
469
576
  key: "tryToDockWithDifferentSVGWithFormula",
470
577
  value: function () {
471
578
  var _tryToDockWithDifferentSVGWithFormula = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee2(plannerElement, targetElemIdToDock) {
472
- var success, article, origVariantValues, svgsWithFormula, i, elements, variantValues, vv, key, v, _i2, _vv, _elements, _variantValues, _key, _elements2, _variantValues2, _key2;
579
+ var success, article, origVariantValues, svgsWithFormula, i, vv, targetFilterCandidates, _i2, v, _i3, elements, variantValues, key;
473
580
  return _regeneratorRuntime__default["default"].wrap(function _callee2$(_context2) {
474
581
  while (1) switch (_context2.prev = _context2.next) {
475
582
  case 0:
@@ -479,92 +586,107 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
479
586
  origVariantValues = article === null || article === void 0 ? void 0 : article.VariantValues;
480
587
  svgsWithFormula = plannerElement.getSVGsWithFormula();
481
588
  if (!(plannerElement.FilterAVL.length || plannerElement.FilterAVR.length)) {
482
- _context2.next = 47;
589
+ _context2.next = 52;
483
590
  break;
484
591
  }
485
592
  if (!(svgsWithFormula !== null && svgsWithFormula !== void 0 && svgsWithFormula.length)) {
486
- _context2.next = 22;
593
+ _context2.next = 18;
487
594
  break;
488
595
  }
489
596
  i = 0;
490
597
  case 7:
491
598
  if (!(i < svgsWithFormula.length)) {
492
- _context2.next = 22;
599
+ _context2.next = 18;
493
600
  break;
494
601
  }
495
- elements = new Map();
496
- variantValues = new Map();
497
602
  vv = DivaUtils__default["default"].getVariantValuesFromRule(svgsWithFormula[i].JsFormula, {});
498
- for (key in vv) {
499
- variantValues.set(key, vv[key]);
500
- }
501
- elements.set(plannerElement.ElementId, variantValues);
502
- _context2.next = 15;
503
- return this.set.updateCfgValuesByPlanner(elements, true);
504
- case 15:
505
- success = this.dockToAVLorAVR(plannerElement, [this.plannerElements.get(targetElemIdToDock)]);
603
+ _context2.next = 11;
604
+ return this.applyVariantValuesAndTryDock(plannerElement, targetElemIdToDock, vv);
605
+ case 11:
606
+ success = _context2.sent;
506
607
  if (!success) {
507
- _context2.next = 19;
608
+ _context2.next = 15;
508
609
  break;
509
610
  }
510
611
  //svg did match
511
612
  LOG.debug('svgWithFormula nr: ' + i + ' did dock: ' + svgsWithFormula[i].SVG);
512
- return _context2.abrupt("break", 22);
513
- case 19:
613
+ return _context2.abrupt("break", 18);
614
+ case 15:
514
615
  i++;
515
616
  _context2.next = 7;
516
617
  break;
517
- case 22:
618
+ case 18:
619
+ if (!(!success && article)) {
620
+ _context2.next = 31;
621
+ break;
622
+ }
623
+ targetFilterCandidates = this.getVariantValuesMatchingTargetFilters(article, this.plannerElements.get(targetElemIdToDock));
624
+ _i2 = 0;
625
+ case 21:
626
+ if (!(_i2 < targetFilterCandidates.length && _i2 < 20)) {
627
+ _context2.next = 31;
628
+ break;
629
+ }
630
+ _context2.next = 24;
631
+ return this.applyVariantValuesAndTryDock(plannerElement, targetElemIdToDock, targetFilterCandidates[_i2]);
632
+ case 24:
633
+ success = _context2.sent;
634
+ if (!success) {
635
+ _context2.next = 28;
636
+ break;
637
+ }
638
+ LOG.debug('following variantValues matching the target avl/avr filter did dock: ', targetFilterCandidates[_i2]);
639
+ return _context2.abrupt("break", 31);
640
+ case 28:
641
+ _i2++;
642
+ _context2.next = 21;
643
+ break;
644
+ case 31:
518
645
  //other logic. look for decisions with featrue 90 or 89 and try change the options that influence 90 - 89
519
646
  v = plannerElement.getVaraintValuesInfluencingAVLAVRFilter();
520
647
  if (!(v !== null && v !== void 0 && v.length && !success)) {
521
- _context2.next = 40;
648
+ _context2.next = 44;
522
649
  break;
523
650
  }
524
- _i2 = 0;
525
- case 25:
526
- if (!(_i2 < v.length && _i2 < 20)) {
527
- _context2.next = 40;
651
+ _i3 = 0;
652
+ case 34:
653
+ if (!(_i3 < v.length && _i3 < 20)) {
654
+ _context2.next = 44;
528
655
  break;
529
656
  }
530
- _vv = v[_i2];
531
- _elements = new Map();
532
- _variantValues = new Map();
533
- for (_key in _vv) {
534
- _variantValues.set(_key, _vv[_key]);
535
- }
536
- _elements.set(plannerElement.ElementId, _variantValues);
537
- _context2.next = 33;
538
- return this.set.updateCfgValuesByPlanner(_elements, true);
539
- case 33:
540
- success = this.dockToAVLorAVR(plannerElement, [this.plannerElements.get(targetElemIdToDock)]);
657
+ _context2.next = 37;
658
+ return this.applyVariantValuesAndTryDock(plannerElement, targetElemIdToDock, v[_i3]);
659
+ case 37:
660
+ success = _context2.sent;
541
661
  if (!success) {
542
- _context2.next = 37;
662
+ _context2.next = 41;
543
663
  break;
544
664
  }
545
665
  //variantValues did match
546
- LOG.debug('following variantValues did dock: ', _variantValues);
547
- return _context2.abrupt("break", 40);
548
- case 37:
549
- _i2++;
550
- _context2.next = 25;
666
+ LOG.debug('following variantValues did dock: ', v[_i3]);
667
+ return _context2.abrupt("break", 44);
668
+ case 41:
669
+ _i3++;
670
+ _context2.next = 34;
551
671
  break;
552
- case 40:
672
+ case 44:
553
673
  if (success) {
554
- _context2.next = 47;
674
+ _context2.next = 52;
555
675
  break;
556
676
  }
557
- _elements2 = new Map();
558
- _variantValues2 = new Map();
559
- for (_key2 in origVariantValues) {
560
- _variantValues2.set(_key2, origVariantValues[_key2]);
677
+ elements = new Map();
678
+ variantValues = new Map();
679
+ for (key in origVariantValues) {
680
+ variantValues.set(key, origVariantValues[key]);
561
681
  }
562
- _elements2.set(plannerElement.ElementId, _variantValues2);
563
- _context2.next = 47;
564
- return this.set.updateCfgValuesByPlanner(_elements2, true);
565
- case 47:
682
+ elements.set(plannerElement.ElementId, variantValues);
683
+ _context2.next = 51;
684
+ return this.set.updateCfgValuesByPlanner(elements, true);
685
+ case 51:
686
+ if (article) this.commitPendingConnectorFilters(article);
687
+ case 52:
566
688
  return _context2.abrupt("return", success);
567
- case 48:
689
+ case 53:
568
690
  case "end":
569
691
  return _context2.stop();
570
692
  }
@@ -575,6 +697,91 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
575
697
  }
576
698
  return tryToDockWithDifferentSVGWithFormula;
577
699
  }()
700
+ }, {
701
+ key: "applyVariantValuesAndTryDock",
702
+ value: function () {
703
+ var _applyVariantValuesAndTryDock = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee3(plannerElement, targetElemIdToDock, variantValuesToApply) {
704
+ var elements, variantValues, key, article;
705
+ return _regeneratorRuntime__default["default"].wrap(function _callee3$(_context3) {
706
+ while (1) switch (_context3.prev = _context3.next) {
707
+ case 0:
708
+ elements = new Map();
709
+ variantValues = new Map();
710
+ for (key in variantValuesToApply) {
711
+ variantValues.set(key, variantValuesToApply[key]);
712
+ }
713
+ elements.set(plannerElement.ElementId, variantValues);
714
+ _context3.next = 6;
715
+ return this.set.updateCfgValuesByPlanner(elements, true);
716
+ case 6:
717
+ article = this.set.getArticleByElementId(plannerElement.ElementId);
718
+ if (article) this.commitPendingConnectorFilters(article);
719
+ return _context3.abrupt("return", this.dockToAVLorAVR(plannerElement, [this.plannerElements.get(targetElemIdToDock)]));
720
+ case 9:
721
+ case "end":
722
+ return _context3.stop();
723
+ }
724
+ }, _callee3, this);
725
+ }));
726
+ function applyVariantValuesAndTryDock(_x7, _x8, _x9) {
727
+ return _applyVariantValuesAndTryDock.apply(this, arguments);
728
+ }
729
+ return applyVariantValuesAndTryDock;
730
+ }() //the engines only commit option-derived connector filters when the svg swaps, but while probing dock configurations the filters must follow the configuration even without a swap
731
+ }, {
732
+ key: "commitPendingConnectorFilters",
733
+ value: function commitPendingConnectorFilters(article) {
734
+ if (article.newPossibleAVRFilters) {
735
+ article.avr = article.newPossibleAVRFilters;
736
+ article.newPossibleAVRFilters = undefined;
737
+ }
738
+ if (article.newPossibleAVLFilters) {
739
+ article.avl = article.newPossibleAVLFilters;
740
+ article.newPossibleAVLFilters = undefined;
741
+ }
742
+ }
743
+ }, {
744
+ key: "getVariantValuesMatchingTargetFilters",
745
+ value: function getVariantValuesMatchingTargetFilters(article, targetElement) {
746
+ if (!targetElement) return [];
747
+ var optPrefix = !article.CatalogData.isIDMFormat ? 'OPT' : '';
748
+ var opvPrefix = !article.CatalogData.isIDMFormat ? 'OPV' : '';
749
+ var candidates = [];
750
+ var seen = new Set();
751
+ var collect = function collect(connectorFeature, targetFilters) {
752
+ var _iterator2 = _createForOfIteratorHelper(targetFilters),
753
+ _step2;
754
+ try {
755
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
756
+ var filter = _step2.value;
757
+ var _iterator3 = _createForOfIteratorHelper(article.getVariantValuesInfluencingOptions([optPrefix + connectorFeature], opvPrefix + filter)),
758
+ _step3;
759
+ try {
760
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
761
+ var vv = _step3.value;
762
+ var key = JSON.stringify(vv);
763
+ if (!seen.has(key)) {
764
+ seen.add(key);
765
+ candidates.push(vv);
766
+ }
767
+ }
768
+ } catch (err) {
769
+ _iterator3.e(err);
770
+ } finally {
771
+ _iterator3.f();
772
+ }
773
+ }
774
+ } catch (err) {
775
+ _iterator2.e(err);
776
+ } finally {
777
+ _iterator2.f();
778
+ }
779
+ };
780
+ //this article's AVL side (feature 89) docks against the target's AVR side and vice versa
781
+ collect('89', targetElement.FilterAVR);
782
+ collect('90', targetElement.FilterAVL);
783
+ return candidates;
784
+ }
578
785
  }, {
579
786
  key: "dockToAVLorAVR",
580
787
  value: function dockToAVLorAVR(plannerElement, targetElements) {
@@ -752,31 +959,31 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
752
959
  }, {
753
960
  key: "updatePlanner",
754
961
  value: function () {
755
- var _updatePlanner = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee3() {
962
+ var _updatePlanner = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee4() {
756
963
  var allPlannerElements, elemtsWhereSomethingChanged, i, elem, doReload, elementsToDelete, elementsLostDockingRelation;
757
- return _regeneratorRuntime__default["default"].wrap(function _callee3$(_context3) {
758
- while (1) switch (_context3.prev = _context3.next) {
964
+ return _regeneratorRuntime__default["default"].wrap(function _callee4$(_context4) {
965
+ while (1) switch (_context4.prev = _context4.next) {
759
966
  case 0:
760
967
  allPlannerElements = this.getAllPlannerElements();
761
968
  elemtsWhereSomethingChanged = [];
762
969
  i = 0;
763
970
  case 3:
764
971
  if (!(i < allPlannerElements.length)) {
765
- _context3.next = 13;
972
+ _context4.next = 13;
766
973
  break;
767
974
  }
768
975
  elem = allPlannerElements[i];
769
976
  doReload = elem.updatePlannerData(this.set.getPlannerData(elem.getElementId()));
770
977
  if (!doReload) {
771
- _context3.next = 10;
978
+ _context4.next = 10;
772
979
  break;
773
980
  }
774
981
  elemtsWhereSomethingChanged.push(elem.ElementId);
775
- _context3.next = 10;
982
+ _context4.next = 10;
776
983
  return PlannerHandler2D.handler2D.loadSVG(elem, this.set);
777
984
  case 10:
778
985
  i++;
779
- _context3.next = 3;
986
+ _context4.next = 3;
780
987
  break;
781
988
  case 13:
782
989
  elementsToDelete = [];
@@ -789,11 +996,11 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
789
996
  elementsToDelete.push(elementsLostDockingRelation[i].ElementId);
790
997
  }
791
998
  }
792
- this.updateAllElementsWorldPos();
999
+ this.updateAllElementsWorldPos(undefined, elemtsWhereSomethingChanged);
793
1000
  this.updatePlannerPosNr();
794
1001
  this.updatePlannerBoundingBox();
795
1002
  }
796
- return _context3.abrupt("return", {
1003
+ return _context4.abrupt("return", {
797
1004
  doDeleteBackGrid: false,
798
1005
  elemIdsToDelete: elementsToDelete,
799
1006
  elementIdsToUpdateSelection: elemtsWhereSomethingChanged,
@@ -801,9 +1008,9 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
801
1008
  });
802
1009
  case 16:
803
1010
  case "end":
804
- return _context3.stop();
1011
+ return _context4.stop();
805
1012
  }
806
- }, _callee3, this);
1013
+ }, _callee4, this);
807
1014
  }));
808
1015
  function updatePlanner() {
809
1016
  return _updatePlanner.apply(this, arguments);
@@ -818,15 +1025,14 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
818
1025
  }, {
819
1026
  key: "extendPlanner",
820
1027
  value: (function () {
821
- 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;
823
- return _regeneratorRuntime__default["default"].wrap(function _callee4$(_context4) {
824
- while (1) switch (_context4.prev = _context4.next) {
1028
+ var _extendPlanner = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee5(setPlanData, globalBoundingBox) {
1029
+ var planData, jsonElements, elementsSortedbyPosNr, accElements, oldElementidMapping, i, _saveElementArticleCo, _jsonElement$Accessoi, jsonElement, catalogArticle, plannerElement, data, elementsForDockingExtend, row, curElement, DPsInfo, j, dpInfo, sourceDP, targetElement, targetDP;
1030
+ return _regeneratorRuntime__default["default"].wrap(function _callee5$(_context5) {
1031
+ while (1) switch (_context5.prev = _context5.next) {
825
1032
  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;
1033
+ planData = parseSetPlanData(setPlanData);
1034
+ if (!isSavePlannerV2(planData)) {
1035
+ _context5.next = 39;
830
1036
  break;
831
1037
  }
832
1038
  jsonElements = planData.set.elements;
@@ -834,70 +1040,70 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
834
1040
  accElements = [];
835
1041
  oldElementidMapping = new Map(); //First reset planner element values in jsonElement so that every set is planned to be set to origin
836
1042
  i = 0;
837
- case 8:
1043
+ case 7:
838
1044
  if (!(i < jsonElements.length)) {
839
- _context4.next = 36;
1045
+ _context5.next = 35;
840
1046
  break;
841
1047
  }
842
- _context4.prev = 9;
1048
+ _context5.prev = 8;
843
1049
  jsonElement = jsonElements[i];
844
- catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex(jsonElement.articleCodex || jsonElement.Codex);
1050
+ catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex((_saveElementArticleCo = saveElementArticleCodex(jsonElement)) !== null && _saveElementArticleCo !== void 0 ? _saveElementArticleCo : '');
845
1051
  if (!(!catalogArticle && (_jsonElement$Accessoi = jsonElement.AccessoireInitParams) !== null && _jsonElement$Accessoi !== void 0 && _jsonElement$Accessoi.RelatedToBasketID && !this.set.getSetState.onlyRunLogic)) {
846
- _context4.next = 15;
1052
+ _context5.next = 14;
847
1053
  break;
848
1054
  }
849
1055
  LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
850
1056
  code: 'WC_0012'
851
1057
  }));
852
- return _context4.abrupt("continue", 33);
853
- case 15:
1058
+ return _context5.abrupt("continue", 32);
1059
+ case 14:
854
1060
  plannerElement = new index.PlannerElementData(this.set.getSetId(), jsonElement.basketID, this.nextElementId, DivaStandardPlanner.plannerType);
855
- oldElementidMapping.set(parseInt(jsonElement.elementID), plannerElement);
1061
+ oldElementidMapping.set(jsonElement.elementID, plannerElement);
856
1062
  this.nextElementId = plannerElement.getElementId() + 1;
857
1063
  this.plannerElements.set(plannerElement.ElementId, plannerElement);
858
1064
  this.set.setElementId(jsonElement.basketID, plannerElement.ElementId);
859
1065
  data = this.set.getPlannerData(plannerElement.ElementId);
860
1066
  plannerElement.updatePlannerData(data);
861
1067
  if (this.doDisablePlanner2D) {
862
- _context4.next = 25;
1068
+ _context5.next = 24;
863
1069
  break;
864
1070
  }
865
- _context4.next = 25;
1071
+ _context5.next = 24;
866
1072
  return PlannerHandler2D.handler2D.loadSVG(plannerElement, this.set);
867
- case 25:
1073
+ case 24:
868
1074
  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
1075
  plannerElement.RotDeg = jsonElement.rot;
870
1076
  if (plannerElement.IsDockedAccessoire) {
871
1077
  accElements.push(jsonElement);
872
1078
  plannerElement.PosNr = jsonElement.posNr;
873
- plannerElement.AccessoirePosNr = jsonElement.accNr;
1079
+ if (jsonElement.accNr != null) plannerElement.AccessoirePosNr = jsonElement.accNr;
874
1080
  } else {
875
1081
  elementsSortedbyPosNr[jsonElement.posNr - 1] = jsonElement;
876
1082
  plannerElement.PosNr = jsonElement.posNr;
877
1083
  }
878
- _context4.next = 33;
1084
+ _context5.next = 32;
879
1085
  break;
880
- case 30:
881
- _context4.prev = 30;
882
- _context4.t0 = _context4["catch"](9);
1086
+ case 29:
1087
+ _context5.prev = 29;
1088
+ _context5.t0 = _context5["catch"](8);
883
1089
  LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
884
- cause: _context4.t0,
1090
+ cause: _context5.t0,
885
1091
  code: 'WC_0012'
886
1092
  }));
887
- case 33:
1093
+ case 32:
888
1094
  i++;
889
- _context4.next = 8;
1095
+ _context5.next = 7;
890
1096
  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
1097
+ case 35:
1098
+ elementsForDockingExtend = [].concat(_toConsumableArray__default["default"](elementsSortedbyPosNr.filter(function (e) {
1099
+ return e != null;
1100
+ })), accElements);
1101
+ for (i = 0; i < elementsForDockingExtend.length; i++) {
1102
+ row = elementsForDockingExtend[i];
1103
+ curElement = oldElementidMapping.get(row.elementID);
1104
+ if (elementsForDockingExtend.length > 1) {
898
1105
  if (i > 0) {
899
- //The other elements are docked to the First element.
900
- DPsInfo = elementsSortedbyPosNr[i].DP;
1106
+ DPsInfo = row.DP;
901
1107
  for (j = 0; j < DPsInfo.length; j++) {
902
1108
  dpInfo = DPsInfo[j];
903
1109
  sourceDP = curElement === null || curElement === void 0 ? void 0 : curElement.getDockingPointById(dpInfo.id);
@@ -910,19 +1116,19 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
910
1116
  }
911
1117
  }
912
1118
  }
913
- _context4.next = 41;
1119
+ _context5.next = 40;
914
1120
  break;
915
- case 40:
1121
+ case 39:
916
1122
  LOG.error(new DivaUtils.DivaError('The function extend Planner works only with products that are saved in the configurator 2.0', {
917
1123
  code: 'WC_0012'
918
1124
  }));
919
- case 41:
1125
+ case 40:
920
1126
  case "end":
921
- return _context4.stop();
1127
+ return _context5.stop();
922
1128
  }
923
- }, _callee4, this, [[9, 30]]);
1129
+ }, _callee5, this, [[8, 29]]);
924
1130
  }));
925
- function extendPlanner(_x7, _x8) {
1131
+ function extendPlanner(_x10, _x11) {
926
1132
  return _extendPlanner.apply(this, arguments);
927
1133
  }
928
1134
  return extendPlanner;
@@ -930,47 +1136,45 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
930
1136
  }, {
931
1137
  key: "initPlanner",
932
1138
  value: function () {
933
- 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;
935
- return _regeneratorRuntime__default["default"].wrap(function _callee5$(_context5) {
936
- while (1) switch (_context5.prev = _context5.next) {
1139
+ var _initPlanner = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee6(setPlanData) {
1140
+ 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;
1141
+ return _regeneratorRuntime__default["default"].wrap(function _callee6$(_context6) {
1142
+ while (1) switch (_context6.prev = _context6.next) {
937
1143
  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;
1144
+ planData = parseSetPlanData(setPlanData);
1145
+ if (!isSavePlannerV2(planData)) {
1146
+ _context6.next = 63;
942
1147
  break;
943
1148
  }
944
1149
  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;
1150
+ if ((_planData$set = planData.set) !== null && _planData$set !== void 0 && (_planData$set = _planData$set.elements) !== null && _planData$set !== void 0 && _planData$set.length) {
1151
+ _context6.next = 5;
947
1152
  break;
948
1153
  }
949
- return _context5.abrupt("return");
950
- case 6:
951
- //Init new saved Plannings
1154
+ return _context6.abrupt("return");
1155
+ case 5:
952
1156
  jsonElements = planData.set.elements;
953
1157
  elementsSortedbyPosNr = [];
954
1158
  accElements = [];
955
1159
  i = 0;
956
- case 10:
1160
+ case 9:
957
1161
  if (!(i < jsonElements.length)) {
958
- _context5.next = 38;
1162
+ _context6.next = 37;
959
1163
  break;
960
1164
  }
961
- _context5.prev = 11;
1165
+ _context6.prev = 10;
962
1166
  jsonElement = jsonElements[i];
963
- catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex(jsonElement.articleCodex || jsonElement.Codex);
1167
+ catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex((_saveElementArticleCo2 = saveElementArticleCodex(jsonElement)) !== null && _saveElementArticleCo2 !== void 0 ? _saveElementArticleCo2 : '');
964
1168
  if (!(!catalogArticle && (_jsonElement$Accessoi2 = jsonElement.AccessoireInitParams) !== null && _jsonElement$Accessoi2 !== void 0 && _jsonElement$Accessoi2.RelatedToBasketID && !this.set.getSetState.onlyRunLogic)) {
965
- _context5.next = 17;
1169
+ _context6.next = 16;
966
1170
  break;
967
1171
  }
968
1172
  LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
969
1173
  code: 'WC_0012'
970
1174
  }));
971
- return _context5.abrupt("continue", 35);
972
- case 17:
973
- elementID = parseInt(jsonElement.elementID);
1175
+ return _context6.abrupt("continue", 34);
1176
+ case 16:
1177
+ elementID = jsonElement.elementID;
974
1178
  plannerElement = new index.PlannerElementData(this.set.getSetId(), jsonElement.basketID, elementID, DivaStandardPlanner.plannerType);
975
1179
  this.nextElementId = elementID + 1;
976
1180
  this.plannerElements.set(plannerElement.ElementId, plannerElement);
@@ -978,12 +1182,12 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
978
1182
  data = this.set.getPlannerData(plannerElement.ElementId);
979
1183
  plannerElement.updatePlannerData(data);
980
1184
  if (this.doDisablePlanner2D) {
981
- _context5.next = 27;
1185
+ _context6.next = 26;
982
1186
  break;
983
1187
  }
984
- _context5.next = 27;
1188
+ _context6.next = 26;
985
1189
  return PlannerHandler2D.handler2D.loadSVG(plannerElement, this.set);
986
- case 27:
1190
+ case 26:
987
1191
  //Im neuen speichern ist die Position hinten link - nicht mehr im Centrum wie im alten Planer
988
1192
  //plannerElement.WorldPosCenter = new Vector3(jsonElement.x, jsonElement.y, jsonElement.z);
989
1193
  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 +1195,151 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
991
1195
  if (plannerElement.IsDockedAccessoire) {
992
1196
  accElements.push(jsonElement);
993
1197
  plannerElement.PosNr = jsonElement.posNr;
994
- plannerElement.AccessoirePosNr = jsonElement.accNr;
1198
+ if (jsonElement.accNr != null) plannerElement.AccessoirePosNr = jsonElement.accNr;
995
1199
  } else {
996
1200
  elementsSortedbyPosNr[jsonElement.posNr - 1] = jsonElement;
997
1201
  plannerElement.PosNr = jsonElement.posNr;
998
1202
  }
999
- _context5.next = 35;
1203
+ _context6.next = 34;
1000
1204
  break;
1001
- case 32:
1002
- _context5.prev = 32;
1003
- _context5.t0 = _context5["catch"](11);
1205
+ case 31:
1206
+ _context6.prev = 31;
1207
+ _context6.t0 = _context6["catch"](10);
1004
1208
  LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
1005
- cause: _context5.t0,
1209
+ cause: _context6.t0,
1006
1210
  code: 'WC_0012'
1007
1211
  }));
1008
- case 35:
1212
+ case 34:
1009
1213
  i++;
1010
- _context5.next = 10;
1214
+ _context6.next = 9;
1011
1215
  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);
1216
+ case 37:
1217
+ onlyOneBaseElement = elementsSortedbyPosNr.filter(Boolean).length == 1; //Saves if only one base element is in the planning. All the others are only accessoires
1218
+ elementsForDocking = [].concat(_toConsumableArray__default["default"](elementsSortedbyPosNr.filter(function (e) {
1219
+ return e != null;
1220
+ })), accElements);
1015
1221
  i = 0;
1016
- case 41:
1017
- if (!(i < elementsSortedbyPosNr.length)) {
1018
- _context5.next = 60;
1222
+ case 40:
1223
+ if (!(i < elementsForDocking.length)) {
1224
+ _context6.next = 61;
1019
1225
  break;
1020
1226
  }
1021
- _context5.prev = 42;
1227
+ _context6.prev = 41;
1228
+ row = elementsForDocking[i];
1022
1229
  if (!(i == 0 && onlyOneBaseElement && this.plannerHasStaticBackground)) {
1023
- _context5.next = 48;
1230
+ _context6.next = 48;
1024
1231
  break;
1025
1232
  }
1026
1233
  //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
1234
  //Only do this for fresh plannings - if the saved planData already contains a position, keep it.
1235
+ //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
1236
  _jsonElement = elementsSortedbyPosNr[i];
1029
- hasSavedPos = _jsonElement.x != null || _jsonElement.y != null || _jsonElement.z != null;
1237
+ 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
1238
  if (!hasSavedPos) {
1031
- element = this.plannerElements.get(_jsonElement.elementID);
1239
+ element = this.plannerElements.get(row.elementID);
1032
1240
  if (element) element.WorldPosCenter = new index.Vector3(0, element.Height / 2, element.Depth / 2);
1033
1241
  }
1034
- return _context5.abrupt("continue", 57);
1242
+ return _context6.abrupt("continue", 58);
1035
1243
  case 48:
1036
- if (!(elementsSortedbyPosNr[i].DP == null || elementsSortedbyPosNr[i].DP.length == 0)) {
1037
- _context5.next = 50;
1244
+ if (!(row.DP == null || row.DP.length == 0)) {
1245
+ _context6.next = 50;
1038
1246
  break;
1039
1247
  }
1040
- return _context5.abrupt("continue", 57);
1248
+ return _context6.abrupt("continue", 58);
1041
1249
  case 50:
1042
- DPsInfo = elementsSortedbyPosNr[i].DP;
1250
+ DPsInfo = row.DP;
1043
1251
  for (j = 0; j < DPsInfo.length; j++) {
1044
1252
  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);
1253
+ if (dpInfo.id && dpInfo.onID != null && dpInfo.onDPID) {
1254
+ sourceElement = this.plannerElements.get(row.elementID);
1047
1255
  sourceDP = sourceElement === null || sourceElement === void 0 ? void 0 : sourceElement.getDockingPointById(dpInfo.id);
1048
1256
  targetElement = this.plannerElements.get(dpInfo.onID);
1049
1257
  targetDP = targetElement === null || targetElement === void 0 ? void 0 : targetElement.getDockingPointById(dpInfo.onDPID);
1050
1258
  if (sourceDP && targetDP) {
1051
- PlannerHandler2D.dockingPointHandlerInst.tryDockElementDPToDP(sourceElement, targetElement, sourceDP, targetDP);
1259
+ // Saved plans store each relation on both sides - skip the mirror entry of an already established pair.
1260
+ alreadyDocked = sourceDP.IsDocking && sourceDP.OnDP == targetDP;
1261
+ docked = alreadyDocked || PlannerHandler2D.dockingPointHandlerInst.tryDockElementDPToDP(sourceElement, targetElement, sourceDP, targetDP);
1262
+ 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) + ')', {
1263
+ code: 'WC_0012'
1264
+ }));
1052
1265
  } else {
1053
1266
  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
1267
  }
1055
1268
  }
1056
1269
  }
1057
- _context5.next = 57;
1270
+ _context6.next = 58;
1058
1271
  break;
1059
1272
  case 54:
1060
- _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, {
1063
- cause: _context5.t1,
1273
+ _context6.prev = 54;
1274
+ _context6.t1 = _context6["catch"](41);
1275
+ elementId = (_elementsForDocking$i = elementsForDocking[i]) === null || _elementsForDocking$i === void 0 ? void 0 : _elementsForDocking$i.elementID;
1276
+ LOG.error(new DivaUtils.DivaError('Error initializing dockingPoints of element with elementID ' + elementId, {
1277
+ cause: _context6.t1,
1064
1278
  code: 'WC_0012'
1065
1279
  }));
1066
- case 57:
1280
+ case 58:
1067
1281
  i++;
1068
- _context5.next = 41;
1282
+ _context6.next = 40;
1069
1283
  break;
1070
- case 60:
1071
- _context5.next = 113;
1284
+ case 61:
1285
+ _context6.next = 116;
1072
1286
  break;
1073
- case 62:
1287
+ case 63:
1074
1288
  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;
1289
+ legacySet = (_planData$Sets = planData.Sets) === null || _planData$Sets === void 0 ? void 0 : _planData$Sets[0];
1290
+ if (legacySet !== null && legacySet !== void 0 && (_legacySet$Elements = legacySet.Elements) !== null && _legacySet$Elements !== void 0 && _legacySet$Elements.length) {
1291
+ _context6.next = 67;
1077
1292
  break;
1078
1293
  }
1079
- return _context5.abrupt("return");
1080
- case 65:
1081
- //Init old Plannings - saved with the old planner
1082
- _jsonElements = planData.Sets[0].Elements;
1294
+ return _context6.abrupt("return");
1295
+ case 67:
1296
+ _jsonElements = legacySet.Elements;
1083
1297
  _elementsSortedbyPosNr = [];
1084
1298
  _accElements = []; //Zuerst initialisiere alle Elemente
1085
1299
  //Dann positioniere sie richtig
1086
1300
  i = 0;
1087
- case 69:
1301
+ case 71:
1088
1302
  if (!(i < _jsonElements.length)) {
1089
- _context5.next = 103;
1303
+ _context6.next = 105;
1090
1304
  break;
1091
1305
  }
1092
- _context5.prev = 70;
1306
+ _context6.prev = 72;
1093
1307
  _jsonElement2 = _jsonElements[i];
1094
- _catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex(_jsonElement2.articleCodex || _jsonElement2.Codex);
1308
+ _catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex((_saveElementArticleCo3 = saveElementArticleCodex(_jsonElement2)) !== null && _saveElementArticleCo3 !== void 0 ? _saveElementArticleCo3 : '');
1095
1309
  if (!(!_catalogArticle && (_jsonElement2$Accesso = _jsonElement2.AccessoireInitParams) !== null && _jsonElement2$Accesso !== void 0 && _jsonElement2$Accesso.RelatedToBasketID && !this.set.getSetState.onlyRunLogic)) {
1096
- _context5.next = 76;
1310
+ _context6.next = 78;
1097
1311
  break;
1098
1312
  }
1099
- LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
1313
+ LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V1', {
1100
1314
  code: 'WC_0012'
1101
1315
  }));
1102
- return _context5.abrupt("continue", 100);
1103
- case 76:
1316
+ return _context6.abrupt("continue", 102);
1317
+ case 78:
1104
1318
  basketID = _jsonElement2.BasketID;
1105
1319
  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;
1320
+ _elementId = this.set.getElementId(basketID);
1321
+ _jsonElement2.elementId = _elementId;
1322
+ if (!(_elementId == -1)) {
1323
+ _context6.next = 85;
1110
1324
  break;
1111
1325
  }
1112
1326
  LOG.error(new DivaUtils.DivaError('Error when initializing planner. The elementID Was not saved in the article. ', {
1113
1327
  code: 'WC_0012'
1114
1328
  }));
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;
1329
+ return _context6.abrupt("continue", 102);
1330
+ case 85:
1331
+ _plannerElement = new index.PlannerElementData(this.set.getSetId(), basketID, _elementId, DivaStandardPlanner.plannerType);
1332
+ this.nextElementId = _elementId + 1;
1119
1333
  this.plannerElements.set(_plannerElement.ElementId, _plannerElement);
1120
1334
  _data = this.set.getPlannerData(_plannerElement.ElementId);
1121
1335
  _plannerElement.updatePlannerData(_data);
1122
1336
  if (this.doDisablePlanner2D) {
1123
- _context5.next = 91;
1337
+ _context6.next = 93;
1124
1338
  break;
1125
1339
  }
1126
- _context5.next = 91;
1340
+ _context6.next = 93;
1127
1341
  return PlannerHandler2D.handler2D.loadSVG(_plannerElement, this.set);
1128
- case 91:
1342
+ case 93:
1129
1343
  //Achtung die Pos Infos im alten Planer waren Zentrumskoordinaten!!! Nicht hinten oben.
1130
1344
  centerWorldPos = new index.Vector3(_jsonElement2.PosX, _jsonElement2.PosZ, _jsonElement2.PosY);
1131
1345
  _plannerElement.WorldPosCenter = new index.Vector3(this.plannerBoundingBox.WorldPos.x + centerWorldPos.x, this.plannerBoundingBox.WorldPos.y + centerWorldPos.y, this.plannerBoundingBox.WorldPos.z + centerWorldPos.z);
@@ -1135,72 +1349,77 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1135
1349
  if (_jsonElement2.PosNum.toString().indexOf('.') > 0) {
1136
1350
  parentPosNr = _jsonElement2.PosNum.toString().split('.')[0];
1137
1351
  accPosNr = _jsonElement2.PosNum.toString().split('.')[1];
1138
- _plannerElement.PosNr = parentPosNr;
1139
- _plannerElement.AccessoirePosNr = accPosNr;
1352
+ _plannerElement.PosNr = Number(parentPosNr);
1353
+ _plannerElement.AccessoirePosNr = Number(accPosNr);
1140
1354
  }
1141
1355
  } else {
1142
1356
  _elementsSortedbyPosNr[_jsonElement2.PosNum - 1] = _jsonElement2;
1143
1357
  _plannerElement.PosNr = _jsonElement2.PosNum;
1144
1358
  }
1145
- _context5.next = 100;
1359
+ _context6.next = 102;
1146
1360
  break;
1147
- case 97:
1148
- _context5.prev = 97;
1149
- _context5.t2 = _context5["catch"](70);
1361
+ case 99:
1362
+ _context6.prev = 99;
1363
+ _context6.t2 = _context6["catch"](72);
1150
1364
  LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner - Plan Data old Planner', {
1151
- cause: _context5.t2,
1365
+ cause: _context6.t2,
1152
1366
  code: 'WC_0012'
1153
1367
  }));
1154
- case 100:
1368
+ case 102:
1155
1369
  i++;
1156
- _context5.next = 69;
1370
+ _context6.next = 71;
1157
1371
  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
1372
  case 105:
1163
- if (!(i < _elementsSortedbyPosNr.length)) {
1164
- _context5.next = 113;
1373
+ elementsForDockingV1 = [].concat(_toConsumableArray__default["default"](_elementsSortedbyPosNr.filter(function (e) {
1374
+ return e != null;
1375
+ })), _accElements);
1376
+ i = 0;
1377
+ case 107:
1378
+ if (!(i < elementsForDockingV1.length)) {
1379
+ _context6.next = 116;
1165
1380
  break;
1166
1381
  }
1167
- if (!(_elementsSortedbyPosNr[i].DP == null || _elementsSortedbyPosNr[i].DP.length == 0)) {
1168
- _context5.next = 108;
1382
+ _row = elementsForDockingV1[i];
1383
+ if (!(_row.DP == null || _row.DP.length == 0)) {
1384
+ _context6.next = 111;
1169
1385
  break;
1170
1386
  }
1171
- return _context5.abrupt("continue", 110);
1172
- case 108:
1173
- _DPsInfo = _elementsSortedbyPosNr[i].DP;
1387
+ return _context6.abrupt("continue", 113);
1388
+ case 111:
1389
+ _DPsInfo = _row.DP;
1174
1390
  for (j = 0; j < _DPsInfo.length; j++) {
1175
1391
  _dpInfo = _DPsInfo[j];
1176
1392
  if (_dpInfo.DP && _dpInfo.DP != '' && _dpInfo.onID && _dpInfo.onID != '') {
1177
- targetElementId = parseInt(_dpInfo.onID);
1393
+ targetElementId = parseInt(String(_dpInfo.onID));
1178
1394
  dpType = _dpInfo.DP;
1179
- curElement = this.plannerElements.get(_elementsSortedbyPosNr[i].elementId);
1395
+ curElement = _row.elementId != null ? this.plannerElements.get(_row.elementId) : undefined;
1180
1396
  _targetElement = (_this$plannerElements = this.plannerElements.get(targetElementId)) !== null && _this$plannerElements !== void 0 ? _this$plannerElements : this.getPlannerElementByIndex(targetElementId - 1);
1181
1397
  if (curElement && _targetElement) {
1182
1398
  PlannerHandler2D.dockingPointHandlerInst.initDockingPointRelationByArea(curElement, _targetElement, dpType);
1183
1399
  } else {
1184
- LOG.error(new DivaUtils.DivaError('Error initializing dockingPoints of element with elementID ' + _elementsSortedbyPosNr[i].elementId, {
1400
+ LOG.error(new DivaUtils.DivaError('Error initializing dockingPoints of element with elementID ' + _row.elementId, {
1185
1401
  code: 'WC_0012'
1186
1402
  }));
1187
1403
  }
1188
1404
  }
1189
1405
  }
1190
- case 110:
1406
+ case 113:
1191
1407
  i++;
1192
- _context5.next = 105;
1408
+ _context6.next = 107;
1193
1409
  break;
1194
- case 113:
1195
- this.updateAllElementsWorldPos();
1410
+ case 116:
1411
+ this.plannerElements.forEach(function (el) {
1412
+ if (!el.IsDockedAccessoire && (anchorElement == undefined || el.PosNr < anchorElement.PosNr)) anchorElement = el;
1413
+ });
1414
+ this.updateAllElementsWorldPos(undefined, anchorElement ? [anchorElement.ElementId] : undefined);
1196
1415
  this.updatePlannerPosNr();
1197
- case 115:
1416
+ case 119:
1198
1417
  case "end":
1199
- return _context5.stop();
1418
+ return _context6.stop();
1200
1419
  }
1201
- }, _callee5, this, [[11, 32], [42, 54], [70, 97]]);
1420
+ }, _callee6, this, [[10, 31], [41, 54], [72, 99]]);
1202
1421
  }));
1203
- function initPlanner(_x9) {
1422
+ function initPlanner(_x12) {
1204
1423
  return _initPlanner.apply(this, arguments);
1205
1424
  }
1206
1425
  return initPlanner;
@@ -1219,11 +1438,11 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1219
1438
  }, {
1220
1439
  key: "addPlannerElement",
1221
1440
  value: function () {
1222
- var _addPlannerElement = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee6(basketID, params) {
1441
+ var _addPlannerElement = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee7(basketID, params) {
1223
1442
  var _params$dockingPointI, _t$, _t$2, _t$3;
1224
1443
  var plannerElement, data, t;
1225
- return _regeneratorRuntime__default["default"].wrap(function _callee6$(_context6) {
1226
- while (1) switch (_context6.prev = _context6.next) {
1444
+ return _regeneratorRuntime__default["default"].wrap(function _callee7$(_context7) {
1445
+ while (1) switch (_context7.prev = _context7.next) {
1227
1446
  case 0:
1228
1447
  // _elementId: number, _setId: string, _basketId: string, elementInitProp: any, catalogElement: CatalogPlannerArticleData
1229
1448
  plannerElement = new index.PlannerElementData(this.set.getSetId(), basketID, this.nextElementId, DivaStandardPlanner.plannerType /*, this.set.getSetId(), basketID, elementInitProp, catalogElement*/);
@@ -1234,10 +1453,10 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1234
1453
  plannerElement.updatePlannerData(data);
1235
1454
  //Do load the svg
1236
1455
  if (this.doDisablePlanner2D) {
1237
- _context6.next = 9;
1456
+ _context7.next = 9;
1238
1457
  break;
1239
1458
  }
1240
- _context6.next = 9;
1459
+ _context7.next = 9;
1241
1460
  return PlannerHandler2D.handler2D.loadSVG(plannerElement, this.set);
1242
1461
  case 9:
1243
1462
  t = (_params$dockingPointI = params.dockingPointInfos) !== null && _params$dockingPointI !== void 0 ? _params$dockingPointI : [{
@@ -1245,49 +1464,49 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1245
1464
  targetElemIdToDock: params.targetElemIdToDock
1246
1465
  }];
1247
1466
  if (!(t !== null && t !== void 0 && (_t$ = t[0]) !== null && _t$ !== void 0 && _t$.targetElemIdToDock && t !== null && t !== void 0 && (_t$2 = t[0]) !== null && _t$2 !== void 0 && _t$2.targetDockingPointId)) {
1248
- _context6.next = 15;
1467
+ _context7.next = 15;
1249
1468
  break;
1250
1469
  }
1251
- _context6.next = 13;
1470
+ _context7.next = 13;
1252
1471
  return this.addElementToWorld(plannerElement, t);
1253
1472
  case 13:
1254
- _context6.next = 27;
1473
+ _context7.next = 27;
1255
1474
  break;
1256
1475
  case 15:
1257
1476
  if (!(t !== null && t !== void 0 && (_t$3 = t[0]) !== null && _t$3 !== void 0 && _t$3.targetElemIdToDock)) {
1258
- _context6.next = 20;
1477
+ _context7.next = 20;
1259
1478
  break;
1260
1479
  }
1261
- _context6.next = 18;
1480
+ _context7.next = 18;
1262
1481
  return this.addElementToWorld(plannerElement, t);
1263
1482
  case 18:
1264
- _context6.next = 27;
1483
+ _context7.next = 27;
1265
1484
  break;
1266
1485
  case 20:
1267
1486
  if (!params.oldPlannerTransform) {
1268
- _context6.next = 25;
1487
+ _context7.next = 25;
1269
1488
  break;
1270
1489
  }
1271
- _context6.next = 23;
1490
+ _context7.next = 23;
1272
1491
  return this.addElementToWorld(plannerElement, undefined, undefined, undefined, undefined, {
1273
1492
  forceSetToTrans: true,
1274
1493
  transform: params.oldPlannerTransform
1275
1494
  });
1276
1495
  case 23:
1277
- _context6.next = 27;
1496
+ _context7.next = 27;
1278
1497
  break;
1279
1498
  case 25:
1280
- _context6.next = 27;
1499
+ _context7.next = 27;
1281
1500
  return this.addElementToWorld(plannerElement);
1282
1501
  case 27:
1283
1502
  this.updatePlannerBoundingBox();
1284
1503
  case 28:
1285
1504
  case "end":
1286
- return _context6.stop();
1505
+ return _context7.stop();
1287
1506
  }
1288
- }, _callee6, this);
1507
+ }, _callee7, this);
1289
1508
  }));
1290
- function addPlannerElement(_x10, _x11) {
1509
+ function addPlannerElement(_x13, _x14) {
1291
1510
  return _addPlannerElement.apply(this, arguments);
1292
1511
  }
1293
1512
  return addPlannerElement;
@@ -1306,34 +1525,68 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1306
1525
  }, {
1307
1526
  key: "copyPlannerElement",
1308
1527
  value: (function () {
1309
- var _copyPlannerElement = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee7(articleCopyRelation, copyInfo) {
1310
- var articlesToLoad, i;
1311
- return _regeneratorRuntime__default["default"].wrap(function _callee7$(_context7) {
1312
- while (1) switch (_context7.prev = _context7.next) {
1528
+ var _copyPlannerElement = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee8(articleCopyRelation, copyInfo) {
1529
+ var i, _copyInfo$copyIndex, rel, dirX, sourceElement, targetDP;
1530
+ return _regeneratorRuntime__default["default"].wrap(function _callee8$(_context8) {
1531
+ while (1) switch (_context8.prev = _context8.next) {
1313
1532
  case 0:
1314
- articlesToLoad = [];
1315
- articleCopyRelation.forEach(function (rel) {
1316
- if (copyInfo == undefined) articlesToLoad.push(rel.value);
1317
- });
1318
1533
  i = 0;
1319
- case 3:
1320
- if (!(i < articlesToLoad.length)) {
1321
- _context7.next = 9;
1534
+ case 1:
1535
+ if (!(i < articleCopyRelation.length)) {
1536
+ _context8.next = 24;
1322
1537
  break;
1323
1538
  }
1324
- _context7.next = 6;
1325
- return this.addPlannerElement(articlesToLoad[i], {});
1539
+ rel = articleCopyRelation[i];
1540
+ if (!(copyInfo == undefined)) {
1541
+ _context8.next = 7;
1542
+ break;
1543
+ }
1544
+ _context8.next = 6;
1545
+ return this.addPlannerElement(rel.value, {});
1326
1546
  case 6:
1547
+ return _context8.abrupt("continue", 21);
1548
+ case 7:
1549
+ //Directional copy (copyIndex.x = -1 left / 1 right): dock the copy at the source element's free AVL/AVR
1550
+ dirX = (_copyInfo$copyIndex = copyInfo.copyIndex) === null || _copyInfo$copyIndex === void 0 ? void 0 : _copyInfo$copyIndex.x;
1551
+ if (!(dirX != -1 && dirX != 1)) {
1552
+ _context8.next = 12;
1553
+ break;
1554
+ }
1555
+ _context8.next = 11;
1556
+ return this.addPlannerElement(rel.value, {});
1557
+ case 11:
1558
+ return _context8.abrupt("continue", 21);
1559
+ case 12:
1560
+ sourceElement = this.plannerElements.get(rel.key);
1561
+ targetDP = sourceElement === null || sourceElement === void 0 ? void 0 : sourceElement.getFreeDockingPointsByType(dirX == -1 ? 'AVL' : 'AVR').find(function (dp) {
1562
+ return !dp.IsDisabled;
1563
+ });
1564
+ if (!(sourceElement && targetDP)) {
1565
+ _context8.next = 19;
1566
+ break;
1567
+ }
1568
+ _context8.next = 17;
1569
+ return this.addPlannerElement(rel.value, {
1570
+ targetElemIdToDock: sourceElement.ElementId,
1571
+ targetDockingPointId: targetDP.DpId
1572
+ });
1573
+ case 17:
1574
+ _context8.next = 21;
1575
+ break;
1576
+ case 19:
1577
+ _context8.next = 21;
1578
+ return this.addPlannerElement(rel.value, {});
1579
+ case 21:
1327
1580
  i++;
1328
- _context7.next = 3;
1581
+ _context8.next = 1;
1329
1582
  break;
1330
- case 9:
1583
+ case 24:
1331
1584
  case "end":
1332
- return _context7.stop();
1585
+ return _context8.stop();
1333
1586
  }
1334
- }, _callee7, this);
1587
+ }, _callee8, this);
1335
1588
  }));
1336
- function copyPlannerElement(_x12, _x13) {
1589
+ function copyPlannerElement(_x15, _x16) {
1337
1590
  return _copyPlannerElement.apply(this, arguments);
1338
1591
  }
1339
1592
  return copyPlannerElement;
@@ -1352,7 +1605,8 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1352
1605
  }, {
1353
1606
  key: "getPlannerElementsInfluencedByCopy",
1354
1607
  value: function getPlannerElementsInfluencedByCopy(elementId, copyInfo) {
1355
- if (!copyInfo || copyInfo.copyType != 'BoxPlanner_backside') throw new Error('copyType needs to be BoxPlanner_backside here');
1608
+ //STD = directional AVL/AVR copy of a single element; only the element itself is influenced
1609
+ if (!copyInfo || copyInfo.copyType != 'BoxPlanner_backside' && copyInfo.copyType != 'STD') throw new Error('copyType needs to be BoxPlanner_backside or STD here');
1356
1610
  if (this.plannerElements.has(elementId)) return [elementId];
1357
1611
  return [];
1358
1612
  }
@@ -1365,19 +1619,19 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1365
1619
  }, {
1366
1620
  key: "deletePlannerElement",
1367
1621
  value: (function () {
1368
- var _deletePlannerElement = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee8(elementId, autoCorrectAVL_AVR) {
1622
+ var _deletePlannerElement = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee9(elementId, autoCorrectAVL_AVR) {
1369
1623
  var plannerElement, parent, prevPosNum, nextPosNum, newSelElemIdPrev, newSelElemIdNext, endForEach, removeDockingRelation, avlVec, avrVec, elementLeft, elementRight, avrElementLeft, avlElementRight, transform;
1370
- return _regeneratorRuntime__default["default"].wrap(function _callee8$(_context8) {
1371
- while (1) switch (_context8.prev = _context8.next) {
1624
+ return _regeneratorRuntime__default["default"].wrap(function _callee9$(_context9) {
1625
+ while (1) switch (_context9.prev = _context9.next) {
1372
1626
  case 0:
1373
- _context8.next = 2;
1627
+ _context9.next = 2;
1374
1628
  return DivaUtils__default["default"].Sleep(1);
1375
1629
  case 2:
1376
1630
  if (this.plannerElements.has(elementId)) {
1377
- _context8.next = 4;
1631
+ _context9.next = 4;
1378
1632
  break;
1379
1633
  }
1380
- return _context8.abrupt("return", {});
1634
+ return _context9.abrupt("return", {});
1381
1635
  case 4:
1382
1636
  plannerElement = this.plannerElements.get(elementId);
1383
1637
  parent = this.getParentElement(plannerElement);
@@ -1434,17 +1688,17 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1434
1688
  this.updatePlannerPosNr();
1435
1689
  this.checkCollision(false, plannerElement.getElementId());
1436
1690
  this.updatePlannerBoundingBox();
1437
- return _context8.abrupt("return", {
1691
+ return _context9.abrupt("return", {
1438
1692
  newElementToSelect: newSelElemIdPrev >= 0 ? newSelElemIdPrev : newSelElemIdNext >= 0 ? newSelElemIdNext : undefined,
1439
1693
  transform: transform
1440
1694
  });
1441
1695
  case 24:
1442
1696
  case "end":
1443
- return _context8.stop();
1697
+ return _context9.stop();
1444
1698
  }
1445
- }, _callee8, this);
1699
+ }, _callee9, this);
1446
1700
  }));
1447
- function deletePlannerElement(_x14, _x15) {
1701
+ function deletePlannerElement(_x17, _x18) {
1448
1702
  return _deletePlannerElement.apply(this, arguments);
1449
1703
  }
1450
1704
  return deletePlannerElement;
@@ -1536,8 +1790,8 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1536
1790
  element.SetPosNr = startSetPosNr + element.PosNr - 1;
1537
1791
  this.set.setPosNr(element.ElementId, element.getPosNr());
1538
1792
  }
1539
- for (var _i3 = 0; _i3 < elements.length; _i3++) {
1540
- if (!elements[_i3].IsAccessoire) this.set.giveAccNewPosNrByBasketId(elements[_i3].getBasketId());
1793
+ for (var _i4 = 0; _i4 < elements.length; _i4++) {
1794
+ if (!elements[_i4].IsAccessoire) this.set.giveAccNewPosNrByBasketId(elements[_i4].getBasketId());
1541
1795
  }
1542
1796
  return elements.length;
1543
1797
  }
@@ -1554,12 +1808,12 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1554
1808
  */
1555
1809
  }, {
1556
1810
  key: "updatePlannerTrans",
1557
- value: function updatePlannerTrans(elementId, deltaMove, deltaAngleDeg, rotCorrection, transState, autoDockingDistance) {
1811
+ value: function updatePlannerTrans(elementId, deltaMove, deltaAngleDeg, rotCorrection, transState, autoDockingDistance, turningPoint) {
1558
1812
  var _this3 = this;
1559
1813
  var updateConfig = false;
1560
1814
  if (this.plannerElements.has(elementId)) {
1561
1815
  var plannerElement = this.plannerElements.get(elementId);
1562
- plannerElement === null || plannerElement === void 0 || plannerElement.updateDeltaTrans(deltaMove, deltaAngleDeg, rotCorrection, transState == 'END');
1816
+ plannerElement === null || plannerElement === void 0 || plannerElement.updateDeltaTrans(deltaMove, deltaAngleDeg, rotCorrection, transState == 'END', turningPoint);
1563
1817
  if (transState == 'START') {
1564
1818
  if (plannerElement) {
1565
1819
  var dpsToUndock = ['AVR', 'AVL'];
@@ -1742,8 +1996,8 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
1742
1996
  }
1743
1997
  var shelfPlannerElements = _this5.set.getShelfPlannerData(elemId);
1744
1998
  if (shelfPlannerElements) {
1745
- for (var _i4 = 0; _i4 < shelfPlannerElements.length; _i4++) {
1746
- var accessorire = shelfPlannerElements[_i4];
1999
+ for (var _i5 = 0; _i5 < shelfPlannerElements.length; _i5++) {
2000
+ var accessorire = shelfPlannerElements[_i5];
1747
2001
  var shelfConfig = _this5.set.getShelfPlannerConfigData(accessorire.basketId).config;
1748
2002
  var _accElements2 = [];
1749
2003
  if (shelfConfig.accs && shelfConfig.accs.length > 0) {