ruoyi-vue-nocode/ruoyi-ui/ruoyi-bpmnjs/resources/properties-panel/cmd/CreateBusinessObjectListHandler.js
2022-08-11 16:10:41 +08:00

111 lines
3.2 KiB
JavaScript

'use strict';
var forEach = require('lodash/forEach');
var elementHelper = require('../helper/ElementHelper');
/**
* A handler that implements a BPMN 2.0 property update
* for business objects 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 CreateBusinessObjectListHandler(elementRegistry, bpmnFactory) {
this._elementRegistry = elementRegistry;
this._bpmnFactory = bpmnFactory;
}
CreateBusinessObjectListHandler.$inject = [ 'elementRegistry', 'bpmnFactory' ];
module.exports = CreateBusinessObjectListHandler;
function ensureNotNull(prop, name) {
if (!prop) {
throw new Error(name + ' required');
}
return prop;
}
function ensureList(prop, name) {
if (!prop || Object.prototype.toString.call(prop) !== '[object Array]') {
throw new Error(name + ' needs to be a list');
}
return prop;
}
// api /////////////////////////////////////////////
/**
* Creates a new element under a provided parent and updates / creates a reference to it in
* one atomic action.
*
* @method CreateBusinessObjectListHandler#execute
*
* @param {Object} context
* @param {djs.model.Base} context.element which is the context for the reference
* @param {moddle.referencingObject} context.referencingObject the object which creates the reference
* @param {String} context.referenceProperty the property of the referencingObject which makes the reference
* @param {moddle.newObject} context.newObject the new object to add
* @param {moddle.newObjectContainer} context.newObjectContainer the container for the new object
*
* @return {Array<djs.mode.Base>} the updated element
*/
CreateBusinessObjectListHandler.prototype.execute = function(context) {
var currentObject = ensureNotNull(context.currentObject, 'currentObject'),
propertyName = ensureNotNull(context.propertyName, 'propertyName'),
newObjects = ensureList(context.newObjects, 'newObjects'),
changed = [ context.element ]; // this will not change any diagram-js elements
var childObjects = [];
var self = this;
// create new array of business objects
forEach(newObjects, function(obj) {
var element = elementHelper.createElement(obj.type, obj.properties, currentObject, self._bpmnFactory);
childObjects.push(element);
});
context.childObject = childObjects;
// adjust array reference in the parent business object
context.previousChilds = currentObject[propertyName];
currentObject[propertyName] = childObjects;
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
*/
CreateBusinessObjectListHandler.prototype.revert = function(context) {
var currentObject = context.currentObject,
propertyName = context.propertyName,
previousChilds = context.previousChilds;
// remove new element
currentObject.set(propertyName, previousChilds);
return context.changed;
};