From 9e37037ac6e8eccf3426831a2e415cc654eeb966 Mon Sep 17 00:00:00 2001 From: Nico Rehwaldt Date: Fri, 28 Nov 2014 11:38:06 +0100 Subject: [PATCH] fix(move): adjust positioning of all attached labels --- lib/features/modeling/LabelSupport.js | 19 +- test/fixtures/bpmn/simple.bpmn | 20 +- test/spec/features/modeling/MoveShapeSpec.js | 207 +++++++++++-------- test/spec/import/ImporterSpec.js | 20 +- 4 files changed, 160 insertions(+), 106 deletions(-) diff --git a/lib/features/modeling/LabelSupport.js b/lib/features/modeling/LabelSupport.js index 4e7a341b..59116257 100644 --- a/lib/features/modeling/LabelSupport.js +++ b/lib/features/modeling/LabelSupport.js @@ -59,14 +59,21 @@ function LabelSupport(eventBus, modeling, bpmnFactory) { // move labels with shapes eventBus.on([ - 'commandStack.shape.move.postExecute' + 'commandStack.shapes.move.postExecute' ], function(e) { - var context = e.context, - shape = context.shape; - if (shape.label && context.hints.layout !== false) { - modeling.moveShape(shape.label, context.delta); - } + var context = e.context, + closure = context.closure, + enclosedElements = closure.enclosedElements; + + // ensure we move all labels with their respective elements + // if they have not been moved already + + _.forEach(enclosedElements, function(e) { + if (e.label && !enclosedElements[e.label.id]) { + modeling.moveShape(e.label, context.delta, e.parent); + } + }); }); diff --git a/test/fixtures/bpmn/simple.bpmn b/test/fixtures/bpmn/simple.bpmn index 621a50df..f9ec5d4e 100644 --- a/test/fixtures/bpmn/simple.bpmn +++ b/test/fixtures/bpmn/simple.bpmn @@ -1,7 +1,8 @@ - + + SequenceFlow_3 SequenceFlow_2 SequenceFlow_1 @@ -15,6 +16,10 @@ SequenceFlow_2 + + SequenceFlow_3 + + @@ -38,6 +43,19 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/spec/features/modeling/MoveShapeSpec.js b/test/spec/features/modeling/MoveShapeSpec.js index 7503b9ae..419d1582 100644 --- a/test/spec/features/modeling/MoveShapeSpec.js +++ b/test/spec/features/modeling/MoveShapeSpec.js @@ -107,7 +107,110 @@ describe('features/modeling - move shape', function() { })); - it('should move label with element', inject(function(elementRegistry, modeling) { + describe('undo support', function() { + + it('should undo', inject(function(elementRegistry, commandStack, modeling) { + + // given + var startEventElement = elementRegistry.get('StartEvent_1'), + startEvent = startEventElement.businessObject; + + var oldPosition = { + x: startEventElement.x, + y: startEventElement.y + }; + + modeling.moveShape(startEventElement, { x: 0, y: 50 }); + + // when + commandStack.undo(); + + // then + expect(startEvent.di.bounds.x).toBe(oldPosition.x); + expect(startEvent.di.bounds.y).toBe(oldPosition.y); + })); + + + it('should undo on label', inject(function(elementRegistry, commandStack, modeling) { + + // given + var labelElement = elementRegistry.get('StartEvent_1_label'), + startEvent = labelElement.businessObject; + + var oldPosition = { + x: labelElement.x, + y: labelElement.y + }; + + modeling.moveShape(labelElement, { x: 0, y: 50 }); + + // when + commandStack.undo(); + + // then + expect(startEvent.di.label.bounds.x).toBe(oldPosition.x); + expect(startEvent.di.label.bounds.y).toBe(oldPosition.y); + })); + + }); + + + describe('redo support', function() { + + it('should redo', inject(function(elementRegistry, commandStack, modeling) { + + // given + var startEventElement = elementRegistry.get('StartEvent_1'), + startEvent = startEventElement.businessObject; + + + modeling.moveShape(startEventElement, { x: 0, y: 50 }); + + var newPosition = { + x: startEventElement.x, + y: startEventElement.y + }; + + // when + commandStack.undo(); + commandStack.redo(); + + // then + expect(startEvent.di.bounds.x).toBe(newPosition.x); + expect(startEvent.di.bounds.y).toBe(newPosition.y); + })); + + + it('should redo on label', inject(function(elementRegistry, commandStack, modeling) { + + // given + var labelElement = elementRegistry.get('StartEvent_1_label'), + startEvent = labelElement.businessObject; + + modeling.moveShape(labelElement, { x: 0, y: 50 }); + + var newPosition = { + x: labelElement.x, + y: labelElement.y + }; + + // when + commandStack.undo(); + commandStack.redo(); + + // then + expect(startEvent.di.label.bounds.x).toBe(newPosition.x); + expect(startEvent.di.label.bounds.y).toBe(newPosition.y); + })); + + }); + + }); + + + describe('label suport', function() { + + it('should move label with shape', inject(function(elementRegistry, modeling) { // given var startEventElement = elementRegistry.get('StartEvent_1'), @@ -121,110 +224,34 @@ describe('features/modeling - move shape', function() { }; // when - modeling.moveShape(startEventElement, { x: 40, y: -80 }); + modeling.moveShapes([ startEventElement ], { x: 40, y: -80 }); // then expect(label.x).toBe(labelPosition.x + 40); expect(label.y).toBe(labelPosition.y - 80); })); - }); - - describe('undo support', function() { - - it('should undo', inject(function(elementRegistry, commandStack, modeling) { + it('should move label with connection', inject(function(elementRegistry, modeling) { // given - var startEventElement = elementRegistry.get('StartEvent_1'), - startEvent = startEventElement.businessObject; + var startEventElement = elementRegistry.get('StartEvent_2'), + startEvent = startEventElement.businessObject, + subProcessElement = elementRegistry.get('SubProcess_1'), + subProcess = startEventElement.businessObject, + flowLabel = elementRegistry.get('SequenceFlow_3_label'); - var oldPosition = { - x: startEventElement.x, - y: startEventElement.y - }; - - modeling.moveShape(startEventElement, { x: 0, y: 50 }); - - // when - commandStack.undo(); - - // then - expect(startEvent.di.bounds.x).toBe(oldPosition.x); - expect(startEvent.di.bounds.y).toBe(oldPosition.y); - })); - - - it('should undo on label', inject(function(elementRegistry, commandStack, modeling) { - - // given - var labelElement = elementRegistry.get('StartEvent_1_label'), - startEvent = labelElement.businessObject; - - var oldPosition = { - x: labelElement.x, - y: labelElement.y - }; - - modeling.moveShape(labelElement, { x: 0, y: 50 }); - - // when - commandStack.undo(); - - // then - expect(startEvent.di.label.bounds.x).toBe(oldPosition.x); - expect(startEvent.di.label.bounds.y).toBe(oldPosition.y); - })); - - }); - - - describe('redo support', function() { - - it('should redo', inject(function(elementRegistry, commandStack, modeling) { - - // given - var startEventElement = elementRegistry.get('StartEvent_1'), - startEvent = startEventElement.businessObject; - - - modeling.moveShape(startEventElement, { x: 0, y: 50 }); - - var newPosition = { - x: startEventElement.x, - y: startEventElement.y + var labelPosition = { + x: flowLabel.x, + y: flowLabel.y }; // when - commandStack.undo(); - commandStack.redo(); + modeling.moveShapes([ startEventElement, subProcessElement ], { x: 40, y: -80 }); // then - expect(startEvent.di.bounds.x).toBe(newPosition.x); - expect(startEvent.di.bounds.y).toBe(newPosition.y); - })); - - - it('should redo on label', inject(function(elementRegistry, commandStack, modeling) { - - // given - var labelElement = elementRegistry.get('StartEvent_1_label'), - startEvent = labelElement.businessObject; - - modeling.moveShape(labelElement, { x: 0, y: 50 }); - - var newPosition = { - x: labelElement.x, - y: labelElement.y - }; - - // when - commandStack.undo(); - commandStack.redo(); - - // then - expect(startEvent.di.label.bounds.x).toBe(newPosition.x); - expect(startEvent.di.label.bounds.y).toBe(newPosition.y); + expect(flowLabel.x).toBe(labelPosition.x + 40); + expect(flowLabel.y).toBe(labelPosition.y - 80); })); }); diff --git a/test/spec/import/ImporterSpec.js b/test/spec/import/ImporterSpec.js index f261917c..b10a58e8 100644 --- a/test/spec/import/ImporterSpec.js +++ b/test/spec/import/ImporterSpec.js @@ -70,7 +70,7 @@ describe('import - importer', function() { runImport(diagram, xml, function(err, warnings) { // then - expect(eventCount).toEqual(7); + expect(eventCount).toEqual(9); done(err); }); @@ -81,7 +81,7 @@ describe('import - importer', function() { describe('basics', function() { - it('should import process', function(done) { + it('should import simple process', function(done) { // given var xml = fs.readFileSync('test/fixtures/bpmn/simple.bpmn', 'utf8'); @@ -103,13 +103,15 @@ describe('import - importer', function() { // then expect(events).toEqual([ - { type: 'add', semantic: 'Process_1', di: 'BPMNPlane_1', diagramElement: 'Process_1' }, - { type: 'add', semantic: 'SubProcess_1', di: '_BPMNShape_SubProcess_2', diagramElement: 'SubProcess_1' }, - { type: 'add', semantic: 'StartEvent_1', di: '_BPMNShape_StartEvent_2', diagramElement: 'StartEvent_1' }, - { type: 'add', semantic: 'Task_1', di: '_BPMNShape_Task_2', diagramElement: 'Task_1' }, - { type: 'add', semantic: 'EndEvent_1', di: '_BPMNShape_EndEvent_2', diagramElement: 'EndEvent_1' }, - { type: 'add', semantic: 'SequenceFlow_1', di: 'BPMNEdge_SequenceFlow_1', diagramElement: 'SequenceFlow_1' }, - { type: 'add', semantic: 'SequenceFlow_2', di: 'BPMNEdge_SequenceFlow_2', diagramElement: 'SequenceFlow_2' } + { type: 'add', semantic: 'Process_1', di: 'BPMNPlane_1', diagramElement: 'Process_1' }, + { type: 'add', semantic: 'SubProcess_1', di: '_BPMNShape_SubProcess_2', diagramElement: 'SubProcess_1' }, + { type: 'add', semantic: 'StartEvent_1', di: '_BPMNShape_StartEvent_2', diagramElement: 'StartEvent_1' }, + { type: 'add', semantic: 'Task_1', di: '_BPMNShape_Task_2', diagramElement: 'Task_1' }, + { type: 'add', semantic: 'EndEvent_1', di: '_BPMNShape_EndEvent_2', diagramElement: 'EndEvent_1' }, + { type: 'add', semantic: 'StartEvent_2', di: '_BPMNShape_StartEvent_11', diagramElement: 'StartEvent_2' }, + { type: 'add', semantic: 'SequenceFlow_1', di: 'BPMNEdge_SequenceFlow_1', diagramElement: 'SequenceFlow_1' }, + { type: 'add', semantic: 'SequenceFlow_2', di: 'BPMNEdge_SequenceFlow_2', diagramElement: 'SequenceFlow_2' }, + { type: 'add', semantic: 'SequenceFlow_3', di: 'BPMNEdge_SequenceFlow_3', diagramElement: 'SequenceFlow_3' } ]); done(err);