Build tree couples
This commit is contained in:
79
geneit_app/src/utils/family_tree.ts
Normal file
79
geneit_app/src/utils/family_tree.ts
Normal 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,
|
||||
};
|
||||
}
|
Reference in New Issue
Block a user