mirror of
https://github.com/openziti/zrok.git
synced 2025-02-01 02:49:34 +01:00
initial full port of the merge algorithm (#803)
This commit is contained in:
parent
5d16a6fa33
commit
5a568d72db
@ -1,6 +1,6 @@
|
|||||||
import {useEffect, useState} from "react";
|
import {useEffect, useState} from "react";
|
||||||
import {Configuration, MetadataApi} from "./api";
|
import {Configuration, MetadataApi} from "./api";
|
||||||
import {buildVisualOverview, VisualOverview, visualOverviewsEqual} from "./model/visualizer.ts";
|
import {buildVisualOverview, mergeVisualOverview, VisualOverview, visualOverviewsEqual} from "./model/visualizer.ts";
|
||||||
import {Box} from "@mui/material";
|
import {Box} from "@mui/material";
|
||||||
import NavBar from "./NavBar.tsx";
|
import NavBar from "./NavBar.tsx";
|
||||||
import {User} from "./model/user.ts";
|
import {User} from "./model/user.ts";
|
||||||
@ -36,10 +36,7 @@ const ApiConsole = ({ user, logout }: ApiConsoleProps) => {
|
|||||||
let api = new MetadataApi(cfg);
|
let api = new MetadataApi(cfg);
|
||||||
api.overview()
|
api.overview()
|
||||||
.then(d => {
|
.then(d => {
|
||||||
let vo = buildVisualOverview(d);
|
setOverview(mergeVisualOverview(overview, user, false, d));
|
||||||
if(!visualOverviewsEqual(vo, overview)) {
|
|
||||||
setOverview(vo);
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
@ -54,7 +51,7 @@ const ApiConsole = ({ user, logout }: ApiConsoleProps) => {
|
|||||||
<div>
|
<div>
|
||||||
<NavBar logout={logout} />
|
<NavBar logout={logout} />
|
||||||
<Box>
|
<Box>
|
||||||
<Visualizer overview={overview} />
|
<Visualizer vov={overview} />
|
||||||
</Box>
|
</Box>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -10,7 +10,7 @@ import AccountNode from "../AccountNode.tsx";
|
|||||||
import AccessNode from "./AccessNode.tsx";
|
import AccessNode from "./AccessNode.tsx";
|
||||||
|
|
||||||
interface VisualizerProps {
|
interface VisualizerProps {
|
||||||
overview: VisualOverview;
|
vov: VisualOverview;
|
||||||
}
|
}
|
||||||
|
|
||||||
const nodeTypes = {
|
const nodeTypes = {
|
||||||
@ -20,7 +20,7 @@ const nodeTypes = {
|
|||||||
share: ShareNode
|
share: ShareNode
|
||||||
};
|
};
|
||||||
|
|
||||||
const Visualizer = ({ overview }: VisualizerProps) => {
|
const Visualizer = ({ vov }: VisualizerProps) => {
|
||||||
const [nodes, setNodes, onNodesChange] = useNodesState([]);
|
const [nodes, setNodes, onNodesChange] = useNodesState([]);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState([]);
|
const [edges, setEdges, onEdgesChange] = useEdgesState([]);
|
||||||
|
|
||||||
@ -46,10 +46,10 @@ const Visualizer = ({ overview }: VisualizerProps) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let layouted = layout(overview.nodes, overview.edges);
|
let layouted = layout(vov.nodes, vov.edges);
|
||||||
setNodes(layouted.nodes);
|
setNodes(layouted.nodes);
|
||||||
setEdges(layouted.edges);
|
setEdges(layouted.edges);
|
||||||
}, [overview]);
|
}, [vov]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactFlow
|
<ReactFlow
|
||||||
@ -67,11 +67,11 @@ const Visualizer = ({ overview }: VisualizerProps) => {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default ({ overview }: VisualizerProps) => {
|
export default ({ vov }: VisualizerProps) => {
|
||||||
return (
|
return (
|
||||||
<div style={{ height: "400px" }}>
|
<div style={{ height: "400px" }}>
|
||||||
<ReactFlowProvider>
|
<ReactFlowProvider>
|
||||||
<Visualizer overview={overview}/>
|
<Visualizer vov={vov}/>
|
||||||
</ReactFlowProvider>
|
</ReactFlowProvider>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -103,10 +103,42 @@ export const mergeVisualOverview = (oldVov: VisualOverview, u: User, limited: bo
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
newVov.nodes = sortNodes(newVov.nodes);
|
||||||
|
|
||||||
|
if(nodesEqual(oldVov.nodes, newVov.nodes)) {
|
||||||
|
// if the list of nodes is equal, the graph hasn't changed; we can just return the oldGraph and save the
|
||||||
|
// physics headaches in the visualizer.
|
||||||
|
return oldVov;
|
||||||
|
}
|
||||||
|
|
||||||
|
let outNodes = oldVov.nodes.filter(oldNode => newVov.nodes.find(newNode => newNode.id === oldNode.id && newNode.data.limited == oldNode.data.limited && newNode.data.label === oldNode.data.label));
|
||||||
|
let outEdges = oldVov.edges.filter(oldEdge => newVov.edges.find(newEdge => newEdge.target === oldEdge.target && newEdge.source === oldEdge.source));
|
||||||
|
|
||||||
|
outNodes.push(...newVov.nodes.filter(newNode => !outNodes.find(oldNode => oldNode.id === newNode.id && oldNode.data.limited === newNode.data.limited && oldNode.data.label === newNode.data.label)));
|
||||||
|
outEdges.push(...newVov.edges.filter(newEdge => !outEdges.find(oldEdge => oldEdge.target === newEdge.target && oldEdge.source === newEdge.source)));
|
||||||
|
|
||||||
|
newVov.nodes = outNodes;
|
||||||
|
newVov.edges = outEdges;
|
||||||
return newVov;
|
return newVov;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const sortNodes = (nodes) => {
|
||||||
|
return nodes.sort((a, b) => {
|
||||||
|
if(a.id > b.id) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if(a.id < b.id) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const nodesEqual = (a, b) => {
|
||||||
|
if(a.length !== b.length) return false;
|
||||||
|
return a.every((e, i) => e.id === b[i].id && e.data.limited === b[i].data.limited && e.data.label === b[i].data.label);
|
||||||
|
}
|
||||||
|
|
||||||
export const buildVisualOverview = (overview: Overview): VisualOverview => {
|
export const buildVisualOverview = (overview: Overview): VisualOverview => {
|
||||||
let out = new VisualOverview();
|
let out = new VisualOverview();
|
||||||
out.nodes = [
|
out.nodes = [
|
||||||
|
Loading…
Reference in New Issue
Block a user