Can customize shown depth
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@ -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));
|
||||
}
|
||||
|
Reference in New Issue
Block a user