60 lines
2.5 KiB
JavaScript
60 lines
2.5 KiB
JavaScript
|
import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';
|
||
|
import { is } from 'bpmn-js/lib/util/ModelUtil';
|
||
|
import { findDataObjects } from './DataObjectHelpers';
|
||
|
var HIGH_PRIORITY = 1500;
|
||
|
|
||
|
/**
|
||
|
* This Command Interceptor functions like the BpmnUpdator in BPMN.js - It hooks into events
|
||
|
* from Diagram.js and updates the underlying BPMN model accordingly.
|
||
|
*
|
||
|
* This handles some special cases we want to handle for DataObjects and DataObjectReferences,
|
||
|
* for instance:
|
||
|
* 1) Use existing data objects if possible when creating a new reference (don't create new objects each time)
|
||
|
* 2) Don't automatically delete a data object when you delete the reference - unless all references are removed.
|
||
|
* 3) Update the name of the DataObjectReference to match the id of the DataObject.
|
||
|
* 4) Don't allow someone to move a DataObjectReference from one process to another process.
|
||
|
*/
|
||
|
export default class DataObjectInterceptor extends CommandInterceptor {
|
||
|
constructor(eventBus, bpmnFactory, bpmnUpdater) {
|
||
|
super(eventBus);
|
||
|
|
||
|
/**
|
||
|
* For DataObjectReferences only ...
|
||
|
* Prevent this from calling the CreateDataObjectBehavior in BPMN-js, as it will
|
||
|
* attempt to crete a dataObject immediately. We can't create the dataObject until
|
||
|
* we know where it is placed - as we want to reuse data objects of the parent when
|
||
|
* possible */
|
||
|
this.preExecute([ 'shape.create' ], HIGH_PRIORITY, function(event) {
|
||
|
const context = event.context, shape = context.shape;
|
||
|
if (is(shape, 'bpmn:DataObjectReference') && shape.type !== 'label') {
|
||
|
event.stopPropagation();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
/**
|
||
|
* Don't just create a new data object, use the first existing one if it already exists
|
||
|
*/
|
||
|
this.executed([ 'shape.create' ], HIGH_PRIORITY, function(event) {
|
||
|
const context = event.context, shape = context.shape;
|
||
|
if (is(shape, 'bpmn:DataObjectReference') && shape.type !== 'label') {
|
||
|
let process = shape.parent.businessObject;
|
||
|
let existingDataObjects = findDataObjects(process);
|
||
|
let dataObject;
|
||
|
if (existingDataObjects.length > 0) {
|
||
|
dataObject = existingDataObjects[0];
|
||
|
} else {
|
||
|
dataObject = bpmnFactory.create('bpmn:DataObject');
|
||
|
}
|
||
|
|
||
|
// Update the name of the reference to match the data object's id.
|
||
|
shape.businessObject.name = dataObject.id;
|
||
|
|
||
|
// set the reference to the DataObject
|
||
|
shape.businessObject.dataObjectRef = dataObject;
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DataObjectInterceptor.$inject = [ 'eventBus', 'bpmnFactory', 'bpmnUpdater' ];
|