Break today's food down by kind in the overview
The Food chart splits by kind but today's overview did not, so the one place you look first still lumped dry and fresh into a single total. It is a line under the stat tiles rather than part of the Meals tile. That tile is about 90px wide with a 0.7rem sub-line, and two kinds will not sit in it without wrapping into a mess — so the tile keeps the day's total, which is the headline figure, and the breakdown gets the room it needs. It follows the chart's conventions so the two read as one breakdown rather than two arbitrary lists: the same layer order, "No kind" last, a kind deleted since still named through its tombstone, and a meal logged without an amount adding nothing. Hidden unless a meal that day carries a kind, which keeps the overview untouched for anyone not using them — the case the first assertion in the new suite pins down. This was a gap rather than a reversal: when the split was scoped to "the grams chart only", the options named the counts chart, the by-hour heatmap and Timing as staying put. The overview's food total was in neither list, so it was never decided either way.
This commit is contained in:
@@ -122,4 +122,46 @@ suite("the palette wraps rather than running out");
|
||||
"…and the palette wraps, so two share rather than one having none");
|
||||
}
|
||||
|
||||
// ---------------------------------------------- the day's split in the overview
|
||||
// The Meals tile keeps the day's total; this is the breakdown under it. The
|
||||
// case that matters is the one where it must not appear at all.
|
||||
{
|
||||
let kinds = [];
|
||||
let el = { hidden: false, textContent: "" };
|
||||
const view = load({
|
||||
names: ["NO_KIND", "renderDayFoodKinds"],
|
||||
stubs: {
|
||||
document: { getElementById: () => el },
|
||||
liveFoodKinds: () => kinds,
|
||||
foodKindNames: () => new Map(kinds.map(k => [k.id, k.name])),
|
||||
},
|
||||
});
|
||||
const meal = (grams, foodKindId = "") => ({ type: "eat", grams, foodKindId });
|
||||
const show = (evs) => { el = { hidden: false, textContent: "" }; view.renderDayFoodKinds(evs); return el; };
|
||||
|
||||
suite("the day's food split");
|
||||
{
|
||||
kinds = [];
|
||||
eq(show([meal(180), meal(120)]).hidden, true,
|
||||
"meals with no kind show no breakdown — the tile's total already says it");
|
||||
eq(show([]).hidden, true, "a day with no meals shows nothing");
|
||||
|
||||
kinds = [{ id: "d", name: "Dry" }, { id: "f", name: "Fresh" }];
|
||||
const both = show([meal(200, "d"), meal(100, "f"), meal(60, "d")]);
|
||||
eq(both.hidden, false, "once a meal carries a kind, the breakdown appears");
|
||||
eq(both.textContent, "Dry 260 g · Fresh 100 g", "…summed per kind, in the chart's order");
|
||||
|
||||
eq(show([meal(200, "d"), meal(50)]).textContent, "Dry 200 g · No kind 50 g",
|
||||
"unlabelled food on a day that has kinds is named, not dropped");
|
||||
|
||||
kinds = [];
|
||||
eq(show([meal(90, "gone")]).textContent, "Deleted kind 90 g",
|
||||
"a kind deleted since still labels its food rather than vanishing");
|
||||
|
||||
kinds = [{ id: "d", name: "Dry" }];
|
||||
eq(show([meal(0, "d"), meal(120, "d")]).textContent, "Dry 120 g",
|
||||
"a meal logged without an amount adds nothing to the split");
|
||||
}
|
||||
}
|
||||
|
||||
export default report("food-kinds");
|
||||
|
||||
Reference in New Issue
Block a user