in src/sankeyDiagram.ts [639:678]
private processCyclesForwardLinks(cycles: SankeyDiagramCycleDictionary, nodes: SankeyDiagramNode[], links: SankeyDiagramLink[], settings: SankeyDiagramSettings): SankeyDiagramLink[] {
let createdNodes: SankeyDiagramNode[] = [];
for (let nodeName of Object.keys(cycles)) {
let firstCyclesNode: SankeyDiagramNode = cycles[nodeName][cycles[nodeName].length - 1];
// create a clone of the node and save a link to each other. In selection behavior, selection of clone lead to select original and visa versa
let nodeCopy: SankeyDiagramNode = _.cloneDeep(firstCyclesNode);
nodeCopy.label.name += SankeyDiagram.DuplicatedNamePostfix;
firstCyclesNode.cloneLink = nodeCopy;
nodeCopy.cloneLink = firstCyclesNode;
// copy only! output links to new node;
nodeCopy.links = firstCyclesNode.links.filter((link: SankeyDiagramLink) => {
if (link.source === firstCyclesNode || link.source === link.destination) {
return true;
}
return false;
});
nodeCopy.links.forEach((link: SankeyDiagramLink) => {
link.source = nodeCopy;
});
// remove output links from original node
firstCyclesNode.links = firstCyclesNode.links.filter((link: SankeyDiagramLink) => {
if (link.destination === firstCyclesNode || link.destination === link.source) {
return true;
}
return false;
});
SankeyDiagram.updateValueOfNode(firstCyclesNode);
SankeyDiagram.updateValueOfNode(nodeCopy);
SankeyDiagram.fixLinksCount(firstCyclesNode);
SankeyDiagram.fixLinksCount(nodeCopy);
nodes.push(nodeCopy);
createdNodes.push(nodeCopy);
}
return links;
}