@@ -103,6 +103,60 @@ defmodule ZoutWeb.ProjectView do
103103 defp json_stop_ping ( % { stop: nil } ) , do: nil
104104 defp json_stop_ping ( % { stop: s } ) , do: NaiveDateTime . to_iso8601 ( s )
105105
106+ def render_dotx_graph ( projects_and_pings ) do
107+ nodes =
108+ projects_and_pings
109+ |> Enum . map ( fn % { project: project , ping: ping } ->
110+ % Dotx.Node {
111+ id: [ project . slug ] ,
112+ attrs: % {
113+ "href" => ~p" /projects/#{ project . id } " ,
114+ "label" => % Dotx.HTML {
115+ html: """
116+ <table border="0">
117+ <tr><td><b>#{ project . name } </b></td></tr>
118+ <tr><td><font point-size="8">#{ render_status ( ping , false ) } </font></td></tr>
119+ </table>
120+ """
121+ } ,
122+ "fontcolor" => text_colour ( ping ) ,
123+ "fillcolor" => status_colour ( ping )
124+ }
125+ }
126+ end )
127+
128+ edges =
129+ projects_and_pings
130+ |> Enum . map ( fn % { project: project } -> project end )
131+ # Load the dependencies field
132+ |> Enum . map ( fn project -> Data . get_project! ( project . id ) end )
133+ |> Enum . flat_map ( fn project ->
134+ project . dependencies
135+ |> Enum . map ( fn dependency ->
136+ % Dotx.Edge {
137+ from: % Dotx.Node { id: [ project . slug ] , attrs: % { } } ,
138+ to: % Dotx.Node { id: [ dependency . slug ] , attrs: % { } } ,
139+ attrs: % { } ,
140+ bidir: false
141+ }
142+ end )
143+ end )
144+
145+ % Dotx.Graph {
146+ strict: false ,
147+ type: :digraph ,
148+ id: "ZOUT" ,
149+ attrs: % { } ,
150+ graphs_attrs: % { } ,
151+ nodes_attrs: % {
152+ "shape" => "box" ,
153+ "style" => "filled"
154+ } ,
155+ edges_attrs: % { } ,
156+ children: Enum . concat ( nodes , edges )
157+ }
158+ end
159+
106160 def can? ( conn , action , params \\ nil ) do
107161 user = Guardian.Plug . current_resource ( conn )
108162 Bodyguard . permit? ( Zout.Data.Policy , action , user , params )
0 commit comments