feat(stammbaum): family network — graph, badge, edit card, /stammbaum page (#358) #360
@@ -14,7 +14,10 @@ interface Props {
|
|||||||
|
|
||||||
let { personId, relationships, inferredRelationships }: Props = $props();
|
let { personId, relationships, inferredRelationships }: Props = $props();
|
||||||
|
|
||||||
const topDerived = $derived(inferredRelationships.slice(0, 5));
|
const directOtherIds = $derived(new Set(relationships.map((rel) => otherId(rel))));
|
||||||
|
const topDerived = $derived(
|
||||||
|
inferredRelationships.filter((d) => !directOtherIds.has(d.person.id)).slice(0, 5)
|
||||||
|
);
|
||||||
|
|
||||||
function chipLabel(rel: RelationshipDTO): string {
|
function chipLabel(rel: RelationshipDTO): string {
|
||||||
const viewpointIsSubject = rel.personId === personId;
|
const viewpointIsSubject = rel.personId === personId;
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
import { describe, it, expect } from 'vitest';
|
||||||
|
import { render } from 'vitest-browser-svelte';
|
||||||
|
import { page } from 'vitest/browser';
|
||||||
|
import PersonRelationshipsCard from './PersonRelationshipsCard.svelte';
|
||||||
|
|
||||||
|
const PERSON_ID = '00000000-0000-0000-0000-000000000001';
|
||||||
|
const SPOUSE_ID = '00000000-0000-0000-0000-000000000002';
|
||||||
|
|
||||||
|
describe('PersonRelationshipsCard', () => {
|
||||||
|
it('hides an inferred relationship that is already a direct one', async () => {
|
||||||
|
render(PersonRelationshipsCard, {
|
||||||
|
personId: PERSON_ID,
|
||||||
|
relationships: [
|
||||||
|
{
|
||||||
|
id: 'r1',
|
||||||
|
personId: PERSON_ID,
|
||||||
|
relatedPersonId: SPOUSE_ID,
|
||||||
|
personDisplayName: 'Anna Müller',
|
||||||
|
relatedPersonDisplayName: 'Bertha Müller',
|
||||||
|
relationType: 'SPOUSE_OF'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
inferredRelationships: [
|
||||||
|
{
|
||||||
|
person: {
|
||||||
|
id: SPOUSE_ID,
|
||||||
|
displayName: 'Bertha Müller',
|
||||||
|
familyMember: true
|
||||||
|
},
|
||||||
|
label: 'SPOUSE',
|
||||||
|
hops: 1
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
const matches = await page.getByText('Bertha Müller').all();
|
||||||
|
expect(matches).toHaveLength(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('still renders inferred relationships that are not direct', async () => {
|
||||||
|
const COUSIN_ID = '00000000-0000-0000-0000-000000000003';
|
||||||
|
render(PersonRelationshipsCard, {
|
||||||
|
personId: PERSON_ID,
|
||||||
|
relationships: [],
|
||||||
|
inferredRelationships: [
|
||||||
|
{
|
||||||
|
person: { id: COUSIN_ID, displayName: 'Carla Cousine', familyMember: true },
|
||||||
|
label: 'COUSIN',
|
||||||
|
hops: 4
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
await expect.element(page.getByText('Carla Cousine')).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user