Skip to content
Snippets Groups Projects
neighbors.tsx 2.12 KiB
Newer Older
import React from "react";
import { NodeData } from "../../graph";
import FancyScrollbar from "../fancyscrollbar";
import Collapsible from "../collapsible";

interface NeighborsProps {
    neighbors: NodeData[];
    nodeColors?: Map<string, string>;
    nodeClickedCallback?: (node: NodeData) => void;
}

function Neighbors({
    neighbors,
    nodeClickedCallback,
    nodeColors = new Map<string, string>(),
}: NeighborsProps) {
    const classes = [...new Set<string>(neighbors.map((node) => node.type))];
    classes.sort(); // Sort classes to get a constant order of the node type tabs
    const categories = new Map<string, Array<NodeData>>();

    for (const cls of classes) {
        categories.set(cls, []);
    }

    for (const neighbor of neighbors) {
        categories.get(neighbor.type).push(neighbor);
    }

    const handleNodeClick = (node: NodeData) => {
        if (nodeClickedCallback) {
            nodeClickedCallback(node);
        }
    };

    return (
        <div className={"neighbor-container"}>
            <FancyScrollbar>
                <Collapsible header={"Verwandte Inhalte"}>
                    {classes.map((cls) => (
                        <Collapsible
                            header={cls}
                            key={cls}
                            heightTransition={false}
                            color={nodeColors.get(cls)}
                            <ul>
                                {categories.get(cls).map((node) => (
                                    <li
                                        className={"neighbor-content-link"}
                                        key={node.name}
                                        onClick={() => handleNodeClick(node)}
                                    >
                                        {node.name}
                                    </li>
                                ))}
                            </ul>
                        </Collapsible>
                    ))}
                </Collapsible>
            </FancyScrollbar>
        </div>
    );
}

export default Neighbors;