From 7583d5514cc4b93c92ff4e1c0500bb2d96af998c Mon Sep 17 00:00:00 2001 From: Alexis Zeghers <42282939+AZeghers@users.noreply.github.com> Date: Wed, 18 Nov 2020 11:39:01 +0100 Subject: [PATCH] feat(replace): add switch between DataStore and DataObject in replace menu Closes #1372 --- .../popup-menu/ReplaceMenuProvider.js | 8 +++ lib/features/replace/BpmnReplace.js | 7 +++ lib/features/replace/ReplaceOptions.js | 22 +++++++++ lib/util/DiUtil.js | 2 +- .../{data-object.bpmn => data-elements.bpmn} | 8 +++ .../context-pad/ContextPadProviderSpec.js | 6 +-- .../popup-menu/ReplaceMenuProviderSpec.js | 49 ++++++++++++++++++- 7 files changed, 96 insertions(+), 6 deletions(-) rename test/fixtures/bpmn/features/replace/{data-object.bpmn => data-elements.bpmn} (77%) diff --git a/lib/features/popup-menu/ReplaceMenuProvider.js b/lib/features/popup-menu/ReplaceMenuProvider.js index 0ce22c602a..45fd6e5d90 100644 --- a/lib/features/popup-menu/ReplaceMenuProvider.js +++ b/lib/features/popup-menu/ReplaceMenuProvider.js @@ -77,6 +77,14 @@ ReplaceMenuProvider.prototype.getEntries = function(element) { var differentType = isDifferentType(element); + if (is(businessObject, 'bpmn:DataObjectReference')) { + return this._createEntries(element, replaceOptions.DATA_OBJECT_REFERENCE); + } + + if (is(businessObject, 'bpmn:DataStoreReference')) { + return this._createEntries(element, replaceOptions.DATA_STORE_REFERENCE); + } + // start events outside sub processes if (is(businessObject, 'bpmn:StartEvent') && !is(businessObject.$parent, 'bpmn:SubProcess')) { diff --git a/lib/features/replace/BpmnReplace.js b/lib/features/replace/BpmnReplace.js index 5547d46789..2860ec9a97 100644 --- a/lib/features/replace/BpmnReplace.js +++ b/lib/features/replace/BpmnReplace.js @@ -84,6 +84,7 @@ export default function BpmnReplace( moddleCopy, modeling, replace, + rules, selection ) { @@ -221,6 +222,11 @@ export default function BpmnReplace( newElement.height = elementFactory._getDefaultSize(newBusinessObject).height; } + if (!rules.allowed('shape.resize', { shape: newBusinessObject })) { + newElement.height = elementFactory._getDefaultSize(newBusinessObject).height; + newElement.width = elementFactory._getDefaultSize(newBusinessObject).width; + } + newBusinessObject.name = oldBusinessObject.name; // retain default flow's reference between inclusive <-> exclusive gateways and activities @@ -273,6 +279,7 @@ BpmnReplace.$inject = [ 'moddleCopy', 'modeling', 'replace', + 'rules', 'selection' ]; diff --git a/lib/features/replace/ReplaceOptions.js b/lib/features/replace/ReplaceOptions.js index b132368e46..d49e9b6900 100644 --- a/lib/features/replace/ReplaceOptions.js +++ b/lib/features/replace/ReplaceOptions.js @@ -537,6 +537,28 @@ export var TASK = [ } ]; +export var DATA_OBJECT_REFERENCE = [ + { + label: 'Data Store Reference', + actionName: 'replace-with-data-store-reference', + className: 'bpmn-icon-data-store', + target: { + type: 'bpmn:DataStoreReference' + } + } +]; + +export var DATA_STORE_REFERENCE = [ + { + label: 'Data Object Reference', + actionName: 'replace-with-data-object-reference', + className: 'bpmn-icon-data-object', + target: { + type: 'bpmn:DataObjectReference' + } + } +]; + export var BOUNDARY_EVENT = [ { label: 'Message Boundary Event', diff --git a/lib/util/DiUtil.js b/lib/util/DiUtil.js index 91c4e5a12a..119cb54dfa 100644 --- a/lib/util/DiUtil.js +++ b/lib/util/DiUtil.js @@ -15,7 +15,7 @@ export function isExpanded(element) { } if (is(element, 'bpmn:SubProcess')) { - return !!getBusinessObject(element).di.isExpanded; + return getBusinessObject(element).di && !!getBusinessObject(element).di.isExpanded; } if (is(element, 'bpmn:Participant')) { diff --git a/test/fixtures/bpmn/features/replace/data-object.bpmn b/test/fixtures/bpmn/features/replace/data-elements.bpmn similarity index 77% rename from test/fixtures/bpmn/features/replace/data-object.bpmn rename to test/fixtures/bpmn/features/replace/data-elements.bpmn index 1476dd7b48..24f9d36a67 100644 --- a/test/fixtures/bpmn/features/replace/data-object.bpmn +++ b/test/fixtures/bpmn/features/replace/data-elements.bpmn @@ -4,6 +4,8 @@ + + @@ -19,6 +21,12 @@ + + + + + + diff --git a/test/spec/features/context-pad/ContextPadProviderSpec.js b/test/spec/features/context-pad/ContextPadProviderSpec.js index bd6159fbbf..adfb580425 100644 --- a/test/spec/features/context-pad/ContextPadProviderSpec.js +++ b/test/spec/features/context-pad/ContextPadProviderSpec.js @@ -265,7 +265,7 @@ describe('features - context-pad', function() { expectContextPadEntries('DataStoreReference', [ 'connect', 'append.text-annotation', - '!replace', + 'replace', '!append.end-event' ]); })); @@ -489,11 +489,11 @@ describe('features - context-pad', function() { // given var rootShape = canvas.getRootElement(), - dataStore = elementFactory.createShape({ type: 'bpmn:DataStoreReference' }), + group = elementFactory.createShape({ type: 'bpmn:Group' }), replaceMenu; // when - create.start(canvasEvent({ x: 0, y: 0 }), dataStore); + create.start(canvasEvent({ x: 0, y: 0 }), group); dragging.move(canvasEvent({ x: 50, y: 50 })); dragging.hover({ element: rootShape }); diff --git a/test/spec/features/popup-menu/ReplaceMenuProviderSpec.js b/test/spec/features/popup-menu/ReplaceMenuProviderSpec.js index 26cad9c052..983bfeaae5 100644 --- a/test/spec/features/popup-menu/ReplaceMenuProviderSpec.js +++ b/test/spec/features/popup-menu/ReplaceMenuProviderSpec.js @@ -29,7 +29,7 @@ describe('features/popup-menu - replace menu provider', function() { var diagramXMLMarkers = require('../../../fixtures/bpmn/draw/activity-markers-simple.bpmn'), diagramXMLReplace = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn'), - diagramXMLDataObject = require('../../../fixtures/bpmn/features/replace/data-object.bpmn'); + diagramXMLDataElements = require('../../../fixtures/bpmn/features/replace/data-elements.bpmn'); var testModules = [ coreModule, @@ -50,9 +50,10 @@ describe('features/popup-menu - replace menu provider', function() { }); }; + describe('data object - collection marker', function() { - beforeEach(bootstrapModeler(diagramXMLDataObject, { modules: testModules })); + beforeEach(bootstrapModeler(diagramXMLDataElements, { modules: testModules })); it('should toggle on', inject(function(elementRegistry) { @@ -1202,6 +1203,50 @@ describe('features/popup-menu - replace menu provider', function() { }); + describe('data object', function() { + + beforeEach(bootstrapModeler(diagramXMLDataElements, { modules: testModules })); + + + it('should only contain data store reference', inject(function(elementRegistry) { + + // given + var dataObjectReference = elementRegistry.get('DataObjectReference_1'); + + // when + openPopup(dataObjectReference); + + // then + expect(queryEntries()).to.have.length(2); + expect(queryEntry('toggle-is-collection')).to.exist; + expect(queryEntry('replace-with-data-store-reference')).to.exist; + expect(queryEntry('replace-with-data-object-reference')).to.be.null; + })); + }); + + + describe('data store', function() { + + beforeEach(bootstrapModeler(diagramXMLDataElements, { modules: testModules })); + + + it('should only contain data object reference', inject(function(elementRegistry) { + + // given + var dataStoreReference = elementRegistry.get('DataStoreReference_1'); + + // when + openPopup(dataStoreReference); + + // then + expect(queryEntries()).to.have.length(1); + expect(queryEntry('toggle-is-collection')).to.be.null; + expect(queryEntry('replace-with-data-store-reference')).to.be.null; + expect(queryEntry('replace-with-data-object-reference')).to.exist; + })); + + }); + });