feat: getEmptyVertexIndents
This commit is contained in:
parent
b888d6b7f0
commit
fb7f38e7df
@ -1,6 +1,11 @@
|
|||||||
import type { ElementDefinition } from "cytoscape";
|
import type { ElementDefinition } from "cytoscape";
|
||||||
import type { Vertex } from "./elements";
|
import type { Vertex } from "./elements";
|
||||||
|
|
||||||
|
type VertexIndent = {
|
||||||
|
id: string;
|
||||||
|
indent: number;
|
||||||
|
};
|
||||||
|
|
||||||
const sortElementsByLevel = (vertices: Vertex[]): Record<number, Vertex[]> => {
|
const sortElementsByLevel = (vertices: Vertex[]): Record<number, Vertex[]> => {
|
||||||
const sortedVertices: Record<number, Vertex[]> = {};
|
const sortedVertices: Record<number, Vertex[]> = {};
|
||||||
|
|
||||||
@ -15,27 +20,50 @@ const sortElementsByLevel = (vertices: Vertex[]): Record<number, Vertex[]> => {
|
|||||||
return sortedVertices;
|
return sortedVertices;
|
||||||
};
|
};
|
||||||
|
|
||||||
const getEmptyVerticesAboveAmount = (
|
const getEmptyVertexIndents = (
|
||||||
elements: ElementDefinition[],
|
elements: ElementDefinition[],
|
||||||
vertices: Vertex[],
|
vertices: Vertex[],
|
||||||
|
id: string,
|
||||||
indent: number,
|
indent: number,
|
||||||
currentIndent: number,
|
currentIndent: number,
|
||||||
level: number
|
level: number
|
||||||
): number => {
|
): VertexIndent[] => {
|
||||||
let topIndent = indent + currentIndent;
|
let topIndent = indent + currentIndent;
|
||||||
|
const indents: VertexIndent[] = [];
|
||||||
|
|
||||||
return elements.filter(({ data, position }) => {
|
elements.forEach(({ data, position }) => {
|
||||||
const isEmptyVertex =
|
const isEmptyVertex =
|
||||||
position?.y === topIndent &&
|
position?.y === topIndent &&
|
||||||
position?.x === level * 250 - 250 &&
|
position?.x === level * 250 - 250 &&
|
||||||
vertices.find((item) => item.id === data.id && !item.edges?.length);
|
vertices.find((item) => item.id === data.id && !item.edges?.length);
|
||||||
|
|
||||||
if (isEmptyVertex) {
|
if (!isEmptyVertex) {
|
||||||
topIndent += 200;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return isEmptyVertex;
|
const parentVertex = vertices.find(({ edges }) => edges?.includes(id));
|
||||||
}).length;
|
const parentElement = elements.find(
|
||||||
|
({ data }) => parentVertex?.id === data.id
|
||||||
|
);
|
||||||
|
|
||||||
|
if (parentElement?.position?.y && parentVertex?.edges?.length) {
|
||||||
|
const minTopIndent =
|
||||||
|
parentElement.position.y - (parentVertex.edges.length || 0) * 100;
|
||||||
|
|
||||||
|
topIndent += 200;
|
||||||
|
|
||||||
|
if (indent < minTopIndent) {
|
||||||
|
indent = minTopIndent;
|
||||||
|
indents.push({ id, indent: minTopIndent });
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
indents.push({ id, indent: topIndent });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return indents;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const createGraphElements = (
|
export const createGraphElements = (
|
||||||
@ -50,15 +78,22 @@ export const createGraphElements = (
|
|||||||
|
|
||||||
vertexItems.forEach(({ id, label, level, edges }) => {
|
vertexItems.forEach(({ id, label, level, edges }) => {
|
||||||
const currentIndent = edges?.length ? edges?.length * 100 : 100;
|
const currentIndent = edges?.length ? edges?.length * 100 : 100;
|
||||||
const emptyVertexAboveAmount = getEmptyVerticesAboveAmount(
|
const emptyVertexIndents = getEmptyVertexIndents(
|
||||||
elements,
|
elements,
|
||||||
vertices,
|
vertices,
|
||||||
|
id,
|
||||||
indent,
|
indent,
|
||||||
currentIndent,
|
currentIndent,
|
||||||
level
|
level
|
||||||
);
|
);
|
||||||
|
|
||||||
indent += emptyVertexAboveAmount * 200;
|
if (emptyVertexIndents.length) {
|
||||||
|
const emptyVertexIndent = emptyVertexIndents.find(
|
||||||
|
(item) => item.id === id
|
||||||
|
);
|
||||||
|
|
||||||
|
indent = emptyVertexIndent?.indent || indent;
|
||||||
|
}
|
||||||
|
|
||||||
elements.push({
|
elements.push({
|
||||||
data: { id, label },
|
data: { id, label },
|
||||||
@ -68,13 +103,13 @@ export const createGraphElements = (
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
indent += currentIndent * 2;
|
|
||||||
|
|
||||||
edges?.forEach((edge) => {
|
edges?.forEach((edge) => {
|
||||||
bridges.push({
|
bridges.push({
|
||||||
data: { source: id, target: edge },
|
data: { source: id, target: edge },
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
indent += currentIndent * 2;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user