Private/ConvertTo-WorkflowMermaid.ps1
|
function ConvertTo-WorkflowMermaid { param( $WorkflowRecord ) $workflowNodeId = ConvertTo-MermaidNodeId -Seed ("workflow_$($WorkflowRecord.Id)") $triggerNodeId = ConvertTo-MermaidNodeId -Seed ("trigger_$($WorkflowRecord.Id)") $scopeNodeId = ConvertTo-MermaidNodeId -Seed ("scope_$($WorkflowRecord.Id)") $diagramLines = [System.Collections.Generic.List[string]]::new() $diagramLines.Add('flowchart TD') $diagramLines.Add((' {0}["{1}<br/>{2}"]' -f $workflowNodeId, (ConvertTo-MermaidSafeText -Value $WorkflowRecord.DisplayName), (ConvertTo-MermaidSafeText -Value $WorkflowRecord.Category))) $diagramLines.Add((' {0}["Trigger<br/>{1}"]' -f $triggerNodeId, (ConvertTo-MermaidSafeText -Value $WorkflowRecord.TriggerSummary))) $diagramLines.Add((' {0}["Scope<br/>{1}"]' -f $scopeNodeId, (ConvertTo-MermaidSafeText -Value $WorkflowRecord.ScopeSummary))) $diagramLines.Add(" $workflowNodeId --> $triggerNodeId") $diagramLines.Add(" $workflowNodeId --> $scopeNodeId") $previousTaskNodeId = $null foreach ($task in $WorkflowRecord.Tasks) { $taskNodeId = ConvertTo-MermaidNodeId -Seed ("task_$($WorkflowRecord.Id)_$($task.ExecutionSequence)") $taskType = if ($task.CustomExtension) { 'Custom extension' } else { $task.DefinitionDisplayName } $taskLabelParts = [System.Collections.Generic.List[string]]::new() $taskLabelParts.Add("[$($task.ExecutionSequence)] $(ConvertTo-MermaidSafeText -Value $task.DisplayName)") $taskLabelParts.Add((ConvertTo-MermaidSafeText -Value $taskType)) if ($task.CustomExtension) { $taskLabelParts.Add("Logic App: $(ConvertTo-MermaidSafeText -Value $task.CustomExtension.LogicAppName)") } $diagramLines.Add((' {0}["{1}"]' -f $taskNodeId, ($taskLabelParts -join '<br/>'))) if ($null -eq $previousTaskNodeId) { $diagramLines.Add(" $workflowNodeId --> $taskNodeId") } else { $diagramLines.Add(" $previousTaskNodeId --> $taskNodeId") } $className = if ($task.IsEnabled) { 'enabledTask' } else { 'disabledTask' } if ($task.CustomExtension) { $className = 'customTask' } $diagramLines.Add(" class $taskNodeId $className") $previousTaskNodeId = $taskNodeId } $diagramLines.Add(" class $workflowNodeId workflowNode") $diagramLines.Add(" class $triggerNodeId metaNode") $diagramLines.Add(" class $scopeNodeId metaNode") $diagramLines.Add(' classDef workflowNode fill:#16324f,color:#ffffff,stroke:#16324f,stroke-width:2px') $diagramLines.Add(' classDef metaNode fill:#eef4ed,color:#132a13,stroke:#4f772d,stroke-width:1px') $diagramLines.Add(' classDef enabledTask fill:#d9f2e6,color:#0b3d2e,stroke:#2d6a4f,stroke-width:1px') $diagramLines.Add(' classDef disabledTask fill:#f3f4f6,color:#3f3f46,stroke:#a1a1aa,stroke-dasharray: 5 5') $diagramLines.Add(' classDef customTask fill:#ffe8cc,color:#7c2d12,stroke:#c2410c,stroke-width:1px') return ($diagramLines -join [Environment]::NewLine) } |