@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.
- package/package.json +1 -1
- package/src/sap/suite/ui/commons/.library +1 -1
- package/src/sap/suite/ui/commons/AriaProperties.js +1 -1
- package/src/sap/suite/ui/commons/CalculationBuilder.js +35 -6
- package/src/sap/suite/ui/commons/CalculationBuilderExpression.js +1 -1
- package/src/sap/suite/ui/commons/CalculationBuilderFunction.js +1 -1
- package/src/sap/suite/ui/commons/CalculationBuilderGroup.js +1 -1
- package/src/sap/suite/ui/commons/CalculationBuilderInput.js +11 -0
- package/src/sap/suite/ui/commons/CalculationBuilderItem.js +1 -1
- package/src/sap/suite/ui/commons/CalculationBuilderValidationResult.js +1 -1
- package/src/sap/suite/ui/commons/CalculationBuilderVariable.js +1 -1
- package/src/sap/suite/ui/commons/CloudFilePicker.js +1 -3
- package/src/sap/suite/ui/commons/ControlProxy.js +7 -4
- package/src/sap/suite/ui/commons/MicroProcessFlow.js +1 -1
- package/src/sap/suite/ui/commons/MicroProcessFlowItem.js +1 -1
- package/src/sap/suite/ui/commons/ProcessFlow.js +79 -75
- package/src/sap/suite/ui/commons/ProcessFlowRenderer.js +3 -0
- package/src/sap/suite/ui/commons/Timeline.js +9 -0
- package/src/sap/suite/ui/commons/TimelineNavigator.js +37 -5
- package/src/sap/suite/ui/commons/TimelineRenderer.js +3 -3
- package/src/sap/suite/ui/commons/collaboration/BaseHelperService.js +0 -1
- package/src/sap/suite/ui/commons/collaboration/CollaborationHelper.js +0 -3
- package/src/sap/suite/ui/commons/collaboration/CollaborationManagerService.js +0 -1
- package/src/sap/suite/ui/commons/collaboration/ContactHelper.js +12 -1
- package/src/sap/suite/ui/commons/collaboration/ContactPopover.fragment.xml +4 -1
- package/src/sap/suite/ui/commons/collaboration/MinimalContactPopover.fragment.xml +8 -5
- package/src/sap/suite/ui/commons/collaboration/ServiceContainer.js +12 -2
- package/src/sap/suite/ui/commons/collaboration/TeamsHelperService.js +0 -6
- package/src/sap/suite/ui/commons/collaboration/channels/MessageChannel.js +0 -2
- package/src/sap/suite/ui/commons/collaboration/flpplugins/msplugin/Component-preload.js +1 -1
- package/src/sap/suite/ui/commons/collaboration/flpplugins/msplugin/Component.js +1 -2
- package/src/sap/suite/ui/commons/flexibility/changeHandler/PropertyChangeMapper.js +1 -1
- package/src/sap/suite/ui/commons/imageeditor/CropCustomShapeHistoryItem.js +1 -1
- package/src/sap/suite/ui/commons/imageeditor/CropEllipseHistoryItem.js +1 -1
- package/src/sap/suite/ui/commons/imageeditor/CropRectangleHistoryItem.js +1 -1
- package/src/sap/suite/ui/commons/imageeditor/CustomSizeItem.js +1 -1
- package/src/sap/suite/ui/commons/imageeditor/FilterHistoryItem.js +1 -1
- package/src/sap/suite/ui/commons/imageeditor/FlipHistoryItem.js +1 -1
- package/src/sap/suite/ui/commons/imageeditor/HistoryItem.js +1 -1
- package/src/sap/suite/ui/commons/imageeditor/ImageEditor.js +1 -1
- package/src/sap/suite/ui/commons/imageeditor/ImageEditorContainer.js +1 -1
- package/src/sap/suite/ui/commons/imageeditor/ImageEditorResponsiveContainer.js +9 -6
- package/src/sap/suite/ui/commons/imageeditor/ResizeHistoryItem.js +1 -1
- package/src/sap/suite/ui/commons/imageeditor/RotateHistoryItem.js +1 -1
- package/src/sap/suite/ui/commons/library.js +25 -1
- package/src/sap/suite/ui/commons/messagebundle.properties +20 -9
- package/src/sap/suite/ui/commons/messagebundle_ar.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_bg.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_ca.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_cnr.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_cs.properties +23 -2
- package/src/sap/suite/ui/commons/messagebundle_cy.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_da.properties +23 -2
- package/src/sap/suite/ui/commons/messagebundle_de.properties +36 -15
- package/src/sap/suite/ui/commons/messagebundle_el.properties +25 -4
- package/src/sap/suite/ui/commons/messagebundle_en.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_en_GB.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_en_US_saprigi.properties +11 -5
- package/src/sap/suite/ui/commons/messagebundle_es.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_es_MX.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_et.properties +23 -2
- package/src/sap/suite/ui/commons/messagebundle_fi.properties +23 -2
- package/src/sap/suite/ui/commons/messagebundle_fr.properties +32 -11
- package/src/sap/suite/ui/commons/messagebundle_fr_CA.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_hi.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_hr.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_hu.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_id.properties +25 -4
- package/src/sap/suite/ui/commons/messagebundle_it.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_iw.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_ja.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_kk.properties +25 -4
- package/src/sap/suite/ui/commons/messagebundle_ko.properties +23 -2
- package/src/sap/suite/ui/commons/messagebundle_lt.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_lv.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_mk.properties +23 -2
- package/src/sap/suite/ui/commons/messagebundle_ms.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_nl.properties +23 -2
- package/src/sap/suite/ui/commons/messagebundle_no.properties +25 -4
- package/src/sap/suite/ui/commons/messagebundle_pl.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_pt.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_pt_PT.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_ro.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_ru.properties +25 -4
- package/src/sap/suite/ui/commons/messagebundle_sh.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_sk.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_sl.properties +23 -2
- package/src/sap/suite/ui/commons/messagebundle_sr.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_sv.properties +23 -2
- package/src/sap/suite/ui/commons/messagebundle_th.properties +25 -4
- package/src/sap/suite/ui/commons/messagebundle_tr.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_uk.properties +27 -6
- package/src/sap/suite/ui/commons/messagebundle_vi.properties +26 -5
- package/src/sap/suite/ui/commons/messagebundle_zh_CN.properties +24 -3
- package/src/sap/suite/ui/commons/messagebundle_zh_TW.properties +26 -5
- package/src/sap/suite/ui/commons/networkgraph/Graph.js +49 -22
- package/src/sap/suite/ui/commons/networkgraph/KeyboardNavigator.js +45 -4
- package/src/sap/suite/ui/commons/networkgraph/Line.js +157 -11
- package/src/sap/suite/ui/commons/networkgraph/Node.js +289 -86
- package/src/sap/suite/ui/commons/networkgraph/Utils.js +239 -10
- package/src/sap/suite/ui/commons/networkgraph/layout/NoopLayout.js +55 -8
- package/src/sap/suite/ui/commons/networkgraph/util/DependencyLayoutHelper.js +156 -74
- package/src/sap/suite/ui/commons/networkgraph/util/DragDropManager.js +52 -50
- package/src/sap/suite/ui/commons/networkgraph/util/PortManager.js +14 -6
- package/src/sap/suite/ui/commons/statusindicator/Circle.js +1 -1
- package/src/sap/suite/ui/commons/statusindicator/CustomShape.js +1 -1
- package/src/sap/suite/ui/commons/statusindicator/DiscreteThreshold.js +1 -1
- package/src/sap/suite/ui/commons/statusindicator/FillingOption.js +1 -1
- package/src/sap/suite/ui/commons/statusindicator/LibraryShape.js +1 -1
- package/src/sap/suite/ui/commons/statusindicator/Path.js +1 -1
- package/src/sap/suite/ui/commons/statusindicator/PropertyThreshold.js +1 -1
- package/src/sap/suite/ui/commons/statusindicator/Rectangle.js +1 -1
- package/src/sap/suite/ui/commons/statusindicator/Shape.js +1 -1
- package/src/sap/suite/ui/commons/statusindicator/ShapeGroup.js +1 -1
- package/src/sap/suite/ui/commons/statusindicator/SimpleShape.js +1 -1
- package/src/sap/suite/ui/commons/statusindicator/StatusIndicator.js +1 -1
- package/src/sap/suite/ui/commons/taccount/TAccount.js +1 -1
- package/src/sap/suite/ui/commons/taccount/TAccountGroup.js +1 -1
- package/src/sap/suite/ui/commons/taccount/TAccountItem.js +1 -1
- package/src/sap/suite/ui/commons/taccount/TAccountItemProperty.js +1 -1
- package/src/sap/suite/ui/commons/taccount/TAccountPanel.js +1 -1
- package/src/sap/suite/ui/commons/themes/base/NetworkLine.less +26 -5
- 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.
|
|
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
|
|
1146
|
-
if (this._zoomIn && this._zoomOut) {
|
|
1147
|
-
var
|
|
1148
|
-
this._zoomIn.
|
|
1149
|
-
this._zoomOut.
|
|
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
|
-
|
|
1180
|
-
|
|
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.
|
|
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 (
|
|
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()
|
|
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
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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:
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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
|
-
|
|
203
|
-
|
|
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
|
-
//
|
|
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
|
|