Build tree couples

This commit is contained in:
2023-08-21 17:53:51 +02:00
parent c414defb19
commit 4d5bdaad57
4 changed files with 108 additions and 6 deletions

View File

@ -0,0 +1,79 @@
import { Couple, CouplesList } from "../api/CoupleApi";
import { Member, MembersList } from "../api/MemberApi";
export interface CoupleInformation {
couple: Couple;
member: Member;
down: FamilyTreeNode[];
}
export interface FamilyTreeNode {
down?: FamilyTreeNode[];
member: Member;
couples?: CoupleInformation[];
}
export function buildAscendingTree(
memberId: number,
members: MembersList,
couples: CouplesList
): FamilyTreeNode {
const member = members.get(memberId)!;
const parents = [];
if (member.father)
parents.push(buildAscendingTree(member.father, members, couples));
if (member.mother)
parents.push(buildAscendingTree(member.mother, members, couples));
return {
member: member,
down: parents,
};
}
export function buildDescendingTree(
memberId: number,
members: MembersList,
couples: CouplesList
): FamilyTreeNode {
const member = members.get(memberId)!;
const children = members.children(member.id);
// Process user couples
const member_couples: CoupleInformation[] = [];
for (const c of couples.getAllOf(member)) {
// Currently, couples with missing pair information are not supported
const pairId = c.otherPersonID(member.id);
if (!pairId) continue;
const pair = members.get(pairId);
const c_children: Member[] = [];
// Determine children associated with each couple
for (let index = 0; index < children.length; ) {
const c = children[index];
if (c.mother !== pairId && c.father !== pairId) {
index++;
continue;
}
children.splice(index, 1);
c_children.push(c);
}
member_couples.push({
couple: c,
member: pair!,
down: c_children.map((c) => buildDescendingTree(c.id, members, couples)),
});
}
return {
member: member,
down: children.map((c) => buildDescendingTree(c.id, members, couples)),
couples: member_couples,
};
}