Skip to content

Commit

Permalink
chore(create-append-anything): move rules to dedicated module
Browse files Browse the repository at this point in the history
  • Loading branch information
smbea committed Jan 25, 2023
1 parent 089ed31 commit 76558cc
Show file tree
Hide file tree
Showing 5 changed files with 158 additions and 102 deletions.
71 changes: 71 additions & 0 deletions lib/features/create-append-anything/AppendRules.js
Original file line number Diff line number Diff line change
@@ -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);
});
}
7 changes: 5 additions & 2 deletions lib/features/create-append-anything/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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__: [
Expand All @@ -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 ]
};
31 changes: 0 additions & 31 deletions lib/features/rules/BpmnRules.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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.
Expand Down
82 changes: 82 additions & 0 deletions test/spec/features/create-append-anything/AppendRulesSpec.js
Original file line number Diff line number Diff line change
@@ -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;
}));

});

});
69 changes: 0 additions & 69 deletions test/spec/features/rules/BpmnRulesSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}));

});

});

0 comments on commit 76558cc

Please sign in to comment.