filteredlinkchart = {
const links = filteredlinks;
const nodes = data.nodes.map(d => Object.create(d));
var isTooltipHidden = true;
const simulation = d3.forceSimulation(nodes)
.force("link", d3.forceLink(links).id(d => d.id))
.force("charge", d3.forceManyBody())
.force("x", d3.forceX())
.force("y", d3.forceY());
const svg = d3.create("svg")
.attr("viewBox", [-width / 2, -height / 2, width, height]);
const link = svg.append("g")
.attr("stroke", "#999")
.attr("stroke-opacity", 0.6)
.selectAll("line")
.data(links)
.join("line")
.attr("stroke", d => colors(d.type))
.attr("stroke-width", 2);
link.append("title")
.text(d => d.type);
const node = svg.append("g")
.attr("stroke", "#fff")
.attr("stroke-width", 1.5)
.selectAll("circle")
.data(nodes)
.join("circle")
.attr("r", 7)
.attr("fill", color)
.call(drag(simulation))
.on("click", clickNode)
.on("mouseenter", (d) => {
link
.attr("display", "none")
.filter(l => l.source.id === d.id || l.target.id === d.id)
.attr("display", "block");
})
.on("mouseleave", evt => {
link.attr("display", "block");
});
function clickNode(node) {
isTooltipHidden = !isTooltipHidden;
var visibility = (isTooltipHidden) ? "hidden" : "visible";
loadTooltipContent(node);
if (isTooltipHidden) {
unPinNode(node);
}
return tooltip.style("top", (d3.event.pageY -10) + "px").style("left", (d3.event.pageX + 10) + "px").style("visibility", visibility);
}
function unPinNode(node) {
node.fx = null;
node.fy = null;
}
function loadTooltipContent(node) {
var htmlContent = "<div>";
htmlContent += "<h4>" + node.id + "<\/h4>"
htmlContent += "<a href=\"" + node.url + "\">View resources<\/a>"
htmlContent += "<\/div>"
tooltip.html(htmlContent);
}
var tooltip = d3.select("body")
.append("div")
.attr("class", "tooltip")
.style("position", "absolute")
.style("padding", "10px")
.style("z-index", "10")
.style("width", "150px")
.style("height", "100px")
.style("background-color", "rgba(230, 242, 255, 0.8)")
.style("border-radius", "5px")
.style("visibility", "hidden")
.text("");
node.append("title")
.text(d => d.id);
simulation.on("tick", () => {
link
.attr("x1", d => d.source.x)
.attr("y1", d => d.source.y)
.attr("x2", d => d.target.x)
.attr("y2", d => d.target.y);
node
.attr("cx", d => d.x)
.attr("cy", d => d.y);
});
invalidation.then(() => simulation.stop());
return svg.node();
}