diff --git a/src/components/measurements/__tests__/measurement-list-meta.test.ts b/src/components/measurements/__tests__/measurement-list-meta.test.ts index c2ea28c44..89e8e01c5 100644 --- a/src/components/measurements/__tests__/measurement-list-meta.test.ts +++ b/src/components/measurements/__tests__/measurement-list-meta.test.ts @@ -5,6 +5,7 @@ import { MEASUREMENT_TYPE_ICONS, MEASUREMENT_TYPE_COLORS, measurementUnitLabel, + measurementUnitMetaLead, } from "../measurement-list-meta"; import enMessages from "../../../../messages/en.json"; import deMessages from "../../../../messages/de.json"; @@ -61,3 +62,14 @@ describe("measurementUnitLabel", () => { expect(measurementUnitLabel("VISCERAL_FAT", "rating", t)).toBe(""); }); }); + +describe("measurementUnitMetaLead", () => { + const t = (key: string) => `t:${key}`; + it("leads the meta line with the unit and its separator", () => { + expect(measurementUnitMetaLead("WEIGHT", "kg", t)).toBe("kg · "); + }); + it("leaves no bare separator for a score or a rating", () => { + expect(measurementUnitMetaLead("PHQ9_SCORE", "score", t)).toBeNull(); + expect(measurementUnitMetaLead("VISCERAL_FAT", "rating", t)).toBeNull(); + }); +}); diff --git a/src/components/measurements/measurement-list-meta.ts b/src/components/measurements/measurement-list-meta.ts index 0f228e9e4..1ac911c5a 100644 --- a/src/components/measurements/measurement-list-meta.ts +++ b/src/components/measurements/measurement-list-meta.ts @@ -425,3 +425,17 @@ export function measurementUnitLabel( } const UNITLESS_TOKENS: ReadonlySet = new Set(["score", "rating"]); + +/** + * The unit as the lead of a row's meta line ("kg · 2 days ago"), or null + * when the row has no unit word to show: a score or a rating would otherwise + * open the line with a bare separator. + */ +export function measurementUnitMetaLead( + type: string, + unit: string, + t: (key: string) => string, +): string | null { + const label = measurementUnitLabel(type, unit, t); + return label ? `${label} · ` : null; +} diff --git a/src/components/measurements/measurement-list.tsx b/src/components/measurements/measurement-list.tsx index 032b28006..942909da7 100644 --- a/src/components/measurements/measurement-list.tsx +++ b/src/components/measurements/measurement-list.tsx @@ -105,6 +105,7 @@ import { MEASUREMENT_TYPE_ICONS as TYPE_ICONS, MEASUREMENT_TYPE_COLORS as TYPE_COLORS, measurementUnitLabel, + measurementUnitMetaLead, } from "./measurement-list-meta"; import { measurementListFiltersToSearch, @@ -1537,19 +1538,22 @@ export function MeasurementList({ one ("Atemzüge/min") beside the value pushed the row's controls; it leads the meta line instead. Sleep reads as a duration. */} - {isSleep ? null : ( - - {measurementUnitLabel( - m.type, - isGrouped ? m.unit : rowDisplay(m).unit, - t, - )} - {" · "} - - )} + {(() => { + if (isSleep) return null; + const lead = measurementUnitMetaLead( + m.type, + isGrouped ? m.unit : rowDisplay(m).unit, + t, + ); + return lead ? ( + + {lead} + + ) : null; + })()} {m.dayKey !== undefined ? (