Fix parent-child connection lines and PED export label
Some checks failed
Deploy to GitHub Pages / build (push) Has been cancelled
Deploy to GitHub Pages / deploy (push) Has been cancelled

Fixes:
- Connection lines now start directly from the spouse line (parentY)
  instead of below the parent symbols (parentY + halfSymbol), ensuring
  lines connect properly without gaps
- PED export now uses metadata.label instead of internal ID, so user-
  defined labels are preserved in exported files. Parent references
  (fatherId, motherId) also use the label mapping for consistency.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
gbanyan
2025-12-15 21:18:19 +08:00
parent 07a4902e45
commit 9ba52db8b5
2 changed files with 18 additions and 8 deletions

View File

@@ -18,6 +18,12 @@ export class PedWriter {
write(pedigree: Pedigree): string { write(pedigree: Pedigree): string {
const lines: string[] = []; const lines: string[] = [];
// Build ID to label mapping (use label if available, otherwise use ID)
const idToLabel = new Map<string, string>();
for (const [id, person] of pedigree.persons) {
idToLabel.set(id, person.metadata.label || id);
}
// Add header comment // Add header comment
lines.push(`# Pedigree: ${pedigree.familyId}`); lines.push(`# Pedigree: ${pedigree.familyId}`);
lines.push(`# Generated: ${new Date().toISOString()}`); lines.push(`# Generated: ${new Date().toISOString()}`);
@@ -28,7 +34,7 @@ export class PedWriter {
const sortedPersons = this.sortPersonsByGeneration(pedigree); const sortedPersons = this.sortPersonsByGeneration(pedigree);
for (const person of sortedPersons) { for (const person of sortedPersons) {
const line = this.formatPersonLine(person); const line = this.formatPersonLine(person, idToLabel);
lines.push(line); lines.push(line);
} }
@@ -38,12 +44,16 @@ export class PedWriter {
/** /**
* Format a single person as a PED line * Format a single person as a PED line
*/ */
private formatPersonLine(person: Person): string { private formatPersonLine(person: Person, idToLabel: Map<string, string>): string {
const individualId = idToLabel.get(person.id) || person.id;
const paternalId = person.fatherId ? (idToLabel.get(person.fatherId) || person.fatherId) : '0';
const maternalId = person.motherId ? (idToLabel.get(person.motherId) || person.motherId) : '0';
const fields = [ const fields = [
person.familyId, person.familyId,
person.id, individualId,
person.fatherId ?? '0', paternalId,
person.motherId ?? '0', maternalId,
this.formatSex(person.sex), this.formatSex(person.sex),
this.formatPhenotype(person.phenotypes[0] ?? Phenotype.Unknown), this.formatPhenotype(person.phenotypes[0] ?? Phenotype.Unknown),
]; ];

View File

@@ -137,11 +137,11 @@ export class ConnectionRenderer {
} }
const childY = children[0].y; const childY = children[0].y;
const midY = parentY + halfSymbol + dropHeight; const midY = parentY + dropHeight;
// Vertical line from parent connection point // Vertical line from parent connection point (starts at spouse line level)
paths.push({ paths.push({
d: `M ${parentX} ${parentY + halfSymbol} L ${parentX} ${midY}`, d: `M ${parentX} ${parentY} L ${parentX} ${midY}`,
className: 'connection-parent-child', className: 'connection-parent-child',
}); });