diff --git a/geneit_app/src/api/MemberApi.ts b/geneit_app/src/api/MemberApi.ts index e29c670..d14d0ef 100644 --- a/geneit_app/src/api/MemberApi.ts +++ b/geneit_app/src/api/MemberApi.ts @@ -31,6 +31,12 @@ export interface MemberDataApi { note?: string; } +export interface DateValue { + year?: number; + month?: number; + day?: number; +} + export class Member implements MemberDataApi { id: number; family_id: number; @@ -111,13 +117,43 @@ export class Member implements MemberDataApi { return this.photo_id !== null; } - get photoURL(): string { + get photoURL(): string | null { + if (!this.signed_photo_id) return null; return `${APIClient.backendURL()}/photo/${this.signed_photo_id}`; } - get thumbnailURL(): string { + get thumbnailURL(): string | null { + if (!this.signed_photo_id) return null; return `${APIClient.backendURL()}/photo/${this.signed_photo_id}/thumbnail`; } + + get dateOfBirth(): DateValue | undefined { + if (!this.birth_day && !this.birth_month && !this.birth_year) + return undefined; + + return { + year: this.birth_year, + month: this.birth_month, + day: this.birth_day, + }; + } + + get dateOfDeath(): DateValue | undefined { + if (!this.death_day && !this.death_month && !this.death_year) + return undefined; + + return { + year: this.death_year, + month: this.death_month, + day: this.death_day, + }; + } +} + +export function fmtDate(d?: DateValue): string { + return `${d?.day?.toString().padStart(2, "0") ?? "__"}/${ + d?.month?.toString().padStart(2, "0") ?? "__" + }/${d?.year?.toString().padStart(4, "0") ?? "__"}`; } export class MembersList { @@ -132,6 +168,14 @@ export class MembersList { this.map.set(m.id, m); } } + + filter(predicate: (m: Member) => boolean): Member[] { + return this.list.filter(predicate); + } + + get(id: number): Member | undefined { + return this.map.get(id); + } } export class MemberApi { diff --git a/geneit_app/src/routes/family/FamilyMemberRoute.tsx b/geneit_app/src/routes/family/FamilyMemberRoute.tsx index d396251..397bd4c 100644 --- a/geneit_app/src/routes/family/FamilyMemberRoute.tsx +++ b/geneit_app/src/routes/family/FamilyMemberRoute.tsx @@ -383,11 +383,7 @@ export function MemberPage(p: { label="Date de naissance" editable={p.editing} id="dob" - value={{ - year: member.birth_year, - month: member.birth_month, - day: member.birth_day, - }} + value={member.dateOfBirth} onValueChange={(d) => { member.birth_year = d.year; member.birth_month = d.month; @@ -412,11 +408,7 @@ export function MemberPage(p: { label="Date de décès" editable={p.editing} id="dod" - value={{ - year: member.death_year, - month: member.death_month, - day: member.death_day, - }} + value={member.dateOfDeath} onValueChange={(d) => { member.death_year = d.year; member.death_month = d.month; @@ -426,6 +418,7 @@ export function MemberPage(p: { /> {/* Father */} +
m.sex === "M" || m.sex === undefined} + filter={(m) => + (m.sex === "M" || m.sex === undefined) && m.id !== member.id + } current={member.father} /> {/* Mother */} +
{ - member.father = m; + member.mother = m; updatedMember(); }} - filter={(m) => m.sex === "F" || m.sex === undefined} - current={member.father} + filter={(m) => + (m.sex === "F" || m.sex === undefined) && m.id !== member.id + } + current={member.mother} /> @@ -469,7 +467,7 @@ export function MemberPage(p: { onPhotoSelected={uploadNewPhoto} />{" "} {member.hasPhoto && ( - + - + {/* Upload button (from URL) */}{" "} + {isDebug() && ( + + )}{" "} {/* Crop image dialog */} {imageURL && (