Skip to content

Instantly share code, notes, and snippets.

@denisemauldin
Last active October 5, 2017 01:24
Show Gist options
  • Save denisemauldin/c1bb732b2488b3ef547f0c47ea537f2d to your computer and use it in GitHub Desktop.
Save denisemauldin/c1bb732b2488b3ef547f0c47ea537f2d to your computer and use it in GitHub Desktop.
CE-Tree_View_Matrix
license: mit
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v3.min.js"></script>
<style>
body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; }
</style>
</head>
<body>
<section class="d3-tree">
<h2>Interactive Tree View</h2>
<div id="tree" class="">
</div>
</section>
<script>
// var ref_link_others = document.getElementById('ref_link_others');
// function display_others_ref_link(d) {
// if(d.referral_name){
// ref_link_others.innerHTML = "https://app.projectethereum.com/register/".concat(d.referral_name);
// }
// }
var margin = {
top: 20,
right: 20,
bottom: 20,
left: 20
},
width = 500,
height = 500;
var zm;
var svg = d3.select("#tree").append("svg")
.attr("width", width)
.attr("height", height)
.attr("style", 'border: 1px solid black; background-color: lightgray;')
.call(zm = d3.behavior.zoom().scaleExtent([.1, 3]).on("zoom", redraw)).append("g")
.attr("transform", "translate(" + 350 + "," + 20 + ")");
//Redraw for zoom
function redraw() {
svg.attr("transform",
"translate(" + d3.event.translate + ")" + " scale(" + d3.event.scale + ")");
}
// var url = "/admin/treedata";
//necessary so that zoom knows where to zoom and unzoom from
zm.translate([350, 20]);
d3.json("people.json", function(error, data) {
if (error) throw error;
console.log("data", data);
var root = data;
/*var root = {
"name": "Test Account" ,
"level": "0",
"referral_name": "test",
"children": []
};
*/
var i = 0,
duration = 600,
rectW = 120,
rectH = 50;
var tree = d3.layout.tree().nodeSize([130, 60]);
var diagonal = d3.svg.diagonal()
.projection(function(d) {
return [d.x + rectW / 2, d.y + rectH / 2];
});
root.x0 = 0;
root.y0 = height / 2;
function collapse(d) {
if (d.children) {
d._children = d.children;
d._children.forEach(collapse);
d.children = null;
}
}
//root.children.forEach(collapse);
update(root);
d3.select("#tree").style("height", "500px");
function update(source) {
// Compute the new tree layout.
var nodes = tree.nodes(root).reverse(),
links = tree.links(nodes);
// Normalize for fixed-depth.
nodes.forEach(function(d) {
d.y = d.depth * 60;
});
// Update the nodes…
var node = svg.selectAll("g.node")
.data(nodes, function(d) {
return d.id || (d.id = ++i);
});
// Enter any new nodes at the parent's previous position.
var nodeEnter = node.enter().append("g")
.attr("class", "node")
.attr("transform", function(d) {
return "translate(" + source.x0 + "," + source.y0 + ")";
})
.on("click", click)
//.on("mouseover", display_others_ref_link);
nodeEnter.append("rect")
.attr("width", rectW)
.attr("height", rectH)
.attr("stroke", "black")
.attr("stroke-width", 1)
.style("fill", function(d) {
if (d.active == 0) {
return d._children ? "sandybrown": "peachpuff";
} else {
return d._children ? "gainsboro" : "#fff";
}
});
nodeEnter.append("text")
.attr("x", rectW / 2)
.attr("y", rectH / 2)
.attr("dy", "0em")
.attr("text-anchor", "middle")
.text(function(d) {
return d.name;
});
nodeEnter.append("text")
.attr("x", rectW / 15)
.attr("y", rectH / 4)
.attr("dy", "0em")
.attr("text-anchor", "middle")
.text(function(d) {
return d.level;
});
nodeEnter.append("text")
.attr("x", rectW / 2)
.attr("y", rectH / 2)
.attr("dy", "1.6em")
.attr("text-anchor", "middle")
.text(function(d) {
return d.referral_name;
});
//nodeEnter.append("text")
// .attr("x", rectW / 2)
// .attr("y", rectH / 2)
// .attr("dy", "2em")
// .attr("text-anchor", "middle")
// .text(function(d) {
// return d.email;
// });
// Transition nodes to their new position.
var nodeUpdate = node.transition()
.duration(duration)
.attr("transform", function(d) {
return "translate(" + d.x + "," + d.y + ")";
});
nodeUpdate.select("rect")
.attr("width", rectW)
.attr("height", rectH)
.attr("stroke", "black")
.attr("stroke-width", 1)
.style("fill", function(d) {
if (d.active == 0) {
return d._children ? "sandybrown": "peachpuff";
} else {
return d._children ? "gainsboro" : "#fff";
}
});
nodeUpdate.select("text")
.style("fill-opacity", 1);
// Transition exiting nodes to the parent's new position.
var nodeExit = node.exit().transition()
.duration(duration)
.attr("transform", function(d) {
return "translate(" + source.x + "," + source.y + ")";
})
.remove();
nodeExit.select("rect")
.attr("width", rectW)
.attr("height", rectH)
.attr("stroke", "black")
.attr("stroke-width", 1)
nodeExit.select("text");
// Update the links…
var link = svg.selectAll("path.link")
.data(links, function(d) {
return d.target.id;
});
// Enter any new links at the parent's previous position.
link.enter().insert("path", "g")
.attr("class", "link")
.attr("x", rectW / 2)
.attr("y", rectH / 2)
.attr("d", function(d) {
var o = {
x: source.x0,
y: source.y0
};
return diagonal({
source: o,
target: o
});
});
// Transition links to their new position.
link.transition()
.duration(duration)
.attr("d", diagonal);
// Transition exiting nodes to the parent's new position.
link.exit().transition()
.duration(duration)
.attr("d", function(d) {
var o = {
x: source.x,
y: source.y
};
return diagonal({
source: o,
target: o
});
})
.remove();
// Stash the old positions for transition.
nodes.forEach(function(d) {
d.x0 = d.x;
d.y0 = d.y;
});
}
// Toggle children on click.
function click(d) {
//If it has no children (Hidden or not hidden), AJAX request that name
if(!d.children && !d._children){
console.log("click d ", d);
$.ajax({
url: "/account/9397/yield_children/" + d.referral_name + "/" + d.level + "?format=json",
})
.done( function(data){
fakeDB = $.extend(true, fakeDB, data);
var data = $.extend(true, {}, fakeDB[d.referral_name])
for (var i = 0; i < data.children.length; i++) {
data.children[i] = $.extend(true, {}, fakeDB[data.children[i]])
delete data.children[i].children
};
d.children = data.children
update(d)
});
}
else if (d.children) {
d._children = d.children;
d.children = null;
} else {
d.children = d._children;
d._children = null;
}
update(d);
}
});
</script>
</body>
{ "name": "Rich", "children": [{"name": "John", "children": [ {"name": "Lee"}, {"name": "Candy"}, {"name": "Elise"}, {"name": "Sydney"}, {"name": "Garth"}, {"name": "Otto"}, {"name": "Randy"} ] }, { "name": "Corry", "children": [ {"name": "Adam"}, {"name": "Vinney"}, {"name": "Adison"} ] }]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment