From 0435509952eea104e64ae16d2b9ca1d3e0ada64c Mon Sep 17 00:00:00 2001 From: Szymon Stasik Date: Sat, 12 Mar 2016 18:39:49 +0100 Subject: [PATCH 1/4] fix message to self with activation --- .../sequenceDiagram/sequenceRenderer.js | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/diagrams/sequenceDiagram/sequenceRenderer.js b/src/diagrams/sequenceDiagram/sequenceRenderer.js index 6e9f7cf5c..39f191af6 100644 --- a/src/diagrams/sequenceDiagram/sequenceRenderer.js +++ b/src/diagrams/sequenceDiagram/sequenceRenderer.js @@ -347,6 +347,18 @@ module.exports.draw = function (text, id) { svgDraw.insertArrowHead(diagram); svgDraw.insertArrowCrossHead(diagram); + function activeEnd(msg, verticalPos) { + var activationData = exports.bounds.endActivation(msg); + if(activationData.starty + 18 > verticalPos) { + activationData.starty = verticalPos - 18; + } + svgDraw.drawActivation(diagram, activationData, verticalPos, conf); + + exports.bounds.insert(activationData.startx, verticalPos -10, activationData.stopx, verticalPos); + } + + var lastMsg; + // Draw the messages/signals messages.forEach(function(msg){ var loopData; @@ -377,12 +389,12 @@ module.exports.draw = function (text, id) { // exports.bounds.bumpVerticalPos(conf.boxMargin); exports.bounds.newActivation(msg, diagram); // exports.bounds.bumpVerticalPos(conf.boxMargin + conf.boxTextMargin); + if (lastMsg && (lastMsg.from == lastMsg.to)) { + activeEnd(msg, exports.bounds.getVerticalPos() - 12); + } break; case sq.yy.LINETYPE.ACTIVE_END: - var activationData = exports.bounds.endActivation(msg); - svgDraw.drawActivation(diagram, activationData, exports.bounds.getVerticalPos(), conf); - - exports.bounds.insert(activationData.startx, exports.bounds.getVerticalPos() -10, activationData.stopx, exports.bounds.getVerticalPos()); + activeEnd(msg, exports.bounds.getVerticalPos()); break; case sq.yy.LINETYPE.LOOP_START: exports.bounds.bumpVerticalPos(conf.boxMargin); @@ -426,12 +438,14 @@ module.exports.draw = function (text, id) { break; default: try { + lastMsg = msg; exports.bounds.bumpVerticalPos(conf.messageMargin); var fromBounds = actorFlowVerticaBounds(msg.from); var toBounds = actorFlowVerticaBounds(msg.to); - var forward = fromBounds[0] < toBounds[0]; - startx = fromBounds[forward?1:0]; - stopx = toBounds[forward?0:1]; + var fromIdx = fromBounds[0] <= toBounds[0]?1:0; + var toIdx = fromBounds[0] < toBounds[0]?0:1; + startx = fromBounds[fromIdx]; + stopx = toBounds[toIdx]; drawMessage(diagram, startx, stopx, exports.bounds.getVerticalPos(), msg); } catch (e) { From c3f840126cb59521d634e9cbd15c5db2ded90e67 Mon Sep 17 00:00:00 2001 From: Szymon Stasik Date: Sat, 12 Mar 2016 19:33:35 +0100 Subject: [PATCH 2/4] fix loop/block bounds with activations through them --- src/diagrams/sequenceDiagram/sequenceRenderer.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/diagrams/sequenceDiagram/sequenceRenderer.js b/src/diagrams/sequenceDiagram/sequenceRenderer.js index 39f191af6..6900cf729 100644 --- a/src/diagrams/sequenceDiagram/sequenceRenderer.js +++ b/src/diagrams/sequenceDiagram/sequenceRenderer.js @@ -442,12 +442,15 @@ module.exports.draw = function (text, id) { exports.bounds.bumpVerticalPos(conf.messageMargin); var fromBounds = actorFlowVerticaBounds(msg.from); var toBounds = actorFlowVerticaBounds(msg.to); - var fromIdx = fromBounds[0] <= toBounds[0]?1:0; - var toIdx = fromBounds[0] < toBounds[0]?0:1; + var fromIdx = fromBounds[0] <= toBounds[0]?1:0; + var toIdx = fromBounds[0] < toBounds[0]?0:1; startx = fromBounds[fromIdx]; stopx = toBounds[toIdx]; - drawMessage(diagram, startx, stopx, exports.bounds.getVerticalPos(), msg); + var verticalPos = exports.bounds.getVerticalPos(); + drawMessage(diagram, startx, stopx, verticalPos, msg); + var allBounds = fromBounds.concat(toBounds); + exports.bounds.insert(Math.min.apply(null, allBounds), verticalPos, Math.max.apply(null, allBounds), verticalPos); } catch (e) { console.error('error while drawing message', e); } From 68b65ba5d43b6f63df714ddad5de92a68d0c65a6 Mon Sep 17 00:00:00 2001 From: Szymon Stasik Date: Sat, 12 Mar 2016 19:40:45 +0100 Subject: [PATCH 3/4] adjust activation after message to self --- src/diagrams/sequenceDiagram/sequenceRenderer.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/diagrams/sequenceDiagram/sequenceRenderer.js b/src/diagrams/sequenceDiagram/sequenceRenderer.js index 6900cf729..2c88bf3e7 100644 --- a/src/diagrams/sequenceDiagram/sequenceRenderer.js +++ b/src/diagrams/sequenceDiagram/sequenceRenderer.js @@ -350,7 +350,8 @@ module.exports.draw = function (text, id) { function activeEnd(msg, verticalPos) { var activationData = exports.bounds.endActivation(msg); if(activationData.starty + 18 > verticalPos) { - activationData.starty = verticalPos - 18; + activationData.starty = verticalPos - 6; + verticalPos += 12; } svgDraw.drawActivation(diagram, activationData, verticalPos, conf); @@ -386,12 +387,7 @@ module.exports.draw = function (text, id) { } break; case sq.yy.LINETYPE.ACTIVE_START: - // exports.bounds.bumpVerticalPos(conf.boxMargin); exports.bounds.newActivation(msg, diagram); - // exports.bounds.bumpVerticalPos(conf.boxMargin + conf.boxTextMargin); - if (lastMsg && (lastMsg.from == lastMsg.to)) { - activeEnd(msg, exports.bounds.getVerticalPos() - 12); - } break; case sq.yy.LINETYPE.ACTIVE_END: activeEnd(msg, exports.bounds.getVerticalPos()); From d0700298561999426a1c3abf1f91d82e684db47c Mon Sep 17 00:00:00 2001 From: Szymon Stasik Date: Sat, 12 Mar 2016 19:54:09 +0100 Subject: [PATCH 4/4] activations doc --- docs/content/sequenceDiagram.md | 49 +++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/docs/content/sequenceDiagram.md b/docs/content/sequenceDiagram.md index 3da5d988a..8261456b3 100755 --- a/docs/content/sequenceDiagram.md +++ b/docs/content/sequenceDiagram.md @@ -72,6 +72,55 @@ There are six types of arrows currently supported: --x which will render a dotted line with a cross at the end (async) +## Activations +It is possible to activate and deactivate an actor. (de)activation can be dedicated declarations: + +``` +sequenceDiagram + Alice->>John: Hello John, how are you? + activate John + John-->>Alice: Great! + deactivate John +``` + +Renders to the diagram below: + +```mermaid +sequenceDiagram + Alice->>John: Hello John, how are you? + activate John + John-->>Alice: Great! + deactivate John +``` + +There is also a shortcut notation by appending `+`/`-` suffix to the message arrow: + +``` +sequenceDiagram + Alice->>+John: Hello John, how are you? + John-->>-Alice: Great! +``` + +Activations can be stacked for same actor: + +``` +sequenceDiagram + Alice->>+John: Hello John, how are you? + Alice->>+John: John, can yoy hear me? + John-->>-Alice: Hi Alice, I can hear you! + John-->>-Alice: I feel great! +``` + +Stacked activations look like this: + +```mermaid +sequenceDiagram + Alice->>+John: Hello John, how are you? + Alice->>+John: John, can yoy hear me? + John-->>-Alice: Hi Alice, I can hear you! + John-->>-Alice: I feel great! +``` + ## Notes It is possible to add notes to a sequence diagram. This is done by the notation Note [ right of | left of | over ] [Actor]: Text in note content