Skip to content
Snippets Groups Projects
neighbors.tsx 2.43 KiB
Newer Older
  • Learn to ignore specific revisions
  • import React from "react";
    
    import { NodeTypeData, Node } from "../../../common/graph/graph";
    
    import FancyScrollbar from "../fancyscrollbar";
    import Collapsible from "../collapsible";
    
    
    interface NeighborsProps {
    
        neighbors: Node[];
        nodeColors?: Map<string, GraphObjectType>;
        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, GraphObjectType>(),
    
        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;