feat: getEmptyVertexIndents

This commit is contained in:
IlyaDoronin 2023-10-25 16:23:54 +03:00
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;
}); });
}); });