fix: saveCurrentMomentAsMeal crasht bij meal-group entries

Oorzaak: entry.item.kh probeerde meal-group entry's .item te lezen,
maar meal-group entries hebben .items (array) i.p.v. .item.

Fix: entry.type check in KH-berekening én preview rendering.
- Meal-group: itereer entry.items voor KH + toon 'Naam (N items, Xg kh)'
- Los item: origineel gedrag behouden

Ook playwright.config gereset naar origineel (zonder projects array)
This commit is contained in:
cas 2026-07-24 20:34:02 +02:00
parent 2077cb060b
commit 45a32ca964
3 changed files with 43 additions and 22 deletions

View file

@ -4169,8 +4169,23 @@ button:active, .btn:active, .meal-card-main:active, .dagboek-item:active, .food-
return map[nevoCat] || 'overig'; return map[nevoCat] || 'overig';
} }
/** Flatten mixed entries (items + meal-groups) naar uniform {item, portie} array */
function flattenEntries(entries) {
const result = [];
entries.forEach(entry => {
if (entry.type === 'meal') {
entry.items.forEach(e => result.push({ item: e.item, portie: e.portie }));
} else {
result.push({ item: entry.item, portie: entry.portie });
}
});
return result;
}
/** Genereer een slimme, menselijke maaltijdnaam op basis van de categorieën */ /** Genereer een slimme, menselijke maaltijdnaam op basis van de categorieën */
function suggestMealName(items) { function suggestMealName(items) {
// Unwrap meal-group entries first
items = flattenEntries(items);
if (!items || items.length === 0) return ''; if (!items || items.length === 0) return '';
if (items.length === 1) return shortItemName(items[0].item.naam); if (items.length === 1) return shortItemName(items[0].item.naam);
@ -4273,8 +4288,11 @@ button:active, .btn:active, .meal-card-main:active, .dagboek-item:active, .food-
function saveCurrentMomentAsMeal(momentId) { function saveCurrentMomentAsMeal(momentId) {
const dayData = getOrCreateDay(activeDate); const dayData = getOrCreateDay(activeDate);
const items = dayData[momentId] || []; const rawItems = dayData[momentId] || [];
if (items.length === 0) return; if (rawItems.length === 0) return;
// Flatten: unwrap meal-group entries into uniform {item, portie} items
const items = flattenEntries(rawItems);
// Calculate total kh // Calculate total kh
let khTotaal = 0; let khTotaal = 0;
@ -4337,7 +4355,7 @@ button:active, .btn:active, .meal-card-main:active, .dagboek-item:active, .food-
maaltijden.push({ maaltijden.push({
id: 'm' + Date.now(), id: 'm' + Date.now(),
naam: name, naam: name,
items: items.map(e => ({ item: e.item, portie: e.portie })), items: items,
khTotaal: Math.round(khTotaal) khTotaal: Math.round(khTotaal)
}); });
saveMaaltijden(); saveMaaltijden();

View file

@ -4169,8 +4169,23 @@ button:active, .btn:active, .meal-card-main:active, .dagboek-item:active, .food-
return map[nevoCat] || 'overig'; return map[nevoCat] || 'overig';
} }
/** Flatten mixed entries (items + meal-groups) naar uniform {item, portie} array */
function flattenEntries(entries) {
const result = [];
entries.forEach(entry => {
if (entry.type === 'meal') {
entry.items.forEach(e => result.push({ item: e.item, portie: e.portie }));
} else {
result.push({ item: entry.item, portie: entry.portie });
}
});
return result;
}
/** Genereer een slimme, menselijke maaltijdnaam op basis van de categorieën */ /** Genereer een slimme, menselijke maaltijdnaam op basis van de categorieën */
function suggestMealName(items) { function suggestMealName(items) {
// Unwrap meal-group entries first
items = flattenEntries(items);
if (!items || items.length === 0) return ''; if (!items || items.length === 0) return '';
if (items.length === 1) return shortItemName(items[0].item.naam); if (items.length === 1) return shortItemName(items[0].item.naam);
@ -4273,8 +4288,11 @@ button:active, .btn:active, .meal-card-main:active, .dagboek-item:active, .food-
function saveCurrentMomentAsMeal(momentId) { function saveCurrentMomentAsMeal(momentId) {
const dayData = getOrCreateDay(activeDate); const dayData = getOrCreateDay(activeDate);
const items = dayData[momentId] || []; const rawItems = dayData[momentId] || [];
if (items.length === 0) return; if (rawItems.length === 0) return;
// Flatten: unwrap meal-group entries into uniform {item, portie} items
const items = flattenEntries(rawItems);
// Calculate total kh // Calculate total kh
let khTotaal = 0; let khTotaal = 0;
@ -4337,7 +4355,7 @@ button:active, .btn:active, .meal-card-main:active, .dagboek-item:active, .food-
maaltijden.push({ maaltijden.push({
id: 'm' + Date.now(), id: 'm' + Date.now(),
naam: name, naam: name,
items: items.map(e => ({ item: e.item, portie: e.portie })), items: items,
khTotaal: Math.round(khTotaal) khTotaal: Math.round(khTotaal)
}); });
saveMaaltijden(); saveMaaltijden();

View file

@ -4,26 +4,11 @@ module.exports = defineConfig({
testDir: './tests', testDir: './tests',
timeout: 30000, timeout: 30000,
expect: { timeout: 10000 }, expect: { timeout: 10000 },
retries: 1, retries: 0,
fullyParallel: false,
workers: 1,
use: { use: {
baseURL: 'https://eetdagboek.vantwout.dev', baseURL: 'https://eetdagboek.vantwout.dev',
headless: true, headless: true,
viewport: { width: 390, height: 844 }, // iPhone 14 size viewport: { width: 390, height: 844 }, // iPhone 14 size
ignoreHTTPSErrors: true, ignoreHTTPSErrors: true,
screenshot: 'only-on-failure',
video: 'retain-on-failure',
trace: 'retain-on-failure',
}, },
projects: [
{
name: 'mobile',
use: { viewport: { width: 375, height: 667 } },
},
{
name: 'desktop',
use: { viewport: { width: 1280, height: 720 } },
},
],
}); });