Newer
Older
import FancyScrollbar from "../fancyscrollbar";
import Collapsible from "../collapsible";
import "./neighbors.css";
import { NodeType } from "../../../common/graph/nodetype";
import { Node } from "../../../common/graph/node";

Matthias Konitzny
committed
neighbors: Node[];

Matthias Konitzny
committed
nodeClickedCallback?: (node: Node) => void;
/**
* Shows a list of neighbors of a specific node separated by node type.
* @param neighbors List of neighbors
* @param nodeClickedCallback Optional callback to handle clicks on neighbors.
* @param nodeColors Mapping of node types to colors.
* @constructor
*/
function Neighbors({
neighbors,
nodeClickedCallback,
}: NeighborsProps) {

Matthias Konitzny
committed
const classes = [
...new Set<string>(neighbors.map((node) => node.type.name)),
];
classes.sort(); // Sort classes to get a constant order of the node type tabs

Matthias Konitzny
committed
const categories = new Map<string, Array<Node>>();
for (const cls of classes) {
categories.set(cls, []);
}
for (const neighbor of neighbors) {

Matthias Konitzny
committed
categories.get(neighbor.type.name).push(neighbor);

Matthias Konitzny
committed
const handleNodeClick = (node: Node) => {
if (nodeClickedCallback) {
nodeClickedCallback(node);
}
};
return (
<div className={"neighbor-container"}>
<FancyScrollbar>
<Collapsible header={"Verwandte Inhalte"}>
{classes.map((cls) => (
<Collapsible
header={cls}
key={cls}
heightTransition={false}

Matthias Konitzny
committed
color={nodeColors.get(cls).color}
<ul>
{categories.get(cls).map((node) => (
<li
className={"neighbor-content-link"}
key={node.name}
onClick={() => handleNodeClick(node)}
>
{node.name}
</li>