fix(dropOnFlowBehavior): ignore drop point if bendpoint is inside shape
Closes #696
This commit is contained in:
parent
b234f17244
commit
b1a544b84f
|
@ -8,6 +8,16 @@ var CommandInterceptor = require('diagram-js/lib/command/CommandInterceptor');
|
||||||
|
|
||||||
var getApproxIntersection = require('diagram-js/lib/util/LineIntersection').getApproxIntersection;
|
var getApproxIntersection = require('diagram-js/lib/util/LineIntersection').getApproxIntersection;
|
||||||
|
|
||||||
|
function isPointInsideBBox(bbox, point) {
|
||||||
|
var x = point.x,
|
||||||
|
y = point.y;
|
||||||
|
|
||||||
|
return x >= bbox.x &&
|
||||||
|
x <= bbox.x + bbox.width &&
|
||||||
|
y >= bbox.y &&
|
||||||
|
y <= bbox.y + bbox.height;
|
||||||
|
}
|
||||||
|
|
||||||
function copy(obj) {
|
function copy(obj) {
|
||||||
return assign({}, obj);
|
return assign({}, obj);
|
||||||
}
|
}
|
||||||
|
@ -41,8 +51,15 @@ function DropOnFlow(eventBus, bpmnRules, modeling) {
|
||||||
|
|
||||||
dockingPoint = intersection.bendpoint ? waypoints[intersection.index] : position;
|
dockingPoint = intersection.bendpoint ? waypoints[intersection.index] : position;
|
||||||
|
|
||||||
waypointsBefore.push(copy(dockingPoint));
|
// if last waypointBefore is inside shape's bounds, ignore docking point
|
||||||
waypointsAfter.unshift(copy(dockingPoint));
|
if (!isPointInsideBBox(shape, waypointsBefore[waypointsBefore.length-1])) {
|
||||||
|
waypointsBefore.push(copy(dockingPoint));
|
||||||
|
}
|
||||||
|
|
||||||
|
// if first waypointAfter is inside shape's bounds, ignore docking point
|
||||||
|
if (!isPointInsideBBox(shape, waypointsAfter[0])) {
|
||||||
|
waypointsAfter.unshift(copy(dockingPoint));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
source = targetFlow.source;
|
source = targetFlow.source;
|
||||||
|
|
|
@ -150,6 +150,54 @@ describe('modeling/behavior - drop on connection', function() {
|
||||||
]));
|
]));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
||||||
|
it('should connect start -> target -> end (with bendpointBefore inside bbox)',
|
||||||
|
inject(function(modeling, elementRegistry, elementFactory) {
|
||||||
|
// given
|
||||||
|
var taskShape = elementFactory.createShape({ type: 'bpmn:Task' }),
|
||||||
|
sequenceFlow = elementRegistry.get('SequenceFlow_1'),
|
||||||
|
originalWaypoints = sequenceFlow.waypoints,
|
||||||
|
dropPosition = { x: 340, y: 145 }; // 25 pixels below bendpoint
|
||||||
|
|
||||||
|
// when
|
||||||
|
modeling.createShape(taskShape, dropPosition, sequenceFlow);
|
||||||
|
|
||||||
|
// then
|
||||||
|
// split target but don't keep insertion point
|
||||||
|
expect(sequenceFlow).to.have.waypoints(flatten([
|
||||||
|
originalWaypoints.slice(0, 1),
|
||||||
|
{ x: 290, y: 120 }
|
||||||
|
]));
|
||||||
|
|
||||||
|
expect(sequenceFlow).to.have.endDocking({ x: 340, y: 120 });
|
||||||
|
}
|
||||||
|
));
|
||||||
|
|
||||||
|
|
||||||
|
it('should connect start -> target -> end (with bendpointAfter inside bbox)',
|
||||||
|
inject(function(modeling, elementRegistry, elementFactory) {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var taskShape = elementFactory.createShape({ type: 'bpmn:Task' }),
|
||||||
|
sequenceFlow = elementRegistry.get('SequenceFlow_1'),
|
||||||
|
originalWaypoints = sequenceFlow.waypoints,
|
||||||
|
dropPosition = { x: 340, y: 280 }; // 25 pixels above bendpoint
|
||||||
|
|
||||||
|
// when
|
||||||
|
var newShape = modeling.createShape(taskShape, dropPosition, sequenceFlow),
|
||||||
|
targetConnection = newShape.outgoing[0];
|
||||||
|
|
||||||
|
// then
|
||||||
|
// split target but don't keep insertion point
|
||||||
|
expect(targetConnection).to.have.waypoints(flatten([
|
||||||
|
{ x: 390, y: 299 },
|
||||||
|
originalWaypoints.slice(3)
|
||||||
|
]));
|
||||||
|
|
||||||
|
expect(targetConnection).to.have.startDocking({ x: 340, y: 299 });
|
||||||
|
}
|
||||||
|
));
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('move', function() {
|
describe('move', function() {
|
||||||
|
|
Loading…
Reference in New Issue