ruoyi-vue-nocode/ruoyi-ui/ruoyi-bpmnjs/resources/properties-panel/cmd/CreateAndReferenceHandler.js

102 lines
3.2 KiB
JavaScript
Raw Normal View History

2022-08-11 16:10:41 +08:00
'use strict';
var elementHelper = require('../helper/ElementHelper');
/**
* A handler capable of creating a new element under a provided parent
* and updating / creating a reference to it in one atomic action.
*
* @class
* @constructor
*/
function CreateAndReferenceElementHandler(elementRegistry, bpmnFactory) {
this._elementRegistry = elementRegistry;
this._bpmnFactory = bpmnFactory;
}
CreateAndReferenceElementHandler.$inject = [ 'elementRegistry', 'bpmnFactory' ];
module.exports = CreateAndReferenceElementHandler;
// api ////////////////////
/**
* Creates a new element under a provided parent and updates / creates a reference to it in
* one atomic action.
*
* @method CreateAndReferenceElementHandler#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
*
* @returns {Array<djs.mode.Base>} the updated element
*/
CreateAndReferenceElementHandler.prototype.execute = function(context) {
var referencingObject = ensureNotNull(context.referencingObject, 'referencingObject'),
referenceProperty = ensureNotNull(context.referenceProperty, 'referenceProperty'),
newObject = ensureNotNull(context.newObject, 'newObject'),
newObjectContainer = ensureNotNull(context.newObjectContainer, 'newObjectContainer'),
newObjectParent = ensureNotNull(context.newObjectParent, 'newObjectParent'),
changed = [ context.element ]; // this will not change any diagram-js elements
// create new object
var referencedObject = elementHelper
.createElement(newObject.type, newObject.properties, newObjectParent, this._bpmnFactory);
context.referencedObject = referencedObject;
// add to containing list
newObjectContainer.push(referencedObject);
// adjust reference attribute
context.previousReference = referencingObject[referenceProperty];
referencingObject[referenceProperty] = referencedObject;
context.changed = changed;
// indicate changed on objects affected by the update
return changed;
};
/**
* Reverts the update
*
* @method CreateAndReferenceElementHandler#revert
*
* @param {Object} context
*
* @returns {djs.mode.Base} the updated element
*/
CreateAndReferenceElementHandler.prototype.revert = function(context) {
var referencingObject = context.referencingObject,
referenceProperty = context.referenceProperty,
previousReference = context.previousReference,
referencedObject = context.referencedObject,
newObjectContainer = context.newObjectContainer;
// reset reference
referencingObject.set(referenceProperty, previousReference);
// remove new element
newObjectContainer.splice(newObjectContainer.indexOf(referencedObject), 1);
return context.changed;
};
// helpers //////////////
function ensureNotNull(prop, name) {
if (!prop) {
throw new Error(name + ' required');
}
return prop;
}