dagre-d3v4
Version:
A D3-based renderer for Dagre
62 lines (48 loc) • 2.06 kB
JavaScript
;
var _ = require("./lodash"),
addLabel = require("./label/add-label"),
util = require("./util"),
d3 = require("./d3");
module.exports = createNodes;
function createNodes(selection, g, shapes) {
var simpleNodes = g.nodes().filter(function(v) { return !util.isSubgraph(g, v); });
var svgNodesUpdate = selection.selectAll("g.node")
.data(simpleNodes, function(v) { return v; })
.classed("update", true);
/* -FIX- d3v4: during render updates, we can be smarter about this remove-and-recreate */
svgNodesUpdate.selectAll("*").remove();
var svgNodesEnter = svgNodesUpdate.enter()
.append("g")
.attr("class", "node")
.style("opacity", 0);
var svgNodesMerge = svgNodesEnter.merge(svgNodesUpdate);
svgNodesMerge.each(function(v) {
var node = g.node(v),
thisGroup = d3.select(this),
labelGroup = thisGroup.append("g").attr("class", "label"),
labelDom = addLabel(labelGroup, node),
shape = shapes[node.shape],
bbox = _.pick(labelDom.node().getBBox(), "width", "height");
node.elem = this;
if (node.id) { thisGroup.attr("id", node.id); }
if (node.labelId) { labelGroup.attr("id", node.labelId); }
util.applyClass(thisGroup, node["class"],
(thisGroup.classed("update") ? "update " : "") + "node");
if (_.has(node, "width")) { bbox.width = node.width; }
if (_.has(node, "height")) { bbox.height = node.height; }
bbox.width += node.paddingLeft + node.paddingRight;
bbox.height += node.paddingTop + node.paddingBottom;
labelGroup.attr("transform", "translate(" +
((node.paddingLeft - node.paddingRight) / 2) + "," +
((node.paddingTop - node.paddingBottom) / 2) + ")");
var shapeSvg = shape(d3.select(this), bbox, node);
util.applyStyle(shapeSvg, node.style);
var shapeBBox = shapeSvg.node().getBBox();
node.width = shapeBBox.width;
node.height = shapeBBox.height;
});
util.applyTransition(svgNodesUpdate.exit(), g)
.style("opacity", 0)
.remove();
return svgNodesMerge;
}