diff --git a/lib/features/drilldown/DrilldownBreadcrumbs.js b/lib/features/drilldown/DrilldownBreadcrumbs.js index de9ec1b5..930d49a5 100644 --- a/lib/features/drilldown/DrilldownBreadcrumbs.js +++ b/lib/features/drilldown/DrilldownBreadcrumbs.js @@ -4,9 +4,7 @@ import { find } from 'min-dash'; import { escapeHTML } from 'diagram-js/lib/util/EscapeUtil'; import { getBusinessObject, is } from '../../util/ModelUtil'; import { - getPlaneIdFromShape, - getShapeIdFromPlane, - isPlane + getPlaneIdFromShape } from '../../util/DrilldownUtil'; var OPEN_CLASS = 'bjs-breadcrumbs-shown'; @@ -28,19 +26,6 @@ export default function DrilldownBreadcrumbs(eventBus, elementRegistry, overlays var boParents = []; - // update primary shape if name or ID of the plane changes - eventBus.on('element.changed', function(e) { - var shape = e.element; - - if (!isPlane(shape)) { - return; - } - - var primary = elementRegistry.get(getShapeIdFromPlane(shape)); - - primary && eventBus.fire('element.changed', { element: primary }); - }); - // update breadcrumbs if name or ID of the primary shape changes eventBus.on('element.changed', function(e) { var shape = e.element, diff --git a/lib/features/modeling/behavior/SubProcessPlaneBehavior.js b/lib/features/modeling/behavior/SubProcessPlaneBehavior.js index b36297ca..c1448a91 100644 --- a/lib/features/modeling/behavior/SubProcessPlaneBehavior.js +++ b/lib/features/modeling/behavior/SubProcessPlaneBehavior.js @@ -239,6 +239,27 @@ export default function SubProcessPlaneBehavior( elementRegistry.updateId(planeElement, toPlaneId(oldId)); }, true); + // re-throw element.changed to re-render primary shape if associated plane has + // changed (e.g. bpmn:name property has changed) + eventBus.on('element.changed', function(context) { + var element = context.element; + + if (!isPlane(element)) { + return; + } + + var plane = element; + + var primaryShape = elementRegistry.get(getShapeIdFromPlane(plane)); + + // do not re-throw if no associated primary shape (e.g. bpmn:Process) + if (!primaryShape || primaryShape === plane) { + return; + } + + eventBus.fire('element.changed', { element: primaryShape }); + }); + // create/remove plane for the subprocess this.executed('shape.toggleCollapse', LOW_PRIORITY, function(context) { diff --git a/test/spec/features/drilldown/DrilldownIntegrationSpec.js b/test/spec/features/drilldown/DrilldownIntegrationSpec.js index c9a6328e..7f6e42dc 100644 --- a/test/spec/features/drilldown/DrilldownIntegrationSpec.js +++ b/test/spec/features/drilldown/DrilldownIntegrationSpec.js @@ -151,6 +151,27 @@ describe('features - drilldown', function() { }) ); + + it('should update on process name change', + inject(function(canvas, elementRegistry, modeling) { + + // given + canvas.setRootElement(canvas.findRoot('collapsedProcess_2_plane')); + var shape = elementRegistry.get('rootProcess'); + + // when + modeling.updateProperties(shape, { name: 'new name' }); + + // then + expectBreadcrumbs([ + 'new name', + 'Collapsed Process', + 'Expanded Process', + 'Collapsed Process 2' + ]); + }) + ); + }); }); diff --git a/test/spec/features/modeling/behavior/SubProcessPlaneBehaviorSpec.js b/test/spec/features/modeling/behavior/SubProcessPlaneBehaviorSpec.js index 69161537..9712741e 100644 --- a/test/spec/features/modeling/behavior/SubProcessPlaneBehaviorSpec.js +++ b/test/spec/features/modeling/behavior/SubProcessPlaneBehaviorSpec.js @@ -336,6 +336,27 @@ describe('features/modeling/behavior - subprocess planes', function() { expect(plane.id).to.equal('new_name_plane'); })); + + it('should rerender primary shape name when plane is changed', + inject(function(modeling, elementRegistry, eventBus) { + + // given + var subProcess = elementRegistry.get('SubProcess_2'), + plane = elementRegistry.get('SubProcess_2_plane'); + + var changedSpy = sinon.spy(); + + eventBus.on('element.changed', 5000, changedSpy); + + // when + modeling.updateProperties(plane, { name: 'new name' }); + + // then + expect(changedSpy).to.have.been.calledTwice; + expect(changedSpy.secondCall.args[0].element).to.eql(subProcess); + }) + ); + });