81 lines
1.8 KiB
JavaScript
81 lines
1.8 KiB
JavaScript
import {
|
|
getMid
|
|
} from 'diagram-js/lib/layout/LayoutUtil';
|
|
|
|
import lineIntersect from './util/LineIntersect';
|
|
|
|
|
|
/**
|
|
* Fix broken dockings after DI imports.
|
|
*
|
|
* @param {EventBus} eventBus
|
|
*/
|
|
export default function ImportDockingFix(eventBus) {
|
|
|
|
function adjustDocking(startPoint, nextPoint, elementMid) {
|
|
|
|
var elementTop = {
|
|
x: elementMid.x,
|
|
y: elementMid.y - 50
|
|
};
|
|
|
|
var elementLeft = {
|
|
x: elementMid.x - 50,
|
|
y: elementMid.y
|
|
};
|
|
|
|
var verticalIntersect = lineIntersect(startPoint, nextPoint, elementMid, elementTop),
|
|
horizontalIntersect = lineIntersect(startPoint, nextPoint, elementMid, elementLeft);
|
|
|
|
// original is horizontal or vertical center cross intersection
|
|
var centerIntersect;
|
|
|
|
if (verticalIntersect && horizontalIntersect) {
|
|
if (getDistance(verticalIntersect, elementMid) > getDistance(horizontalIntersect, elementMid)) {
|
|
centerIntersect = horizontalIntersect;
|
|
} else {
|
|
centerIntersect = verticalIntersect;
|
|
}
|
|
} else {
|
|
centerIntersect = verticalIntersect || horizontalIntersect;
|
|
}
|
|
|
|
startPoint.original = centerIntersect;
|
|
}
|
|
|
|
function fixDockings(connection) {
|
|
var waypoints = connection.waypoints;
|
|
|
|
adjustDocking(
|
|
waypoints[0],
|
|
waypoints[1],
|
|
getMid(connection.source)
|
|
);
|
|
|
|
adjustDocking(
|
|
waypoints[waypoints.length - 1],
|
|
waypoints[waypoints.length - 2],
|
|
getMid(connection.target)
|
|
);
|
|
}
|
|
|
|
eventBus.on('bpmnElement.added', function(e) {
|
|
|
|
var element = e.element;
|
|
|
|
if (element.waypoints) {
|
|
fixDockings(element);
|
|
}
|
|
});
|
|
}
|
|
|
|
ImportDockingFix.$inject = [
|
|
'eventBus'
|
|
];
|
|
|
|
|
|
// helpers //////////////////////
|
|
|
|
function getDistance(p1, p2) {
|
|
return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
|
|
} |