bpmn-js/lib/features/modeling/cmd/UpdatePropertiesHandler.js
Nico Rehwaldt 2019c658df feat(modeling): add property update mechanism
This adds the modeling#updateProperties(element, props) method to the
modeler that can be used to set BPMN 2.0 properties on elements.

By assigning the properties this way, the modeler is aware of the
elements that got changed and can update / redraw the elements
accordingly.

This hooks up with the modelers undo/redo chain, too.

Related to #167
2015-01-02 16:15:18 +01:00

96 lines
2.4 KiB
JavaScript

'use strict';
var _ = require('lodash');
var DEFAULT_FLOW = 'default',
NAME = 'name';
/**
* A handler that implements a BPMN 2.0 property update.
*
* This should be used to set simple properties on elements with
* an underlying BPMN business object.
*
* Use respective diagram-js provided handlers if you would
* like to perform automated modeling.
*/
function UpdatePropertiesHandler(elementRegistry) {
this._elementRegistry = elementRegistry;
}
UpdatePropertiesHandler.$inject = [ 'elementRegistry' ];
module.exports = UpdatePropertiesHandler;
////// api /////////////////////////////////////////////
/**
* Updates a BPMN element with a list of new properties
*
* @param {Object} context
* @param {djs.model.Base} context.element the element to update
* @param {Object} context.properties a list of properties to set on the element's
* businessObject (the BPMN model element)
*
* @return {Array<djs.mode.Base>} the updated element
*/
UpdatePropertiesHandler.prototype.execute = function(context) {
var element = context.element,
changed = [ element ];
if (!element) {
throw new Error('element required');
}
var elementRegistry = this._elementRegistry;
var businessObject = element.businessObject,
properties = context.properties,
oldProperties = context.oldProperties || _.pick(businessObject, _.keys(properties));
// correctly indicate visual changes on default flow updates
if (DEFAULT_FLOW in properties) {
if (properties[DEFAULT_FLOW]) {
changed.push(elementRegistry.get(properties[DEFAULT_FLOW].id));
}
if (businessObject[DEFAULT_FLOW]) {
changed.push(elementRegistry.get(businessObject[DEFAULT_FLOW].id));
}
}
if (NAME in properties && element.label) {
changed.push(element.label);
}
// update properties
_.assign(businessObject, properties);
// store old values
context.oldProperties = oldProperties;
context.changed = changed;
// indicate changed on objects affected by the update
return changed;
};
/**
* Reverts the update on a BPMN elements properties.
*
* @param {Object} context
*
* @return {djs.mode.Base} the updated element
*/
UpdatePropertiesHandler.prototype.revert = function(context) {
var element = context.element,
businessObject = element.businessObject;
_.assign(businessObject, context.oldProperties);
return context.changed;
};