Merge branch 'main' of github.com:sartography/bpmn-js-spiffworkflow

This commit is contained in:
jasquat 2022-07-13 16:44:01 -04:00
commit 34d3127d18
8 changed files with 91 additions and 15 deletions

View File

@ -1,8 +1,13 @@
/**
* Returns the moddelElement if it is a process, otherwise, returns the
*
* @param container
*/
export function findDataObjects(process) { export function findDataObjects(process) {
let dataObjects = []; let dataObjects = [];
if (! process.flowElements) { if (!process || !process.flowElements) {
return dataObjects; return dataObjects;
} }
for (const element of process.flowElements) { for (const element of process.flowElements) {
@ -21,11 +26,13 @@ export function findDataObject(process, id) {
} }
} }
export function findDataReferences(process, id) { export function findDataReferenceShapes(processShape, id) {
let refs = []; let refs = [];
for (const element of process.children) { for (const shape of processShape.children) {
if (element.type === 'bpmn:DataObjectReference') { if (shape.type === 'bpmn:DataObjectReference') {
refs.push(element); if (shape.businessObject.dataObjectRef && shape.businessObject.dataObjectRef.id === id) {
refs.push(shape);
}
} }
} }
return refs; return refs;

View File

@ -0,0 +1,44 @@
import BaseRenderer from 'diagram-js/lib/draw/BaseRenderer';
import {
attr as svgAttr
} from 'tiny-svg';
import { getBusinessObject, is } from 'bpmn-js/lib/util/ModelUtil';
import { isAny } from 'bpmn-js/lib/features/modeling/util/ModelingUtil';
import { findDataObject } from './DataObjectHelpers';
const HIGH_PRIORITY = 1500;
/**
* Work in progress -- render data object references in red if they are
* not valid.
*/
export default class DataObjectRenderer extends BaseRenderer {
constructor(eventBus, bpmnRenderer) {
super(eventBus, HIGH_PRIORITY);
this.bpmnRenderer = bpmnRenderer;
}
canRender(element) {
return isAny(element, [ 'bpmn:DataObjectReference' ]) && !element.labelTarget;
}
drawShape(parentNode, element) {
const shape = this.bpmnRenderer.drawShape(parentNode, element);
if (is(element, 'bpmn:DataObjectReference')) {
let businessObject = getBusinessObject(element);
let dataObject = businessObject.dataObjectRef;
if (dataObject && dataObject.id) {
let parentObject = businessObject.$parent;
dataObject = findDataObject(parentObject, dataObject.id);
}
if (!dataObject) {
svgAttr(shape, 'stroke', 'red');
}
return shape;
}
}
}
DataObjectRenderer.$inject = [ 'eventBus', 'bpmnRenderer' ];

View File

@ -1,14 +1,16 @@
import DataObjectInterceptor from './DataObjectInterceptor'; import DataObjectInterceptor from './DataObjectInterceptor';
import DataObjectRules from './DataObjectRules'; import DataObjectRules from './DataObjectRules';
import RulesModule from 'diagram-js/lib/features/rules'; import RulesModule from 'diagram-js/lib/features/rules';
import DataObjectRenderer from './DataObjectRenderer';
export default { export default {
__depends__: [ __depends__: [
RulesModule RulesModule
], ],
__init__: [ 'dataInterceptor', 'dataObjectRules' ], __init__: [ 'dataInterceptor', 'dataObjectRules', 'dataObjectRenderer' ],
dataInterceptor: [ 'type', DataObjectInterceptor ], dataInterceptor: [ 'type', DataObjectInterceptor ],
dataObjectRules: [ 'type', DataObjectRules ] dataObjectRules: [ 'type', DataObjectRules ],
dataObjectRenderer: [ 'type', DataObjectRenderer ]
}; };

View File

@ -18,7 +18,7 @@ export default function SpiffWorkflowPropertiesProvider(propertiesPanel, transla
if (is(element, 'bpmn:DataObjectReference')) { if (is(element, 'bpmn:DataObjectReference')) {
groups.push(createDataObjectSelector(element, translate, moddle, commandStack)); groups.push(createDataObjectSelector(element, translate, moddle, commandStack));
} }
if (isAny(element, [ 'bpmn:Process', 'bpmn:SubProcess' ])) { if (isAny(element, [ 'bpmn:Process', 'bpmn:SubProcess', 'bpmn:Participant' ])) {
groups.push(createDataObjectEditor(element, translate, moddle, commandStack, elementRegistry)); groups.push(createDataObjectEditor(element, translate, moddle, commandStack, elementRegistry));
} }
if (is(element, 'bpmn:UserTask')) { if (is(element, 'bpmn:UserTask')) {

View File

@ -1,7 +1,8 @@
import { useService } from 'bpmn-js-properties-panel'; import { useService } from 'bpmn-js-properties-panel';
import { isTextFieldEntryEdited, TextFieldEntry } from '@bpmn-io/properties-panel'; import { isTextFieldEntryEdited, TextFieldEntry } from '@bpmn-io/properties-panel';
import { without } from 'min-dash'; import { without } from 'min-dash';
import {findDataObjects, findDataReferences} from '../../DataObject/DataObjectHelpers'; import { findDataObjects, findDataReferenceShapes } from '../../DataObject/DataObjectHelpers';
import { is } from 'bpmn-js/lib/util/ModelUtil';
/** /**
* Provides a list of data objects, and allows you to add / remove data objects, and change their ids. * Provides a list of data objects, and allows you to add / remove data objects, and change their ids.
@ -11,10 +12,16 @@ import {findDataObjects, findDataReferences} from '../../DataObject/DataObjectHe
export function DataObjectArray(props) { export function DataObjectArray(props) {
const moddle = props.moddle; const moddle = props.moddle;
const element = props.element; const element = props.element;
const process = props.element.businessObject; // The BusinessObject in this case must be a BPMN:Process
const commandStack = props.commandStack; const commandStack = props.commandStack;
const elementRegistry = props.elementRegistry; const elementRegistry = props.elementRegistry;
let process;
// This element might be a process, or something that will reference a process.
if (is(element.businessObject, 'bpmn:Process')) {
process = element.businessObject;
} else if (element.businessObject.processRef) {
process = element.businessObject.processRef;
}
let dataObjects = findDataObjects(process); let dataObjects = findDataObjects(process);
const items = dataObjects.map((dataObject, index) => { const items = dataObjects.map((dataObject, index) => {
@ -70,6 +77,18 @@ function removeFactory(props) {
flowElements: without(process.get('flowElements'), dataObject) flowElements: without(process.get('flowElements'), dataObject)
} }
}); });
// Also update the label of all the references
let references = findDataReferenceShapes(element, dataObject.id);
for (const ref of references) {
commandStack.execute('element.updateProperties', {
element: ref,
moddleElement: ref.businessObject,
properties: {
'name': '???'
},
changed:[ ref ] // everything is already marked as changed, don't recalculate.
});
}
}; };
} }
@ -116,7 +135,7 @@ function DataObjectTextField(props) {
); );
// Also update the label of all the references // Also update the label of all the references
let references = findDataReferences(element, dataObject.id); let references = findDataReferenceShapes(element, dataObject.id);
for (const ref of references) { for (const ref of references) {
commandStack.execute('element.updateProperties', { commandStack.execute('element.updateProperties', {
element: ref, element: ref,

View File

@ -5,16 +5,18 @@ import SpiffWorkflowPropertiesProvider from './PropertiesPanel/SpiffWorkflowProp
import DataObjectInterceptor from './DataObject/DataObjectInterceptor'; import DataObjectInterceptor from './DataObject/DataObjectInterceptor';
import DataObjectRules from './DataObject/DataObjectRules'; import DataObjectRules from './DataObject/DataObjectRules';
import RulesModule from 'diagram-js/lib/features/rules'; import RulesModule from 'diagram-js/lib/features/rules';
import DataObjectRenderer from './DataObject/DataObjectRenderer';
export default { export default {
__depends__: [ RulesModule ], __depends__: [ RulesModule ],
__init__: [ __init__: [
'spiffWorkflowPropertiesProvider', 'spiffWorkflowPropertiesProvider',
'dataObjectInterceptor', 'dataObjectRules', 'dataObjectInterceptor', 'dataObjectRules',
'ioPalette', 'ioRules', 'ioInterceptor' ], 'ioPalette', 'ioRules', 'ioInterceptor', 'dataObjectRenderer' ],
spiffWorkflowPropertiesProvider: [ 'type', SpiffWorkflowPropertiesProvider ], spiffWorkflowPropertiesProvider: [ 'type', SpiffWorkflowPropertiesProvider ],
dataObjectInterceptor: [ 'type', DataObjectInterceptor ], dataObjectInterceptor: [ 'type', DataObjectInterceptor ],
dataObjectRules:[ 'type', DataObjectRules ], dataObjectRules:[ 'type', DataObjectRules ],
dataObjectRenderer: [ 'type', DataObjectRenderer ],
ioPalette: [ 'type', IoPalette ], ioPalette: [ 'type', IoPalette ],
ioRules: [ 'type', IoRules ], ioRules: [ 'type', IoRules ],
ioInterceptor: [ 'type', IoInterceptor ], ioInterceptor: [ 'type', IoInterceptor ],

3
package-lock.json generated
View File

@ -16,7 +16,8 @@
"inherits-browser": "^0.0.1", "inherits-browser": "^0.0.1",
"min-dash": "^3.8.1", "min-dash": "^3.8.1",
"min-dom": "^3.2.1", "min-dom": "^3.2.1",
"moddle": "^5.0.3" "moddle": "^5.0.3",
"tiny-svg": "^2.2.3"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.18.6", "@babel/core": "^7.18.6",

View File

@ -71,6 +71,7 @@
"inherits-browser": "^0.0.1", "inherits-browser": "^0.0.1",
"min-dash": "^3.8.1", "min-dash": "^3.8.1",
"min-dom": "^3.2.1", "min-dom": "^3.2.1",
"moddle": "^5.0.3" "moddle": "^5.0.3",
"tiny-svg": "^2.2.3"
} }
} }