fix(fitness): save and recall paired L/R body measurements

Schema uses flat keys (leftBicep, rightBicep, leftForearm, ...), but
create/edit forms built nested objects (biceps: {left, right}), which
Mongoose silently stripped — so paired parts never persisted. The
latest-measurements endpoint also wraps the body-parts doc in
{value, date}; the display path skipped the .value hop, hiding every
body-part field. Switch client to flat keys end-to-end.
This commit is contained in:
2026-04-20 13:22:28 +02:00
parent 8e0b1d7b96
commit e9010b9e13
3 changed files with 39 additions and 46 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "homepage",
"version": "1.35.1",
"version": "1.35.2",
"private": true,
"type": "module",
"scripts": {
@@ -77,20 +77,21 @@
}
}
const latestBp = $derived(latest.measurements?.value ?? {});
const bodyPartFields = $derived([
{ label: t('neck', lang), key: 'neck', value: latest.measurements?.neck },
{ label: t('shoulders', lang), key: 'shoulders', value: latest.measurements?.shoulders },
{ label: t('chest', lang), key: 'chest', value: latest.measurements?.chest },
{ label: t('l_bicep', lang), key: 'bicepsLeft', value: latest.measurements?.biceps?.left },
{ label: t('r_bicep', lang), key: 'bicepsRight', value: latest.measurements?.biceps?.right },
{ label: t('l_forearm', lang), key: 'forearmsLeft', value: latest.measurements?.forearms?.left },
{ label: t('r_forearm', lang), key: 'forearmsRight', value: latest.measurements?.forearms?.right },
{ label: t('waist', lang), key: 'waist', value: latest.measurements?.waist },
{ label: t('hips', lang), key: 'hips', value: latest.measurements?.hips },
{ label: t('l_thigh', lang), key: 'thighsLeft', value: latest.measurements?.thighs?.left },
{ label: t('r_thigh', lang), key: 'thighsRight', value: latest.measurements?.thighs?.right },
{ label: t('l_calf', lang), key: 'calvesLeft', value: latest.measurements?.calves?.left },
{ label: t('r_calf', lang), key: 'calvesRight', value: latest.measurements?.calves?.right }
{ label: t('neck', lang), key: 'neck', value: latestBp.neck },
{ label: t('shoulders', lang), key: 'shoulders', value: latestBp.shoulders },
{ label: t('chest', lang), key: 'chest', value: latestBp.chest },
{ label: t('l_bicep', lang), key: 'leftBicep', value: latestBp.leftBicep },
{ label: t('r_bicep', lang), key: 'rightBicep', value: latestBp.rightBicep },
{ label: t('l_forearm', lang), key: 'leftForearm', value: latestBp.leftForearm },
{ label: t('r_forearm', lang), key: 'rightForearm', value: latestBp.rightForearm },
{ label: t('waist', lang), key: 'waist', value: latestBp.waist },
{ label: t('hips', lang), key: 'hips', value: latestBp.hips },
{ label: t('l_thigh', lang), key: 'leftThigh', value: latestBp.leftThigh },
{ label: t('r_thigh', lang), key: 'rightThigh', value: latestBp.rightThigh },
{ label: t('l_calf', lang), key: 'leftCalf', value: latestBp.leftCalf },
{ label: t('r_calf', lang), key: 'rightCalf', value: latestBp.rightCalf }
]);
/** @param {string} id */
@@ -175,20 +176,16 @@
if (formNeck) m.neck = Number(formNeck);
if (formShoulders) m.shoulders = Number(formShoulders);
if (formChest) m.chest = Number(formChest);
if (formBicepsL || formBicepsR) m.biceps = {};
if (formBicepsL) m.biceps.left = Number(formBicepsL);
if (formBicepsR) m.biceps.right = Number(formBicepsR);
if (formForearmsL || formForearmsR) m.forearms = {};
if (formForearmsL) m.forearms.left = Number(formForearmsL);
if (formForearmsR) m.forearms.right = Number(formForearmsR);
if (formBicepsL) m.leftBicep = Number(formBicepsL);
if (formBicepsR) m.rightBicep = Number(formBicepsR);
if (formForearmsL) m.leftForearm = Number(formForearmsL);
if (formForearmsR) m.rightForearm = Number(formForearmsR);
if (formWaist) m.waist = Number(formWaist);
if (formHips) m.hips = Number(formHips);
if (formThighsL || formThighsR) m.thighs = {};
if (formThighsL) m.thighs.left = Number(formThighsL);
if (formThighsR) m.thighs.right = Number(formThighsR);
if (formCalvesL || formCalvesR) m.calves = {};
if (formCalvesL) m.calves.left = Number(formCalvesL);
if (formCalvesR) m.calves.right = Number(formCalvesR);
if (formThighsL) m.leftThigh = Number(formThighsL);
if (formThighsR) m.rightThigh = Number(formThighsR);
if (formCalvesL) m.leftCalf = Number(formCalvesL);
if (formCalvesR) m.rightCalf = Number(formCalvesR);
body.measurements = Object.keys(m).length > 0 ? m : null;
return body;
@@ -26,16 +26,16 @@
let formNeck = $state(bp.neck != null ? String(bp.neck) : '');
let formShoulders = $state(bp.shoulders != null ? String(bp.shoulders) : '');
let formChest = $state(bp.chest != null ? String(bp.chest) : '');
let formBicepsL = $state((bp.biceps?.left ?? bp.leftBicep) != null ? String(bp.biceps?.left ?? bp.leftBicep) : '');
let formBicepsR = $state((bp.biceps?.right ?? bp.rightBicep) != null ? String(bp.biceps?.right ?? bp.rightBicep) : '');
let formForearmsL = $state((bp.forearms?.left ?? bp.leftForearm) != null ? String(bp.forearms?.left ?? bp.leftForearm) : '');
let formForearmsR = $state((bp.forearms?.right ?? bp.rightForearm) != null ? String(bp.forearms?.right ?? bp.rightForearm) : '');
let formBicepsL = $state(bp.leftBicep != null ? String(bp.leftBicep) : '');
let formBicepsR = $state(bp.rightBicep != null ? String(bp.rightBicep) : '');
let formForearmsL = $state(bp.leftForearm != null ? String(bp.leftForearm) : '');
let formForearmsR = $state(bp.rightForearm != null ? String(bp.rightForearm) : '');
let formWaist = $state(bp.waist != null ? String(bp.waist) : '');
let formHips = $state(bp.hips != null ? String(bp.hips) : '');
let formThighsL = $state((bp.thighs?.left ?? bp.leftThigh) != null ? String(bp.thighs?.left ?? bp.leftThigh) : '');
let formThighsR = $state((bp.thighs?.right ?? bp.rightThigh) != null ? String(bp.thighs?.right ?? bp.rightThigh) : '');
let formCalvesL = $state((bp.calves?.left ?? bp.leftCalf) != null ? String(bp.calves?.left ?? bp.leftCalf) : '');
let formCalvesR = $state((bp.calves?.right ?? bp.rightCalf) != null ? String(bp.calves?.right ?? bp.rightCalf) : '');
let formThighsL = $state(bp.leftThigh != null ? String(bp.leftThigh) : '');
let formThighsR = $state(bp.rightThigh != null ? String(bp.rightThigh) : '');
let formCalvesL = $state(bp.leftCalf != null ? String(bp.leftCalf) : '');
let formCalvesR = $state(bp.rightCalf != null ? String(bp.rightCalf) : '');
function buildBody() {
/** @type {any} */
@@ -49,20 +49,16 @@
if (formNeck) ms.neck = Number(formNeck);
if (formShoulders) ms.shoulders = Number(formShoulders);
if (formChest) ms.chest = Number(formChest);
if (formBicepsL || formBicepsR) ms.biceps = {};
if (formBicepsL) ms.biceps.left = Number(formBicepsL);
if (formBicepsR) ms.biceps.right = Number(formBicepsR);
if (formForearmsL || formForearmsR) ms.forearms = {};
if (formForearmsL) ms.forearms.left = Number(formForearmsL);
if (formForearmsR) ms.forearms.right = Number(formForearmsR);
if (formBicepsL) ms.leftBicep = Number(formBicepsL);
if (formBicepsR) ms.rightBicep = Number(formBicepsR);
if (formForearmsL) ms.leftForearm = Number(formForearmsL);
if (formForearmsR) ms.rightForearm = Number(formForearmsR);
if (formWaist) ms.waist = Number(formWaist);
if (formHips) ms.hips = Number(formHips);
if (formThighsL || formThighsR) ms.thighs = {};
if (formThighsL) ms.thighs.left = Number(formThighsL);
if (formThighsR) ms.thighs.right = Number(formThighsR);
if (formCalvesL || formCalvesR) ms.calves = {};
if (formCalvesL) ms.calves.left = Number(formCalvesL);
if (formCalvesR) ms.calves.right = Number(formCalvesR);
if (formThighsL) ms.leftThigh = Number(formThighsL);
if (formThighsR) ms.rightThigh = Number(formThighsR);
if (formCalvesL) ms.leftCalf = Number(formCalvesL);
if (formCalvesR) ms.rightCalf = Number(formCalvesR);
body.measurements = Object.keys(ms).length > 0 ? ms : null;
return body;