Can customize shown depth
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2023-08-26 08:47:02 +02:00
parent d3b1028fe4
commit 635fb667e1
4 changed files with 157 additions and 72 deletions

View File

@ -82,6 +82,9 @@ export function buildDescendingTree(
};
}
/**
* Sort family tree children per date of birth
*/
function sortChildren(n: FamilyTreeNode[]): FamilyTreeNode[] {
n.sort(
(a, b) =>
@ -89,3 +92,71 @@ function sortChildren(n: FamilyTreeNode[]): FamilyTreeNode[] {
);
return n;
}
/**
* Compute family tree height
*/
export function treeHeight(node: FamilyTreeNode): number {
let res =
node.down?.reduce((prev, node) => Math.max(prev, treeHeight(node)), 0) ?? 0;
node.couples?.forEach(
(c) =>
(res = Math.max(
res,
c.down.reduce((prev, node) => Math.max(prev, treeHeight(node)), 0)
))
);
return res + 1;
}
/**
* Compute family tree width
*/
export function treeWidth(node: FamilyTreeNode): number {
const values = new Array(treeHeight(node)).fill(0);
treeWidthRecurse(node, values, 0);
return Math.max(...values);
}
function treeWidthRecurse(node: FamilyTreeNode, vals: number[], level: number) {
vals[level] +=
1 + (node.couples?.length ?? 0) + ((node.down?.length ?? 0) > 0 ? 1 : 0);
node.down?.forEach((n) => treeWidthRecurse(n, vals, level + 1));
node.couples?.forEach((c) =>
c.down.forEach((n) => treeWidthRecurse(n, vals, level + 1))
);
}
/**
* Get the list of members to be shown in a tree,
* depending of a specified depth
*/
export function getAvailableMembers(
t: FamilyTreeNode,
depth: number
): Set<number> {
const s = new Set<number>();
getAvailableMembersRecurse(t, depth, s);
return s;
}
function getAvailableMembersRecurse(
t: FamilyTreeNode,
depth: number,
s: Set<number>
) {
if (depth < 1) return;
s.add(t.member.id);
t.couples?.forEach((c) => {
s.add(c.member.id);
c.down.forEach((e) => getAvailableMembersRecurse(e, depth - 1, s));
});
t.down?.forEach((e) => getAvailableMembersRecurse(e, depth - 1, s));
}