86 lines
2.2 KiB
JavaScript
86 lines
2.2 KiB
JavaScript
import inherits from 'inherits';
|
|
|
|
import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';
|
|
|
|
import { is } from '../../../util/ModelUtil';
|
|
|
|
export default function EventBasedGatewayBehavior(eventBus, modeling) {
|
|
|
|
CommandInterceptor.call(this, eventBus);
|
|
|
|
/**
|
|
* Remove existing sequence flows of event-based target before connecting
|
|
* from event-based gateway.
|
|
*/
|
|
this.preExecuted('connection.create', function(event) {
|
|
|
|
var context = event.context,
|
|
source = context.source,
|
|
target = context.target,
|
|
existingIncomingConnections = target.incoming.slice();
|
|
|
|
if (context.hints && context.hints.createElementsBehavior === false) {
|
|
return;
|
|
}
|
|
|
|
if (
|
|
is(source, 'bpmn:EventBasedGateway') &&
|
|
target.incoming.length
|
|
) {
|
|
|
|
existingIncomingConnections.filter(isSequenceFlow)
|
|
.forEach(function(sequenceFlow) {
|
|
modeling.removeConnection(sequenceFlow);
|
|
});
|
|
}
|
|
});
|
|
|
|
/**
|
|
* After replacing shape with event-based gateway, remove incoming sequence
|
|
* flows of event-based targets which do not belong to event-based gateway
|
|
* source.
|
|
*/
|
|
this.preExecuted('shape.replace', function(event) {
|
|
|
|
var newShape = event.context.newShape,
|
|
newShapeTargets,
|
|
newShapeTargetsIncomingSequenceFlows;
|
|
|
|
if (!is(newShape, 'bpmn:EventBasedGateway')) {
|
|
return;
|
|
}
|
|
|
|
newShapeTargets = newShape.outgoing.filter(isSequenceFlow)
|
|
.map(function(sequenceFlow) {
|
|
return sequenceFlow.target;
|
|
});
|
|
|
|
newShapeTargetsIncomingSequenceFlows = newShapeTargets.reduce(function(sequenceFlows, target) {
|
|
var incomingSequenceFlows = target.incoming.filter(isSequenceFlow);
|
|
|
|
return sequenceFlows.concat(incomingSequenceFlows);
|
|
}, []);
|
|
|
|
newShapeTargetsIncomingSequenceFlows.forEach(function(sequenceFlow) {
|
|
if (sequenceFlow.source !== newShape) {
|
|
modeling.removeConnection(sequenceFlow);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
EventBasedGatewayBehavior.$inject = [
|
|
'eventBus',
|
|
'modeling'
|
|
];
|
|
|
|
inherits(EventBasedGatewayBehavior, CommandInterceptor);
|
|
|
|
|
|
|
|
// helpers //////////////////////
|
|
|
|
function isSequenceFlow(connection) {
|
|
return is(connection, 'bpmn:SequenceFlow');
|
|
}
|