diff --git a/CHANGELOG.md b/CHANGELOG.md index f4e80c5e..06611d05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ All notable changes to [bpmn-js](https://github.com/bpmn-io/bpmn-js) are documen ___Note:__ Yet to be released changes appear here._ +## 5.1.2 + +* `FIX`: account for label pasting in label behavior ([#1227](https://github.com/bpmn-io/bpmn-js/issues/1227)) + ## 5.1.1 * `FIX`: re-select only existing elements when dragging is finished ([#1225](https://github.com/bpmn-io/bpmn-js/issues/1225)) diff --git a/lib/features/modeling/behavior/LabelBehavior.js b/lib/features/modeling/behavior/LabelBehavior.js index 63dff55a..589fd8df 100644 --- a/lib/features/modeling/behavior/LabelBehavior.js +++ b/lib/features/modeling/behavior/LabelBehavior.js @@ -212,7 +212,12 @@ export default function LabelBehavior( var label = event.context.connection.label, labelAdjustment; - if (!label) { + // handle missing label as well as the case + // that the label parent does not exist (yet), + // because it is being pasted / created via multi element create + // + // Cf. https://github.com/bpmn-io/bpmn-js/pull/1227 + if (!label || !label.parent) { return; } @@ -386,4 +391,4 @@ function getNearestLine(point, lines) { var sorted = sortBy(distances, 'distance'); return sorted[0].line; -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index b706a86f..c2ecc2f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bpmn-js", - "version": "5.1.1", + "version": "5.1.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 847a5437..86c8939d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bpmn-js", - "version": "5.1.1", + "version": "5.1.2", "description": "A bpmn 2.0 toolkit and web modeler", "scripts": { "all": "run-s lint test distro test:distro", diff --git a/test/spec/features/modeling/behavior/LabelBehavior.copyPaste.bpmn b/test/spec/features/modeling/behavior/LabelBehavior.copyPaste.bpmn new file mode 100644 index 00000000..c77d4e29 --- /dev/null +++ b/test/spec/features/modeling/behavior/LabelBehavior.copyPaste.bpmn @@ -0,0 +1,31 @@ + + + + + SequenceFlow + + + SequenceFlow + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/spec/features/modeling/behavior/LabelBehaviorSpec.js b/test/spec/features/modeling/behavior/LabelBehaviorSpec.js index 21a5f767..9d43b448 100644 --- a/test/spec/features/modeling/behavior/LabelBehaviorSpec.js +++ b/test/spec/features/modeling/behavior/LabelBehaviorSpec.js @@ -15,15 +15,19 @@ import { import modelingModule from 'lib/features/modeling'; import coreModule from 'lib/core'; +import gridSnappingModule from 'lib/features/grid-snapping'; describe('behavior - LabelBehavior', function() { var diagramXML = require('./LabelBehavior.bpmn'); - var testModules = [ modelingModule, coreModule ]; - - beforeEach(bootstrapModeler(diagramXML, { modules: testModules })); + beforeEach(bootstrapModeler(diagramXML, { + modules: [ + modelingModule, + coreModule + ] + })); describe('updating name property', function() { @@ -669,6 +673,59 @@ describe('behavior - LabelBehavior', function() { }); + +describe('behavior - LabelBehavior', function() { + + describe('copy/paste integration', function() { + + var diagramXML = require('./LabelBehavior.copyPaste.bpmn'); + + beforeEach(bootstrapModeler(diagramXML, { + modules: [ + modelingModule, + coreModule, + gridSnappingModule + ] + })); + + + it('should skip adjustment during creation', inject( + function(elementRegistry, copyPaste, canvas, dragging) { + + // given + var elements = [ + elementRegistry.get('Source'), + elementRegistry.get('Target'), + elementRegistry.get('SequenceFlow'), + elementRegistry.get('SequenceFlow').label + ]; + + var rootElement = canvas.getRootElement(); + + copyPaste.copy(elements); + + // when + var pastedElements = copyPaste.paste({ + element: rootElement, + point: { + x: 700, + y: 300 + } + }); + + var label = pastedElements[3]; + + // then + expect(label).to.exist; + + expect(label).to.have.position({ x: 681, y: 287 }); + } + )); + + }); + +}); + // helpers ////////// function getBounds(element) {