class @Graph
constructor: (canvas_id) -> @canvas = "##{canvas_id}" @digraph = new dagreD3.Digraph populate: (nodes, links) -> nodes.forEach (node) => @digraph.addNode node.name, finished: node.finished, failed: node.failed, running: node.running, enqueued: node.enqueued label: node.name links.forEach (edge) => @digraph.addEdge(null, edge.source, edge.target) render: -> renderer = new dagreD3.Renderer layout = dagreD3.layout().nodeSep(50).rankDir("LR"); oldDrawNodes = renderer.drawNodes() renderer.drawNodes (graph, root) => svgNodes = oldDrawNodes(graph, root); svgNodes.attr "data-job-name", (name) => name; svgNodes.attr "class", (name) => node = @digraph.node(name) classes = "node " + name.replace(/::/g, '_').toLowerCase() if node.failed classes += " status-failed"; else if node.finished classes += " status-finished"; else if node.running classes += " status-running"; else if node.enqueued classes += " status-enqueued" classes; svgNodes; .layout(layout) .run(@digraph, d3.select("#{@canvas} g")); @panZoom() panZoom: -> svgPanZoom @canvas, panEnabled: true, minZoom: 0.8, maxZoom: 10, zoomEnabled: true, center: false, fit: true markNode: (name, class_names) -> name = name.replace(/::/g, '_').toLowerCase() $("svg#{@canvas} .node.#{name}") .attr('class', "node #{name} #{class_names}")