diff --git a/docker/index.html b/docker/index.html index 444998f..6805b5e 100644 --- a/docker/index.html +++ b/docker/index.html @@ -1246,28 +1246,62 @@ body { opacity: 0.6; } -/* ===== Save Meal Icon in Header ===== */ -.save-meal-btn { - display: inline-flex; +/* ===== Save Meal — checkbox + footer ===== */ +.item-checkbox-wrapper { + display: none; align-items: center; - justify-content: center; - width: 24px; - height: 24px; - font-size: 14px; - color: var(--primary-dark); + flex-shrink: 0; +} +.eetmoment-card.has-multi-items .item-checkbox-wrapper { + display: inline-flex; +} +.item-checkbox { + flex-shrink: 0; + width: 18px; + height: 18px; + accent-color: var(--primary); cursor: pointer; - border-radius: 50%; - transition: background 0.15s, transform 0.15s; - user-select: none; - -webkit-user-select: none; + margin: 0 6px 0 0; } -.save-meal-btn:hover { +/* Meal-group checkbox: on the header line */ +.eetmoment-meal-group .item-checkbox { + margin: 0 6px 0 -2px; +} + +.save-meal-footer { + padding: 4px 14px 10px; +} +.save-meal-footer-btn { + display: block; + width: 100%; + padding: 10px 16px; background: var(--primary-light); - transform: scale(1.1); + border: 1px solid var(--primary); + border-radius: var(--radius-sm); + color: var(--primary-dark); + font-size: var(--font-sm); + font-weight: 600; + cursor: pointer; + transition: background 0.15s, opacity 0.15s; + text-align: center; + font-family: var(--body-font); + min-height: var(--touch-min); + line-height: 1.3; } -.save-meal-btn:active { - background: var(--accent); - transform: scale(0.95); +.save-meal-footer-btn:hover { + background: var(--primary); + color: var(--white); +} +.save-meal-footer-btn:active { + background: var(--primary-dark); + color: var(--white); +} +.save-meal-footer-btn:disabled { + opacity: 0.4; + cursor: default; + background: var(--primary-lighter); + color: var(--primary-dark); + border-color: var(--border); } /* ===== Diary — nested meal groups ===== */ @@ -3322,6 +3356,7 @@ button:active, .btn:active, .meal-card-main:active, .dagboek-item:active, .food- return `
  • + 🍽 ${escapeHtml(entry.mealNaam)} ${formatKh(mealKh)} g @@ -3349,6 +3384,9 @@ button:active, .btn:active, .meal-card-main:active, .dagboek-item:active, .food- const itemOverLimit = overLimit && itemKh > 0; return `
  • + + +
    ${escapeHtml(displayNaam(entry.item.naam))}
    @@ -3372,21 +3410,26 @@ button:active, .btn:active, .meal-card-main:active, .dagboek-item:active, .food- const inlineGlucoseHtml = glucoseMoment ? renderInlineGlucoseItem(glucoseMoment) : ''; return ` -
  • +
  • ${moment.icon} ${moment.name}
    ${roundedKh > 0 ? formatKh(roundedKh) + ' g' : '—'} - ${items.length > 0 ? '' : ''} - ${items.length > 0 ? '' : ''} + ${items.length > 0 ? '' : ''}
    ${items.length > 0 ? `` : ''} ${inlineGlucoseHtml}
    + Voedingsmiddel toevoegen
    + ${items.length > 0 ? ` + ` : ''}
  • `; }).join(''); @@ -3443,18 +3486,43 @@ button:active, .btn:active, .meal-card-main:active, .dagboek-item:active, .food- }); }); - // Save meal buttons - listEl.querySelectorAll('.save-meal-btn').forEach(btn => { + // Save meal footer button + listEl.querySelectorAll('.save-meal-footer-btn').forEach(btn => { btn.addEventListener('click', (e) => { e.stopPropagation(); - saveCurrentMomentAsMeal(btn.dataset.moment); + const momentId = btn.dataset.moment; + const card = btn.closest('.eetmoment-card'); + // Collect selected indices from checked checkboxes + const checked = card.querySelectorAll('.item-checkbox:checked'); + const selectedIndices = Array.from(checked).map(cb => parseInt(cb.dataset.index)); + saveCurrentMomentAsMeal(momentId, selectedIndices); + }); + }); + + // Checkbox change → update save button text + listEl.querySelectorAll('.item-checkbox').forEach(cb => { + cb.addEventListener('change', () => { + const card = cb.closest('.eetmoment-card'); + if (!card) return; + const footer = card.querySelector('.save-meal-footer'); + if (!footer) return; + const btn = footer.querySelector('.save-meal-footer-btn'); + const checked = card.querySelectorAll('.item-checkbox:checked').length; + const total = card.querySelectorAll('.item-checkbox').length; + if (checked === 0) { + btn.disabled = true; + btn.textContent = '⭐ 0 geselecteerde items als maaltijd'; + } else { + btn.disabled = false; + btn.textContent = `⭐ Opslaan ${checked} geselecteerde ${checked === 1 ? 'item' : 'items'} als maaltijd`; + } }); }); // Meal group toggle expand/collapse listEl.querySelectorAll('.meal-group-header').forEach(header => { header.addEventListener('click', (e) => { - if (e.target.closest('.meal-group-edit, .eetmoment-remove')) return; + if (e.target.closest('.meal-group-edit, .eetmoment-remove, .item-checkbox')) return; header.classList.toggle('expanded'); }); }); @@ -4286,13 +4354,19 @@ button:active, .btn:active, .meal-card-main:active, .dagboek-item:active, .food- return r; } - function saveCurrentMomentAsMeal(momentId) { + function saveCurrentMomentAsMeal(momentId, selectedIndices) { const dayData = getOrCreateDay(activeDate); const rawItems = dayData[momentId] || []; if (rawItems.length === 0) return; + // Filter to only selected items (by index in rawItems) + const filteredRaw = selectedIndices + ? rawItems.filter((_, i) => selectedIndices.includes(i)) + : rawItems; + if (filteredRaw.length === 0) return; + // Flatten: unwrap meal-group entries into uniform {item, portie} items - const items = flattenEntries(rawItems); + const items = flattenEntries(filteredRaw); // Calculate total kh let khTotaal = 0; @@ -4325,7 +4399,7 @@ button:active, .btn:active, .meal-card-main:active, .dagboek-item:active, .food-