Skip to content
Snippets Groups Projects
neighbors.tsx 2.46 KiB
Newer Older
import React from "react";
import FancyScrollbar from "../fancyscrollbar";
import Collapsible from "../collapsible";

import { NodeType } from "../../../common/graph/nodetype";
import { Node } from "../../../common/graph/node";
interface NeighborsProps {
    nodeColors?: Map<string, NodeType>;
    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,
    nodeColors = new Map<string, NodeType>(),
    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
    const categories = new Map<string, Array<Node>>();

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

    for (const neighbor of neighbors) {
        categories.get(neighbor.type.name).push(neighbor);
        if (nodeClickedCallback) {
            nodeClickedCallback(node);
        }
    };

    return (
        <div className={"neighbor-container"}>
            <FancyScrollbar>
                <Collapsible header={"Verwandte Inhalte"}>
                    {classes.map((cls) => (
                        <Collapsible
                            header={cls}
                            key={cls}
                            heightTransition={false}
                            <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;