in karavan-designer/src/topology/TopologyTab.tsx [56:165]
export function TopologyTab(props: Props) {
const [selectedIds, setSelectedIds, setFileName, ranker, setRanker, setNodeData, showGroups, showBeans, showLegend] = useTopologyStore((s) =>
[s.selectedIds, s.setSelectedIds, s.setFileName, s.ranker, s.setRanker, s.setNodeData, s.showGroups, s.showBeans, s.showLegend], shallow);
const [setSelectedStep] = useDesignerStore((s) => [s.setSelectedStep], shallow)
const {selectFile, setDisabled} = useTopologyHook();
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 customLayoutFactory: LayoutFactory = (type: string, graph: Graph, options?: LayoutOptions): Layout => {
return new DagreLayout(graph, {
rankdir: 'TB',
ranker: "network-simplex",
nodesep: 20,
edgesep: 20,
ranksep: 1,
// align: 'UL'
});
};
const controller = React.useMemo(() => {
const model = getModel(props.files, showGroups, selectFile, setDisabled);
const controller = new Visualization();
controller.registerLayoutFactory(customLayoutFactory);
controller.registerComponentFactory(CustomComponentFactory);
controller.addEventListener(SELECTION_EVENT, args => setTopologySelected(model, args));
// controller1.addEventListener(SELECTION_EVENT, args => {
// console.log(args)
// });
controller.addEventListener(GRAPH_LAYOUT_END_EVENT, () => {
controller.getGraph().fit(80);
});
controller.fromModel(model, false);
return controller;
},[]);
React.useEffect(() => {
try {
setSelectedIds([])
const model = getModel(props.files, showGroups, selectFile, setDisabled);
controller.fromModel(model, false);
} catch (e) {
console.error(e);
}
}, [setSelectedIds, props.files, controller, showGroups]);
const controlButtons = React.useMemo(() => {
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 onClickAddRouteConfiguration={props.onClickAddRouteConfiguration}
onClickAddBean={props.onClickAddBean}
onClickAddKamelet={props.onClickAddKamelet}
onClickAddREST={props.onClickAddREST}
isDev={props.isDev}
/>
: undefined}
controlBar={
<TopologyControlBar
controlButtons={controlButtons}
/>
}
>
<VisualizationProvider controller={controller}>
<VisualizationSurface state={{selectedIds}}/>
{showBeans && <TopologyBeans/>}
{showLegend && <TopologyLegend/>}
</VisualizationProvider>
</TopologyView>
);
}