UNPKG

dagre-d3v4

Version:
62 lines (48 loc) 2.06 kB
"use strict"; 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; }