@sapui5/sap.suite.ui.commons 1.144.0 → 1.146.0

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 (123) hide show
  1. package/package.json +1 -1
  2. package/src/sap/suite/ui/commons/.library +1 -1
  3. package/src/sap/suite/ui/commons/AriaProperties.js +1 -1
  4. package/src/sap/suite/ui/commons/CalculationBuilder.js +35 -6
  5. package/src/sap/suite/ui/commons/CalculationBuilderExpression.js +1 -1
  6. package/src/sap/suite/ui/commons/CalculationBuilderFunction.js +1 -1
  7. package/src/sap/suite/ui/commons/CalculationBuilderGroup.js +1 -1
  8. package/src/sap/suite/ui/commons/CalculationBuilderInput.js +11 -0
  9. package/src/sap/suite/ui/commons/CalculationBuilderItem.js +1 -1
  10. package/src/sap/suite/ui/commons/CalculationBuilderValidationResult.js +1 -1
  11. package/src/sap/suite/ui/commons/CalculationBuilderVariable.js +1 -1
  12. package/src/sap/suite/ui/commons/CloudFilePicker.js +1 -3
  13. package/src/sap/suite/ui/commons/ControlProxy.js +7 -4
  14. package/src/sap/suite/ui/commons/MicroProcessFlow.js +1 -1
  15. package/src/sap/suite/ui/commons/MicroProcessFlowItem.js +1 -1
  16. package/src/sap/suite/ui/commons/ProcessFlow.js +79 -75
  17. package/src/sap/suite/ui/commons/ProcessFlowRenderer.js +3 -0
  18. package/src/sap/suite/ui/commons/Timeline.js +9 -0
  19. package/src/sap/suite/ui/commons/TimelineNavigator.js +37 -5
  20. package/src/sap/suite/ui/commons/TimelineRenderer.js +3 -3
  21. package/src/sap/suite/ui/commons/collaboration/BaseHelperService.js +0 -1
  22. package/src/sap/suite/ui/commons/collaboration/CollaborationHelper.js +0 -3
  23. package/src/sap/suite/ui/commons/collaboration/CollaborationManagerService.js +0 -1
  24. package/src/sap/suite/ui/commons/collaboration/ContactHelper.js +12 -1
  25. package/src/sap/suite/ui/commons/collaboration/ContactPopover.fragment.xml +4 -1
  26. package/src/sap/suite/ui/commons/collaboration/MinimalContactPopover.fragment.xml +8 -5
  27. package/src/sap/suite/ui/commons/collaboration/ServiceContainer.js +12 -2
  28. package/src/sap/suite/ui/commons/collaboration/TeamsHelperService.js +0 -6
  29. package/src/sap/suite/ui/commons/collaboration/channels/MessageChannel.js +0 -2
  30. package/src/sap/suite/ui/commons/collaboration/flpplugins/msplugin/Component-preload.js +1 -1
  31. package/src/sap/suite/ui/commons/collaboration/flpplugins/msplugin/Component.js +1 -2
  32. package/src/sap/suite/ui/commons/flexibility/changeHandler/PropertyChangeMapper.js +1 -1
  33. package/src/sap/suite/ui/commons/imageeditor/CropCustomShapeHistoryItem.js +1 -1
  34. package/src/sap/suite/ui/commons/imageeditor/CropEllipseHistoryItem.js +1 -1
  35. package/src/sap/suite/ui/commons/imageeditor/CropRectangleHistoryItem.js +1 -1
  36. package/src/sap/suite/ui/commons/imageeditor/CustomSizeItem.js +1 -1
  37. package/src/sap/suite/ui/commons/imageeditor/FilterHistoryItem.js +1 -1
  38. package/src/sap/suite/ui/commons/imageeditor/FlipHistoryItem.js +1 -1
  39. package/src/sap/suite/ui/commons/imageeditor/HistoryItem.js +1 -1
  40. package/src/sap/suite/ui/commons/imageeditor/ImageEditor.js +1 -1
  41. package/src/sap/suite/ui/commons/imageeditor/ImageEditorContainer.js +1 -1
  42. package/src/sap/suite/ui/commons/imageeditor/ImageEditorResponsiveContainer.js +9 -6
  43. package/src/sap/suite/ui/commons/imageeditor/ResizeHistoryItem.js +1 -1
  44. package/src/sap/suite/ui/commons/imageeditor/RotateHistoryItem.js +1 -1
  45. package/src/sap/suite/ui/commons/library.js +25 -1
  46. package/src/sap/suite/ui/commons/messagebundle.properties +20 -9
  47. package/src/sap/suite/ui/commons/messagebundle_ar.properties +24 -3
  48. package/src/sap/suite/ui/commons/messagebundle_bg.properties +24 -3
  49. package/src/sap/suite/ui/commons/messagebundle_ca.properties +24 -3
  50. package/src/sap/suite/ui/commons/messagebundle_cnr.properties +24 -3
  51. package/src/sap/suite/ui/commons/messagebundle_cs.properties +23 -2
  52. package/src/sap/suite/ui/commons/messagebundle_cy.properties +24 -3
  53. package/src/sap/suite/ui/commons/messagebundle_da.properties +23 -2
  54. package/src/sap/suite/ui/commons/messagebundle_de.properties +36 -15
  55. package/src/sap/suite/ui/commons/messagebundle_el.properties +25 -4
  56. package/src/sap/suite/ui/commons/messagebundle_en.properties +24 -3
  57. package/src/sap/suite/ui/commons/messagebundle_en_GB.properties +24 -3
  58. package/src/sap/suite/ui/commons/messagebundle_en_US_saprigi.properties +11 -5
  59. package/src/sap/suite/ui/commons/messagebundle_es.properties +24 -3
  60. package/src/sap/suite/ui/commons/messagebundle_es_MX.properties +24 -3
  61. package/src/sap/suite/ui/commons/messagebundle_et.properties +23 -2
  62. package/src/sap/suite/ui/commons/messagebundle_fi.properties +23 -2
  63. package/src/sap/suite/ui/commons/messagebundle_fr.properties +32 -11
  64. package/src/sap/suite/ui/commons/messagebundle_fr_CA.properties +24 -3
  65. package/src/sap/suite/ui/commons/messagebundle_hi.properties +24 -3
  66. package/src/sap/suite/ui/commons/messagebundle_hr.properties +24 -3
  67. package/src/sap/suite/ui/commons/messagebundle_hu.properties +24 -3
  68. package/src/sap/suite/ui/commons/messagebundle_id.properties +25 -4
  69. package/src/sap/suite/ui/commons/messagebundle_it.properties +24 -3
  70. package/src/sap/suite/ui/commons/messagebundle_iw.properties +24 -3
  71. package/src/sap/suite/ui/commons/messagebundle_ja.properties +24 -3
  72. package/src/sap/suite/ui/commons/messagebundle_kk.properties +25 -4
  73. package/src/sap/suite/ui/commons/messagebundle_ko.properties +23 -2
  74. package/src/sap/suite/ui/commons/messagebundle_lt.properties +24 -3
  75. package/src/sap/suite/ui/commons/messagebundle_lv.properties +24 -3
  76. package/src/sap/suite/ui/commons/messagebundle_mk.properties +23 -2
  77. package/src/sap/suite/ui/commons/messagebundle_ms.properties +24 -3
  78. package/src/sap/suite/ui/commons/messagebundle_nl.properties +23 -2
  79. package/src/sap/suite/ui/commons/messagebundle_no.properties +25 -4
  80. package/src/sap/suite/ui/commons/messagebundle_pl.properties +24 -3
  81. package/src/sap/suite/ui/commons/messagebundle_pt.properties +24 -3
  82. package/src/sap/suite/ui/commons/messagebundle_pt_PT.properties +24 -3
  83. package/src/sap/suite/ui/commons/messagebundle_ro.properties +24 -3
  84. package/src/sap/suite/ui/commons/messagebundle_ru.properties +25 -4
  85. package/src/sap/suite/ui/commons/messagebundle_sh.properties +24 -3
  86. package/src/sap/suite/ui/commons/messagebundle_sk.properties +24 -3
  87. package/src/sap/suite/ui/commons/messagebundle_sl.properties +23 -2
  88. package/src/sap/suite/ui/commons/messagebundle_sr.properties +24 -3
  89. package/src/sap/suite/ui/commons/messagebundle_sv.properties +23 -2
  90. package/src/sap/suite/ui/commons/messagebundle_th.properties +25 -4
  91. package/src/sap/suite/ui/commons/messagebundle_tr.properties +24 -3
  92. package/src/sap/suite/ui/commons/messagebundle_uk.properties +27 -6
  93. package/src/sap/suite/ui/commons/messagebundle_vi.properties +26 -5
  94. package/src/sap/suite/ui/commons/messagebundle_zh_CN.properties +24 -3
  95. package/src/sap/suite/ui/commons/messagebundle_zh_TW.properties +26 -5
  96. package/src/sap/suite/ui/commons/networkgraph/Graph.js +49 -22
  97. package/src/sap/suite/ui/commons/networkgraph/KeyboardNavigator.js +45 -4
  98. package/src/sap/suite/ui/commons/networkgraph/Line.js +157 -11
  99. package/src/sap/suite/ui/commons/networkgraph/Node.js +289 -86
  100. package/src/sap/suite/ui/commons/networkgraph/Utils.js +239 -10
  101. package/src/sap/suite/ui/commons/networkgraph/layout/NoopLayout.js +55 -8
  102. package/src/sap/suite/ui/commons/networkgraph/util/DependencyLayoutHelper.js +156 -74
  103. package/src/sap/suite/ui/commons/networkgraph/util/DragDropManager.js +52 -50
  104. package/src/sap/suite/ui/commons/networkgraph/util/PortManager.js +14 -6
  105. package/src/sap/suite/ui/commons/statusindicator/Circle.js +1 -1
  106. package/src/sap/suite/ui/commons/statusindicator/CustomShape.js +1 -1
  107. package/src/sap/suite/ui/commons/statusindicator/DiscreteThreshold.js +1 -1
  108. package/src/sap/suite/ui/commons/statusindicator/FillingOption.js +1 -1
  109. package/src/sap/suite/ui/commons/statusindicator/LibraryShape.js +1 -1
  110. package/src/sap/suite/ui/commons/statusindicator/Path.js +1 -1
  111. package/src/sap/suite/ui/commons/statusindicator/PropertyThreshold.js +1 -1
  112. package/src/sap/suite/ui/commons/statusindicator/Rectangle.js +1 -1
  113. package/src/sap/suite/ui/commons/statusindicator/Shape.js +1 -1
  114. package/src/sap/suite/ui/commons/statusindicator/ShapeGroup.js +1 -1
  115. package/src/sap/suite/ui/commons/statusindicator/SimpleShape.js +1 -1
  116. package/src/sap/suite/ui/commons/statusindicator/StatusIndicator.js +1 -1
  117. package/src/sap/suite/ui/commons/taccount/TAccount.js +1 -1
  118. package/src/sap/suite/ui/commons/taccount/TAccountGroup.js +1 -1
  119. package/src/sap/suite/ui/commons/taccount/TAccountItem.js +1 -1
  120. package/src/sap/suite/ui/commons/taccount/TAccountItemProperty.js +1 -1
  121. package/src/sap/suite/ui/commons/taccount/TAccountPanel.js +1 -1
  122. package/src/sap/suite/ui/commons/themes/base/NetworkLine.less +26 -5
  123. package/src/sap/suite/ui/commons/windowmessages/CollaborationMessageConsumer.js +3 -3
@@ -47,7 +47,8 @@ sap.ui.define([
47
47
  'sap/ui/core/InvisibleText',
48
48
  "./GraphRenderer",
49
49
  "./util/DragDropManager",
50
- "./util/PortManager"
50
+ "./util/PortManager",
51
+ "sap/ui/core/IconPool"
51
52
  ], function (
52
53
  library,
53
54
  jQuery,
@@ -90,7 +91,8 @@ sap.ui.define([
90
91
  InvisibleText,
91
92
  GraphRenderer,
92
93
  DragDropManager,
93
- PortManager
94
+ PortManager,
95
+ IconPool
94
96
  ) {
95
97
  "use strict";
96
98
 
@@ -250,6 +252,7 @@ sap.ui.define([
250
252
  /**
251
253
  * Enables the drag and drop of nodes. This property is ignored if the layout property is not set to noop.
252
254
  * If set to <code>true</code>, nodes can be dragged and dropped within the graph.
255
+ * Note: Drag and drop functionality is only available for nodes. Groups cannot be dragged and dropped, even when NoopLayout is used and enableDragAndDrop is set to true.
253
256
  * @public
254
257
  * @since 1.144
255
258
  */
@@ -413,7 +416,9 @@ sap.ui.define([
413
416
  }
414
417
  },
415
418
  /**
416
- * This event is fired when a user drops a node in the graph. This event is available only for the noop layout.
419
+ * This event is fired when a user drops a node in the graph.
420
+ * This event is available only when the layout algorithm is set to "NoopLayout" and the <code>enableDragAndDrop</code> property is set to <code>true</code>.
421
+ * Note: When a node is dropped near the TOP or LEFT boundary of the graph canvas, its position is automatically adjusted (clamped) to ensure the node and its elements remain fully visible. This provides better visualization by preventing nodes from being positioned at coordinates that would make them invisible or partially hidden.
417
422
  * @public
418
423
  * @since 1.144
419
424
  */
@@ -461,6 +466,20 @@ sap.ui.define([
461
466
  **/
462
467
  toNode: { type: "sap.suite.ui.commons.networkgraph.Node" }
463
468
  }
469
+ },
470
+ /**
471
+ * This event is fired when a user presses the delete key on a focused node or line.
472
+ * This event is available only when the layout algorithm is set to "NoopLayout" and the <code>enableDragAndDrop</code> property is set to <code>true</code>.
473
+ * @public
474
+ * @since 1.145
475
+ */
476
+ itemDeleted: {
477
+ parameters: {
478
+ /**
479
+ * The item (node or line) that is to be deleted.
480
+ */
481
+ item: { type: "sap.suite.ui.commons.networkgraph.ElementBase" }
482
+ }
464
483
  }
465
484
  }
466
485
  }
@@ -1142,11 +1161,17 @@ sap.ui.define([
1142
1161
  Graph.prototype.setEnableDragAndDrop = function (bEnabled) {
1143
1162
  this.setProperty("enableDragAndDrop", bEnabled, true);
1144
1163
 
1145
- // Update zoom button states
1146
- if (this._zoomIn && this._zoomOut) {
1147
- var bZoomEnabled = !this._isDnDEnabled();
1148
- this._zoomIn.setEnabled(bZoomEnabled);
1149
- this._zoomOut.setEnabled(bZoomEnabled);
1164
+ // Update zoom button visibility
1165
+ if (this._zoomIn && this._zoomOut && this._zoomToFitButton) {
1166
+ var bZoomVisible = !this._isDnDEnabled();
1167
+ this._zoomIn.setVisible(bZoomVisible);
1168
+ this._zoomOut.setVisible(bZoomVisible);
1169
+ this._zoomToFitButton.setVisible(bZoomVisible);
1170
+ }
1171
+
1172
+ // remove the node ports when drag and drop is disabled
1173
+ if (!bEnabled) {
1174
+ PortManager.removeAllPorts();
1150
1175
  }
1151
1176
 
1152
1177
  return this;
@@ -1176,12 +1201,12 @@ sap.ui.define([
1176
1201
  this._oFocus.item.isA("sap.suite.ui.commons.networkgraph.Node")))) {
1177
1202
  this._updateAccessibility(oFocus);
1178
1203
  }
1179
- this._updateAccessibility(oFocus);
1180
- return;
1204
+ this._updateAccessibility(oFocus);
1205
+ return;
1181
1206
  }
1182
1207
 
1183
1208
  this.defocus();
1184
- if (this.getFocusDomRef()) {
1209
+ if (this.getFocusDomRef() && !(oFocus && oFocus.button && oFocus.button.id && oFocus.button.id.indexOf("actionOverflow") !== -1)) {
1185
1210
  this.getFocusDomRef().focus();
1186
1211
  }
1187
1212
 
@@ -2202,22 +2227,24 @@ sap.ui.define([
2202
2227
  }
2203
2228
  });
2204
2229
  this._toolbar.addContent(this._zoomOut);
2205
-
2206
- // Disable zoom buttons if drag and drop is enabled
2207
- if (this._isDnDEnabled()) {
2208
- this._zoomIn.setEnabled(false);
2209
- this._zoomOut.setEnabled(false);
2210
- }
2211
- }
2230
+ }
2212
2231
 
2213
2232
  // fit to viewport
2214
- this._toolbar.addContent(new OverflowToolbarButton({
2233
+ this._zoomToFitButton = new OverflowToolbarButton({
2215
2234
  type: ButtonType.Transparent,
2216
2235
  icon: "sap-icon://popup-window",
2217
2236
  tooltip: oResourceBundle.getText("NETWORK_GRAPH_ZOOMTOFIT"),
2218
2237
  text: oResourceBundle.getText("NETWORK_GRAPH_ZOOMTOFIT"),
2219
2238
  press: this._fitToScreen.bind(this)
2220
- }));
2239
+ });
2240
+ this._toolbar.addContent(this._zoomToFitButton);
2241
+
2242
+ // Hide zoom buttons if drag and drop is enabled
2243
+ if (this._isDnDEnabled()) {
2244
+ this._zoomIn.setVisible(false);
2245
+ this._zoomOut.setVisible(false);
2246
+ this._zoomToFitButton.setVisible(false);
2247
+ }
2221
2248
 
2222
2249
  // toggle full screen
2223
2250
  this._oFullScreenButton = new OverflowToolbarButton({
@@ -2622,7 +2649,7 @@ sap.ui.define([
2622
2649
  this._tooltip.instantClose();
2623
2650
 
2624
2651
  // Remove all ports when deselecting
2625
- if (this.getNodePorts() !== "None") {
2652
+ if (PortManager._currentTriggerNodeKey !== null) {
2626
2653
  PortManager.removeAllPorts();
2627
2654
  }
2628
2655
  };
@@ -3309,7 +3336,7 @@ sap.ui.define([
3309
3336
  * @private
3310
3337
  */
3311
3338
  Graph.prototype._supportsNodePorts = function () {
3312
- return this.getNodePorts() !== "None" && this._isDnDEnabled() && this.getShowCreateConnectionButton();
3339
+ return this.getNodePorts() !== "None" && this._isDnDEnabled();
3313
3340
  };
3314
3341
 
3315
3342
  return Graph;
@@ -187,13 +187,15 @@ sap.ui.define([
187
187
  };
188
188
 
189
189
  KeyboardNavigator.prototype.onkeyup = function(oEvent) {
190
- if (oEvent.keyCode === KeyCodes.SPACE){
191
- this._handleEnter();
192
- if (this._oGraph.getFocusDomRef() === document.activeElement) {
190
+ if (oEvent.keyCode === KeyCodes.SPACE){
191
+ this._handleEnter();
192
+ if (this._oGraph.getFocusDomRef() === document.activeElement) {
193
193
  oEvent.stopPropagation();
194
194
  oEvent.preventDefault();
195
- }
196
195
  }
196
+ } else if (oEvent.keyCode === KeyCodes.DELETE || oEvent.keyCode === KeyCodes.BACKSPACE) {
197
+ this._handleDelete(oEvent);
198
+ }
197
199
  };
198
200
 
199
201
  KeyboardNavigator.prototype.onsapenter = function (oEvent) {
@@ -331,6 +333,45 @@ sap.ui.define([
331
333
  }
332
334
  };
333
335
 
336
+ KeyboardNavigator.prototype._handleDelete = function (oEvent) {
337
+ // Only handle delete when DnD is enabled
338
+ if (!this._oGraph._isDnDEnabled()) {
339
+ return;
340
+ }
341
+
342
+ var oFocus = this.getFocus();
343
+ if (!oFocus) {
344
+ return;
345
+ }
346
+
347
+ var oItem = oFocus.item;
348
+
349
+ // Only allow delete for Node and Line, not Group
350
+ if (oItem instanceof Node || oItem instanceof Line) {
351
+ oItem.setSelected(false);
352
+
353
+ // Clear focus before delete to prevent stale reference issues
354
+ if (this._oGraph._oFocus && this._oGraph._oFocus.item === oItem) {
355
+ this._oGraph._oFocus = null;
356
+ }
357
+
358
+ // Fire the itemDeleted event on the graph
359
+ var bExecuteDefault = this._oGraph.fireEvent("itemDeleted", {
360
+ item: oItem
361
+ }, true);
362
+
363
+ if (bExecuteDefault) {
364
+ oEvent.stopPropagation();
365
+ oEvent.preventDefault();
366
+ }
367
+
368
+ // Restore focus after a small timeout (to let any rerender settle)
369
+ setTimeout(function () {
370
+ this._oGraph.setFocus(oFocus)
371
+ }.bind(this), 0);
372
+ }
373
+ };
374
+
334
375
  KeyboardNavigator.prototype._handleTab = function (oEvent, sDirection) {
335
376
  var oResourceBundle = CoreLib.getResourceBundleFor("sap.suite.ui.commons");
336
377
  this._oWrapperDom.setAttribute("aria-live","assertive");
@@ -191,16 +191,19 @@ sap.ui.define([
191
191
  }
192
192
  }
193
193
  },
194
- renderer: function (oRM, oControl) {
195
- // NOTE: this render is considered to be called only for single item invalidation
196
- // whole graph has different render path
197
- var sHtml = oControl._render({
198
- renderManager: oRM
199
- });
200
- this.oRm = oRM;
194
+ renderer: {
195
+ apiVersion: 2,
196
+ render (oRM, oControl) {
197
+ // NOTE: this render is considered to be called only for single item invalidation
198
+ // whole graph has different render path
199
+ var sHtml = oControl._render({
200
+ renderManager: oRM
201
+ });
202
+ this.oRm = oRM;
201
203
 
202
- if (sHtml) {
203
- oRM.unsafeHtml(sHtml);
204
+ if (sHtml) {
205
+ oRM.unsafeHtml(sHtml);
206
+ }
204
207
  }
205
208
  },
206
209
  onAfterRendering: function () {
@@ -905,6 +908,11 @@ sap.ui.define([
905
908
 
906
909
  aSentenceParts.push(oResourceBundle.getText('NETWORK_GRAPH_ACCESSIBILITY_TOGGLE_STATE'));
907
910
 
911
+ const iIncomingConnectors = this.getFromNode().getChildLines().length;
912
+ if (iIncomingConnectors > 1) {
913
+ aSentenceParts.push(oResourceBundle.getText('NETWORK_GRAPH_LINE_NAVIGATION_ARROW_KEYS', [sFromNodeText]));
914
+ }
915
+
908
916
  aSentenceParts.push(oResourceBundle.getText('NETWORK_GRAPH_LINE_NAVIGATION_TAB_TO_TARGET', [sToNodeText]));
909
917
  aSentenceParts.push(oResourceBundle.getText('NETWORK_GRAPH_LINE_NAVIGATION_SHIFT_TAB_TO_SOURCE', [sFromNodeText]));
910
918
 
@@ -1106,10 +1114,39 @@ sap.ui.define([
1106
1114
  $line.on("mouseout", function (oEvent) {
1107
1115
  this._mouseOut();
1108
1116
  }.bind(this));
1117
+
1118
+ // Setup events for text box
1119
+ var oParent = this.getParent();
1120
+ if (oParent) {
1121
+ var sLineId = this._getLineId();
1122
+ var $textBox = oParent.$("line-texts").find('[data-line-id="' + sLineId + '"]');
1123
+
1124
+ $textBox.on("click", function (oEvent) {
1125
+ this._click({
1126
+ ctrlKey: oEvent.ctrlKey,
1127
+ clientX: oEvent.clientX,
1128
+ clientY: oEvent.clientY
1129
+ });
1130
+ }.bind(this));
1131
+
1132
+ $textBox.on("mouseover", function (oEvent) {
1133
+ this._mouseOver();
1134
+ }.bind(this));
1135
+
1136
+ $textBox.on("mouseout", function (oEvent) {
1137
+ this._mouseOut();
1138
+ }.bind(this));
1139
+ }
1109
1140
  };
1110
1141
 
1111
1142
  Line.prototype._mouseOut = function () {
1112
1143
  this.$().removeClass(this.HIGHLIGHT_CLASS);
1144
+ // Remove highlight class from text box using data-line-id attribute
1145
+ var oParent = this.getParent();
1146
+ if (oParent) {
1147
+ var sLineId = this._getLineId();
1148
+ oParent.$("line-texts").find('[data-line-id="' + sLineId + '"]').removeClass(this.HIGHLIGHT_CLASS);
1149
+ }
1113
1150
  if (!this.getSelected()) {
1114
1151
  this._setStatusColors("");
1115
1152
  }
@@ -1121,6 +1158,12 @@ sap.ui.define([
1121
1158
  if (!this.getSelected() && bExecuteDefault) {
1122
1159
  this._setStatusColors("Hover");
1123
1160
  this.$().addClass(this.HIGHLIGHT_CLASS);
1161
+ // Add highlight class to text box using data-line-id attribute
1162
+ var oParent = this.getParent();
1163
+ if (oParent) {
1164
+ var sLineId = this._getLineId();
1165
+ oParent.$("line-texts").find('[data-line-id="' + sLineId + '"]').addClass(this.HIGHLIGHT_CLASS);
1166
+ }
1124
1167
  }
1125
1168
  };
1126
1169
 
@@ -1141,7 +1184,7 @@ sap.ui.define([
1141
1184
  }
1142
1185
  } else {
1143
1186
  /** @deprecated As of 1.120 */
1144
- {
1187
+ {
1145
1188
  $arrow.css("fill", sBackgroundColor);
1146
1189
  $arrow.css("stroke", sBorderColor);
1147
1190
  this.$("path").css("stroke", sBorderColor);
@@ -1434,6 +1477,18 @@ sap.ui.define([
1434
1477
  if (bFocus) {
1435
1478
  this._renderFocusWrapper();
1436
1479
  }
1480
+
1481
+ // Apply focus class to text box for blue border
1482
+ var oParent = this.getParent();
1483
+ if (oParent) {
1484
+ var sLineId = this._getLineId();
1485
+ var $textBox = oParent.$("line-texts").find('[data-line-id="' + sLineId + '"]');
1486
+ if (bFocus) {
1487
+ $textBox.addClass(this.FOCUS_CLASS);
1488
+ } else {
1489
+ $textBox.removeClass(this.FOCUS_CLASS);
1490
+ }
1491
+ }
1437
1492
  };
1438
1493
 
1439
1494
  Line.prototype._isEndPosition = function () {
@@ -1850,6 +1905,9 @@ sap.ui.define([
1850
1905
  fRemainingDistance,
1851
1906
  i;
1852
1907
 
1908
+ // Threshold to detect if arrow is too close to a vertex/bend (10px)
1909
+ var fVertexThreshold = 10;
1910
+
1853
1911
  if (sDirection === "forward") {
1854
1912
  // Travel from source towards target
1855
1913
  for (i = 0; i < iLastIndex; i++) {
@@ -1901,7 +1959,95 @@ sap.ui.define([
1901
1959
  fRatio = 1 - fRatio; // Reverse the ratio for backward direction
1902
1960
  }
1903
1961
 
1904
- // Calculate the exact coordinates that are 44px away from the anchor
1962
+ // Check if arrow position is too close to a vertex (bend point)
1963
+ var fDistanceToStart = fRatio * fSegmentLength;
1964
+ var fDistanceToEnd = (1 - fRatio) * fSegmentLength;
1965
+ var fAdjustedSegmentLength;
1966
+
1967
+ // Strategy: When arrow is too close to a bend, prefer moving AWAY from the anchor
1968
+ // to avoid overlap with node/port. This means:
1969
+ // - For "forward" direction (from source): prefer moving to next segment (away from source)
1970
+ // - For "backward" direction (from target): prefer moving to previous segment (away from target)
1971
+
1972
+ if (sDirection === "forward") {
1973
+ // Arrow traveling from source: prefer moving forward (away from source) when near bend
1974
+ if (fDistanceToEnd < fVertexThreshold && iSegmentIndex + 1 < iLastIndex) {
1975
+ // Too close to end of segment - move to next segment (preferred)
1976
+ fAdjustedSegmentLength = Math.sqrt(
1977
+ Math.pow(oCoords[iSegmentIndex + 2].getX() - oCoords[iSegmentIndex + 1].getX(), 2) +
1978
+ Math.pow(oCoords[iSegmentIndex + 2].getY() - oCoords[iSegmentIndex + 1].getY(), 2)
1979
+ );
1980
+
1981
+ if (fAdjustedSegmentLength > fVertexThreshold) {
1982
+ // Move arrow to start of next segment plus threshold
1983
+ iSegmentIndex = iSegmentIndex + 1;
1984
+ fRatio = fVertexThreshold / fAdjustedSegmentLength;
1985
+ fSegmentLength = fAdjustedSegmentLength;
1986
+ } else {
1987
+ // Next segment too short, stay on current segment away from vertex
1988
+ fRatio = Math.max(0, (fSegmentLength - fVertexThreshold) / fSegmentLength);
1989
+ }
1990
+ } else if (fDistanceToStart < fVertexThreshold) {
1991
+ // Too close to start of segment - only move back if critically close to source anchor
1992
+ // This is less preferred as it moves closer to the source node/port
1993
+ if (fDistanceToStart < 5 && iSegmentIndex > 0) {
1994
+ // Only if extremely close (< 5px) and previous segment exists
1995
+ fAdjustedSegmentLength = Math.sqrt(
1996
+ Math.pow(oCoords[iSegmentIndex].getX() - oCoords[iSegmentIndex - 1].getX(), 2) +
1997
+ Math.pow(oCoords[iSegmentIndex].getY() - oCoords[iSegmentIndex - 1].getY(), 2)
1998
+ );
1999
+
2000
+ if (fAdjustedSegmentLength > fVertexThreshold) {
2001
+ iSegmentIndex = iSegmentIndex - 1;
2002
+ fRatio = (fAdjustedSegmentLength - fVertexThreshold) / fAdjustedSegmentLength;
2003
+ fSegmentLength = fAdjustedSegmentLength;
2004
+ }
2005
+ } else {
2006
+ // Stay on current segment, move away from start vertex
2007
+ fRatio = Math.min(1, fVertexThreshold / fSegmentLength);
2008
+ }
2009
+ }
2010
+ } else if (sDirection === "backward") {
2011
+ // Arrow traveling from target: prefer moving backward (away from target) when near bend
2012
+ if (fDistanceToStart < fVertexThreshold && iSegmentIndex > 0) {
2013
+ // Too close to start of segment - move to previous segment (preferred)
2014
+ fAdjustedSegmentLength = Math.sqrt(
2015
+ Math.pow(oCoords[iSegmentIndex].getX() - oCoords[iSegmentIndex - 1].getX(), 2) +
2016
+ Math.pow(oCoords[iSegmentIndex].getY() - oCoords[iSegmentIndex - 1].getY(), 2)
2017
+ );
2018
+
2019
+ if (fAdjustedSegmentLength > fVertexThreshold) {
2020
+ // Move arrow to end of previous segment minus threshold
2021
+ iSegmentIndex = iSegmentIndex - 1;
2022
+ fRatio = (fAdjustedSegmentLength - fVertexThreshold) / fAdjustedSegmentLength;
2023
+ fSegmentLength = fAdjustedSegmentLength;
2024
+ } else {
2025
+ // Previous segment too short, stay on current segment away from vertex
2026
+ fRatio = Math.min(1, fVertexThreshold / fSegmentLength);
2027
+ }
2028
+ } else if (fDistanceToEnd < fVertexThreshold) {
2029
+ // Too close to end of segment - only move forward if critically close to target anchor
2030
+ // This is less preferred as it moves closer to the target node/port
2031
+ if (fDistanceToEnd < 5 && iSegmentIndex + 1 < iLastIndex) {
2032
+ // Only if extremely close (< 5px) and next segment exists
2033
+ fAdjustedSegmentLength = Math.sqrt(
2034
+ Math.pow(oCoords[iSegmentIndex + 2].getX() - oCoords[iSegmentIndex + 1].getX(), 2) +
2035
+ Math.pow(oCoords[iSegmentIndex + 2].getY() - oCoords[iSegmentIndex + 1].getY(), 2)
2036
+ );
2037
+
2038
+ if (fAdjustedSegmentLength > fVertexThreshold) {
2039
+ iSegmentIndex = iSegmentIndex + 1;
2040
+ fRatio = fVertexThreshold / fAdjustedSegmentLength;
2041
+ fSegmentLength = fAdjustedSegmentLength;
2042
+ }
2043
+ } else {
2044
+ // Stay on current segment, move away from end vertex
2045
+ fRatio = Math.max(0, (fSegmentLength - fVertexThreshold) / fSegmentLength);
2046
+ }
2047
+ }
2048
+ }
2049
+
2050
+ // Calculate the exact coordinates with adjusted position
1905
2051
  var fExactX = oCoords[iSegmentIndex].getX() + (oCoords[iSegmentIndex + 1].getX() - oCoords[iSegmentIndex].getX()) * fRatio;
1906
2052
  var fExactY = oCoords[iSegmentIndex].getY() + (oCoords[iSegmentIndex + 1].getY() - oCoords[iSegmentIndex].getY()) * fRatio;
1907
2053