94 lines
2.3 KiB
JavaScript
94 lines
2.3 KiB
JavaScript
import inherits from 'inherits';
|
|
|
|
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;
|
|
} |