From 86c61b0c0d6dcf776adda94b6d72b621644c2abe Mon Sep 17 00:00:00 2001 From: Oguz Eroglu Date: Tue, 10 Sep 2019 12:10:24 +0200 Subject: [PATCH] fix(snapping): snap to task mid Related to https://github.com/camunda/camunda-modeler/issues/1436 --- lib/features/snapping/BpmnConnectSnapping.js | 32 +++++++++---------- .../snapping/BpmnConnectSnapping.bpmn | 20 ++++++++++-- .../snapping/BpmnConnectSnappingSpec.js | 12 +++---- 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/lib/features/snapping/BpmnConnectSnapping.js b/lib/features/snapping/BpmnConnectSnapping.js index f1b1c99a..01b83b8d 100644 --- a/lib/features/snapping/BpmnConnectSnapping.js +++ b/lib/features/snapping/BpmnConnectSnapping.js @@ -12,7 +12,6 @@ import { import { is } from '../../util/ModelUtil'; import { - every, some } from 'min-dash'; @@ -26,6 +25,8 @@ var TARGET_BOUNDS_PADDING = 20; var TARGET_CENTER_PADDING = 20; +var TASK_BOUNDS_PADDING = 10; + var AXES = [ 'x', 'y' ]; var abs = Math.abs; @@ -78,7 +79,7 @@ export default function BpmnConnectSnapping(eventBus, rules) { } if (is(target, 'bpmn:Task')) { - snapTargetMidOnCenter(event, target); + snapToTaskMid(event, target); } if (is(source, 'bpmn:BoundaryEvent') && target === source.host) { @@ -130,21 +131,15 @@ function snapInsideTarget(event, target, padding) { }); } -// snap to target mid if event position in center area -function snapTargetMidOnCenter(event, target) { +// snap to target mid if event in center +function snapToTaskMid(event, target) { + var targetMid = mid(target); - var isCenter = every(AXES, function(axis) { - var coordinate = event[axis], - matchingTargetDimension = getDimensionForAxis(axis, target); - - return coordinate > target[axis] + TARGET_CENTER_PADDING - && coordinate < target[axis] + matchingTargetDimension - TARGET_CENTER_PADDING; + AXES.forEach(function(axis) { + if (isCenter(event, target, axis)) { + setSnapped(event, axis, targetMid[ axis ]); + } }); - - if (isCenter) { - snapToPosition(event, mid(target)); - } - } // snap outside of Boundary Event surroundings @@ -200,8 +195,13 @@ function getDimensionForAxis(axis, element) { function getTargetBoundsPadding(target) { if (is(target, 'bpmn:Task')) { - return 10; + return TASK_BOUNDS_PADDING; } else { return TARGET_BOUNDS_PADDING; } } + +function isCenter(event, target, axis) { + return event[ axis ] > target[ axis ] + TARGET_CENTER_PADDING + && event[ axis ] < target[ axis ] + getDimensionForAxis(axis, target) - TARGET_CENTER_PADDING; +} diff --git a/test/spec/features/snapping/BpmnConnectSnapping.bpmn b/test/spec/features/snapping/BpmnConnectSnapping.bpmn index ffdb2a66..ab926ec3 100644 --- a/test/spec/features/snapping/BpmnConnectSnapping.bpmn +++ b/test/spec/features/snapping/BpmnConnectSnapping.bpmn @@ -1,19 +1,20 @@ - + + - - + + @@ -24,6 +25,10 @@ + + + + @@ -65,6 +70,15 @@ + + + + + + + + + diff --git a/test/spec/features/snapping/BpmnConnectSnappingSpec.js b/test/spec/features/snapping/BpmnConnectSnappingSpec.js index c9034166..8aaa72b8 100644 --- a/test/spec/features/snapping/BpmnConnectSnappingSpec.js +++ b/test/spec/features/snapping/BpmnConnectSnappingSpec.js @@ -148,23 +148,23 @@ describe('features/snapping - BpmnConnectSnapping', function() { inject(function(connect, dragging, elementRegistry) { // given - var startEvent = elementRegistry.get('StartEvent_1'), - task = elementRegistry.get('Task_1'), + var startEvent = elementRegistry.get('StartEvent_2'), + task = elementRegistry.get('Task_3'), taskGfx = elementRegistry.getGraphics(task); // when - connect.start(canvasEvent({ x: 210, y: 60 }), startEvent); + connect.start(canvasEvent({ x: 130, y: 850 }), startEvent); dragging.hover({ element: task, gfx: taskGfx }); - dragging.move(canvasEvent({ x: 300, y: 300 })); + dragging.move(canvasEvent({ x: 171, y: 893 })); dragging.end(); // then var waypoints = startEvent.outgoing[0].waypoints; - expect(waypoints[3].y).to.eql(300); + expect(waypoints[waypoints.length-1].y).to.eql(895); }) ); @@ -355,4 +355,4 @@ describe('features/snapping - BpmnConnectSnapping', function() { }); -}); \ No newline at end of file +});