mirror of
https://github.com/sartography/spiff-arena.git
synced 2025-01-27 09:45:12 +00:00
Squashed 'bpmn-js-spiffworkflow/' changes from b3eef6e52..9c0da0240
9c0da0240 Merge pull request #21 from sartography/bug/data_objects 6fe36aeb0 Minor fixes. d21cb75fb Assure we aren't setting the properties on every service task to the same thing. f28a3f89e Deleting any data object reference caused the associated data object to get deleted. Fixes this so that only if you delete all references, wii the data object be removed. Also assures that a new data object is not created when adding to a participant in a collaboration (an edge case bug(. git-subtree-dir: bpmn-js-spiffworkflow git-subtree-split: 9c0da02406ecbc51cfd7fd1ed1f2f311101d9987
This commit is contained in:
parent
1d3a492179
commit
bb86175687
@ -5,10 +5,19 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
export function findDataObjects(process) {
|
export function findDataObjects(parent) {
|
||||||
let dataObjects = [];
|
let dataObjects = [];
|
||||||
if (!process || !process.flowElements) {
|
let process;
|
||||||
return dataObjects;
|
if (!parent) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
if (parent.processRef) {
|
||||||
|
process = parent.processRef;
|
||||||
|
} else {
|
||||||
|
process = parent;
|
||||||
|
}
|
||||||
|
if (!process.flowElements) {
|
||||||
|
return [];
|
||||||
}
|
}
|
||||||
for (const element of process.flowElements) {
|
for (const element of process.flowElements) {
|
||||||
if (element.$type === 'bpmn:DataObject') {
|
if (element.$type === 'bpmn:DataObject') {
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';
|
import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';
|
||||||
import { is } from 'bpmn-js/lib/util/ModelUtil';
|
import {getDi, is} from 'bpmn-js/lib/util/ModelUtil';
|
||||||
import { findDataObjects } from './DataObjectHelpers';
|
import {findDataObjects, findDataReferenceShapes} from './DataObjectHelpers';
|
||||||
var HIGH_PRIORITY = 1500;
|
var HIGH_PRIORITY = 1500;
|
||||||
|
import {
|
||||||
|
remove as collectionRemove,
|
||||||
|
} from 'diagram-js/lib/util/Collections';
|
||||||
/**
|
/**
|
||||||
* This Command Interceptor functions like the BpmnUpdator in BPMN.js - It hooks into events
|
* This Command Interceptor functions like the BpmnUpdator in BPMN.js - It hooks into events
|
||||||
* from Diagram.js and updates the underlying BPMN model accordingly.
|
* from Diagram.js and updates the underlying BPMN model accordingly.
|
||||||
@ -53,6 +55,45 @@ export default class DataObjectInterceptor extends CommandInterceptor {
|
|||||||
shape.businessObject.dataObjectRef = dataObject;
|
shape.businessObject.dataObjectRef = dataObject;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Don't remove the associated DataObject, unless all references to that data object
|
||||||
|
* Difficult to do given placement of this logic in the BPMN Updater, so we have
|
||||||
|
* to manually handle the removal.
|
||||||
|
*/
|
||||||
|
this.executed([ 'shape.delete' ], HIGH_PRIORITY, function(event) {
|
||||||
|
const { context } = event;
|
||||||
|
const { shape, oldParent } = context;
|
||||||
|
if (is(shape, 'bpmn:DataObjectReference') && shape.type !== 'label') {
|
||||||
|
const references = findDataReferenceShapes(
|
||||||
|
oldParent,
|
||||||
|
shape.businessObject.dataObjectRef.id
|
||||||
|
);
|
||||||
|
if (references.length === 0) {
|
||||||
|
return; // Use the default bahavior and delete the data object.
|
||||||
|
}
|
||||||
|
// Remove the business Object
|
||||||
|
let containment = '';
|
||||||
|
const { businessObject } = shape;
|
||||||
|
if (is(businessObject, 'bpmn:DataOutputAssociation')) {
|
||||||
|
containment = 'dataOutputAssociations';
|
||||||
|
}
|
||||||
|
if (is(businessObject, 'bpmn:DataInputAssociation')) {
|
||||||
|
containment = 'dataInputAssociations';
|
||||||
|
}
|
||||||
|
const children = businessObject.$parent.get(containment);
|
||||||
|
collectionRemove(children, businessObject);
|
||||||
|
|
||||||
|
// Remove the visible element.
|
||||||
|
const di = getDi(shape);
|
||||||
|
const planeElements = di.$parent.get('planeElement');
|
||||||
|
collectionRemove(planeElements, di);
|
||||||
|
di.$parent = null;
|
||||||
|
|
||||||
|
// Stop the propogation.
|
||||||
|
event.stopPropagation();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,6 +245,7 @@ function createServiceGroup(element, translate, moddle, commandStack) {
|
|||||||
element,
|
element,
|
||||||
moddle,
|
moddle,
|
||||||
translate,
|
translate,
|
||||||
|
commandStack
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
@ -111,9 +111,11 @@ export function ServiceTaskOperatorSelect(props) {
|
|||||||
console.error(`Could not find service task operator with id: ${value}`);
|
console.error(`Could not find service task operator with id: ${value}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!(element.businessObject.id in previouslyUsedServiceTaskParameterValuesHash)) {
|
||||||
|
previouslyUsedServiceTaskParameterValuesHash[element.businessObject.id] = {}
|
||||||
|
}
|
||||||
const previouslyUsedServiceTaskParameterValues =
|
const previouslyUsedServiceTaskParameterValues =
|
||||||
previouslyUsedServiceTaskParameterValuesHash[value];
|
previouslyUsedServiceTaskParameterValuesHash[element.businessObject.id][value];
|
||||||
|
|
||||||
const { businessObject } = element;
|
const { businessObject } = element;
|
||||||
let extensions = businessObject.extensionElements;
|
let extensions = businessObject.extensionElements;
|
||||||
@ -143,9 +145,12 @@ export function ServiceTaskOperatorSelect(props) {
|
|||||||
newParameterModdleElement.type = stoParameter.type;
|
newParameterModdleElement.type = stoParameter.type;
|
||||||
newParameterList.parameters.push(newParameterModdleElement);
|
newParameterList.parameters.push(newParameterModdleElement);
|
||||||
});
|
});
|
||||||
previouslyUsedServiceTaskParameterValuesHash[value] = newParameterList;
|
|
||||||
|
previouslyUsedServiceTaskParameterValuesHash[element.businessObject.id][
|
||||||
|
value
|
||||||
|
] = newParameterList;
|
||||||
if (oldServiceTaskOperatorModdleElement) {
|
if (oldServiceTaskOperatorModdleElement) {
|
||||||
previouslyUsedServiceTaskParameterValuesHash[
|
previouslyUsedServiceTaskParameterValuesHash[element.businessObject.id][
|
||||||
oldServiceTaskOperatorModdleElement.id
|
oldServiceTaskOperatorModdleElement.id
|
||||||
] = oldServiceTaskOperatorModdleElement.parameterList;
|
] = oldServiceTaskOperatorModdleElement.parameterList;
|
||||||
}
|
}
|
||||||
@ -228,13 +233,21 @@ function serviceTaskParameterEntries(props) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function ServiceTaskParameterTextField(props) {
|
function ServiceTaskParameterTextField(props) {
|
||||||
const { idPrefix, element, serviceTaskParameterModdleElement } = props;
|
const { idPrefix, element, serviceTaskParameterModdleElement, commandStack } = props;
|
||||||
|
|
||||||
const debounce = useService('debounceInput');
|
const debounce = useService('debounceInput');
|
||||||
|
|
||||||
const setValue = (value) => {
|
const setValue = (value) => {
|
||||||
serviceTaskParameterModdleElement.value = value;
|
commandStack.execute('element.updateModdleProperties', {
|
||||||
|
element,
|
||||||
|
moddleElement: serviceTaskParameterModdleElement,
|
||||||
|
properties: {
|
||||||
|
value: value,
|
||||||
|
},
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const getValue = () => {
|
const getValue = () => {
|
||||||
return serviceTaskParameterModdleElement.value;
|
return serviceTaskParameterModdleElement.value;
|
||||||
};
|
};
|
||||||
|
@ -50,6 +50,41 @@ describe('DataObject Interceptor', function() {
|
|||||||
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
it('Deleting a data object reference does not delete the data object, unless it is the last reference', inject(function(canvas, modeling) {
|
||||||
|
|
||||||
|
// IF - two dataObjectReferences are created
|
||||||
|
let rootShape = canvas.getRootElement();
|
||||||
|
const dataObjectRefShape1 = modeling.createShape({ type: 'bpmn:DataObjectReference' },
|
||||||
|
{ x: 220, y: 220 }, rootShape);
|
||||||
|
const dataObjectRefShape2 = modeling.createShape({ type: 'bpmn:DataObjectReference' },
|
||||||
|
{ x: 320, y: 220 }, rootShape);
|
||||||
|
|
||||||
|
// AND one is deleted
|
||||||
|
modeling.removeShape(dataObjectRefShape1)
|
||||||
|
|
||||||
|
// THEN - there is still a data object
|
||||||
|
const dataObjects = findDataObjects(rootShape.businessObject);
|
||||||
|
expect(dataObjects.length).to.equal(1);
|
||||||
|
}));
|
||||||
|
|
||||||
|
it('Deleting all the data references will also delete the data object', inject(function(canvas, modeling) {
|
||||||
|
|
||||||
|
// IF - two dataObjectReferences are created
|
||||||
|
let rootShape = canvas.getRootElement();
|
||||||
|
const dataObjectRefShape1 = modeling.createShape({ type: 'bpmn:DataObjectReference' },
|
||||||
|
{ x: 220, y: 220 }, rootShape);
|
||||||
|
const dataObjectRefShape2 = modeling.createShape({ type: 'bpmn:DataObjectReference' },
|
||||||
|
{ x: 320, y: 220 }, rootShape);
|
||||||
|
|
||||||
|
// AND both are deleted
|
||||||
|
modeling.removeShape(dataObjectRefShape1);
|
||||||
|
modeling.removeShape(dataObjectRefShape2);
|
||||||
|
|
||||||
|
// THEN - there is no data object
|
||||||
|
const dataObjects = findDataObjects(rootShape.businessObject);
|
||||||
|
expect(dataObjects.length).to.equal(0);
|
||||||
|
}));
|
||||||
|
|
||||||
it('Creating a new Reference will update the name to match the DataObject', inject(function(canvas, modeling) {
|
it('Creating a new Reference will update the name to match the DataObject', inject(function(canvas, modeling) {
|
||||||
|
|
||||||
// IF - a Data Reference Exists
|
// IF - a Data Reference Exists
|
||||||
|
Loading…
x
Reference in New Issue
Block a user