From 1874c5b689ac61517ab4aaea47e8aaaf0e212fb6 Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 11 Jul 2022 17:29:41 -0400 Subject: [PATCH] Some minor bug fixes that needed squashing: 1. When you rename a DataObject in the properties panel for a process, the labels of all the references should update. 2. Sub-processes should have their own independent list of data objects in the properties panel. --- .../DataObject/DataObjectHelpers.js | 10 +++ .../SpiffWorkflowPropertiesProvider.js | 4 +- .../PropertiesPanel/parts/DataObjectArray.js | 17 ++++- test/spec/DataObjectInterceptorSpec.js | 14 ++++ test/spec/DataObjectPropsSpec.js | 19 ++++- test/spec/bpmn/diagram.bpmn | 74 +++++++++---------- test/spec/bpmn/empty_diagram.bpmn | 14 +++- 7 files changed, 107 insertions(+), 45 deletions(-) diff --git a/app/spiffworkflow/DataObject/DataObjectHelpers.js b/app/spiffworkflow/DataObject/DataObjectHelpers.js index b5c90d4..35dcbd1 100644 --- a/app/spiffworkflow/DataObject/DataObjectHelpers.js +++ b/app/spiffworkflow/DataObject/DataObjectHelpers.js @@ -17,3 +17,13 @@ export function findDataObject(process, id) { } } } + +export function findDataReferences(process, id) { + let refs = []; + for (const element of process.children) { + if (element.type === 'bpmn:DataObjectReference') { + refs.push(element); + } + } + return refs; +} diff --git a/app/spiffworkflow/PropertiesPanel/SpiffWorkflowPropertiesProvider.js b/app/spiffworkflow/PropertiesPanel/SpiffWorkflowPropertiesProvider.js index 1ebbcf7..5e68a53 100644 --- a/app/spiffworkflow/PropertiesPanel/SpiffWorkflowPropertiesProvider.js +++ b/app/spiffworkflow/PropertiesPanel/SpiffWorkflowPropertiesProvider.js @@ -3,7 +3,7 @@ import { is, isAny } from 'bpmn-js/lib/util/ModelUtil'; import { DataObjectSelect } from './parts/DataObjectSelect'; import { ListGroup, isTextFieldEntryEdited } from '@bpmn-io/properties-panel'; import { DataObjectArray } from './parts/DataObjectArray'; -import {SpiffExtensionTextInput} from './parts/SpiffExtensionTextInput'; +import { SpiffExtensionTextInput } from './parts/SpiffExtensionTextInput'; const LOW_PRIORITY = 500; export default function SpiffWorkflowPropertiesProvider(propertiesPanel, translate, moddle, commandStack, elementRegistry) { @@ -17,7 +17,7 @@ export default function SpiffWorkflowPropertiesProvider(propertiesPanel, transla if (is(element, 'bpmn:DataObjectReference')) { groups.push(createDataObjectSelector(element, translate, moddle, commandStack)); } - if (is(element, 'bpmn:Process')) { + if (isAny(element, [ 'bpmn:Process', 'bpmn:SubProcess' ])) { groups.push(createDataObjectEditor(element, translate, moddle, commandStack, elementRegistry)); } if (is(element, 'bpmn:UserTask')) { diff --git a/app/spiffworkflow/PropertiesPanel/parts/DataObjectArray.js b/app/spiffworkflow/PropertiesPanel/parts/DataObjectArray.js index d993d5e..ab926ed 100644 --- a/app/spiffworkflow/PropertiesPanel/parts/DataObjectArray.js +++ b/app/spiffworkflow/PropertiesPanel/parts/DataObjectArray.js @@ -1,7 +1,7 @@ import { useService } from 'bpmn-js-properties-panel'; import { isTextFieldEntryEdited, TextFieldEntry } from '@bpmn-io/properties-panel'; import { without } from 'min-dash'; -import { findDataObjects } from '../../DataObject/DataObjectHelpers'; +import {findDataObjects, findDataReferences} from '../../DataObject/DataObjectHelpers'; /** * Provides a list of data objects, and allows you to add / remove data objects, and change their ids. @@ -104,7 +104,7 @@ function DataObjectTextField(props) { const debounce = useService('debounceInput'); const setValue = (value) => { - return commandStack.execute( + commandStack.execute( 'element.updateModdleProperties', { element, @@ -114,6 +114,19 @@ function DataObjectTextField(props) { } } ); + + // Also update the label of all the references + let references = findDataReferences(element, dataObject.id); + for (const ref of references) { + commandStack.execute('element.updateProperties', { + element: ref, + moddleElement: ref.businessObject, + properties: { + 'name': value + }, + changed:[ ref ] // everything is already marked as changed, don't recalculate. + }); + } }; const getValue = (parameter) => { diff --git a/test/spec/DataObjectInterceptorSpec.js b/test/spec/DataObjectInterceptorSpec.js index fd2c67b..0742a97 100644 --- a/test/spec/DataObjectInterceptorSpec.js +++ b/test/spec/DataObjectInterceptorSpec.js @@ -61,6 +61,20 @@ describe('DataObject Interceptor', function() { expect(dataObjectRefShape1.businessObject.name).to.equal(dataObjects[0].id); })); + it('should allow you to add a data object to a subprocess', inject(function(canvas, modeling, elementRegistry) { + // IF - A data object reference is added to a sup-process + let subProcessShape = elementRegistry.get('my_subprocess'); + let subProcess = subProcessShape.businessObject; + let dataObjects = findDataObjects(subProcess); + expect(dataObjects.length).to.equal(0); + + const dataObjectRefShape = modeling.createShape({ type: 'bpmn:DataObjectReference' }, + { x: 220, y: 220 }, subProcessShape); + + // THEN - a new data object is visible in that SubProcess + dataObjects = findDataObjects(subProcess); + expect(dataObjects.length).to.equal(1); + })); }); diff --git a/test/spec/DataObjectPropsSpec.js b/test/spec/DataObjectPropsSpec.js index 1ce74fe..296ad5a 100644 --- a/test/spec/DataObjectPropsSpec.js +++ b/test/spec/DataObjectPropsSpec.js @@ -1,13 +1,15 @@ import { bootstrapPropertiesPanel, changeInput, expectSelected, - findEntry, findGroupEntry, findSelect, + findEntry, findGroupEntry, findInput, findSelect, } from './helpers'; import { BpmnPropertiesPanelModule, BpmnPropertiesProviderModule } from 'bpmn-js-properties-panel'; import SpiffWorkflowPropertiesProvider from '../../app/spiffworkflow/PropertiesPanel'; +import { inject } from 'bpmn-js/test/helper'; import spiffModdleExtension from '../../app/spiffworkflow/moddle/spiffworkflow.json'; import TestContainer from 'mocha-test-container-support'; +import { findDataObjects } from '../../app/spiffworkflow/DataObject/DataObjectHelpers'; describe('Properties Panel for Data Objects', function() { let xml = require('./bpmn/diagram.bpmn').default; @@ -46,7 +48,8 @@ describe('Properties Panel for Data Objects', function() { expect(selector.length).to.equal(3); }); - it('selecting a data object should change the data model.', async function() { + + it('selecting a different data object should change the data model.', async function() { // IF - a data object reference is selected let my_data_ref_1 = await expectSelected('my_data_ref_1'); @@ -62,5 +65,17 @@ describe('Properties Panel for Data Objects', function() { expect(businessObject.get('dataObjectRef').id).to.equal('my_third_data_object'); }); + it('renaming a data object, changes to the label of references', async function() { + + // IF - a process is selected, and the name of a data object is changed. + let entry = findEntry('ProcessTest-dataObj-2-id', container); + let textInput = findInput('text', entry); + changeInput(textInput, 'my_nifty_new_name'); + let my_data_ref_1 = await expectSelected('my_data_ref_1'); + + // THEN - both the data object itself, and the label of any references are updated. + expect(my_data_ref_1.businessObject.dataObjectRef.id).to.equal('my_nifty_new_name'); + expect(my_data_ref_1.businessObject.name).to.equal('my_nifty_new_name'); + }); }); diff --git a/test/spec/bpmn/diagram.bpmn b/test/spec/bpmn/diagram.bpmn index 789f6df..4e32586 100644 --- a/test/spec/bpmn/diagram.bpmn +++ b/test/spec/bpmn/diagram.bpmn @@ -40,6 +40,11 @@ + + + Flow_0q4oys2 + Flow_132laxn + @@ -49,78 +54,73 @@ - - - Flow_0q4oys2 - Flow_132laxn - - - + + - + + + + + + + - - + + - - + + - - + + - - + + - + - + - + - + - - - - - - - + - + - + - - - - + + + + - - + + - - + + diff --git a/test/spec/bpmn/empty_diagram.bpmn b/test/spec/bpmn/empty_diagram.bpmn index 66867bb..00c045b 100644 --- a/test/spec/bpmn/empty_diagram.bpmn +++ b/test/spec/bpmn/empty_diagram.bpmn @@ -1,12 +1,22 @@ - + + + + - + + + + + + + +