@sapui5/sap.suite.ui.commons 1.143.0 → 1.145.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 (126) 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 +26 -14
  5. package/src/sap/suite/ui/commons/CalculationBuilderExpression.js +2 -2
  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 +5 -5
  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/MicroProcessFlow.js +77 -73
  14. package/src/sap/suite/ui/commons/MicroProcessFlowItem.js +3 -3
  15. package/src/sap/suite/ui/commons/Timeline.js +9 -0
  16. package/src/sap/suite/ui/commons/TimelineNavigator.js +37 -5
  17. package/src/sap/suite/ui/commons/TimelineRenderer.js +3 -3
  18. package/src/sap/suite/ui/commons/collaboration/BaseHelperService.js +0 -1
  19. package/src/sap/suite/ui/commons/collaboration/CollaborationHelper.js +0 -3
  20. package/src/sap/suite/ui/commons/collaboration/CollaborationManagerService.js +0 -1
  21. package/src/sap/suite/ui/commons/collaboration/ContactHelper.js +7 -0
  22. package/src/sap/suite/ui/commons/collaboration/ContactPopover.fragment.xml +4 -1
  23. package/src/sap/suite/ui/commons/collaboration/MinimalContactPopover.fragment.xml +2 -1
  24. package/src/sap/suite/ui/commons/collaboration/TeamsHelperService.js +0 -6
  25. package/src/sap/suite/ui/commons/collaboration/channels/MessageChannel.js +0 -2
  26. package/src/sap/suite/ui/commons/collaboration/flpplugins/msplugin/Component-preload.js +1 -1
  27. package/src/sap/suite/ui/commons/collaboration/flpplugins/msplugin/Component.js +1 -2
  28. package/src/sap/suite/ui/commons/flexibility/changeHandler/PropertyChangeMapper.js +1 -1
  29. package/src/sap/suite/ui/commons/imageeditor/CropCustomShapeHistoryItem.js +1 -1
  30. package/src/sap/suite/ui/commons/imageeditor/CropEllipseHistoryItem.js +1 -1
  31. package/src/sap/suite/ui/commons/imageeditor/CropRectangleHistoryItem.js +1 -1
  32. package/src/sap/suite/ui/commons/imageeditor/CustomSizeItem.js +1 -1
  33. package/src/sap/suite/ui/commons/imageeditor/FilterHistoryItem.js +1 -1
  34. package/src/sap/suite/ui/commons/imageeditor/FlipHistoryItem.js +1 -1
  35. package/src/sap/suite/ui/commons/imageeditor/HistoryItem.js +1 -1
  36. package/src/sap/suite/ui/commons/imageeditor/ImageEditor.js +1 -1
  37. package/src/sap/suite/ui/commons/imageeditor/ImageEditorContainer.js +1 -1
  38. package/src/sap/suite/ui/commons/imageeditor/ImageEditorResponsiveContainer.js +1 -1
  39. package/src/sap/suite/ui/commons/imageeditor/ResizeHistoryItem.js +1 -1
  40. package/src/sap/suite/ui/commons/imageeditor/RotateHistoryItem.js +1 -1
  41. package/src/sap/suite/ui/commons/library.js +100 -3
  42. package/src/sap/suite/ui/commons/messagebundle.properties +76 -10
  43. package/src/sap/suite/ui/commons/messagebundle_ar.properties +51 -5
  44. package/src/sap/suite/ui/commons/messagebundle_bg.properties +62 -16
  45. package/src/sap/suite/ui/commons/messagebundle_ca.properties +52 -6
  46. package/src/sap/suite/ui/commons/messagebundle_cnr.properties +52 -6
  47. package/src/sap/suite/ui/commons/messagebundle_cs.properties +51 -5
  48. package/src/sap/suite/ui/commons/messagebundle_cy.properties +51 -5
  49. package/src/sap/suite/ui/commons/messagebundle_da.properties +51 -5
  50. package/src/sap/suite/ui/commons/messagebundle_de.properties +52 -6
  51. package/src/sap/suite/ui/commons/messagebundle_el.properties +52 -6
  52. package/src/sap/suite/ui/commons/messagebundle_en.properties +50 -7
  53. package/src/sap/suite/ui/commons/messagebundle_en_GB.properties +52 -6
  54. package/src/sap/suite/ui/commons/messagebundle_en_US_saprigi.properties +54 -6
  55. package/src/sap/suite/ui/commons/messagebundle_es.properties +53 -7
  56. package/src/sap/suite/ui/commons/messagebundle_es_MX.properties +54 -8
  57. package/src/sap/suite/ui/commons/messagebundle_et.properties +51 -5
  58. package/src/sap/suite/ui/commons/messagebundle_fi.properties +51 -5
  59. package/src/sap/suite/ui/commons/messagebundle_fr.properties +52 -6
  60. package/src/sap/suite/ui/commons/messagebundle_fr_CA.properties +52 -6
  61. package/src/sap/suite/ui/commons/messagebundle_hi.properties +52 -6
  62. package/src/sap/suite/ui/commons/messagebundle_hr.properties +52 -6
  63. package/src/sap/suite/ui/commons/messagebundle_hu.properties +51 -5
  64. package/src/sap/suite/ui/commons/messagebundle_id.properties +60 -14
  65. package/src/sap/suite/ui/commons/messagebundle_it.properties +53 -7
  66. package/src/sap/suite/ui/commons/messagebundle_iw.properties +51 -5
  67. package/src/sap/suite/ui/commons/messagebundle_ja.properties +52 -6
  68. package/src/sap/suite/ui/commons/messagebundle_kk.properties +51 -5
  69. package/src/sap/suite/ui/commons/messagebundle_ko.properties +51 -5
  70. package/src/sap/suite/ui/commons/messagebundle_lt.properties +51 -5
  71. package/src/sap/suite/ui/commons/messagebundle_lv.properties +52 -6
  72. package/src/sap/suite/ui/commons/messagebundle_mk.properties +51 -5
  73. package/src/sap/suite/ui/commons/messagebundle_ms.properties +59 -13
  74. package/src/sap/suite/ui/commons/messagebundle_nl.properties +51 -5
  75. package/src/sap/suite/ui/commons/messagebundle_no.properties +52 -6
  76. package/src/sap/suite/ui/commons/messagebundle_pl.properties +51 -5
  77. package/src/sap/suite/ui/commons/messagebundle_pt.properties +52 -6
  78. package/src/sap/suite/ui/commons/messagebundle_pt_PT.properties +51 -5
  79. package/src/sap/suite/ui/commons/messagebundle_ro.properties +51 -5
  80. package/src/sap/suite/ui/commons/messagebundle_ru.properties +51 -5
  81. package/src/sap/suite/ui/commons/messagebundle_sh.properties +52 -6
  82. package/src/sap/suite/ui/commons/messagebundle_sk.properties +51 -5
  83. package/src/sap/suite/ui/commons/messagebundle_sl.properties +51 -5
  84. package/src/sap/suite/ui/commons/messagebundle_sr.properties +52 -6
  85. package/src/sap/suite/ui/commons/messagebundle_sv.properties +51 -5
  86. package/src/sap/suite/ui/commons/messagebundle_th.properties +52 -6
  87. package/src/sap/suite/ui/commons/messagebundle_tr.properties +51 -5
  88. package/src/sap/suite/ui/commons/messagebundle_uk.properties +53 -7
  89. package/src/sap/suite/ui/commons/messagebundle_vi.properties +55 -9
  90. package/src/sap/suite/ui/commons/messagebundle_zh_CN.properties +51 -5
  91. package/src/sap/suite/ui/commons/messagebundle_zh_TW.properties +53 -7
  92. package/src/sap/suite/ui/commons/networkgraph/ElementBase.js +19 -1
  93. package/src/sap/suite/ui/commons/networkgraph/Graph.js +371 -29
  94. package/src/sap/suite/ui/commons/networkgraph/GraphRenderer.js +23 -10
  95. package/src/sap/suite/ui/commons/networkgraph/Group.js +43 -22
  96. package/src/sap/suite/ui/commons/networkgraph/KeyboardNavigator.js +54 -6
  97. package/src/sap/suite/ui/commons/networkgraph/Line.js +736 -31
  98. package/src/sap/suite/ui/commons/networkgraph/Node.js +546 -96
  99. package/src/sap/suite/ui/commons/networkgraph/Tooltip.js +5 -0
  100. package/src/sap/suite/ui/commons/networkgraph/layout/NoopLayout.js +28 -5
  101. package/src/sap/suite/ui/commons/networkgraph/util/ConnectionPathUtils.js +1144 -0
  102. package/src/sap/suite/ui/commons/networkgraph/util/CreateConnectionPopover.js +374 -0
  103. package/src/sap/suite/ui/commons/networkgraph/util/DependencyLayoutHelper.js +870 -0
  104. package/src/sap/suite/ui/commons/networkgraph/util/DragDropManager.js +563 -41
  105. package/src/sap/suite/ui/commons/networkgraph/util/PortManager.js +573 -0
  106. package/src/sap/suite/ui/commons/statusindicator/Circle.js +1 -1
  107. package/src/sap/suite/ui/commons/statusindicator/CustomShape.js +1 -1
  108. package/src/sap/suite/ui/commons/statusindicator/DiscreteThreshold.js +1 -1
  109. package/src/sap/suite/ui/commons/statusindicator/FillingOption.js +1 -1
  110. package/src/sap/suite/ui/commons/statusindicator/LibraryShape.js +1 -1
  111. package/src/sap/suite/ui/commons/statusindicator/Path.js +1 -1
  112. package/src/sap/suite/ui/commons/statusindicator/PropertyThreshold.js +1 -1
  113. package/src/sap/suite/ui/commons/statusindicator/Rectangle.js +1 -1
  114. package/src/sap/suite/ui/commons/statusindicator/Shape.js +1 -1
  115. package/src/sap/suite/ui/commons/statusindicator/ShapeGroup.js +1 -1
  116. package/src/sap/suite/ui/commons/statusindicator/SimpleShape.js +1 -1
  117. package/src/sap/suite/ui/commons/statusindicator/StatusIndicator.js +1 -1
  118. package/src/sap/suite/ui/commons/taccount/TAccount.js +1 -1
  119. package/src/sap/suite/ui/commons/taccount/TAccountGroup.js +1 -1
  120. package/src/sap/suite/ui/commons/taccount/TAccountItem.js +1 -1
  121. package/src/sap/suite/ui/commons/taccount/TAccountItemProperty.js +1 -1
  122. package/src/sap/suite/ui/commons/taccount/TAccountPanel.js +1 -1
  123. package/src/sap/suite/ui/commons/themes/base/NetworkGraph.less +13 -13
  124. package/src/sap/suite/ui/commons/themes/base/NetworkGroup.less +34 -2
  125. package/src/sap/suite/ui/commons/themes/base/NetworkLine.less +58 -13
  126. package/src/sap/suite/ui/commons/themes/base/NetworkNode.less +206 -1
@@ -31,7 +31,10 @@ sap.ui.define([
31
31
  "sap/ui/performance/Measurement",
32
32
  "sap/base/security/encodeXML",
33
33
  "sap/m/ToggleButton",
34
+ "sap/m/BusyIndicator",
34
35
  "sap/m/library",
36
+ "sap/m/IllustratedMessage",
37
+ "sap/m/IllustratedMessageType",
35
38
  "sap/suite/ui/commons/util/FullScreenUtil",
36
39
  "sap/ui/core/InvisibleMessage",
37
40
  "sap/ui/core/library",
@@ -43,7 +46,9 @@ sap.ui.define([
43
46
  "sap/ui/core/Theming",
44
47
  'sap/ui/core/InvisibleText',
45
48
  "./GraphRenderer",
46
- "./util/DragDropManager"
49
+ "./util/DragDropManager",
50
+ "./util/PortManager",
51
+ "sap/ui/core/IconPool"
47
52
  ], function (
48
53
  library,
49
54
  jQuery,
@@ -70,7 +75,10 @@ sap.ui.define([
70
75
  Measurement,
71
76
  encodeXML,
72
77
  ToggleButton,
78
+ BusyIndicator,
73
79
  MobileLibrary,
80
+ IllustratedMessage,
81
+ IllustratedMessageType,
74
82
  FullScreenUtil,
75
83
  InvisibleMessage,
76
84
  coreLibrary,
@@ -82,7 +90,9 @@ sap.ui.define([
82
90
  Theming,
83
91
  InvisibleText,
84
92
  GraphRenderer,
85
- DragDropManager
93
+ DragDropManager,
94
+ PortManager,
95
+ IconPool
86
96
  ) {
87
97
  "use strict";
88
98
 
@@ -91,7 +101,8 @@ sap.ui.define([
91
101
  Orientation = library.networkgraph.Orientation,
92
102
  LayoutRenderType = library.networkgraph.LayoutRenderType,
93
103
  RenderType = library.networkgraph.RenderType,
94
- SemanticColorType = library.SemanticColorType;
104
+ SemanticColorType = library.SemanticColorType,
105
+ NodePorts = library.networkgraph.NodePorts;
95
106
 
96
107
  var AGG_NODES = "nodes",
97
108
  AGG_LINES = "lines",
@@ -212,6 +223,22 @@ sap.ui.define([
212
223
  noDataText: {
213
224
  type: "string", group: "Behavior", defaultValue: ""
214
225
  },
226
+ /**
227
+ * Set this property to <code>true</code> to display a loading indicator while the data loads.
228
+ * @public
229
+ * @since 1.144
230
+ */
231
+ loading: {
232
+ type: "boolean", group: "Behavior", defaultValue: false
233
+ },
234
+ /**
235
+ * Text that is displayed when the loading is set. <br> This property takes effect only when the <code>loading</code> property is set to <code>true</code>.
236
+ * @public
237
+ * @since 1.144
238
+ */
239
+ loadingText: {
240
+ type: "string", group: "Behavior", defaultValue: ""
241
+ },
215
242
  /**
216
243
  * Adds delay in wheel scrolling to make zooming smooth.
217
244
  * Only works when enableWheelZoom is set to true or 'ctrl' key is pressed while wheel scrolling.
@@ -225,11 +252,49 @@ sap.ui.define([
225
252
  /**
226
253
  * Enables the drag and drop of nodes. This property is ignored if the layout property is not set to noop.
227
254
  * If set to <code>true</code>, nodes can be dragged and dropped within the graph.
228
- *
229
- * @private
255
+ * @public
256
+ * @since 1.144
230
257
  */
231
258
  enableDragAndDrop: {
232
- type: "boolean", group: "Behavior", defaultValue: false, visibility: "hidden"
259
+ type: "boolean", group: "Behavior", defaultValue: false
260
+ },
261
+ /**
262
+ * Specifies the ports that are to be displayed on nodes. Ports are used for creating connections between nodes.
263
+ * Ports are available only when the layout algorithm is set to "NoopLayout", and when the drag and drop is enabled. Otherwise, this property is ignored.
264
+ * @public
265
+ * @since 1.144
266
+ */
267
+ nodePorts: {
268
+ type: "sap.suite.ui.commons.networkgraph.NodePorts", group: "Behavior", defaultValue: NodePorts.None
269
+ },
270
+ /**
271
+ * This action button is used to create connections between nodes as an accessible alternative to node ports.
272
+ * The button is displayed on each node when the layout algorithm is set to "NoopLayout" and drag and drop is enabled.
273
+ * shows the 'Create Connection' action button on node.
274
+ * If set to <code>false</code>, the button remains hidden.
275
+ * Hide this button when you want to implement your own way of creating connections between nodes as an accessible alternative to node ports.
276
+ * @public
277
+ * @since 1.144
278
+ */
279
+ showCreateConnectionButton: {
280
+ type: "boolean", group: "Behavior", defaultValue: true
281
+ },
282
+ /**
283
+ * Mapping of connection types to their display text keys or custom text values.
284
+ * This allows customization of how connection types are displayed in the connection creation popover.
285
+ * The mapping should be an object where keys are connection type values (LeftToLeft, LeftToRight, RightToLeft, RightToRight)
286
+ * and values are custom text that follows the correct format (e.g., "Start to End", "Source to Target").
287
+ * If the format is invalid or not provided, default values are used
288
+ * @public
289
+ * @since 1.144
290
+ */
291
+ connectionTypeMapping: {
292
+ type: "object", group: "Behavior", defaultValue: {
293
+ "LeftToLeft": "Left to Left",
294
+ "LeftToRight": "Left to Right",
295
+ "RightToLeft": "Right to Left",
296
+ "RightToRight": "Right to Right"
297
+ }
233
298
  }
234
299
  },
235
300
  aggregations: {
@@ -243,7 +308,7 @@ sap.ui.define([
243
308
  * Holds the nodes to be displayed in the graph.
244
309
  */
245
310
  nodes: {
246
- type: "sap.suite.ui.commons.networkgraph.Node", multiple: true, singularName: "node"
311
+ type: "sap.suite.ui.commons.networkgraph.Node", multiple: true, singularName: "node", dnd: true
247
312
  },
248
313
  /**
249
314
  * Holds a list of groups used in the graph.
@@ -280,7 +345,12 @@ sap.ui.define([
280
345
  /**
281
346
  * Controls or IDs that label this control. This association is used by screen reader software.
282
347
  */
283
- ariaLabelledBy: { type: "sap.ui.core.Control", multiple: true, singularName: "ariaLabelledBy" }
348
+ ariaLabelledBy: { type: "sap.ui.core.Control", multiple: true, singularName: "ariaLabelledBy" },
349
+ /**
350
+ * Control or ID of an auxiliary control associated with this graph.
351
+ * @since 1.144
352
+ */
353
+ associatedControl: { type: "sap.ui.core.Control", multiple: false, singularName: "associatedControl" }
284
354
  },
285
355
  events: {
286
356
  /**
@@ -345,8 +415,10 @@ sap.ui.define([
345
415
  }
346
416
  },
347
417
  /**
348
- * This event is fired when a user drops a node in the graph. This event is available only for the noop layout.
349
- * @private
418
+ * This event is fired when a user drops a node in the graph.
419
+ * 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>.
420
+ * @public
421
+ * @since 1.144
350
422
  */
351
423
  nodeDropped: {
352
424
  parameters: {
@@ -362,9 +434,51 @@ sap.ui.define([
362
434
  * The new y coordinate of the node.
363
435
  */
364
436
  newY: { type: "float" }
365
- },
366
- visibility: "hidden"
437
+ }
367
438
  },
439
+ /**
440
+ * This event is fired when a new connection is created between two nodes by using node ports.
441
+ * @public
442
+ * @since 1.144
443
+ */
444
+ connectionCreated: {
445
+ parameters: {
446
+ /**
447
+ * The key of the source node.
448
+ **/
449
+ from: { type: "string" },
450
+ /**
451
+ * The key of the target node.
452
+ **/
453
+ to: { type: "string" },
454
+ /**
455
+ * The connection type defining how the line connects the source and target nodes.
456
+ */
457
+ connectionType: {type: "sap.suite.ui.commons.networkgraph.ConnectionType"},
458
+ /**
459
+ * The source node control instance.
460
+ **/
461
+ fromNode: { type: "sap.suite.ui.commons.networkgraph.Node" },
462
+ /**
463
+ * The target node control instance.
464
+ **/
465
+ toNode: { type: "sap.suite.ui.commons.networkgraph.Node" }
466
+ }
467
+ },
468
+ /**
469
+ * This event is fired when a user presses the delete key on a focused node or line.
470
+ * 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>.
471
+ * @public
472
+ * @since 1.145
473
+ */
474
+ itemDeleted: {
475
+ parameters: {
476
+ /**
477
+ * The item (node or line) that is to be deleted.
478
+ */
479
+ item: { type: "sap.suite.ui.commons.networkgraph.ElementBase" }
480
+ }
481
+ }
368
482
  }
369
483
  }
370
484
  });
@@ -425,6 +539,9 @@ sap.ui.define([
425
539
  // RTL mode - it's reset in 'onBeforeRendering' in case it changed runtime
426
540
  this._bIsRtl = Localization.getRTL();
427
541
 
542
+ // Private variable for multiple directed arrows feature
543
+ this._enableMultipleDirectedArrows = false;
544
+
428
545
  // element with focus
429
546
  this._oFocus = null;
430
547
 
@@ -443,6 +560,9 @@ sap.ui.define([
443
560
  // flag to check if the events has been added to the graph
444
561
  this._bEventsAdded = false;
445
562
 
563
+ // illustrated message instance for empty state
564
+ this._oIllustratedMessage = null;
565
+
446
566
  this._createToolbar();
447
567
 
448
568
  /**
@@ -452,9 +572,11 @@ sap.ui.define([
452
572
  try {
453
573
  DragDropManager.injectDnD(this);
454
574
  } catch (error) {
455
- Log.error("Graph DnD: ", error);
575
+ Log.warning("Graph injectDnD issue: ", error);
456
576
  }
457
577
  }
578
+ // Initialize PortManager with this graph instance
579
+ PortManager.setGraphInstance(this);
458
580
 
459
581
  };
460
582
 
@@ -601,6 +723,19 @@ sap.ui.define([
601
723
  if (this._oFullScreenUtil) {
602
724
  this._oFullScreenUtil.cleanUpFullScreen(this);
603
725
  }
726
+
727
+ // Clean up busy indicator
728
+ if (this._oBusyIndicator) {
729
+ this._oBusyIndicator.destroy();
730
+ this._oBusyIndicator = null;
731
+ }
732
+
733
+ // Clean up illustrated message
734
+ if (this._oIllustratedMessage) {
735
+ this._oIllustratedMessage.destroy();
736
+ this._oIllustratedMessage = null;
737
+ }
738
+
604
739
  DragDropManager.removeDnD(this);
605
740
  };
606
741
  /* =========================================================== */
@@ -632,6 +767,7 @@ sap.ui.define([
632
767
  /**
633
768
  * Returns <code>true</code> if the graph is in full screen mode.
634
769
  * @public
770
+ * @returns {boolean} Returns whether the graph is in full screen mode.
635
771
  */
636
772
  Graph.prototype.isFullScreen = function () {
637
773
  return this._bIsFullScreen;
@@ -766,6 +902,33 @@ sap.ui.define([
766
902
  return this._mNodes[sKey];
767
903
  };
768
904
 
905
+ /**
906
+ * Re-rendering a node and all connected lines to update the positions of both the node and the lines.
907
+ * Note: This method should be used only when the layout algorithm is set to NoopLayout and enableDragAndDrop is set to true.
908
+ *
909
+ * @param {sap.suite.ui.commons.networkgraph.Node|string} vNode Node instance or node key
910
+ * @param {number} iX New X coordinate
911
+ * @param {number} iY New Y coordinate
912
+ * @returns {sap.suite.ui.commons.networkgraph.Graph} Reference to this for method chaining
913
+ * @public
914
+ * @since 1.144
915
+ */
916
+ Graph.prototype.updateNodePosition = function (vNode, iX, iY) {
917
+ if (!this._isDnDEnabled()) {
918
+ return this;
919
+ }
920
+
921
+ var oNode = typeof vNode === "string" ? this.getNodeByKey(vNode) : vNode;
922
+
923
+ if (!oNode) {
924
+ Log.warning("Node not found", "updateNodePosition", "sap.suite.ui.commons.networkgraph.Graph");
925
+ return this;
926
+ }
927
+
928
+ this.invalidate();
929
+ return this;
930
+ };
931
+
769
932
  /**
770
933
  * Sets a custom label for the legend.
771
934
  * @param {object} mArguments Parameters for this method
@@ -840,7 +1003,7 @@ sap.ui.define([
840
1003
  /**
841
1004
  * Returns current zoom level.
842
1005
  *
843
- * @return {number}
1006
+ * @return {number} Current zoom level
844
1007
  * @public
845
1008
  */
846
1009
  Graph.prototype.getCurrentZoomLevel = function () {
@@ -860,6 +1023,16 @@ sap.ui.define([
860
1023
  this._oZoomLevelInvisibleText.setText(oResourceBundle.getText("NETWORK_GRAPH_ZOOM_LEVEL") + ": " + this._getZoomText());
861
1024
  };
862
1025
 
1026
+ /**
1027
+ * Gets the associated control linked to this graph instance using the 'associatedControl' association.
1028
+ * This can be any UI5 control that is related to the graph.
1029
+ * @returns {sap.ui.core.Control|null} The associated control instance or null if not set.
1030
+ * @public
1031
+ */
1032
+ Graph.prototype.getAssociatedControl = function () {
1033
+ var sId = this.getAssociation("associatedControl");
1034
+ return sId ? Element.getElementById(sId) : null;
1035
+ };
863
1036
 
864
1037
  /* =========================================================== */
865
1038
  /* Private methods */
@@ -886,6 +1059,24 @@ sap.ui.define([
886
1059
  };
887
1060
  };
888
1061
 
1062
+ /**
1063
+ * Returns a busy indicator instance for loading states.
1064
+ * @returns {sap.m.BusyIndicator} BusyIndicator instance
1065
+ * @private
1066
+ */
1067
+ Graph.prototype._getBusyIndicator = function () {
1068
+ var sText = this.getLoadingText() || oResourceBundle.getText("NETWORK_GRAPH_OPENING_CANVAS");
1069
+
1070
+ if (!this._oBusyIndicator) {
1071
+ this._oBusyIndicator = new BusyIndicator({ text: sText });
1072
+ this.addDependent(this._oBusyIndicator);
1073
+ } else {
1074
+ this._oBusyIndicator.setText(sText);
1075
+ }
1076
+
1077
+ return this._oBusyIndicator;
1078
+ };
1079
+
889
1080
  Graph.prototype._createTooltip = function () {
890
1081
  var oTooltip = new Tooltip(this.getId() + "-tooltip");
891
1082
  this.addDependent(oTooltip);
@@ -906,22 +1097,87 @@ sap.ui.define([
906
1097
  return oTooltip;
907
1098
  };
908
1099
 
1100
+ /**
1101
+ * Gets or creates an IllustratedMessage instance for displaying empty state.
1102
+ * This method reuses the same instance to avoid memory leaks.
1103
+ * The illustrated message content depends on whether drag-and-drop is enabled:
1104
+ * - When drag-and-drop is enabled: Shows "AddDimensions" illustration with plan-building message
1105
+ * - When drag-and-drop is disabled: Shows "NoChartData" illustration with custom or default no-data text
1106
+ *
1107
+ * @returns {sap.m.IllustratedMessage} The illustrated message instance for empty state
1108
+ * @private
1109
+ */
1110
+ Graph.prototype._getIllustratedMessage = function () {
1111
+ // Helper function to get configuration based on current state
1112
+ var fnConfigureIllustratedMessage = function () {
1113
+ var sText = this.getNoDataText(),
1114
+ sTextInline = sText || oResourceBundle.getText("NETWORK_GRAPH_NO_DATA");
1115
+
1116
+ if (this._isDnDEnabled()) {
1117
+ return {
1118
+ illustrationType: IllustratedMessageType.AddDimensions,
1119
+ title: oResourceBundle.getText("NETWORK_GRAPH_DND_EMPTY_TITLE"),
1120
+ description: oResourceBundle.getText("NETWORK_GRAPH_DND_EMPTY_DESCRIPTION"),
1121
+ enableDefaultTitleAndDescription: false
1122
+ };
1123
+ } else {
1124
+ return {
1125
+ illustrationType: IllustratedMessageType.NoChartData,
1126
+ title: sTextInline,
1127
+ enableDefaultTitleAndDescription: false
1128
+ };
1129
+ }
1130
+ }.bind(this);
1131
+
1132
+ if (!this._oIllustratedMessage) {
1133
+ var oConfig = fnConfigureIllustratedMessage();
1134
+ this._oIllustratedMessage = new IllustratedMessage(oConfig);
1135
+ this.addDependent(this._oIllustratedMessage);
1136
+ } else {
1137
+ var oConfig = fnConfigureIllustratedMessage();
1138
+ this._oIllustratedMessage.setIllustrationType(oConfig.illustrationType);
1139
+ this._oIllustratedMessage.setTitle(oConfig.title);
1140
+ this._oIllustratedMessage.setDescription(oConfig.description);
1141
+ }
1142
+
1143
+ return this._oIllustratedMessage;
1144
+ };
1145
+
909
1146
  /**
910
1147
  * @private
1148
+ * Defocuses the currently focused element.
911
1149
  */
912
1150
  Graph.prototype.defocus = function () {
913
1151
  this.$().find("." + this.FOCUS_CLASS).removeClass(this.FOCUS_CLASS);
914
1152
  };
915
1153
 
916
1154
  /**
1155
+ * Sets whether drag and drop is enabled.
1156
+ * @param {boolean} bEnabled Whether drag and drop should be enabled
917
1157
  * @private
918
1158
  */
919
1159
  Graph.prototype.setEnableDragAndDrop = function (bEnabled) {
920
1160
  this.setProperty("enableDragAndDrop", bEnabled, true);
1161
+
1162
+ // Update zoom button states
1163
+ if (this._zoomIn && this._zoomOut && this._zoomToFitButton) {
1164
+ var bZoomEnabled = !this._isDnDEnabled();
1165
+ this._zoomIn.setEnabled(bZoomEnabled);
1166
+ this._zoomOut.setEnabled(bZoomEnabled);
1167
+ this._zoomToFitButton.setEnabled(bZoomEnabled);
1168
+ }
1169
+
1170
+ // remove the node ports when drag and drop is disabled
1171
+ if (!bEnabled) {
1172
+ PortManager.removeAllPorts();
1173
+ }
1174
+
1175
+ return this;
921
1176
  };
922
1177
 
923
1178
  /**
924
1179
  * @private
1180
+ * @returns {boolean} Returns whether drag and drop is enabled.
925
1181
  */
926
1182
  Graph.prototype.getEnableDragAndDrop = function () {
927
1183
  return this.getProperty("enableDragAndDrop");
@@ -943,12 +1199,12 @@ sap.ui.define([
943
1199
  this._oFocus.item.isA("sap.suite.ui.commons.networkgraph.Node")))) {
944
1200
  this._updateAccessibility(oFocus);
945
1201
  }
946
- this._updateAccessibility(oFocus);
947
- return;
1202
+ this._updateAccessibility(oFocus);
1203
+ return;
948
1204
  }
949
1205
 
950
1206
  this.defocus();
951
- if (this.getFocusDomRef()) {
1207
+ if (this.getFocusDomRef() && !(oFocus && oFocus.button && oFocus.button.id && oFocus.button.id.indexOf("actionOverflow") !== -1)) {
952
1208
  this.getFocusDomRef().focus();
953
1209
  }
954
1210
 
@@ -988,7 +1244,7 @@ sap.ui.define([
988
1244
  this._setAccessibilityTitle(oResourceBundle.getText("NETWORK_GRAPH_ACCESSIBILITY_CONTENT"));
989
1245
  }.bind(this),
990
1246
  fnBuildTitleForButton = function (sLabel) {
991
- var sTitleLabel = sLabel + " " + oResourceBundle.getText("NETWORK_GRAPH_ACCESSIBILITY_ACTION_BUTTON") ;
1247
+ var sTitleLabel = sLabel + " " + oResourceBundle.getText("NETWORK_GRAPH_ACCESSIBILITY_ACTION_BUTTON");
992
1248
  if (sLabel === "Expand/Collapse") {
993
1249
  if (oFocus.item.getCollapsed()) {
994
1250
  sTitleLabel = sTitleLabel + " " + oResourceBundle.getText("NETWORK_GRAPH_COLLAPSED");
@@ -1128,8 +1384,9 @@ sap.ui.define([
1128
1384
  this.$background.width(iSvgWidth * this._fZoomLevel);
1129
1385
  this.$background.height(iSvgHeight * this._fZoomLevel);
1130
1386
 
1387
+ var sScale = "";
1131
1388
  if (this._isUseNodeHtml()) {
1132
- var sScale = "scale(" + this._fZoomLevel + ")";
1389
+ sScale = "scale(" + this._fZoomLevel + ")";
1133
1390
  this.$("divnodes").css("transform", sScale);
1134
1391
  }
1135
1392
 
@@ -1390,6 +1647,8 @@ sap.ui.define([
1390
1647
  oRm.openStart("g", this.getId() + "-svgbody");
1391
1648
  oRm.openEnd();
1392
1649
  fnRenderItems("lines", aLines, "sapSuiteUiCommonsNetworkLines");
1650
+ // Render line texts after all lines are rendered to handle overlaps
1651
+ this._renderAllLineTexts(aLines, oRm);
1393
1652
  if (!this._isUseNodeHtml()) {
1394
1653
  fnRenderItems("nodes", aNodes, "sapSuiteUiCommonsNetworkNodes");
1395
1654
  }
@@ -1414,6 +1673,45 @@ sap.ui.define([
1414
1673
 
1415
1674
  };
1416
1675
 
1676
+ /**
1677
+ * Renders text labels for all lines in a dedicated SVG group container.
1678
+ *
1679
+ * This method creates a batch rendering context for line labels, enabling
1680
+ * potential overlap handling and positioning optimizations. Labels are only
1681
+ * rendered for lines that meet all of the following conditions:
1682
+ * - The line has a labelName property value set
1683
+ * - The graph is using NoopLayout
1684
+ * - The line's arrowPosition is set to "Both"
1685
+ *
1686
+ * @param {sap.suite.ui.commons.networkgraph.Line[]} aLines Array of line objects to render text labels for
1687
+ * @param {sap.ui.core.RenderManager} oRm The RenderManager instance used for SVG rendering
1688
+ * @private
1689
+ */
1690
+ Graph.prototype._renderAllLineTexts = function (aLines, oRm) {
1691
+ // Early return if line labels are disabled or NoopLayout is not active
1692
+ if (!this._isNoopLayout()) {
1693
+ return;
1694
+ }
1695
+
1696
+ // Create a dedicated SVG group container for all line text labels
1697
+ // This enables batch processing and potential overlap handling
1698
+ oRm.openStart("g");
1699
+ oRm.attr("id", this.getId() + "-line-texts");
1700
+ oRm.class("sapSuiteUiCommonsNetworkLineTexts");
1701
+ oRm.openEnd();
1702
+
1703
+ // Iterate through all lines and render their text labels within the group
1704
+ // Only process lines that are valid, not ignored by layout, and visible
1705
+ aLines.forEach(function (oLine) {
1706
+ if (oLine && !oLine._isIgnored() && oLine.getVisible()) {
1707
+ oLine._renderLineText(oRm);
1708
+ }
1709
+ });
1710
+
1711
+ // Close the SVG group container
1712
+ oRm.close("g");
1713
+ };
1714
+
1417
1715
  Graph.prototype._isProperKey = function (sKey) {
1418
1716
  return sKey || (sKey === "0");
1419
1717
  };
@@ -1494,7 +1792,11 @@ sap.ui.define([
1494
1792
  }
1495
1793
  }
1496
1794
 
1497
- this._isUseNodeHtml() ? oNode._resetDimensions() : oNode._setupWidthAndHeight();
1795
+ if (this._isUseNodeHtml()) {
1796
+ oNode._resetDimensions();
1797
+ } else {
1798
+ oNode._setupWidthAndHeight();
1799
+ }
1498
1800
  oNode._clearChildren();
1499
1801
  oNode._rendered = false;
1500
1802
 
@@ -1923,16 +2225,28 @@ sap.ui.define([
1923
2225
  }
1924
2226
  });
1925
2227
  this._toolbar.addContent(this._zoomOut);
2228
+
2229
+ // Disable zoom buttons if drag and drop is enabled
2230
+ if (this._isDnDEnabled()) {
2231
+ this._zoomIn.setEnabled(false);
2232
+ this._zoomOut.setEnabled(false);
1926
2233
  }
2234
+ }
1927
2235
 
1928
2236
  // fit to viewport
1929
- this._toolbar.addContent(new OverflowToolbarButton({
2237
+ this._zoomToFitButton = new OverflowToolbarButton({
1930
2238
  type: ButtonType.Transparent,
1931
2239
  icon: "sap-icon://popup-window",
1932
2240
  tooltip: oResourceBundle.getText("NETWORK_GRAPH_ZOOMTOFIT"),
1933
2241
  text: oResourceBundle.getText("NETWORK_GRAPH_ZOOMTOFIT"),
1934
2242
  press: this._fitToScreen.bind(this)
1935
- }));
2243
+ });
2244
+ this._toolbar.addContent(this._zoomToFitButton);
2245
+
2246
+ // Disable zoom to fit button if drag and drop is enabled
2247
+ if (this._isDnDEnabled()) {
2248
+ this._zoomToFitButton.setEnabled(false);
2249
+ }
1936
2250
 
1937
2251
  // toggle full screen
1938
2252
  this._oFullScreenButton = new OverflowToolbarButton({
@@ -2214,7 +2528,9 @@ sap.ui.define([
2214
2528
 
2215
2529
  $wrapper.on("mouseleave", this._endDragging.bind(this));
2216
2530
  $wrapper.on("mouseup", this._mouseUp.bind(this));
2217
- if (this.getEnableZoom()) {
2531
+ if (this.getEnableZoom() && !this._isDnDEnabled()) {
2532
+ // Disabling zooming capability in edit mode.
2533
+ // TODO: consider scaling when dragging and dropping nodes and update ghost image dimenstion and coordinates prediction, to allow zooming.
2218
2534
  $wrapper.on("wheel", function (oEvent) {
2219
2535
  if (this._wheel({
2220
2536
  x: oEvent.originalEvent.clientX,
@@ -2300,6 +2616,7 @@ sap.ui.define([
2300
2616
  this._oZoomLevelInvisibleText.setText(oResourceBundle.getText("NETWORK_GRAPH_ZOOM_LEVEL") + ": " + this._getZoomText());
2301
2617
  return true;
2302
2618
  }
2619
+ return false;
2303
2620
  };
2304
2621
 
2305
2622
  Graph.prototype._endDragging = function () {
@@ -2332,6 +2649,11 @@ sap.ui.define([
2332
2649
  this._oPanning.dragging = true;
2333
2650
 
2334
2651
  this._tooltip.instantClose();
2652
+
2653
+ // Remove all ports when deselecting
2654
+ if (PortManager._currentTriggerNodeKey !== null) {
2655
+ PortManager.removeAllPorts();
2656
+ }
2335
2657
  };
2336
2658
 
2337
2659
  Graph.prototype._mouseUp = function () {
@@ -2634,13 +2956,15 @@ sap.ui.define([
2634
2956
  "class": "sapSuiteUiCommonsNetworkGraphLegendLine"
2635
2957
  }, false, oRm);
2636
2958
 
2959
+ var sLegendClass = "sapSuiteUiCommonsNetworkGraphLegendColorLine " + this._getStatusClass(sStatus);
2960
+ if (sClass) {
2961
+ sLegendClass += " " + sClass;
2962
+ }
2637
2963
  this._renderControl.call(that, "div", {
2638
- "class": "sapSuiteUiCommonsNetworkGraphLegendColorLine " + this._getStatusClass(sStatus) + " " + sClass,
2964
+ "class": sLegendClass,
2639
2965
  /** @deprecated As of 1.120 */
2640
2966
  "style": sStyle
2641
- }, null, oRm);
2642
-
2643
- this._renderControl.call(that, "label", {
2967
+ }, null, oRm); this._renderControl.call(that, "label", {
2644
2968
  "class": "sapSuiteUiCommonsNetworkGraphLegendLineLabel"
2645
2969
  }, false, oRm);
2646
2970
  oRm.text(this._oLegendLabels[sType + sStatus] ? this._oLegendLabels[sType + sStatus] : sLabel);
@@ -2856,8 +3180,15 @@ sap.ui.define([
2856
3180
  };
2857
3181
 
2858
3182
  Graph.prototype._isTopBottom = function () {
2859
- return this.getOrientation() === Orientation.TopBottom ||
2860
- this.getOrientation() === Orientation.BottomTop;
3183
+ return this.getOrientation() === Orientation.TopBottom;
3184
+ };
3185
+
3186
+ Graph.prototype._isBottomTop = function () {
3187
+ return this.getOrientation() === Orientation.BottomTop;
3188
+ };
3189
+
3190
+ Graph.prototype._isRightLeft = function () {
3191
+ return this.getOrientation() === Orientation.RightLeft;
2861
3192
  };
2862
3193
 
2863
3194
  /* =========================================================== */
@@ -2999,5 +3330,16 @@ sap.ui.define([
2999
3330
  }
3000
3331
  };
3001
3332
 
3333
+ /**
3334
+ * Checks if the current layout algorithm supports node ports functionality.
3335
+ * For now, only NoopLayout algorithms support node ports.
3336
+ *
3337
+ * @returns {boolean} True if the layout supports node ports, false otherwise
3338
+ * @private
3339
+ */
3340
+ Graph.prototype._supportsNodePorts = function () {
3341
+ return this.getNodePorts() !== "None" && this._isDnDEnabled();
3342
+ };
3343
+
3002
3344
  return Graph;
3003
3345
  });