From e0252f64385ac246ef6bc43526d4b7f7bbda89e0 Mon Sep 17 00:00:00 2001 From: Beatriz Mendes Date: Wed, 25 Jan 2023 09:27:24 +0100 Subject: [PATCH] chore(create-append-anything): move rules to dedicated module --- .../create-append-anything/AppendRules.js | 71 ++++++++++++++++ lib/features/create-append-anything/index.js | 7 +- lib/features/rules/BpmnRules.js | 31 ------- .../create-append-anything/AppendRulesSpec.js | 82 +++++++++++++++++++ test/spec/features/rules/BpmnRulesSpec.js | 69 ---------------- 5 files changed, 158 insertions(+), 102 deletions(-) create mode 100644 lib/features/create-append-anything/AppendRules.js create mode 100644 test/spec/features/create-append-anything/AppendRulesSpec.js diff --git a/lib/features/create-append-anything/AppendRules.js b/lib/features/create-append-anything/AppendRules.js new file mode 100644 index 0000000000..4afec66a4f --- /dev/null +++ b/lib/features/create-append-anything/AppendRules.js @@ -0,0 +1,71 @@ +import { + find, +} from 'min-dash'; + +import inherits from 'inherits-browser'; + +import { + is, + getBusinessObject +} from '../../util/ModelUtil'; + +import { + isAny +} from '../modeling/util/ModelingUtil'; + +import RuleProvider from 'diagram-js/lib/features/rules/RuleProvider'; + + +/** + * Append anything modeling rules + */ +export default function AppendRules(eventBus) { + RuleProvider.call(this, eventBus); +} + +inherits(AppendRules, RuleProvider); + +AppendRules.$inject = [ + 'eventBus' +]; + +AppendRules.prototype.init = function() { + this.addRule('shape.append', function(context) { + + var source = context.element; + + const businessObject = getBusinessObject(source); + + if (isAny(source, [ + 'bpmn:EndEvent', + 'bpmn:Group', + 'bpmn:TextAnnotation', + 'bpmn:SequenceFlow', + 'bpmn:Lane', + 'bpmn:Participant', + 'bpmn:DataStoreReference', + 'bpmn:DataObjectReference' + ])) { + return false; + } + + if (is(source, 'bpmn:IntermediateThrowEvent') && hasEventDefinition(source, 'bpmn:LinkEventDefinition')) { + return false; + } + + if (is(source, 'bpmn:SubProcess') && businessObject.triggeredByEvent) { + return false; + } + }); + +}; + + +// helpers ////////////// +function hasEventDefinition(element, eventDefinition) { + var bo = getBusinessObject(element); + + return !!find(bo.eventDefinitions || [], function(definition) { + return is(definition, eventDefinition); + }); +} \ No newline at end of file diff --git a/lib/features/create-append-anything/index.js b/lib/features/create-append-anything/index.js index 547afcbafa..3704c46614 100644 --- a/lib/features/create-append-anything/index.js +++ b/lib/features/create-append-anything/index.js @@ -9,6 +9,7 @@ import CreateAppendEditorActions from './CreateAppendEditorActions'; import CreateAppendKeyboardBindings from './CreateAppendKeyboardBindings'; import AppendMenuProvider from './AppendMenuProvider'; import AppendContextPadProvider from './AppendContextPadProvider'; +import AppendRules from './AppendRules'; export default { __depends__: [ @@ -23,12 +24,14 @@ export default { 'createAppendEditorActions', 'createAppendKeyboardBindings', 'appendMenuProvider', - 'appendContextPadProvider' + 'appendContextPadProvider', + 'appendRules' ], createMenuProvider: [ 'type', CreateMenuProvider ], createPaletteProvider: [ 'type', CreatePaletteProvider ], createAppendEditorActions: [ 'type', CreateAppendEditorActions ], createAppendKeyboardBindings: [ 'type', CreateAppendKeyboardBindings ], appendMenuProvider: [ 'type', AppendMenuProvider ], - appendContextPadProvider: [ 'type', AppendContextPadProvider ] + appendContextPadProvider: [ 'type', AppendContextPadProvider ], + appendRules: [ 'type', AppendRules ] }; diff --git a/lib/features/rules/BpmnRules.js b/lib/features/rules/BpmnRules.js index 50578dd474..6b252bdd0c 100644 --- a/lib/features/rules/BpmnRules.js +++ b/lib/features/rules/BpmnRules.js @@ -169,11 +169,6 @@ BpmnRules.prototype.init = function() { return canCopy(elements, element); }); - - this.addRule('shape.append', function(context) { - var element = context.element; - return canAppend(element); - }); }; BpmnRules.prototype.canConnectMessageFlow = canConnectMessageFlow; @@ -806,32 +801,6 @@ function canResize(shape, newBounds) { return false; } -function canAppend(source) { - - const businessObject = getBusinessObject(source); - - if (isAny(source, [ - 'bpmn:EndEvent', - 'bpmn:Group', - 'bpmn:TextAnnotation', - 'bpmn:SequenceFlow', - 'bpmn:Lane', - 'bpmn:Participant', - 'bpmn:DataStoreReference', - 'bpmn:DataObjectReference' - ])) { - return false; - } - - if (is(source, 'bpmn:IntermediateThrowEvent') && hasEventDefinition(source, 'bpmn:LinkEventDefinition')) { - return false; - } - - if (is(source, 'bpmn:SubProcess') && businessObject.triggeredByEvent) { - return false; - } -} - /** * Check, whether one side of the relationship * is a text annotation. diff --git a/test/spec/features/create-append-anything/AppendRulesSpec.js b/test/spec/features/create-append-anything/AppendRulesSpec.js new file mode 100644 index 0000000000..c99c4e9782 --- /dev/null +++ b/test/spec/features/create-append-anything/AppendRulesSpec.js @@ -0,0 +1,82 @@ +import { + bootstrapModeler, + inject +} from 'test/TestHelper'; + +import createAppendAnything from 'lib/features/create-append-anything'; +import modelingModule from 'lib/features/modeling'; +import coreModule from 'lib/core'; +import rulesModule from 'diagram-js/lib/features/rules'; + + +describe('features/create-append-anything - rules', function() { + + var testModules = [ modelingModule, coreModule, rulesModule, createAppendAnything ]; + + var testXML = require('./AppendMenuProvider.bpmn'); + + beforeEach(bootstrapModeler(testXML, { modules: testModules })); + + + describe('element append', function() { + + it('should not allow for given element types', inject(function(elementFactory, rules) { + + // given + var types = [ + 'bpmn:EndEvent', + 'bpmn:Group', + 'bpmn:TextAnnotation', + 'bpmn:SequenceFlow', + 'bpmn:Lane', + 'bpmn:Participant', + 'bpmn:DataStoreReference', + 'bpmn:DataObjectReference' + ]; + + // when + + var results = types.map(function(type) { + var element = elementFactory.createShape({ type: type }); + return rules.allowed('shape.append', { element }); + }); + + // then + results.forEach(function(result) { + expect(result).to.be.false; + }); + })); + + + it('should not allow for event subprocess', inject(function(elementFactory, rules) { + + // given + var element = elementFactory.createShape({ type: 'bpmn:SubProcess', triggeredByEvent: true }); + + // when + var result = rules.allowed('shape.append', { element }); + + // then + expect(result).to.be.false; + })); + + + it('should not allow for link intermediate throw event', inject(function(elementFactory, rules) { + + // given + var element = elementFactory.createShape({ + type: 'bpmn:IntermediateThrowEvent', + cancelActivity: false, + eventDefinitionType: 'bpmn:LinkEventDefinition' + }); + + // when + var result = rules.allowed('shape.append', { element }); + + // then + expect(result).to.be.false; + })); + + }); + +}); \ No newline at end of file diff --git a/test/spec/features/rules/BpmnRulesSpec.js b/test/spec/features/rules/BpmnRulesSpec.js index 50359ed846..90c2f3e145 100644 --- a/test/spec/features/rules/BpmnRulesSpec.js +++ b/test/spec/features/rules/BpmnRulesSpec.js @@ -2181,73 +2181,4 @@ describe('features/modeling/rules - BpmnRules', function() { }); - - describe('element append', function() { - - var testXML = require('../../../fixtures/bpmn/simple.bpmn'); - - beforeEach(bootstrapModeler(testXML, { modules: testModules })); - - - it('should not allow for given element types', inject(function(elementFactory, rules) { - - // given - var types = [ - 'bpmn:EndEvent', - 'bpmn:Group', - 'bpmn:TextAnnotation', - 'bpmn:SequenceFlow', - 'bpmn:Lane', - 'bpmn:Participant', - 'bpmn:DataStoreReference', - 'bpmn:DataObjectReference' - ]; - - // when - - var results = types.map(function(type) { - var element = elementFactory.createShape({ type: type }); - return rules.allowed('shape.append', { element }); - }); - - // then - results.forEach(function(result) { - expect(result).to.be.false; - }); - })); - - - it('should not allow for event subprocess', inject(function(elementFactory, rules) { - - // given - var element = elementFactory.createShape({ type: 'bpmn:SubProcess', triggeredByEvent: true }); - - // when - - var result = rules.allowed('shape.append', { element }); - - // then - expect(result).to.be.false; - })); - - - it('should not allow for link intermediate throw event', inject(function(elementFactory, rules) { - - // given - var element = elementFactory.createShape({ - type: 'bpmn:IntermediateThrowEvent', - cancelActivity: false, - eventDefinitionType: 'bpmn:LinkEventDefinition' - }); - - // when - - var result = rules.allowed('shape.append', { element }); - - // then - expect(result).to.be.false; - })); - - }); - });