You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.3 KiB
94 lines
2.3 KiB
3 years ago
|
import inherits from 'inherits-browser';
|
||
|
|
||
|
import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';
|
||
|
|
||
|
import {
|
||
|
getBusinessObject,
|
||
|
is
|
||
|
} from '../../../util/ModelUtil';
|
||
|
|
||
|
import { isLabel } from '../../../util/LabelUtil';
|
||
|
|
||
|
var LOW_PRIORITY = 500;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Replace boundary event with intermediate event when creating or moving results in detached event.
|
||
|
*/
|
||
|
export default function DetachEventBehavior(bpmnReplace, injector) {
|
||
|
injector.invoke(CommandInterceptor, this);
|
||
|
|
||
|
this._bpmnReplace = bpmnReplace;
|
||
|
|
||
|
var self = this;
|
||
|
|
||
|
this.postExecuted('elements.create', LOW_PRIORITY, function(context) {
|
||
|
var elements = context.elements;
|
||
|
|
||
|
elements.filter(function(shape) {
|
||
|
var host = shape.host;
|
||
|
|
||
|
return shouldReplace(shape, host);
|
||
|
}).map(function(shape) {
|
||
|
return elements.indexOf(shape);
|
||
|
}).forEach(function(index) {
|
||
|
context.elements[ index ] = self.replaceShape(elements[ index ]);
|
||
|
});
|
||
|
}, true);
|
||
|
|
||
|
this.preExecute('elements.move', LOW_PRIORITY, function(context) {
|
||
|
var shapes = context.shapes,
|
||
|
newHost = context.newHost;
|
||
|
|
||
|
shapes.forEach(function(shape, index) {
|
||
|
var host = shape.host;
|
||
|
|
||
|
if (shouldReplace(shape, includes(shapes, host) ? host : newHost)) {
|
||
|
shapes[ index ] = self.replaceShape(shape);
|
||
|
}
|
||
|
});
|
||
|
}, true);
|
||
|
}
|
||
|
|
||
|
DetachEventBehavior.$inject = [
|
||
|
'bpmnReplace',
|
||
|
'injector'
|
||
|
];
|
||
|
|
||
|
inherits(DetachEventBehavior, CommandInterceptor);
|
||
|
|
||
|
DetachEventBehavior.prototype.replaceShape = function(shape) {
|
||
|
var eventDefinition = getEventDefinition(shape),
|
||
|
intermediateEvent;
|
||
|
|
||
|
if (eventDefinition) {
|
||
|
intermediateEvent = {
|
||
|
type: 'bpmn:IntermediateCatchEvent',
|
||
|
eventDefinitionType: eventDefinition.$type
|
||
|
};
|
||
|
} else {
|
||
|
intermediateEvent = {
|
||
|
type: 'bpmn:IntermediateThrowEvent'
|
||
|
};
|
||
|
}
|
||
|
|
||
|
return this._bpmnReplace.replaceElement(shape, intermediateEvent, { layoutConnection: false });
|
||
|
};
|
||
|
|
||
|
|
||
|
// helpers //////////
|
||
|
|
||
|
function getEventDefinition(element) {
|
||
|
var businessObject = getBusinessObject(element),
|
||
|
eventDefinitions = businessObject.eventDefinitions;
|
||
|
|
||
|
return eventDefinitions && eventDefinitions[0];
|
||
|
}
|
||
|
|
||
|
function shouldReplace(shape, host) {
|
||
|
return !isLabel(shape) && is(shape, 'bpmn:BoundaryEvent') && !host;
|
||
|
}
|
||
|
|
||
|
function includes(array, item) {
|
||
|
return array.indexOf(item) !== -1;
|
||
|
}
|