From b2b607f5582d3409c789d831a0896aaa55949899 Mon Sep 17 00:00:00 2001 From: Philipp Fromme Date: Fri, 29 Nov 2019 15:29:32 +0100 Subject: [PATCH] fix(adaptive-label-positioning): do not adjust on paste Related to camunda/camunda-modeler#1617 --- .../AdaptiveLabelPositioningBehavior.js | 34 ++++-- .../modeling/behavior/LabelBehavior.js | 5 +- ...aptiveLabelPositioningBehavior.basics.bpmn | 106 +++++++++++------- .../AdaptiveLabelPositioningBehaviorSpec.js | 104 ++++++++--------- .../modeling/behavior/LabelBehaviorSpec.js | 48 ++++++++ 5 files changed, 181 insertions(+), 116 deletions(-) diff --git a/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.js b/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.js index 035cb2a0..88df818c 100644 --- a/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.js +++ b/lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.js @@ -42,22 +42,29 @@ export default function AdaptiveLabelPositioningBehavior(eventBus, modeling) { 'connection.layout', 'connection.updateWaypoints' ], function(event) { - var context = event.context, - connection = context.connection; + connection = context.connection, + source = connection.source, + target = connection.target, + hints = context.hints || {}; - var source = connection.source, - target = connection.target; - - checkLabelAdjustment(source); - checkLabelAdjustment(target); + if (hints.createElementsBehavior !== false) { + checkLabelAdjustment(source); + checkLabelAdjustment(target); + } }); this.postExecuted([ 'label.create' ], function(event) { - checkLabelAdjustment(event.context.shape.labelTarget); + var context = event.context, + shape = context.shape, + hints = context.hints || {}; + + if (hints.createElementsBehavior !== false) { + checkLabelAdjustment(shape.labelTarget); + } }); @@ -65,11 +72,14 @@ export default function AdaptiveLabelPositioningBehavior(eventBus, modeling) { 'elements.create' ], function(event) { var context = event.context, - elements = context.elements; + elements = context.elements, + hints = context.hints || {}; - elements.forEach(function(element) { - checkLabelAdjustment(element); - }); + if (hints.createElementsBehavior !== false) { + elements.forEach(function(element) { + checkLabelAdjustment(element); + }); + } }); function checkLabelAdjustment(element) { diff --git a/lib/features/modeling/behavior/LabelBehavior.js b/lib/features/modeling/behavior/LabelBehavior.js index 589fd8df..99b405c6 100644 --- a/lib/features/modeling/behavior/LabelBehavior.js +++ b/lib/features/modeling/behavior/LabelBehavior.js @@ -12,7 +12,8 @@ import { import { isLabelExternal, getExternalLabelMid, - hasExternalLabel + hasExternalLabel, + isLabel } from '../../../util/LabelUtil'; import { @@ -110,7 +111,7 @@ export default function LabelBehavior( var element = context.shape || context.connection, businessObject = element.businessObject; - if (!isLabelExternal(element)) { + if (isLabel(element) || !isLabelExternal(element)) { return; } diff --git a/test/spec/features/modeling/behavior/AdaptiveLabelPositioningBehavior.basics.bpmn b/test/spec/features/modeling/behavior/AdaptiveLabelPositioningBehavior.basics.bpmn index 567a057f..6f07fb2a 100644 --- a/test/spec/features/modeling/behavior/AdaptiveLabelPositioningBehavior.basics.bpmn +++ b/test/spec/features/modeling/behavior/AdaptiveLabelPositioningBehavior.basics.bpmn @@ -1,5 +1,5 @@ - + @@ -38,116 +38,136 @@ SequenceFlow_0isa70k + + SequenceFlow_3 + + + SequenceFlow_3 + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - - - - + + + + - - - - + + + + - - - - - + + + + + - + - + - - - - + + + + + + + + + + + + + + + + + diff --git a/test/spec/features/modeling/behavior/AdaptiveLabelPositioningBehaviorSpec.js b/test/spec/features/modeling/behavior/AdaptiveLabelPositioningBehaviorSpec.js index 3a8ac1cb..a5d99b8a 100644 --- a/test/spec/features/modeling/behavior/AdaptiveLabelPositioningBehaviorSpec.js +++ b/test/spec/features/modeling/behavior/AdaptiveLabelPositioningBehaviorSpec.js @@ -1,3 +1,5 @@ +/* global sinon */ + import { bootstrapModeler, inject @@ -8,16 +10,13 @@ import { getOrientation } from 'diagram-js/lib/layout/LayoutUtil'; import modelingModule from 'lib/features/modeling'; import coreModule from 'lib/core'; -import { - DEFAULT_LABEL_SIZE, - getExternalLabelMid -} from 'lib/util/LabelUtil'; - var testModules = [ modelingModule, coreModule ]; +var spy = sinon.spy; + var ATTACH = { attach: true }; describe('modeling/behavior - AdaptiveLabelPositioningBehavior', function() { @@ -270,51 +269,6 @@ describe('modeling/behavior - AdaptiveLabelPositioningBehavior', function() { describe('on label creation', function() { - describe('through ', function() { - - it('should create at LEFT', inject(function(bpmnFactory, elementFactory, elementRegistry, modeling, textRenderer) { - - // given - var sequenceFlow = elementRegistry.get('SequenceFlow_1'); - - var intermediateThrowEvent = elementFactory.createShape({ - businessObject: bpmnFactory.create('bpmn:IntermediateThrowEvent', { - name: 'Foo' - }), - type: 'bpmn:IntermediateThrowEvent', - x: 0, - y: 0 - }); - - var externalLabelMid = getExternalLabelMid(intermediateThrowEvent); - - var externalLabelBounds = textRenderer.getExternalLabelBounds(DEFAULT_LABEL_SIZE, 'Foo'); - - var label = elementFactory.createLabel({ - labelTarget: intermediateThrowEvent, - x: externalLabelMid.x - externalLabelBounds.width / 2, - y: externalLabelMid.y - externalLabelBounds.height / 2, - width: externalLabelBounds.width, - height: externalLabelBounds.height - }); - - var sequenceFlowMid = getConnectionMid(sequenceFlow.waypoints[0], sequenceFlow.waypoints[1]); - - // when - modeling.createElements([ intermediateThrowEvent, label ], sequenceFlowMid, sequenceFlow, { - createElementsBehavior: false - }); - - // then - expect(label.x).to.be.closeTo(287, 1); - expect(label.y).to.be.closeTo(307, 1); - expect(label.width).to.be.closeTo(19, 1); - expect(label.height).to.be.closeTo(14, 1); - })); - - }); - - describe('through ', function() { it('should create label at TOP', inject( @@ -458,13 +412,45 @@ describe('modeling/behavior - AdaptiveLabelPositioningBehavior', function() { }); + + describe('integration', function() { + + describe('copy and paste', function() { + + var diagramXML = require('./AdaptiveLabelPositioningBehavior.basics.bpmn'); + + beforeEach(bootstrapModeler(diagramXML, { + modules: testModules + })); + + + it('should NOT adjust on paste', inject( + function(canvas, copyPaste, elementRegistry, modeling) { + + // given + var exclusiveGateway = elementRegistry.get('ExclusiveGateway_1'), + endEvent = elementRegistry.get('EndEvent_1'); + + var moveShapeSpy = spy(modeling, 'moveShape'); + + // when + copyPaste.copy([ exclusiveGateway, endEvent ]); + + copyPaste.paste({ + element: canvas.getRootElement(), + point: { + x: 1000, + y: 1000 + } + }); + + // then + expect(moveShapeSpy).not.to.have.been.called; + }) + ); + + }); + + }); + }); - -// helpers ////////// - -function getConnectionMid(a, b) { - return { - x: (a.x + b.x) / 2, - y: (a.y + b.y) / 2 - }; -} diff --git a/test/spec/features/modeling/behavior/LabelBehaviorSpec.js b/test/spec/features/modeling/behavior/LabelBehaviorSpec.js index 9d43b448..14a7fb80 100644 --- a/test/spec/features/modeling/behavior/LabelBehaviorSpec.js +++ b/test/spec/features/modeling/behavior/LabelBehaviorSpec.js @@ -9,6 +9,11 @@ import { resizeBounds } from 'diagram-js/lib/features/resize/ResizeUtil'; +import { + DEFAULT_LABEL_SIZE, + getExternalLabelMid +} from 'lib/util/LabelUtil'; + import { pick } from 'min-dash'; @@ -17,6 +22,8 @@ import modelingModule from 'lib/features/modeling'; import coreModule from 'lib/core'; import gridSnappingModule from 'lib/features/grid-snapping'; +var spy = sinon.spy; + describe('behavior - LabelBehavior', function() { @@ -196,6 +203,47 @@ describe('behavior - LabelBehavior', function() { )); + it('should not add label if created shape is label', inject( + function(bpmnFactory, elementFactory, elementRegistry, modeling, textRenderer) { + + // given + var parentShape = elementRegistry.get('Process_1'); + + var createLabelSpy = spy(modeling, 'createLabel'); + + var exclusiveGatewayBo = bpmnFactory.create('bpmn:ExclusiveGateway', { + name: 'Foo' + }); + + var exclusiveGateway = elementFactory.createShape({ + type: 'bpmn:ExclusiveGateway', + businessObject: exclusiveGatewayBo + }); + + modeling.createElements([ exclusiveGateway ], { x: 50, y: 50 }, parentShape, { + createElementsBehavior: false + }); + + var externalLabelMid = getExternalLabelMid(exclusiveGateway); + + var externalLabelBounds = textRenderer.getExternalLabelBounds(DEFAULT_LABEL_SIZE, 'Foo'); + + var label = elementFactory.createLabel({ + businessObject: exclusiveGatewayBo, + labelTarget: exclusiveGateway, + width: externalLabelBounds.width, + height: externalLabelBounds.height + }); + + // when + modeling.createElements([ label ], externalLabelMid, parentShape); + + // then + expect(createLabelSpy).not.to.have.been.called; + }) + ); + + describe('on append', function() { it('correctly wired and positioned', inject(