@sapui5/sap.suite.ui.commons 1.145.1 → 1.147.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 (214) 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 +83 -4
  5. package/src/sap/suite/ui/commons/CalculationBuilderExpression.js +87 -14
  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 +16 -3
  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 -1
  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/ProcessFlowRenderer.js +3 -0
  17. package/src/sap/suite/ui/commons/collaboration/ContactHelper.js +5 -1
  18. package/src/sap/suite/ui/commons/collaboration/ContactPopover.fragment.xml +10 -10
  19. package/src/sap/suite/ui/commons/collaboration/MinimalContactPopover.fragment.xml +12 -10
  20. package/src/sap/suite/ui/commons/collaboration/ServiceContainer.js +12 -2
  21. package/src/sap/suite/ui/commons/flexibility/changeHandler/PropertyChangeMapper.js +1 -1
  22. package/src/sap/suite/ui/commons/imageeditor/CropCustomShapeHistoryItem.js +1 -1
  23. package/src/sap/suite/ui/commons/imageeditor/CropEllipseHistoryItem.js +1 -1
  24. package/src/sap/suite/ui/commons/imageeditor/CropRectangleHistoryItem.js +1 -1
  25. package/src/sap/suite/ui/commons/imageeditor/CustomSizeItem.js +1 -1
  26. package/src/sap/suite/ui/commons/imageeditor/FilterHistoryItem.js +1 -1
  27. package/src/sap/suite/ui/commons/imageeditor/FlipHistoryItem.js +1 -1
  28. package/src/sap/suite/ui/commons/imageeditor/HistoryItem.js +1 -1
  29. package/src/sap/suite/ui/commons/imageeditor/ImageEditor.js +1 -1
  30. package/src/sap/suite/ui/commons/imageeditor/ImageEditorContainer.js +1 -1
  31. package/src/sap/suite/ui/commons/imageeditor/ImageEditorResponsiveContainer.js +9 -6
  32. package/src/sap/suite/ui/commons/imageeditor/ResizeHistoryItem.js +1 -1
  33. package/src/sap/suite/ui/commons/imageeditor/RotateHistoryItem.js +1 -1
  34. package/src/sap/suite/ui/commons/library.js +4 -4
  35. package/src/sap/suite/ui/commons/messagebundle.properties +16 -8
  36. package/src/sap/suite/ui/commons/messagebundle_ar.properties +11 -5
  37. package/src/sap/suite/ui/commons/messagebundle_bg.properties +11 -5
  38. package/src/sap/suite/ui/commons/messagebundle_ca.properties +10 -4
  39. package/src/sap/suite/ui/commons/messagebundle_cnr.properties +11 -5
  40. package/src/sap/suite/ui/commons/messagebundle_cs.properties +7 -1
  41. package/src/sap/suite/ui/commons/messagebundle_cy.properties +11 -5
  42. package/src/sap/suite/ui/commons/messagebundle_da.properties +10 -4
  43. package/src/sap/suite/ui/commons/messagebundle_de.properties +8 -2
  44. package/src/sap/suite/ui/commons/messagebundle_el.properties +11 -5
  45. package/src/sap/suite/ui/commons/messagebundle_en.properties +11 -5
  46. package/src/sap/suite/ui/commons/messagebundle_en_GB.properties +11 -5
  47. package/src/sap/suite/ui/commons/messagebundle_en_US_saprigi.properties +9 -5
  48. package/src/sap/suite/ui/commons/messagebundle_es.properties +11 -5
  49. package/src/sap/suite/ui/commons/messagebundle_es_MX.properties +10 -4
  50. package/src/sap/suite/ui/commons/messagebundle_et.properties +6 -0
  51. package/src/sap/suite/ui/commons/messagebundle_fi.properties +10 -4
  52. package/src/sap/suite/ui/commons/messagebundle_fr.properties +11 -5
  53. package/src/sap/suite/ui/commons/messagebundle_fr_CA.properties +11 -5
  54. package/src/sap/suite/ui/commons/messagebundle_hi.properties +11 -5
  55. package/src/sap/suite/ui/commons/messagebundle_hr.properties +10 -4
  56. package/src/sap/suite/ui/commons/messagebundle_hu.properties +9 -3
  57. package/src/sap/suite/ui/commons/messagebundle_id.properties +12 -6
  58. package/src/sap/suite/ui/commons/messagebundle_it.properties +11 -5
  59. package/src/sap/suite/ui/commons/messagebundle_iw.properties +11 -5
  60. package/src/sap/suite/ui/commons/messagebundle_ja.properties +9 -3
  61. package/src/sap/suite/ui/commons/messagebundle_kk.properties +10 -4
  62. package/src/sap/suite/ui/commons/messagebundle_ko.properties +10 -4
  63. package/src/sap/suite/ui/commons/messagebundle_lt.properties +11 -5
  64. package/src/sap/suite/ui/commons/messagebundle_lv.properties +11 -5
  65. package/src/sap/suite/ui/commons/messagebundle_mk.properties +9 -3
  66. package/src/sap/suite/ui/commons/messagebundle_ms.properties +11 -5
  67. package/src/sap/suite/ui/commons/messagebundle_nl.properties +8 -2
  68. package/src/sap/suite/ui/commons/messagebundle_no.properties +10 -4
  69. package/src/sap/suite/ui/commons/messagebundle_pl.properties +11 -5
  70. package/src/sap/suite/ui/commons/messagebundle_pt.properties +11 -5
  71. package/src/sap/suite/ui/commons/messagebundle_pt_PT.properties +11 -5
  72. package/src/sap/suite/ui/commons/messagebundle_ro.properties +11 -5
  73. package/src/sap/suite/ui/commons/messagebundle_ru.properties +12 -6
  74. package/src/sap/suite/ui/commons/messagebundle_sh.properties +11 -5
  75. package/src/sap/suite/ui/commons/messagebundle_sk.properties +10 -4
  76. package/src/sap/suite/ui/commons/messagebundle_sl.properties +10 -4
  77. package/src/sap/suite/ui/commons/messagebundle_sr.properties +11 -5
  78. package/src/sap/suite/ui/commons/messagebundle_sv.properties +10 -4
  79. package/src/sap/suite/ui/commons/messagebundle_th.properties +11 -5
  80. package/src/sap/suite/ui/commons/messagebundle_tr.properties +8 -2
  81. package/src/sap/suite/ui/commons/messagebundle_uk.properties +14 -8
  82. package/src/sap/suite/ui/commons/messagebundle_vi.properties +11 -5
  83. package/src/sap/suite/ui/commons/messagebundle_zh_CN.properties +11 -5
  84. package/src/sap/suite/ui/commons/messagebundle_zh_TW.properties +11 -5
  85. package/src/sap/suite/ui/commons/networkgraph/Graph.js +149 -40
  86. package/src/sap/suite/ui/commons/networkgraph/GraphMap.js +25 -3
  87. package/src/sap/suite/ui/commons/networkgraph/KeyboardNavigator.js +332 -13
  88. package/src/sap/suite/ui/commons/networkgraph/Line.js +110 -12
  89. package/src/sap/suite/ui/commons/networkgraph/Node.js +67 -5
  90. package/src/sap/suite/ui/commons/networkgraph/Utils.js +249 -10
  91. package/src/sap/suite/ui/commons/networkgraph/layout/NoopLayout.js +55 -8
  92. package/src/sap/suite/ui/commons/networkgraph/util/ConnectionPathUtils.js +34 -4
  93. package/src/sap/suite/ui/commons/networkgraph/util/DependencyLayoutHelper.js +230 -82
  94. package/src/sap/suite/ui/commons/networkgraph/util/DragDropManager.js +52 -50
  95. package/src/sap/suite/ui/commons/networkgraph/util/PortManager.js +12 -3
  96. package/src/sap/suite/ui/commons/statusindicator/Circle.js +1 -1
  97. package/src/sap/suite/ui/commons/statusindicator/CustomShape.js +1 -1
  98. package/src/sap/suite/ui/commons/statusindicator/DiscreteThreshold.js +1 -1
  99. package/src/sap/suite/ui/commons/statusindicator/FillingOption.js +1 -1
  100. package/src/sap/suite/ui/commons/statusindicator/LibraryShape.js +1 -1
  101. package/src/sap/suite/ui/commons/statusindicator/Path.js +1 -1
  102. package/src/sap/suite/ui/commons/statusindicator/PropertyThreshold.js +1 -1
  103. package/src/sap/suite/ui/commons/statusindicator/Rectangle.js +1 -1
  104. package/src/sap/suite/ui/commons/statusindicator/Shape.js +1 -1
  105. package/src/sap/suite/ui/commons/statusindicator/ShapeGroup.js +1 -1
  106. package/src/sap/suite/ui/commons/statusindicator/SimpleShape.js +1 -1
  107. package/src/sap/suite/ui/commons/statusindicator/StatusIndicator.js +1 -1
  108. package/src/sap/suite/ui/commons/taccount/TAccount.js +1 -1
  109. package/src/sap/suite/ui/commons/taccount/TAccountGroup.js +1 -1
  110. package/src/sap/suite/ui/commons/taccount/TAccountItem.js +1 -1
  111. package/src/sap/suite/ui/commons/taccount/TAccountItemProperty.js +1 -1
  112. package/src/sap/suite/ui/commons/taccount/TAccountPanel.js +1 -1
  113. package/src/sap/suite/ui/commons/themes/base/BusinessCard.less +5 -4
  114. package/src/sap/suite/ui/commons/themes/base/CalculationBuilder.less +33 -24
  115. package/src/sap/suite/ui/commons/themes/base/CalculationBuilderExpression.less +40 -31
  116. package/src/sap/suite/ui/commons/themes/base/CalculationBuilderInput.less +26 -10
  117. package/src/sap/suite/ui/commons/themes/base/CalculationBuilderItem.less +76 -63
  118. package/src/sap/suite/ui/commons/themes/base/ChartContainer.less +8 -11
  119. package/src/sap/suite/ui/commons/themes/base/ChartTile.less +5 -8
  120. package/src/sap/suite/ui/commons/themes/base/CollaborationPopover.less +116 -106
  121. package/src/sap/suite/ui/commons/themes/base/DateRangeScroller.less +5 -5
  122. package/src/sap/suite/ui/commons/themes/base/DateRangeSliderInternal.less +9 -10
  123. package/src/sap/suite/ui/commons/themes/base/FacetOverview.less +9 -10
  124. package/src/sap/suite/ui/commons/themes/base/FeedItemHeader.less +9 -12
  125. package/src/sap/suite/ui/commons/themes/base/FeedTile.less +23 -27
  126. package/src/sap/suite/ui/commons/themes/base/GenericTile2X2.less +15 -15
  127. package/src/sap/suite/ui/commons/themes/base/HeaderCell.less +7 -6
  128. package/src/sap/suite/ui/commons/themes/base/HeaderContainer.less +35 -37
  129. package/src/sap/suite/ui/commons/themes/base/ImageEditor.less +28 -10
  130. package/src/sap/suite/ui/commons/themes/base/ImageEditorContainer.less +29 -22
  131. package/src/sap/suite/ui/commons/themes/base/InfoTile.less +10 -4
  132. package/src/sap/suite/ui/commons/themes/base/InfoTileSize.less +5 -4
  133. package/src/sap/suite/ui/commons/themes/base/KpiTile.less +10 -11
  134. package/src/sap/suite/ui/commons/themes/base/LaunchTile.less +9 -8
  135. package/src/sap/suite/ui/commons/themes/base/LinkActionSheet.less +14 -43
  136. package/src/sap/suite/ui/commons/themes/base/MicroProcessFlow.less +51 -47
  137. package/src/sap/suite/ui/commons/themes/base/MonitoringContent.less +5 -5
  138. package/src/sap/suite/ui/commons/themes/base/NetworkGraph.less +57 -62
  139. package/src/sap/suite/ui/commons/themes/base/NetworkGroup.less +61 -65
  140. package/src/sap/suite/ui/commons/themes/base/NetworkLine.less +58 -55
  141. package/src/sap/suite/ui/commons/themes/base/NetworkNode.less +3 -0
  142. package/src/sap/suite/ui/commons/themes/base/NetworkTooltip.less +21 -25
  143. package/src/sap/suite/ui/commons/themes/base/NoteTaker.less +13 -18
  144. package/src/sap/suite/ui/commons/themes/base/NoteTakerCard.less +26 -27
  145. package/src/sap/suite/ui/commons/themes/base/NoteTakerFeeder.less +22 -44
  146. package/src/sap/suite/ui/commons/themes/base/NumericTile.less +7 -5
  147. package/src/sap/suite/ui/commons/themes/base/PictureZoomIn.less +6 -5
  148. package/src/sap/suite/ui/commons/themes/base/ProcessFlow.less +57 -76
  149. package/src/sap/suite/ui/commons/themes/base/ProcessFlowConnection.less +71 -17
  150. package/src/sap/suite/ui/commons/themes/base/ProcessFlowConnectionLabel.less +9 -13
  151. package/src/sap/suite/ui/commons/themes/base/ProcessFlowLaneHeader.less +37 -96
  152. package/src/sap/suite/ui/commons/themes/base/ProcessFlowNode.less +219 -238
  153. package/src/sap/suite/ui/commons/themes/base/SemanticColorMixins.less +55 -0
  154. package/src/sap/suite/ui/commons/themes/base/SplitButton.less +7 -20
  155. package/src/sap/suite/ui/commons/themes/base/StatusIndicator.less +10 -9
  156. package/src/sap/suite/ui/commons/themes/base/TAccount.less +78 -73
  157. package/src/sap/suite/ui/commons/themes/base/TargetFilter.less +50 -58
  158. package/src/sap/suite/ui/commons/themes/base/ThingCollection.less +18 -13
  159. package/src/sap/suite/ui/commons/themes/base/ThreePanelThingViewer.less +14 -14
  160. package/src/sap/suite/ui/commons/themes/base/TileContent2X2.less +9 -13
  161. package/src/sap/suite/ui/commons/themes/base/Timeline.less +16 -19
  162. package/src/sap/suite/ui/commons/themes/base/TimelineItem.less +95 -103
  163. package/src/sap/suite/ui/commons/themes/base/UnifiedThingGroup.less +7 -9
  164. package/src/sap/suite/ui/commons/themes/base/UnifiedThingInspector.less +12 -9
  165. package/src/sap/suite/ui/commons/themes/base/VerticalNavigationBar.less +10 -15
  166. package/src/sap/suite/ui/commons/themes/base/ViewRepeater.less +8 -9
  167. package/src/sap/suite/ui/commons/themes/base/library.source.less +0 -2
  168. package/src/sap/suite/ui/commons/themes/sap_fiori_3/MicroProcessFlow.less +9 -3
  169. package/src/sap/suite/ui/commons/themes/sap_fiori_3/ProcessFlowConnection.less +14 -7
  170. package/src/sap/suite/ui/commons/themes/sap_fiori_3/ProcessFlowConnectionLabel.less +38 -35
  171. package/src/sap/suite/ui/commons/themes/sap_fiori_3/ProcessFlowLaneHeader.less +29 -30
  172. package/src/sap/suite/ui/commons/themes/sap_fiori_3/ProcessFlowNode.less +158 -102
  173. package/src/sap/suite/ui/commons/themes/sap_fiori_3_dark/MicroProcessFlow.less +9 -3
  174. package/src/sap/suite/ui/commons/themes/sap_fiori_3_dark/ProcessFlowConnection.less +14 -7
  175. package/src/sap/suite/ui/commons/themes/sap_fiori_3_dark/ProcessFlowConnectionLabel.less +38 -35
  176. package/src/sap/suite/ui/commons/themes/sap_fiori_3_dark/ProcessFlowLaneHeader.less +30 -31
  177. package/src/sap/suite/ui/commons/themes/sap_fiori_3_dark/ProcessFlowNode.less +157 -101
  178. package/src/sap/suite/ui/commons/themes/sap_fiori_3_hcb/ProcessFlowConnection.less +14 -7
  179. package/src/sap/suite/ui/commons/themes/sap_fiori_3_hcb/ProcessFlowConnectionLabel.less +38 -35
  180. package/src/sap/suite/ui/commons/themes/sap_fiori_3_hcb/ProcessFlowLaneHeader.less +30 -31
  181. package/src/sap/suite/ui/commons/themes/sap_fiori_3_hcb/ProcessFlowNode.less +147 -101
  182. package/src/sap/suite/ui/commons/themes/sap_fiori_3_hcw/ProcessFlowConnection.less +14 -7
  183. package/src/sap/suite/ui/commons/themes/sap_fiori_3_hcw/ProcessFlowConnectionLabel.less +38 -35
  184. package/src/sap/suite/ui/commons/themes/sap_fiori_3_hcw/ProcessFlowLaneHeader.less +30 -31
  185. package/src/sap/suite/ui/commons/themes/sap_fiori_3_hcw/ProcessFlowNode.less +158 -102
  186. package/src/sap/suite/ui/commons/themes/sap_horizon/MicroProcessFlow.less +5 -0
  187. package/src/sap/suite/ui/commons/themes/sap_horizon/NetworkLine.less +12 -8
  188. package/src/sap/suite/ui/commons/themes/sap_horizon/ProcessFlowConnection.less +17 -10
  189. package/src/sap/suite/ui/commons/themes/sap_horizon/ProcessFlowConnectionLabel.less +154 -133
  190. package/src/sap/suite/ui/commons/themes/sap_horizon/ProcessFlowLaneHeader.less +30 -32
  191. package/src/sap/suite/ui/commons/themes/sap_horizon/ProcessFlowNode.less +113 -214
  192. package/src/sap/suite/ui/commons/themes/sap_horizon/TimelineItem.less +43 -39
  193. package/src/sap/suite/ui/commons/themes/sap_horizon_dark/MicroProcessFlow.less +5 -0
  194. package/src/sap/suite/ui/commons/themes/sap_horizon_dark/NetworkLine.less +12 -12
  195. package/src/sap/suite/ui/commons/themes/sap_horizon_dark/ProcessFlowConnection.less +17 -10
  196. package/src/sap/suite/ui/commons/themes/sap_horizon_dark/ProcessFlowConnectionLabel.less +154 -133
  197. package/src/sap/suite/ui/commons/themes/sap_horizon_dark/ProcessFlowLaneHeader.less +30 -31
  198. package/src/sap/suite/ui/commons/themes/sap_horizon_dark/ProcessFlowNode.less +114 -216
  199. package/src/sap/suite/ui/commons/themes/sap_horizon_dark/TimelineItem.less +41 -39
  200. package/src/sap/suite/ui/commons/themes/sap_horizon_hcb/MicroProcessFlow.less +4 -4
  201. package/src/sap/suite/ui/commons/themes/sap_horizon_hcb/ProcessFlowConnection.less +17 -10
  202. package/src/sap/suite/ui/commons/themes/sap_horizon_hcb/ProcessFlowConnectionLabel.less +153 -131
  203. package/src/sap/suite/ui/commons/themes/sap_horizon_hcb/ProcessFlowLaneHeader.less +29 -30
  204. package/src/sap/suite/ui/commons/themes/sap_horizon_hcb/ProcessFlowNode.less +159 -103
  205. package/src/sap/suite/ui/commons/themes/sap_horizon_hcb/TimelineItem.less +41 -39
  206. package/src/sap/suite/ui/commons/themes/sap_horizon_hcw/MicroProcessFlow.less +4 -4
  207. package/src/sap/suite/ui/commons/themes/sap_horizon_hcw/ProcessFlowConnection.less +16 -9
  208. package/src/sap/suite/ui/commons/themes/sap_horizon_hcw/ProcessFlowConnectionLabel.less +153 -131
  209. package/src/sap/suite/ui/commons/themes/sap_horizon_hcw/ProcessFlowLaneHeader.less +29 -30
  210. package/src/sap/suite/ui/commons/themes/sap_horizon_hcw/ProcessFlowNode.less +157 -101
  211. package/src/sap/suite/ui/commons/themes/sap_horizon_hcw/TimelineItem.less +41 -39
  212. package/src/sap/suite/ui/commons/windowmessages/CollaborationMessageConsumer.js +3 -3
  213. package/src/sap/suite/ui/commons/themes/base/DateRangeSlider.less +0 -3
  214. package/src/sap/suite/ui/commons/themes/base/MonitoringTile.less +0 -3
@@ -252,6 +252,7 @@ sap.ui.define([
252
252
  /**
253
253
  * Enables the drag and drop of nodes. This property is ignored if the layout property is not set to noop.
254
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.
255
256
  * @public
256
257
  * @since 1.144
257
258
  */
@@ -290,10 +291,10 @@ sap.ui.define([
290
291
  */
291
292
  connectionTypeMapping: {
292
293
  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"
294
+ "LeftToLeft": "Start to Start",
295
+ "LeftToRight": "Start to Finish",
296
+ "RightToLeft": "Finish to Start",
297
+ "RightToRight": "Finish to Finish"
297
298
  }
298
299
  }
299
300
  },
@@ -417,6 +418,7 @@ sap.ui.define([
417
418
  /**
418
419
  * This event is fired when a user drops a node in the graph.
419
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.
420
422
  * @public
421
423
  * @since 1.144
422
424
  */
@@ -478,7 +480,14 @@ sap.ui.define([
478
480
  */
479
481
  item: { type: "sap.suite.ui.commons.networkgraph.ElementBase" }
480
482
  }
481
- }
483
+ },
484
+ /**
485
+ * Fired when the user requests to add a node via INSERT or Ctrl+Alt+N.
486
+ * Only available when NoopLayout is used and enableDragAndDrop is <code>true</code>.
487
+ * @public
488
+ * @since 1.148
489
+ */
490
+ nodeAdded: {}
482
491
  }
483
492
  }
484
493
  });
@@ -577,13 +586,66 @@ sap.ui.define([
577
586
  }
578
587
  // Initialize PortManager with this graph instance
579
588
  PortManager.setGraphInstance(this);
589
+ Core.ready(this._handleCoreInitialized.bind(this));
590
+
591
+ };
592
+
593
+ /**
594
+ * Handler for the core's init event. Attaches listener for localization changes.
595
+ * @private
596
+ */
597
+ Graph.prototype._handleCoreInitialized = function () {
598
+ Localization.attachChange(this._handleLocalizationChanged.bind(this));
599
+ };
600
+
601
+ /**
602
+ * Handler for localization changes. Sets a pending flag when RTL mode changes so that
603
+ * node dimensions are re-measured after RTL CSS files finish loading.
604
+ * UI5 automatically re-renders all UIAreas on RTL change; the flag prevents premature
605
+ * layout calculation in onAfterRendering before CSS dimensions are stable.
606
+ * @private
607
+ */
608
+ Graph.prototype._handleLocalizationChanged = function () {
609
+ const bNewRtl = Localization.getRTL();
610
+ if (this._bIsRtl !== bNewRtl) {
611
+ this._bIsRtl = bNewRtl;
612
+ this._bRtlMeasurementPending = true;
613
+
614
+ const fnOnApplied = function () {
615
+ Theming.detachApplied(fnOnApplied);
616
+ if (this._bRtlMeasurementPending) {
617
+ this._bRtlMeasurementPending = false;
618
+ this._measureAndLayout();
619
+ }
620
+ }.bind(this);
621
+ Theming.attachApplied(fnOnApplied);
622
+ }
623
+ };
580
624
 
625
+ Graph.prototype._measureAndLayout = function () {
626
+ var aNodes = this.getNodes();
627
+ aNodes.forEach(function (oNode) {
628
+ if (this._isUseNodeHtml()) {
629
+ oNode._setupDivDimensions();
630
+ } else {
631
+ oNode.calculateSizes();
632
+ oNode._setupWidthAndHeight();
633
+ }
634
+ }.bind(this));
635
+ this._bTriggerLayoutCalculation = true;
636
+ this._preprocessData();
581
637
  };
582
638
 
583
639
  Graph.prototype.onBeforeRendering = function () {
584
640
  // indicates RTL
585
641
  this._bIsRtl = Localization.getRTL();
586
642
 
643
+ // Check if the currently focused item has been destroyed and clear it
644
+ if (this._oFocus && this._oFocus.item && (this._oFocus.item.bIsDestroyed || this._oFocus.item.isDestroyed?.())) {
645
+ Log.info("NetworkGraph: Focused item was destroyed before rendering, clearing focus");
646
+ this._oFocus = null;
647
+ }
648
+
587
649
  this.setBusy(false);
588
650
  this.setBusyIndicatorDelay(0);
589
651
 
@@ -631,7 +693,6 @@ sap.ui.define([
631
693
  this.$().addClass("sapSuiteUiCommonsNetworkGraphFullScreen");
632
694
  }
633
695
 
634
-
635
696
  if (aNodes.length === 0 || this._bIsInvalid || this.getNoData()) {
636
697
  if (this._bIsInvalid) {
637
698
  oRm.openStart("span");
@@ -693,29 +754,18 @@ sap.ui.define([
693
754
  oRm.flush(this._$innerscroller[0], true, this._$innerscroller.children().length);
694
755
  }
695
756
 
696
- // make sure everything is rendered
697
- aNodes.forEach(function (oNode) {
698
- if (this._isUseNodeHtml()) {
699
- // call after rendering before layouter starts - can be handy when user custom renders
700
- oNode._setupDivDimensions();
701
- } else {
702
- oNode.calculateSizes();
703
- oNode._setupWidthAndHeight();
704
- }
705
- }.bind(this));
706
-
707
- this._preprocessData();
708
- Theming.detachApplied(fnProcess);
757
+ if (!this._bRtlMeasurementPending) {
758
+ this._measureAndLayout();
759
+ }
709
760
  }.bind(this);
710
761
 
711
- // In case theme is applied fnProcess will be called immediately,
712
- // else it will be called once theme is applied.
713
- Theming.attachApplied(fnProcess);
762
+ fnProcess();
714
763
  }
715
764
  this.oInvisibleMessage = InvisibleMessage.getInstance();
716
765
  oRm.destroy();
717
766
 
718
767
  };
768
+
719
769
  Graph.prototype.exit = function () {
720
770
  // if (this.oHashChanger) {
721
771
  // this.oHashChanger.destroy();
@@ -1023,6 +1073,21 @@ sap.ui.define([
1023
1073
  this._oZoomLevelInvisibleText.setText(oResourceBundle.getText("NETWORK_GRAPH_ZOOM_LEVEL") + ": " + this._getZoomText());
1024
1074
  };
1025
1075
 
1076
+ /**
1077
+ * Restores keyboard focus to the last focused item in the graph, or falls back to the graph wrapper.
1078
+ * @private
1079
+ */
1080
+ Graph.prototype._restoreFocusToGraph = function () {
1081
+ if (this._oFocus) {
1082
+ const oFocusToRestore = this._oFocus;
1083
+ // Force setFocus to re-apply even if the item hasn't changed.
1084
+ this._oFocus = null;
1085
+ this.setFocus(oFocusToRestore);
1086
+ } else {
1087
+ this.getFocusDomRef().focus();
1088
+ }
1089
+ };
1090
+
1026
1091
  /**
1027
1092
  * Gets the associated control linked to this graph instance using the 'associatedControl' association.
1028
1093
  * This can be any UI5 control that is related to the graph.
@@ -1084,7 +1149,14 @@ sap.ui.define([
1084
1149
  oTooltip.attachEvent("afterClose", function () {
1085
1150
  var oFocus = this.getFocus();
1086
1151
 
1087
- if (oFocus) {
1152
+ if (oFocus && oFocus.item) {
1153
+ // Check if the focused item is destroyed before trying to restore focus
1154
+ if (oFocus.item.bIsDestroyed || oFocus.item.isDestroyed?.()) {
1155
+ Log.info("NetworkGraph: Cannot restore focus on destroyed control after tooltip close");
1156
+ this._oFocus = null;
1157
+ return;
1158
+ }
1159
+
1088
1160
  this.setFocus(oFocus);
1089
1161
 
1090
1162
  if (oFocus.button == "menu") {
@@ -1159,12 +1231,12 @@ sap.ui.define([
1159
1231
  Graph.prototype.setEnableDragAndDrop = function (bEnabled) {
1160
1232
  this.setProperty("enableDragAndDrop", bEnabled, true);
1161
1233
 
1162
- // Update zoom button states
1234
+ // Update zoom button visibility
1163
1235
  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);
1236
+ var bZoomVisible = !this._isDnDEnabled();
1237
+ this._zoomIn.setVisible(bZoomVisible);
1238
+ this._zoomOut.setVisible(bZoomVisible);
1239
+ this._zoomToFitButton.setVisible(bZoomVisible);
1168
1240
  }
1169
1241
 
1170
1242
  // remove the node ports when drag and drop is disabled
@@ -1190,6 +1262,13 @@ sap.ui.define([
1190
1262
  * @private
1191
1263
  */
1192
1264
  Graph.prototype.setFocus = function (oFocus, bIsClickOrEnter) {
1265
+ // Check if the focused item has been destroyed and clear it
1266
+ if (oFocus && oFocus.item && (oFocus.item.bIsDestroyed || oFocus.item.isDestroyed?.())) {
1267
+ Log.info("NetworkGraph: Cannot set focus on destroyed control, clearing focus");
1268
+ this._oFocus = null;
1269
+ return;
1270
+ }
1271
+
1193
1272
  // Identity redundant
1194
1273
  if (!oFocus && !this._oFocus ||
1195
1274
  oFocus && this._oFocus && oFocus.item === this._oFocus.item && oFocus.button === this._oFocus.button && oFocus.groupInFocused === this._oFocus.groupInFocused) {
@@ -1404,12 +1483,25 @@ sap.ui.define([
1404
1483
 
1405
1484
  // While Expand/Collapse, focus will still remain to the button
1406
1485
  if (this._oFocus && this._oFocus.button === Group.BUTTONS.COLLAPSE) {
1407
- this._oFocus.item._setCollapseButtonFocus(true);
1486
+ // Check if the focused item still exists and is not destroyed
1487
+ if (this._oFocus.item && !this._oFocus.item.bIsDestroyed && !this._oFocus.item.isDestroyed?.()) {
1488
+ this._oFocus.item._setCollapseButtonFocus(true);
1489
+ } else {
1490
+ Log.info("NetworkGraph: Focused item was destroyed, clearing focus");
1491
+ this._oFocus = null;
1492
+ }
1408
1493
  }
1409
1494
  this._bIsLayedOut = true;
1410
1495
  this._setupEvents();
1411
1496
  this._setupKeyboardNavigation();
1412
- this.setFocus(this.getFocus());
1497
+ // Only restore focus if the focused item still exists and is not destroyed
1498
+ var oCurrentFocus = this.getFocus();
1499
+ if (oCurrentFocus && oCurrentFocus.item && (oCurrentFocus.item.bIsDestroyed || oCurrentFocus.item.isDestroyed?.())) {
1500
+ Log.info("NetworkGraph: Cannot restore focus on destroyed control, clearing focus");
1501
+ this._oFocus = null;
1502
+ } else {
1503
+ this.setFocus(oCurrentFocus);
1504
+ }
1413
1505
 
1414
1506
  // when there is background image, busy is set false after image is loaded (own event)
1415
1507
  // in case image was already loaded continue as usual
@@ -2225,12 +2317,6 @@ sap.ui.define([
2225
2317
  }
2226
2318
  });
2227
2319
  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);
2233
- }
2234
2320
  }
2235
2321
 
2236
2322
  // fit to viewport
@@ -2243,9 +2329,11 @@ sap.ui.define([
2243
2329
  });
2244
2330
  this._toolbar.addContent(this._zoomToFitButton);
2245
2331
 
2246
- // Disable zoom to fit button if drag and drop is enabled
2332
+ // Hide zoom buttons if drag and drop is enabled
2247
2333
  if (this._isDnDEnabled()) {
2248
- this._zoomToFitButton.setEnabled(false);
2334
+ this._zoomIn.setVisible(false);
2335
+ this._zoomOut.setVisible(false);
2336
+ this._zoomToFitButton.setVisible(false);
2249
2337
  }
2250
2338
 
2251
2339
  // toggle full screen
@@ -2878,7 +2966,13 @@ sap.ui.define([
2878
2966
  fHeight = oItem._iHeight;
2879
2967
  }
2880
2968
 
2881
- this.$scroller.get(0).scrollLeft = ((fX + (fWidth ? fWidth : 0) / 2) * this._fZoomLevel) - (this.$scroller.width() / 2);
2969
+ const fScrollLeft = ((fX + (fWidth ? fWidth : 0) / 2) * this._fZoomLevel) - (this.$scroller.width() / 2);
2970
+
2971
+ if (this._bIsRtl) {
2972
+ this.$scroller.get(0).scrollLeft = -fScrollLeft;
2973
+ } else {
2974
+ this.$scroller.get(0).scrollLeft = fScrollLeft;
2975
+ }
2882
2976
  this.$scroller.get(0).scrollTop = ((fY + (fHeight ? fHeight : 0) / 2) * this._fZoomLevel) - (this.$scroller.height() / 2);
2883
2977
  };
2884
2978
 
@@ -2899,6 +2993,14 @@ sap.ui.define([
2899
2993
  iRight = iLeft + this.$scroller.width() / this._fZoomLevel,
2900
2994
  iBottom = iTop + this.$scroller.height() / this._fZoomLevel;
2901
2995
 
2996
+ if (this._bIsRtl) {
2997
+ const iGraphWidth = this.$svg.width() / this._fZoomLevel;
2998
+ const iViewportWidth = this.$scroller.width() / this._fZoomLevel;
2999
+ const iScrollPosAbs = Math.abs(iLeft);
3000
+ iLeft = iGraphWidth - iScrollPosAbs - iViewportWidth;
3001
+ iRight = iLeft + iViewportWidth;
3002
+ }
3003
+
2902
3004
  if (!oItem._isOnScreen(iLeft, iRight, iTop, iBottom)) {
2903
3005
  if (oItem instanceof Node) {
2904
3006
  iCenterX = oItem.getX() + oItem._iWidth / 2;
@@ -2913,7 +3015,14 @@ sap.ui.define([
2913
3015
  }
2914
3016
 
2915
3017
  if (iCenterX < iLeft || iCenterX > iRight) {
2916
- oScroller.scrollLeft = iCenterX * this._fZoomLevel - this.$scroller.width() / 2;
3018
+ let iTargetScrollLeft = iCenterX * this._fZoomLevel - this.$scroller.width() / 2;
3019
+
3020
+ if (this._bIsRtl) {
3021
+ const iScrollRange = oScroller.scrollWidth - oScroller.clientWidth;
3022
+ iTargetScrollLeft = -(iScrollRange - iTargetScrollLeft);
3023
+ }
3024
+
3025
+ oScroller.scrollLeft = iTargetScrollLeft;
2917
3026
  }
2918
3027
  if (iCenterY < iTop || iCenterY > iBottom) {
2919
3028
  oScroller.scrollTop = iCenterY * this._fZoomLevel - this.$scroller.height() / 2;
@@ -367,12 +367,28 @@ sap.ui.define([
367
367
  }
368
368
  };
369
369
 
370
+ /**
371
+ * Returns the horizontal scroll position in graph coordinates, accounting for RTL.
372
+ */
373
+ GraphMap.prototype._getScrollLeftForMap = function (oGraph) {
374
+ const fScrollLeft = oGraph.$scroller[0].scrollLeft;
375
+
376
+ if (oGraph._bIsRtl) {
377
+ const iGraphWidth = oGraph.$svg.width() / oGraph._fZoomLevel;
378
+ const iViewportWidth = oGraph.$scroller.width() / oGraph._fZoomLevel;
379
+ const iScrollPosAbs = Math.abs(fScrollLeft) / oGraph._fZoomLevel;
380
+ return iGraphWidth - iScrollPosAbs - iViewportWidth;
381
+ }
382
+
383
+ return fScrollLeft / oGraph._fZoomLevel;
384
+ };
385
+
370
386
  GraphMap.prototype._resize = function () {
371
387
  var oGraph = this.getGraph(),
372
388
  $scroller = oGraph.$scroller,
373
389
  $mapNavigator = this.$("mapNavigator");
374
390
 
375
- $mapNavigator.attr("x", Math.max(NAVIGATORLINESIZE / 2, $scroller[0].scrollLeft / oGraph._fZoomLevel));
391
+ $mapNavigator.attr("x", Math.max(NAVIGATORLINESIZE / 2, this._getScrollLeftForMap(oGraph)));
376
392
  $mapNavigator.attr("y", Math.max(NAVIGATORLINESIZE / 2, $scroller[0].scrollTop / oGraph._fZoomLevel));
377
393
 
378
394
  $mapNavigator.attr("width", $scroller.width() / oGraph._fZoomLevel);
@@ -403,7 +419,7 @@ sap.ui.define([
403
419
  $mapNavigator = this.$("mapNavigator");
404
420
 
405
421
  if (oGraph && $scroller[0]) {
406
- $mapNavigator.attr("x", Math.max(NAVIGATORLINESIZE / 2, $scroller[0].scrollLeft / oGraph._fZoomLevel));
422
+ $mapNavigator.attr("x", Math.max(NAVIGATORLINESIZE / 2, this._getScrollLeftForMap(oGraph)));
407
423
  $mapNavigator.attr("y", Math.max(NAVIGATORLINESIZE / 2, $scroller[0].scrollTop / oGraph._fZoomLevel));
408
424
 
409
425
  this._correctMapNavigator();
@@ -424,7 +440,13 @@ sap.ui.define([
424
440
  fRealStartX = $border.offset().left,
425
441
  fRealStartY = $border.offset().top;
426
442
 
427
- oScroller.scrollLeft = (oScrollData.pageX - fRealStartX) * iRatio - ($scroller.width() / 2);
443
+ const fTargetScrollLeft = (oScrollData.pageX - fRealStartX) * iRatio - ($scroller.width() / 2);
444
+ if (oGraph._bIsRtl) {
445
+ const iScrollRange = oScroller.scrollWidth - oScroller.clientWidth;
446
+ oScroller.scrollLeft = -(iScrollRange - fTargetScrollLeft);
447
+ } else {
448
+ oScroller.scrollLeft = fTargetScrollLeft;
449
+ }
428
450
  oScroller.scrollTop = (oScrollData.pageY - fRealStartY) * iRatio - ($scroller.height() / 2);
429
451
  };
430
452