export function TopologyTab()

in karavan-space/src/topology/TopologyTab.tsx [52:168]


export function TopologyTab(props: Props) {

    const [selectedIds, setSelectedIds, setFileName, ranker, setRanker, setNodeData, showGroups] = useTopologyStore((s) =>
        [s.selectedIds, s.setSelectedIds, s.setFileName, s.ranker, s.setRanker, s.setNodeData, s.showGroups], shallow);
    const [setSelectedStep] = useDesignerStore((s) => [s.setSelectedStep], shallow)

    function setTopologySelected(model: Model, ids: string []) {
        setSelectedIds(ids);
        if (ids.length > 0) {
            const node = model.nodes?.filter(node => node.id === ids[0]);
            if (node && node.length > 0) {
                const data = node[0].data;
                setNodeData(data);
                if (data && data.step) {
                    setFileName(data.fileName)
                    setSelectedStep(data.step)
                } else {
                    setSelectedStep(undefined);
                    setFileName(undefined)
                }
            }
        }
    }

    const controller = React.useMemo(() => {
        const model = getModel(props.files, showGroups);
        const newController = new Visualization();
        newController.registerLayoutFactory((_, graph) =>
            new DagreLayout(graph, {
                rankdir: 'TB',
                ranker: ranker,
                nodesep: 20,
                edgesep: 20,
                ranksep: 0
            }));

        newController.registerComponentFactory(customComponentFactory);

        newController.addEventListener(SELECTION_EVENT, args => setTopologySelected(model, args));
        // newController.addEventListener(SELECTION_EVENT, args => {
        //     console.log(args)
        // });
        newController.addEventListener(GRAPH_LAYOUT_END_EVENT, () => {
            newController.getGraph().fit(80);
        });

        newController.fromModel(model, false);
        return newController;
    },[]);

    React.useEffect(() => {
        setSelectedIds([])
        const model = getModel(props.files, showGroups);
        controller.fromModel(model, false);
    }, [ranker, controller, setSelectedIds, props.files, showGroups]);

    const controlButtons = React.useMemo(() => {
        // const customButtons = [
        //     {
        //         id: "change-ranker",
        //         icon: <RankerIcon />,
        //         tooltip: 'Change Ranker ' + ranker,
        //         ariaLabel: '',
        //         callback: (id: any) => {
        //             if (ranker === 'network-simplex') {
        //                 setRanker('tight-tree')
        //             } else {
        //                 setRanker('network-simplex')
        //             }
        //         }
        //     }
        // ];
        return createTopologyControlButtons({
            ...defaultControlButtonsOptions,
            zoomInCallback: action(() => {
                controller.getGraph().scaleBy(4 / 3);
            }),
            zoomOutCallback: action(() => {
                controller.getGraph().scaleBy(0.75);
            }),
            fitToScreenCallback: action(() => {
                controller.getGraph().fit(80);
            }),
            resetViewCallback: action(() => {
                controller.getGraph().reset();
                controller.getGraph().layout();
            }),
            legend: false,
            // customButtons,
        });
    }, [ranker, controller, setRanker]);

    return (
        <TopologyView
            className="topology-panel"
            contextToolbar={!props.hideToolbar
                ? <TopologyToolbar onClickAddRoute={props.onClickAddRoute}
                                   onClickAddBean={props.onClickAddBean}
                                   onClickAddKamelet={props.onClickAddKamelet}
                                   onClickAddREST={props.onClickAddREST}
                                   isDev={props.isDev}
                />
                : undefined}
            sideBar={<TopologyPropertiesPanel onSetFile={props.onSetFile}/>}
            controlBar={
                <TopologyControlBar
                    controlButtons={controlButtons}
                />
            }
        >
            <VisualizationProvider controller={controller}>
                <VisualizationSurface state={{selectedIds}}/>
                <TopologyLegend/>
            </VisualizationProvider>
        </TopologyView>
    );
}