diff --git a/CHANGELOG.md b/CHANGELOG.md index e23182d9..29bdfe19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ All notable changes to [bpmn-js](https://github.com/bpmn-io/bpmn-js) are documen ___Note:__ Yet to be released changes appear here._ +* `FEAT`: disallow typed start events inside non-event based sub processes ([#831](https://github.com/bpmn-io/bpmn-js/issues/831)) + ## 7.2.1 * `FIX`: disallow boundary events as message flow targets ([#1300](https://github.com/bpmn-io/bpmn-js/issues/1300)) diff --git a/lib/features/rules/BpmnRules.js b/lib/features/rules/BpmnRules.js index cf323041..a15966d0 100644 --- a/lib/features/rules/BpmnRules.js +++ b/lib/features/rules/BpmnRules.js @@ -676,6 +676,22 @@ function canReplace(elements, target, position) { newElementType: 'bpmn:StartEvent' }); } + + // replace a typed start event by a blank interrupting start event + // when the target is a sub process but not an event sub process + if (hasOneOfEventDefinitions(element, + [ + 'bpmn:MessageEventDefinition', + 'bpmn:TimerEventDefinition', + 'bpmn:SignalEventDefinition', + 'bpmn:ConditionalEventDefinition' + ]) && + is(target, 'bpmn:SubProcess')) { + canExecute.replacements.push({ + oldElementId: element.id, + newElementType: 'bpmn:StartEvent' + }); + } } } diff --git a/test/fixtures/bpmn/features/replace/01_replace.bpmn b/test/fixtures/bpmn/features/replace/01_replace.bpmn index 02dd2130..113bfbe0 100644 --- a/test/fixtures/bpmn/features/replace/01_replace.bpmn +++ b/test/fixtures/bpmn/features/replace/01_replace.bpmn @@ -1,5 +1,5 @@ - + SequenceFlow_1 @@ -61,137 +61,157 @@ + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + diff --git a/test/spec/features/replace/BpmnReplaceSpec.js b/test/spec/features/replace/BpmnReplaceSpec.js index 143ce65d..f00ee2f3 100644 --- a/test/spec/features/replace/BpmnReplaceSpec.js +++ b/test/spec/features/replace/BpmnReplaceSpec.js @@ -1058,6 +1058,44 @@ describe('features/replace - bpmn replace', function() { expect(is(newElement, 'bpmn:CallActivity')).to.be.true; })); + it('should drop event type from start event after moving it into sub process', + inject(function(bpmnReplace, elementRegistry, modeling) { + + // given + var startEvent = elementRegistry.get('StartEvent_4'), + subProcess = elementRegistry.get('SubProcess_2'); + + // when + modeling.moveElements([startEvent], { x: 100, y: 0 }, subProcess); + + var startEventAfter = elementRegistry.filter(function(element) { + return is(element, 'bpmn:StartEvent') && element.parent === subProcess; + })[0]; + + // then + expect(startEventAfter.businessObject.eventDefinitions).to.be.undefined; + }) + ); + + it('should not drop event type from start event after moving it into event sub process', + inject(function(bpmnReplace, elementRegistry, modeling) { + + // given + var startEvent = elementRegistry.get('StartEvent_5'), + subProcess = elementRegistry.get('EventSubProcess_2'); + + // when + modeling.moveElements([startEvent], { x: -100, y: 0 }, subProcess); + + var startEventAfter = elementRegistry.filter(function(element) { + return is(element, 'bpmn:StartEvent') && element.parent === subProcess; + })[0]; + + // then + expect(startEventAfter.businessObject.eventDefinitions[0].$type).to.equal('bpmn:MessageEventDefinition'); + }) + ); + });