116 lines
3.2 KiB
JavaScript
116 lines
3.2 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var forEach = require('lodash/forEach');
|
||
|
|
||
|
/**
|
||
|
* A handler that implements a BPMN 2.0 property update
|
||
|
* for business object lists which are not represented in the
|
||
|
* diagram.
|
||
|
*
|
||
|
* This is useful in the context of the properties panel in
|
||
|
* order to update child elements of elements visible in
|
||
|
* the diagram.
|
||
|
*
|
||
|
* Example: perform an update of a specific event definition
|
||
|
* of an intermediate event.
|
||
|
*
|
||
|
* @class
|
||
|
* @constructor
|
||
|
*/
|
||
|
function UpdateBusinessObjectListHandler(elementRegistry, bpmnFactory) {
|
||
|
this._elementRegistry = elementRegistry;
|
||
|
this._bpmnFactory = bpmnFactory;
|
||
|
}
|
||
|
|
||
|
UpdateBusinessObjectListHandler.$inject = [ 'elementRegistry', 'bpmnFactory' ];
|
||
|
|
||
|
module.exports = UpdateBusinessObjectListHandler;
|
||
|
|
||
|
function ensureNotNull(prop, name) {
|
||
|
if (!prop) {
|
||
|
throw new Error(name + 'required');
|
||
|
}
|
||
|
return prop;
|
||
|
}
|
||
|
|
||
|
// api /////////////////////////////////////////////
|
||
|
|
||
|
/**
|
||
|
* Updates a element under a provided parent.
|
||
|
*/
|
||
|
UpdateBusinessObjectListHandler.prototype.execute = function(context) {
|
||
|
|
||
|
var currentObject = ensureNotNull(context.currentObject, 'currentObject'),
|
||
|
propertyName = ensureNotNull(context.propertyName, 'propertyName'),
|
||
|
updatedObjectList = context.updatedObjectList,
|
||
|
objectsToRemove = context.objectsToRemove || [],
|
||
|
objectsToAdd = context.objectsToAdd || [],
|
||
|
changed = [ context.element], // this will not change any diagram-js elements
|
||
|
referencePropertyName;
|
||
|
|
||
|
if (context.referencePropertyName) {
|
||
|
referencePropertyName = context.referencePropertyName;
|
||
|
}
|
||
|
|
||
|
var objectList = currentObject[propertyName];
|
||
|
// adjust array reference in the parent business object
|
||
|
context.previousList = currentObject[propertyName];
|
||
|
|
||
|
if (updatedObjectList) {
|
||
|
currentObject[propertyName] = updatedObjectList;
|
||
|
} else {
|
||
|
var listCopy = [];
|
||
|
// remove all objects which should be removed
|
||
|
forEach(objectList, function(object) {
|
||
|
if (objectsToRemove.indexOf(object) == -1) {
|
||
|
listCopy.push(object);
|
||
|
}
|
||
|
});
|
||
|
// add all objects which should be added
|
||
|
listCopy = listCopy.concat(objectsToAdd);
|
||
|
|
||
|
// set property to new list
|
||
|
if (listCopy.length > 0 || !referencePropertyName) {
|
||
|
|
||
|
// as long as there are elements in the list update the list
|
||
|
currentObject[propertyName] = listCopy;
|
||
|
} else if (referencePropertyName) {
|
||
|
|
||
|
// remove the list when it is empty
|
||
|
var parentObject = currentObject.$parent;
|
||
|
parentObject.set(referencePropertyName, undefined);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
context.changed = changed;
|
||
|
|
||
|
// indicate changed on objects affected by the update
|
||
|
return changed;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Reverts the update
|
||
|
*
|
||
|
* @method CreateBusinessObjectListHandler#revert
|
||
|
*
|
||
|
* @param {Object} context
|
||
|
*
|
||
|
* @return {djs.mode.Base} the updated element
|
||
|
*/
|
||
|
UpdateBusinessObjectListHandler.prototype.revert = function(context) {
|
||
|
|
||
|
var currentObject = context.currentObject,
|
||
|
propertyName = context.propertyName,
|
||
|
previousList = context.previousList,
|
||
|
parentObject = currentObject.$parent;
|
||
|
|
||
|
if (context.referencePropertyName) {
|
||
|
parentObject.set(context.referencePropertyName, currentObject);
|
||
|
}
|
||
|
|
||
|
// remove new element
|
||
|
currentObject.set(propertyName, previousList);
|
||
|
|
||
|
return context.changed;
|
||
|
};
|