Usage ===== Flowchart allows the creation Flowchart diagrams. A simple flowchart consists of `Nodes` and `Edges` (links) between them. More complex flowcharts may include sub-graphs to group flowchart nodes. Nodes ----- There are three (3) types of node: * Node - has a shape and optionally descriptive text * IconNode - The node is an icon * ImageNode - The node is an image Edges ----- Edges are links between nodes and/or sub-graphs. Edges can have a variety of line styles, arrowheads, and - if an edge is given an `EdgeId` - CSS styles. Sub-graphs ---------- Sub-graphs allow grouping of nodes and other sub-graphs; sub-graphs can be nested to any depth. Example ------- PHP +++ .. code-block:: php $start = new Node(NodeShape::circle, 'start'); $stop = new Node(NodeShape::doubleCircle, 'stop'); $r = new subGraph('Reception', 'r'); $isRegistered = new Node(NodeShape::decision, 'isRegistered'); $register = new Node(NodeShape::document, 'register'); $n = new subGraph('Nurse', 'n'); $nurse = new Node(NodeShape::start, 'nurse'); $nurseAvailable = new Node(NodeShape::decision, 'nurseAvailable'); $wfn = new Node(NodeShape::delay, 'wfn'); $assessPatient = new Node(NodeShape::process, 'assessPatient'); $doctorNeeded = new Node(NodeShape::decision, 'doctorNeeded'); $treatPatient = new Node(NodeShape::process, 'treatPatient'); $assignDoctor = new Node(NodeShape::priority, 'assignDoctor'); $d = new subGraph('Doctor', 'd'); $doctorAvailable = new Node(NodeShape::decision,'doctorAvailable'); $wfd = new Node(NodeShape::delay,'wfd'); $consultation = new Node(NodeShape::process,'consultation'); $medicationNeeded = new Node(NodeShape::decision,'medicationNeeded'); $writePrescription = new Node(NodeShape::document,'writePrescription'); $followUpNeeded = new Node(NodeShape::decision,'followUpNeeded'); $makeAppointment = new Node(NodeShape::document,'makeAppointment'); Mermaid::create(Flowchart::class) ->withNode( $start->withText('Patient arrives'), $stop->withText('Patient leaves') ) ->withSubGraph( $r ->withNode( $isRegistered->withText('Patient registered?'), $register->withText('Register patient') ) ->withEdge( new Edge($start, $isRegistered, EdgeStyle::thick), (new Edge($isRegistered, $register))->withText('No'), (new Edge($isRegistered, $nurse))->withText('Yes'), new Edge($register, $isRegistered) ) , $n ->withNode( $nurse->withText('Patient assigned to nurse'), $nurseAvailable->withText('Nurse available?'), $wfn->withText('Wait for nurse'), $assessPatient->withText('Assess patient'), $doctorNeeded->withText('Doctor needed?'), $treatPatient->withText('Treat patient'), $assignDoctor->withText('Assign doctor') ) ->withEdge( new Edge($nurse, $nurseAvailable), (new Edge($nurseAvailable, $wfn))->withText('No'), (new Edge($nurseAvailable, $assessPatient))->withText('Yes'), new Edge($wfn, $nurseAvailable), new Edge($assessPatient, $doctorNeeded, EdgeStyle::thick, arrowhead: Arrowhead::circle), (new Edge($doctorNeeded, $treatPatient))->withText('No'), new Edge($treatPatient, $stop, EdgeStyle::thick), (new Edge($doctorNeeded, $assignDoctor))->withText('Yes'), new Edge($assignDoctor, $doctorAvailable), ) , $d ->withNode( $doctorAvailable->withText('Doctor available?'), $wfd->withText('Wait for doctor'), $consultation->withText('Consultation'), $medicationNeeded->withText('Medication needed?'), $writePrescription->withText('Write prescription'), $followUpNeeded->withText('Follow-up needed?'), $makeAppointment->withText('Make appointment'), ) ->withEdge( (new Edge($doctorAvailable, $wfd))->withText('No'), (new Edge($doctorAvailable, $consultation))->withText('Yes'), new Edge($wfd, $doctorAvailable), new Edge($consultation, $medicationNeeded, arrowhead: Arrowhead::cross), (new Edge($medicationNeeded, $followUpNeeded))->withText('No'), (new Edge($medicationNeeded, $writePrescription))->withText('Yes'), new Edge($writePrescription, $followUpNeeded), (new Edge($followUpNeeded, $makeAppointment))->withText('Yes'), (new Edge($followUpNeeded, $stop))->withText('No'), new Edge($makeAppointment, $stop) ) ) ->render() ; Generated Mermaid +++++++++++++++++ .. code-block:: html
flowchart LR
subgraph r [Reception]
direction TB
isRegistered@{"shape":"decision","label":"Patient registered?"}
register@{"shape":"document","label":"Register patient"}
start ==> isRegistered
isRegistered -->|"No"| register
isRegistered -->|"Yes"| nurse
register --> isRegistered
end
subgraph n [Nurse]
direction TB
nurse@{"shape":"start","label":"Patient assigned to nurse"}
nurseAvailable@{"shape":"decision","label":"Nurse available?"}
wfn@{"shape":"delay","label":"Wait for nurse"}
assessPatient@{"shape":"process","label":"Assess patient"}
doctorNeeded@{"shape":"decision","label":"Doctor needed?"}
treatPatient@{"shape":"process","label":"Treat patient"}
assignDoctor@{"shape":"priority","label":"Assign doctor"}
nurse --> nurseAvailable
nurseAvailable -->|"No"| wfn
nurseAvailable -->|"Yes"| assessPatient
wfn --> nurseAvailable
assessPatient ==o doctorNeeded
doctorNeeded -->|"No"| treatPatient
treatPatient ==> stop
doctorNeeded -->|"Yes"| assignDoctor
assignDoctor --> doctorAvailable
end
subgraph d [Doctor]
direction TB
doctorAvailable@{"shape":"decision","label":"Doctor available?"}
wfd@{"shape":"delay","label":"Wait for doctor"}
consultation@{"shape":"process","label":"Consultation"}
medicationNeeded@{"shape":"decision","label":"Medication needed?"}
writePrescription@{"shape":"document","label":"Write prescription"}
followUpNeeded@{"shape":"decision","label":"Follow-up needed?"}
makeAppointment@{"shape":"document","label":"Make appointment"}
doctorAvailable -->|"No"| wfd
doctorAvailable -->|"Yes"| consultation
wfd --> doctorAvailable
consultation --x medicationNeeded
medicationNeeded -->|"No"| followUpNeeded
medicationNeeded -->|"Yes"| writePrescription
writePrescription --> followUpNeeded
followUpNeeded -->|"Yes"| makeAppointment
followUpNeeded -->|"No"| stop
makeAppointment --> stop
end
start@{"shape":"circle","label":"Patient arrives"}
stop@{"shape":"double-circle","label":"Patient leaves"}
Mermaid Diagram
+++++++++++++++
.. mermaid::
flowchart LR
subgraph r [Reception]
direction TB
isRegistered@{"shape":"decision","label":"Patient registered?"}
register@{"shape":"document","label":"Register patient"}
start ==> isRegistered
isRegistered -->|"No"| register
isRegistered -->|"Yes"| nurse
register --> isRegistered
end
subgraph n [Nurse]
direction TB
nurse@{"shape":"start","label":"Patient assigned to nurse"}
nurseAvailable@{"shape":"decision","label":"Nurse available?"}
wfn@{"shape":"delay","label":"Wait for nurse"}
assessPatient@{"shape":"process","label":"Assess patient"}
doctorNeeded@{"shape":"decision","label":"Doctor needed?"}
treatPatient@{"shape":"process","label":"Treat patient"}
assignDoctor@{"shape":"priority","label":"Assign doctor"}
nurse --> nurseAvailable
nurseAvailable -->|"No"| wfn
nurseAvailable -->|"Yes"| assessPatient
wfn --> nurseAvailable
assessPatient ==o doctorNeeded
doctorNeeded -->|"No"| treatPatient
treatPatient ==> stop
doctorNeeded -->|"Yes"| assignDoctor
assignDoctor --> doctorAvailable
end
subgraph d [Doctor]
direction TB
doctorAvailable@{"shape":"decision","label":"Doctor available?"}
wfd@{"shape":"delay","label":"Wait for doctor"}
consultation@{"shape":"process","label":"Consultation"}
medicationNeeded@{"shape":"decision","label":"Medication needed?"}
writePrescription@{"shape":"document","label":"Write prescription"}
followUpNeeded@{"shape":"decision","label":"Follow-up needed?"}
makeAppointment@{"shape":"document","label":"Make appointment"}
doctorAvailable -->|"No"| wfd
doctorAvailable -->|"Yes"| consultation
wfd --> doctorAvailable
consultation --x medicationNeeded
medicationNeeded -->|"No"| followUpNeeded
medicationNeeded -->|"Yes"| writePrescription
writePrescription --> followUpNeeded
followUpNeeded -->|"Yes"| makeAppointment
followUpNeeded -->|"No"| stop
makeAppointment --> stop
end
start@{"shape":"circle","label":"Patient arrives"}
stop@{"shape":"double-circle","label":"Patient leaves"}