From b0948889b23c2ddc878dcc5af60b811dfe13f776 Mon Sep 17 00:00:00 2001 From: Marcin Michniewicz <45601541+aibcmars@users.noreply.github.com> Date: Mon, 24 Aug 2020 17:47:32 +0200 Subject: [PATCH 1/4] [FEAT] Non-interrupting Start Events --- docs/bpmn-support.adoc | 19 ++++++++++ .../mxgraph/config/StyleConfigurator.ts | 2 +- src/component/mxgraph/shape/event-shapes.ts | 35 ++++++++++++------ .../parser/json/converter/ProcessConverter.ts | 5 +++ src/model/bpmn/shape/ShapeBpmnElement.ts | 2 +- ...-ts-no-visual-regression-events-1-snap.png | Bin 36062 -> 36002 bytes test/e2e/mxGraph.model.test.ts | 7 ++++ .../bpmn/model-complete-semantic.bpmn | 16 +++++++- 8 files changed, 72 insertions(+), 14 deletions(-) diff --git a/docs/bpmn-support.adoc b/docs/bpmn-support.adoc index 1c10746f55..763cd263c6 100644 --- a/docs/bpmn-support.adoc +++ b/docs/bpmn-support.adoc @@ -148,6 +148,25 @@ The event definition can be defined on the event or on the definitions. |The stroke & icon width may be adjusted |=== +[cols="1,1,4", options="header"] +.Non-interrupting Start Events +|=== +|Name +|Rendering +|Comments + +|Timer Non-interrupting Start Event +|icon:check-circle-o[] +|The icon width may be adjusted + +|MessageNon-interrupting Start Event +|icon:check-circle-o[] +|The stroke & icon width may be adjusted + +|Signal Non-interrupting Start Event +|icon:check-circle-o[] +|The stroke & icon width may be adjusted +|=== [cols="1,1,4", options="header"] .Intermediate Catch Events diff --git a/src/component/mxgraph/config/StyleConfigurator.ts b/src/component/mxgraph/config/StyleConfigurator.ts index 61d23e7c5e..fb5c775abe 100644 --- a/src/component/mxgraph/config/StyleConfigurator.ts +++ b/src/component/mxgraph/config/StyleConfigurator.ts @@ -280,7 +280,7 @@ export default class StyleConfigurator { if (bpmnElement instanceof ShapeBpmnEvent) { styleValues.set(StyleIdentifier.BPMN_STYLE_EVENT_KIND, bpmnElement.eventKind); - if (bpmnElement instanceof ShapeBpmnBoundaryEvent) { + if (bpmnElement instanceof ShapeBpmnBoundaryEvent || (bpmnElement.kind === ShapeBpmnElementKind.EVENT_START && bpmnElement.isInterrupting === false)) { styleValues.set(StyleIdentifier.BPMN_STYLE_IS_INTERRUPTING, String(bpmnElement.isInterrupting)); } } else if (bpmnElement instanceof ShapeBpmnActivity) { diff --git a/src/component/mxgraph/shape/event-shapes.ts b/src/component/mxgraph/shape/event-shapes.ts index e5a30cf0e4..76499832bf 100644 --- a/src/component/mxgraph/shape/event-shapes.ts +++ b/src/component/mxgraph/shape/event-shapes.ts @@ -81,12 +81,34 @@ abstract class EventShape extends mxEllipse { const paintIcon = this.iconPainters.get(StyleUtils.getBpmnEventKind(this.style)) || (() => this.iconPainter.paintEmptyIcon()); paintIcon(paintParameter); } + + protected setDashedOuterShapePattern(paintParameter: PaintParameter, isInterrupting: string): void { + if (isInterrupting === 'false') { + paintParameter.c.setDashed(true, false); + paintParameter.c.setDashPattern('3 2'); + } + } + + protected restoreOriginalOuterShapePattern(paintParameter: PaintParameter): void { + // Restore original configuration + // TODO missing mxShape.configureCanvas in mxgraph-type-definitions (this will replace explicit function calls) + // this.configureCanvas(c, x, y, w, h); + paintParameter.c.setDashed(StyleUtils.isDashed(this.style), StyleUtils.isFixDash(this.style)); + paintParameter.c.setDashPattern(StyleUtils.getDashPattern(this.style)); + } } export class StartEventShape extends EventShape { public constructor(bounds: mxRectangle, fill: string, stroke: string, strokewidth: number = StyleDefault.STROKE_WIDTH_THIN) { super(bounds, fill, stroke, strokewidth); } + + protected paintOuterShape(paintParameter: PaintParameter): void { + const isInterrupting = StyleUtils.getBpmnIsInterrupting(this.style); + super.setDashedOuterShapePattern(paintParameter, isInterrupting); + super.paintOuterShape(paintParameter); + super.restoreOriginalOuterShapePattern(paintParameter); + } } export class EndEventShape extends EventShape { @@ -133,17 +155,8 @@ export class BoundaryEventShape extends IntermediateEventShape { protected paintOuterShape(paintParameter: PaintParameter): void { const isInterrupting = StyleUtils.getBpmnIsInterrupting(this.style); - if (isInterrupting === 'false') { - paintParameter.c.setDashed(true, false); - paintParameter.c.setDashPattern('3 2'); - } - + super.setDashedOuterShapePattern(paintParameter, isInterrupting); super.paintOuterShape(paintParameter); - - // Restore original configuration - // TODO missing mxShape.configureCanvas in mxgraph-type-definitions (this will replace explicit function calls) - // this.configureCanvas(c, x, y, w, h); - paintParameter.c.setDashed(StyleUtils.isDashed(this.style), StyleUtils.isFixDash(this.style)); - paintParameter.c.setDashPattern(StyleUtils.getDashPattern(this.style)); + super.restoreOriginalOuterShapePattern(paintParameter); } } diff --git a/src/component/parser/json/converter/ProcessConverter.ts b/src/component/parser/json/converter/ProcessConverter.ts index fe5c5cb451..50d7478f01 100644 --- a/src/component/parser/json/converter/ProcessConverter.ts +++ b/src/component/parser/json/converter/ProcessConverter.ts @@ -197,6 +197,11 @@ export default class ProcessConverter { if (ShapeUtil.isBoundaryEvent(elementKind)) { return this.buildShapeBpmnBoundaryEvent(bpmnElement as TBoundaryEvent, eventKind); } + if (elementKind === ShapeBpmnElementKind.EVENT_START && bpmnElement.isInterrupting === false) { + // in that case we deal with the non-interrupting event in Event Sub Process + // TODO: perhaps one day we will decide to introduce ShapeBpmnSubProcessEvent but at this moment simple solution is satisfying + return new ShapeBpmnEvent(bpmnElement.id, bpmnElement.name, elementKind, eventKind, processId, bpmnElement.isInterrupting); + } return new ShapeBpmnEvent(bpmnElement.id, bpmnElement.name, elementKind, eventKind, processId); } } diff --git a/src/model/bpmn/shape/ShapeBpmnElement.ts b/src/model/bpmn/shape/ShapeBpmnElement.ts index 8a3db3aa56..a45cbdf315 100644 --- a/src/model/bpmn/shape/ShapeBpmnElement.ts +++ b/src/model/bpmn/shape/ShapeBpmnElement.ts @@ -43,7 +43,7 @@ export class ShapeBpmnSubProcess extends ShapeBpmnActivity { } export class ShapeBpmnEvent extends ShapeBpmnElement { - constructor(id: string, name: string, elementKind: BpmnEventKind, readonly eventKind: ShapeBpmnEventKind, parentId: string) { + constructor(id: string, name: string, elementKind: BpmnEventKind, readonly eventKind: ShapeBpmnEventKind, parentId: string, readonly isInterrupting?: boolean | undefined) { super(id, name, elementKind, parentId); } } diff --git a/test/e2e/__image_snapshots__/bpmn-rendering-test-ts-no-visual-regression-events-1-snap.png b/test/e2e/__image_snapshots__/bpmn-rendering-test-ts-no-visual-regression-events-1-snap.png index e6e78ab03083ed84ab1b0958ae2dfd5837da7a25..3a16b8b3c1d79da654112366a1a7f37f27bef040 100644 GIT binary patch literal 36002 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 F{|8$Xp6>tv literal 36062 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 diff --git a/test/e2e/mxGraph.model.test.ts b/test/e2e/mxGraph.model.test.ts index 08fa001f51..b5dc025576 100644 --- a/test/e2e/mxGraph.model.test.ts +++ b/test/e2e/mxGraph.model.test.ts @@ -571,6 +571,13 @@ describe('mxGraph model', () => { parentId: 'expanded_embedded_sub_process_id', }); + // Start Event in Event Sub Process + expectModelContainsShape('expanded_event_sub_process_with_non_interrupting_start_event_id_startEvent_1', { + kind: ShapeBpmnElementKind.EVENT_START, + label: 'non-interrupting start event in subprocess', + parentId: 'expanded_event_sub_process_with_non_interrupting_start_event_id', + }); + // Call Activity calling process // Expanded expectModelContainsShape('expanded_callActivity_1', { kind: ShapeBpmnElementKind.CALL_ACTIVITY, label: 'Expanded Call Activity' }); diff --git a/test/fixtures/bpmn/model-complete-semantic.bpmn b/test/fixtures/bpmn/model-complete-semantic.bpmn index 43a32938ad..b2ad64c330 100644 --- a/test/fixtures/bpmn/model-complete-semantic.bpmn +++ b/test/fixtures/bpmn/model-complete-semantic.bpmn @@ -183,6 +183,11 @@ + + + + + @@ -630,7 +635,16 @@ - + + + + + + + + + + From 7bd2abb0845037cd9523479cf84a33380baae960 Mon Sep 17 00:00:00 2001 From: Marcin Michniewicz <45601541+aibcmars@users.noreply.github.com> Date: Wed, 26 Aug 2020 15:33:33 +0200 Subject: [PATCH 2/4] [FEAT] Non-interrupting Start Events refactored --- .../images/architecture/internal-model.drawio | 2 +- .../images/architecture/internal-model.svg | 2 +- docs/bpmn-support.adoc | 2 +- .../mxgraph/config/StyleConfigurator.ts | 11 +++++++++-- src/component/mxgraph/shape/event-shapes.ts | 18 ++++-------------- .../parser/json/converter/ProcessConverter.ts | 7 +++---- src/model/bpmn/shape/ShapeBpmnElement.ts | 8 +++++++- src/model/bpmn/shape/ShapeUtil.ts | 4 ++++ test/e2e/mxGraph.model.test.ts | 12 +++++++++++- 9 files changed, 41 insertions(+), 25 deletions(-) diff --git a/docs/architecture/images/architecture/internal-model.drawio b/docs/architecture/images/architecture/internal-model.drawio index 40fdfe4a7c..0e11d4770e 100644 --- a/docs/architecture/images/architecture/internal-model.drawio +++ b/docs/architecture/images/architecture/internal-model.drawio @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/architecture/images/architecture/internal-model.svg b/docs/architecture/images/architecture/internal-model.svg index 9be0e748ac..35b6298b60 100644 --- a/docs/architecture/images/architecture/internal-model.svg +++ b/docs/architecture/images/architecture/internal-model.svg @@ -1,3 +1,3 @@ -
0..1
0..1
0..1
0..1
0..1
0..1
2..*
2..*
1
1
1
1
1
1
1
1
1..*
1..*
1
1
0
0
0..*
0..*
Extends
Extends
1
1
0..1
0..1
Edge- id: string- bpmnElement: SequenceFlow- waypoints: Waypoint[]- label: Label- messageVisibleKind: MessageVisibleKind = MessageVisibleKind.NONEShape- id: string- bpmnElement: ShapeBpmnElement- bounds: Bounds- label: Label- isHorizontal?: boolean- isMarkerVisible?: boolean- isMessageVisible?: booleanShapes- flowNodes: Shape[]- lanes: Shape[]- pools: Shape[]
Extends
Extends
Extends
Extends
1
1
Extends
Extends
1
1
1
1
0
0
Extends
Extends
Extends
Extends
Participant- name?: string- id: string- processRef?: stringShapeBpmnElement- id?: string- name?: string- kind: ShapeBpmnElementKind- parentId?: string- instantiate?: boolean = falseDefinitions- collaboration?: Collaboration- process?: Process- bpmnModel: BpmnModel+ bpmnModel(): BpmnModelCollaborationProcessBpmnModel- edges: Edge[]Label- font?: Font- bounds?: BoundsFont- name?: string- size?: number- isBold?: boolean- isItalic?: boolean- isUnderline?: boolean- isStrikeThrough?: booleanBounds- x: number- y: number- width: number- height: numberFlow- id: string- name: string- sourceRefId: string- targetRefId: string- kind: FlowKindSequenceFlow- sequenceFlowKind: SequenceFlowKindSequenceFlowKindMessageVisibleKindWaypoint- x: number- y: number
1
1
1
1
FlowKindAssociationFlow
Extends
Extends
MessageFlow
1
1
AssociationDirectionKind
0..3
0..3
ShapeBpmnEvent- eventKind: ShapeBpmnEventKindShapeBpmnBoundaryEvent- isInterrupting?: boolean = trueShapeBpmnEventKindShapeBpmnMarkerKind
Extends
Extends
ShapeBpmnSubProcess- subProcessKind: ShapeBpmnSubProcessKindShapeBpmnSubProcessKind
Extends
Extends
ShapeBpmnActivity- markers?: ShapeBpmnMarkerKind[] = []ShapeBpmnCallActivity- callActivityKind?: ShapeBpmnCallActivityKindShapeBpmnElementKindShapeBpmnCallActivityKind
1
1
Viewer does not support full SVG 1.1
\ No newline at end of file +
0..1
0..1
0..1
0..1
0..1
0..1
2..*
2..*
1
1
1
1
1
1
1
1
1..*
1..*
1
1
0
0
0..*
0..*
Extends
Extends
1
1
0..1
0..1
Edge- id: string- bpmnElement: SequenceFlow- waypoints: Waypoint[]- label: Label- messageVisibleKind: MessageVisibleKind = MessageVisibleKind.NONEShape- id: string- bpmnElement: ShapeBpmnElement- bounds: Bounds- label: Label- isHorizontal?: boolean- isMarkerVisible?: boolean- isMessageVisible?: booleanShapes- flowNodes: Shape[]- lanes: Shape[]- pools: Shape[]
Extends
Extends
Extends
Extends
1
1
Extends
Extends
1
1
1
1
0
0
Extends
Extends
Extends
Extends
Participant- name?: string- id: string- processRef?: stringShapeBpmnElement- id?: string- name?: string- kind: ShapeBpmnElementKind- parentId?: string- instantiate?: boolean = falseDefinitions- collaboration?: Collaboration- process?: Process- bpmnModel: BpmnModel+ bpmnModel(): BpmnModelCollaborationProcessBpmnModel- edges: Edge[]Label- font?: Font- bounds?: BoundsFont- name?: string- size?: number- isBold?: boolean- isItalic?: boolean- isUnderline?: boolean- isStrikeThrough?: booleanBounds- x: number- y: number- width: number- height: numberFlow- id: string- name: string- sourceRefId: string- targetRefId: string- kind: FlowKindSequenceFlow- sequenceFlowKind: SequenceFlowKindSequenceFlowKindMessageVisibleKindWaypoint- x: number- y: number
1
1
1
1
FlowKindAssociationFlow
Extends
Extends
MessageFlow
1
1
AssociationDirectionKind
0..3
0..3
ShapeBpmnEvent- eventKind: ShapeBpmnEventKindShapeBpmnEventKindShapeBpmnMarkerKind
Extends
Extends
ShapeBpmnSubProcess- subProcessKind: ShapeBpmnSubProcessKindShapeBpmnSubProcessKind
Extends
Extends
ShapeBpmnActivity- markers?: ShapeBpmnMarkerKind[] = []ShapeBpmnCallActivity- callActivityKind?: ShapeBpmnCallActivityKindShapeBpmnElementKindShapeBpmnCallActivityKind
1
1
ShapeBpmnBoundaryEvent- isInterrupting?: boolean = trueShapeBpmnStartEvent- isInterrupting?: boolean
Extends
Extends
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/docs/bpmn-support.adoc b/docs/bpmn-support.adoc index 763cd263c6..e74d582b44 100644 --- a/docs/bpmn-support.adoc +++ b/docs/bpmn-support.adoc @@ -149,7 +149,7 @@ The event definition can be defined on the event or on the definitions. |=== [cols="1,1,4", options="header"] -.Non-interrupting Start Events +.Event Sub-Process Non-Interrupting Start Events |=== |Name |Rendering diff --git a/src/component/mxgraph/config/StyleConfigurator.ts b/src/component/mxgraph/config/StyleConfigurator.ts index fb5c775abe..739c5fff39 100644 --- a/src/component/mxgraph/config/StyleConfigurator.ts +++ b/src/component/mxgraph/config/StyleConfigurator.ts @@ -20,7 +20,14 @@ import { MarkerIdentifier, StyleDefault, StyleIdentifier } from '../StyleUtils'; import Shape from '../../../model/bpmn/shape/Shape'; import Edge from '../../../model/bpmn/edge/Edge'; import Bounds from '../../../model/bpmn/Bounds'; -import { ShapeBpmnActivity, ShapeBpmnBoundaryEvent, ShapeBpmnCallActivity, ShapeBpmnEvent, ShapeBpmnSubProcess } from '../../../model/bpmn/shape/ShapeBpmnElement'; +import { + ShapeBpmnActivity, + ShapeBpmnBoundaryEvent, + ShapeBpmnCallActivity, + ShapeBpmnEvent, + ShapeBpmnStartEvent, + ShapeBpmnSubProcess, +} from '../../../model/bpmn/shape/ShapeBpmnElement'; import { Font } from '../../../model/bpmn/Label'; import { FlowKind } from '../../../model/bpmn/edge/FlowKind'; import { AssociationFlow, SequenceFlow } from '../../../model/bpmn/edge/Flow'; @@ -280,7 +287,7 @@ export default class StyleConfigurator { if (bpmnElement instanceof ShapeBpmnEvent) { styleValues.set(StyleIdentifier.BPMN_STYLE_EVENT_KIND, bpmnElement.eventKind); - if (bpmnElement instanceof ShapeBpmnBoundaryEvent || (bpmnElement.kind === ShapeBpmnElementKind.EVENT_START && bpmnElement.isInterrupting === false)) { + if (bpmnElement instanceof ShapeBpmnBoundaryEvent || bpmnElement instanceof ShapeBpmnStartEvent) { styleValues.set(StyleIdentifier.BPMN_STYLE_IS_INTERRUPTING, String(bpmnElement.isInterrupting)); } } else if (bpmnElement instanceof ShapeBpmnActivity) { diff --git a/src/component/mxgraph/shape/event-shapes.ts b/src/component/mxgraph/shape/event-shapes.ts index 76499832bf..0ac43233fb 100644 --- a/src/component/mxgraph/shape/event-shapes.ts +++ b/src/component/mxgraph/shape/event-shapes.ts @@ -59,7 +59,11 @@ abstract class EventShape extends mxEllipse { public paintVertexShape(c: mxAbstractCanvas2D, x: number, y: number, w: number, h: number): void { this.markNonFullyRenderedEvents(c); const paintParameter = buildPaintParameter(c, x, y, w, h, this, 0.25, this.withFilledIcon); + + this.setDashedOuterShapePattern(paintParameter, StyleUtils.getBpmnIsInterrupting(this.style)); this.paintOuterShape(paintParameter); + this.restoreOriginalOuterShapePattern(paintParameter); + this.paintInnerShape(paintParameter); } @@ -102,13 +106,6 @@ export class StartEventShape extends EventShape { public constructor(bounds: mxRectangle, fill: string, stroke: string, strokewidth: number = StyleDefault.STROKE_WIDTH_THIN) { super(bounds, fill, stroke, strokewidth); } - - protected paintOuterShape(paintParameter: PaintParameter): void { - const isInterrupting = StyleUtils.getBpmnIsInterrupting(this.style); - super.setDashedOuterShapePattern(paintParameter, isInterrupting); - super.paintOuterShape(paintParameter); - super.restoreOriginalOuterShapePattern(paintParameter); - } } export class EndEventShape extends EventShape { @@ -152,11 +149,4 @@ export class BoundaryEventShape extends IntermediateEventShape { public constructor(bounds: mxRectangle, fill: string, stroke: string, strokewidth?: number) { super(bounds, fill, stroke, strokewidth); } - - protected paintOuterShape(paintParameter: PaintParameter): void { - const isInterrupting = StyleUtils.getBpmnIsInterrupting(this.style); - super.setDashedOuterShapePattern(paintParameter, isInterrupting); - super.paintOuterShape(paintParameter); - super.restoreOriginalOuterShapePattern(paintParameter); - } } diff --git a/src/component/parser/json/converter/ProcessConverter.ts b/src/component/parser/json/converter/ProcessConverter.ts index 50d7478f01..67e667a340 100644 --- a/src/component/parser/json/converter/ProcessConverter.ts +++ b/src/component/parser/json/converter/ProcessConverter.ts @@ -19,6 +19,7 @@ import ShapeBpmnElement, { ShapeBpmnBoundaryEvent, ShapeBpmnCallActivity, ShapeBpmnEvent, + ShapeBpmnStartEvent, ShapeBpmnSubProcess, } from '../../../../model/bpmn/shape/ShapeBpmnElement'; import { ShapeBpmnElementKind } from '../../../../model/bpmn/shape/ShapeBpmnElementKind'; @@ -197,10 +198,8 @@ export default class ProcessConverter { if (ShapeUtil.isBoundaryEvent(elementKind)) { return this.buildShapeBpmnBoundaryEvent(bpmnElement as TBoundaryEvent, eventKind); } - if (elementKind === ShapeBpmnElementKind.EVENT_START && bpmnElement.isInterrupting === false) { - // in that case we deal with the non-interrupting event in Event Sub Process - // TODO: perhaps one day we will decide to introduce ShapeBpmnSubProcessEvent but at this moment simple solution is satisfying - return new ShapeBpmnEvent(bpmnElement.id, bpmnElement.name, elementKind, eventKind, processId, bpmnElement.isInterrupting); + if (ShapeUtil.isStartEvent(elementKind)) { + return new ShapeBpmnStartEvent(bpmnElement.id, bpmnElement.name, eventKind, processId, bpmnElement.isInterrupting); } return new ShapeBpmnEvent(bpmnElement.id, bpmnElement.name, elementKind, eventKind, processId); } diff --git a/src/model/bpmn/shape/ShapeBpmnElement.ts b/src/model/bpmn/shape/ShapeBpmnElement.ts index a45cbdf315..a5b6a6d562 100644 --- a/src/model/bpmn/shape/ShapeBpmnElement.ts +++ b/src/model/bpmn/shape/ShapeBpmnElement.ts @@ -43,11 +43,17 @@ export class ShapeBpmnSubProcess extends ShapeBpmnActivity { } export class ShapeBpmnEvent extends ShapeBpmnElement { - constructor(id: string, name: string, elementKind: BpmnEventKind, readonly eventKind: ShapeBpmnEventKind, parentId: string, readonly isInterrupting?: boolean | undefined) { + constructor(id: string, name: string, elementKind: BpmnEventKind, readonly eventKind: ShapeBpmnEventKind, parentId: string) { super(id, name, elementKind, parentId); } } +export class ShapeBpmnStartEvent extends ShapeBpmnEvent { + constructor(id: string, name: string, eventKind: ShapeBpmnEventKind, parentId: string, readonly isInterrupting?: boolean) { + super(id, name, ShapeBpmnElementKind.EVENT_START, eventKind, parentId); + } +} + export class ShapeBpmnBoundaryEvent extends ShapeBpmnEvent { constructor(id: string, name: string, eventKind: ShapeBpmnEventKind, parentId: string, readonly isInterrupting: boolean = true) { super(id, name, ShapeBpmnElementKind.EVENT_BOUNDARY, eventKind, parentId); diff --git a/src/model/bpmn/shape/ShapeUtil.ts b/src/model/bpmn/shape/ShapeUtil.ts index fc661a718d..c991507216 100644 --- a/src/model/bpmn/shape/ShapeUtil.ts +++ b/src/model/bpmn/shape/ShapeUtil.ts @@ -66,6 +66,10 @@ export default class ShapeUtil { return ShapeBpmnElementKind.EVENT_BOUNDARY === kind; } + public static isStartEvent(kind: ShapeBpmnElementKind): boolean { + return ShapeBpmnElementKind.EVENT_START === kind; + } + public static canHaveNoneEvent(kind: ShapeBpmnElementKind): boolean { return ShapeBpmnElementKind.EVENT_INTERMEDIATE_THROW === kind || ShapeBpmnElementKind.EVENT_END === kind || ShapeBpmnElementKind.EVENT_START === kind; } diff --git a/test/e2e/mxGraph.model.test.ts b/test/e2e/mxGraph.model.test.ts index b5dc025576..4d0190741c 100644 --- a/test/e2e/mxGraph.model.test.ts +++ b/test/e2e/mxGraph.model.test.ts @@ -67,6 +67,9 @@ export interface ExpectedSequenceFlowModelElement extends ExpectedEdgeModelEleme export interface ExpectedBoundaryEventModelElement extends ExpectedEventModelElement { isInterrupting?: boolean; } +export interface ExpectedStartEventModelElement extends ExpectedEventModelElement { + isInterrupting?: boolean; +} function expectGeometry(cell: mxCell, geometry: mxGeometry): void { const cellGeometry = cell.getGeometry(); @@ -188,6 +191,11 @@ describe('mxGraph model', () => { expect(cell.style).toContain(`bpmn.isInterrupting=${boundaryEventModelElement.isInterrupting}`); } + function expectModelContainsBpmnStartEvent(cellId: string, startEventModelElement: ExpectedStartEventModelElement): void { + const cell = expectModelContainsBpmnEvent(cellId, { ...startEventModelElement, kind: ShapeBpmnElementKind.EVENT_START }); + expect(cell.style).toContain(`bpmn.isInterrupting=${startEventModelElement.isInterrupting}`); + } + function expectModelContainsSubProcess(cellId: string, subProcessModelElement: ExpectedSubProcessModelElement): mxCell { const cell = expectModelContainsShape(cellId, { ...subProcessModelElement, @@ -572,10 +580,12 @@ describe('mxGraph model', () => { }); // Start Event in Event Sub Process - expectModelContainsShape('expanded_event_sub_process_with_non_interrupting_start_event_id_startEvent_1', { + expectModelContainsBpmnStartEvent('expanded_event_sub_process_with_non_interrupting_start_event_id_startEvent_1', { kind: ShapeBpmnElementKind.EVENT_START, + eventKind: ShapeBpmnEventKind.TIMER, label: 'non-interrupting start event in subprocess', parentId: 'expanded_event_sub_process_with_non_interrupting_start_event_id', + isInterrupting: false, }); // Call Activity calling process From a4bbf4d3603e58d9ed87fba44a0febc8ec2f93d8 Mon Sep 17 00:00:00 2001 From: Marcin Michniewicz <45601541+aibcmars@users.noreply.github.com> Date: Wed, 26 Aug 2020 17:15:00 +0200 Subject: [PATCH 3/4] [FEAT] Non-interrupting Start Events test for style computing --- .../mxgraph/config/StyleConfigurator.test.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/test/unit/component/mxgraph/config/StyleConfigurator.test.ts b/test/unit/component/mxgraph/config/StyleConfigurator.test.ts index 4232ed5107..5414b1210c 100644 --- a/test/unit/component/mxgraph/config/StyleConfigurator.test.ts +++ b/test/unit/component/mxgraph/config/StyleConfigurator.test.ts @@ -21,6 +21,7 @@ import ShapeBpmnElement, { ShapeBpmnBoundaryEvent, ShapeBpmnCallActivity, ShapeBpmnEvent, + ShapeBpmnStartEvent, ShapeBpmnSubProcess, } from '../../../../../src/model/bpmn/shape/ShapeBpmnElement'; import { ShapeBpmnElementKind } from '../../../../../src/model/bpmn/shape/ShapeBpmnElementKind'; @@ -79,6 +80,10 @@ function newShapeBpmnBoundaryEvent(eventKind: ShapeBpmnEventKind, isInterrupting return new ShapeBpmnBoundaryEvent('id', 'name', eventKind, null, isInterrupting); } +function newShapeBpmnStartEvent(eventKind: ShapeBpmnEventKind, isInterrupting: boolean): ShapeBpmnStartEvent { + return new ShapeBpmnStartEvent('id', 'name', eventKind, null, isInterrupting); +} + function newShapeBpmnSubProcess(subProcessKind: ShapeBpmnSubProcessKind, marker?: ShapeBpmnMarkerKind[]): ShapeBpmnSubProcess { return new ShapeBpmnSubProcess('id', 'name', subProcessKind, null, marker); } @@ -236,6 +241,23 @@ describe('mxgraph renderer', () => { }); }); + describe('compute style - boundary events', () => { + it('interrupting message', () => { + const shape = newShape(newShapeBpmnStartEvent(ShapeBpmnEventKind.MESSAGE, true), newLabel({ name: 'Arial' })); + expect(computeStyle(shape)).toEqual('startEvent;bpmn.eventKind=message;bpmn.isInterrupting=true;fontFamily=Arial'); + }); + + it('non interrupting timer', () => { + const shape = newShape(newShapeBpmnStartEvent(ShapeBpmnEventKind.TIMER, false), newLabel({ isItalic: true })); + expect(computeStyle(shape)).toEqual('startEvent;bpmn.eventKind=timer;bpmn.isInterrupting=false;fontStyle=2'); + }); + + it('cancel with undefined interrupting value', () => { + const shape = newShape(newShapeBpmnStartEvent(ShapeBpmnEventKind.CANCEL, undefined), newLabel({ isStrikeThrough: true })); + expect(computeStyle(shape)).toEqual('startEvent;bpmn.eventKind=cancel;bpmn.isInterrupting=undefined;fontStyle=8'); + }); + }); + describe('compute style - sub-processes', () => { describe.each([ ['expanded', []], From 913bc7edbf7aea1e922d6f64c59ff75d076ebfe2 Mon Sep 17 00:00:00 2001 From: Marcin Michniewicz <45601541+aibcmars@users.noreply.github.com> Date: Wed, 26 Aug 2020 17:34:16 +0200 Subject: [PATCH 4/4] [FEAT] Non-interrupting Start Events - test for style computing --- src/component/mxgraph/config/StyleConfigurator.ts | 2 +- test/unit/component/mxgraph/config/StyleConfigurator.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/component/mxgraph/config/StyleConfigurator.ts b/src/component/mxgraph/config/StyleConfigurator.ts index 739c5fff39..0a273b1312 100644 --- a/src/component/mxgraph/config/StyleConfigurator.ts +++ b/src/component/mxgraph/config/StyleConfigurator.ts @@ -287,7 +287,7 @@ export default class StyleConfigurator { if (bpmnElement instanceof ShapeBpmnEvent) { styleValues.set(StyleIdentifier.BPMN_STYLE_EVENT_KIND, bpmnElement.eventKind); - if (bpmnElement instanceof ShapeBpmnBoundaryEvent || bpmnElement instanceof ShapeBpmnStartEvent) { + if (bpmnElement instanceof ShapeBpmnBoundaryEvent || (bpmnElement instanceof ShapeBpmnStartEvent && bpmnElement.isInterrupting !== undefined)) { styleValues.set(StyleIdentifier.BPMN_STYLE_IS_INTERRUPTING, String(bpmnElement.isInterrupting)); } } else if (bpmnElement instanceof ShapeBpmnActivity) { diff --git a/test/unit/component/mxgraph/config/StyleConfigurator.test.ts b/test/unit/component/mxgraph/config/StyleConfigurator.test.ts index 5414b1210c..537bcff73b 100644 --- a/test/unit/component/mxgraph/config/StyleConfigurator.test.ts +++ b/test/unit/component/mxgraph/config/StyleConfigurator.test.ts @@ -241,7 +241,7 @@ describe('mxgraph renderer', () => { }); }); - describe('compute style - boundary events', () => { + describe('compute style - event sub-process start event', () => { it('interrupting message', () => { const shape = newShape(newShapeBpmnStartEvent(ShapeBpmnEventKind.MESSAGE, true), newLabel({ name: 'Arial' })); expect(computeStyle(shape)).toEqual('startEvent;bpmn.eventKind=message;bpmn.isInterrupting=true;fontFamily=Arial'); @@ -254,7 +254,7 @@ describe('mxgraph renderer', () => { it('cancel with undefined interrupting value', () => { const shape = newShape(newShapeBpmnStartEvent(ShapeBpmnEventKind.CANCEL, undefined), newLabel({ isStrikeThrough: true })); - expect(computeStyle(shape)).toEqual('startEvent;bpmn.eventKind=cancel;bpmn.isInterrupting=undefined;fontStyle=8'); + expect(computeStyle(shape)).toEqual('startEvent;bpmn.eventKind=cancel;fontStyle=8'); }); });