Commit graph

38 commits

Author SHA1 Message Date
cas
11b3688779 feat: infinite scroll koppelen aan API pagination
IntersectionObserver haalt nu offset+=batch op via API ipv allItems
slicen. Bij een zoekopdracht wordt eerst de API geraadpleegd (paginated
fetchFoodPage), en bij scrollen worden volgende pagina's opgehaald.
Bij API-falen valt de code terug op de lokale client-side filtering.

Wijzigingen:
- SEARCH_PAGE_SIZE 50 → 200
- fetchFoodPage() — nieuwe async functie voor paginated API calls
- renderZoeken() — async met API try/fallback pad
- setupSearchObserver — async, API-aware via searchTotal flag
- appendSearchBatchFromApi / appendSearchBatchLocal — gesplitst
- resetSearchPagination reset nu ook searchPage en searchTotal
- isSearchLoading guard tegen race conditions
- displayCategory() met Tussendoortjes → Tussendoor mapping
- voedingsmiddelenByN Map voor click-handler lookup in API items
- data-nummer attribuut ipv data-index voor API data compatibiliteit

Alle 25 e2e tests slagen.
2026-07-25 09:38:26 +02:00
cas
0ab09c6f1b docs: beide URLs in README + deploy-script voor main/dev 2026-07-25 00:38:31 +02:00
cas
475528fcf1 docs: Karby logo in README titel 2026-07-25 00:34:31 +02:00
cas
906822e2c3 docs: README met features, changelog, deploy-instructies 2026-07-25 00:31:23 +02:00
cas
ebff09e3e1 ui: trash icoon subtieler — kleiner + tekstkleur ipv rood 2026-07-25 00:20:41 +02:00
cas
8139305a4c ui: vervang rood x door trash-can icoon 2026-07-24 23:54:55 +02:00
cas
510c265302 fix: haptics op checkboxes + test fixes voor animatie-changes
- Haptics uitgebreid naar input[type=checkbox], [role=button], [data-haptic]
- Test: footer-hidden class ipv style.display in evaluate
- Test: collapsed class ipv hidden in meal-group expand check
- Test: dispatchEvent('click') om parent-interceptie te omzeilen

38/39 tests groen, 1 skipped (legitieme guard)
2026-07-24 23:26:26 +02:00
cas
81d459cd51 UX: Animaties + haptics + bottom sheet verbeteringen
- Meal-group expand/collapse: smooth max-height transitie
- Items verwijderen: fade-out animatie
- Checkbox toggle: check animatie + kleur-transitie
- Footer knoppen: fadeIn bij verschijnen
- Portie stepper +/-: visuele pulse feedback
- Glucose save: visuele bevestiging
- Destructive haptics: vibrate(15) ipv 8
- Validatiefouten: dubbele korte vibrate
- Bottom sheet: swipe-down gesture + backdrop click fix

38/39 tests groen
2026-07-24 23:05:11 +02:00
cas
065644eb73 fix: save-meal knop weer zichtbaar bij 2+ geselecteerde items
Worker had style.display:none in template maar gebruikte disabled in handler —
knop bleef hidden. Gefixt naar display toggle + 2-item minimum.

Save-knop en delete-knop staan nu naast elkaar zichtbaar als 2+ items geselecteerd.
2026-07-24 22:33:59 +02:00
cas
89a196ce9a fix: maaltijd vereist 2+ ingrediënten, save-knop pas zichtbaar bij selectie
- Save-meal footer alleen bij 2+ items (niet bij 1 item)
- Save-knop hidden tot 2+ checkboxes gecheckt
- Delete-all knop (bezem) verwijderd uit eetmoment header
- Tests geüpdatet: 2 items toevoegen, checkboxes forceren via evaluate

38/39 tests groen, 1 skipped (confirm modal guard)
2026-07-24 22:25:45 +02:00
cas
e8e1755f31 Feat: bulk-delete via checkboxes + confirmatie dialogs bij destructive acties
- Bulk-delete knop in footer: verschijnt bij geselecteerde items
- confirmAction() herbruikbare confirmatie modal (Weet je het zeker?)
- Bevestiging bij verwijderen items, meal-groups, hele eetmomenten
- Code opgeschoond (72+ verwijderd, 21+ toegevoegd)

39/39 tests groen
2026-07-24 21:59:49 +02:00
cas
2de732159e UX: save-meal knop alleen zichtbaar bij 2+ geselecteerde items
- Save-knop volledig hidden (display:none) tot 2+ items geselecteerd
- 1 item: save-knop direct zichtbaar, enabled
- confirmAction() herbruikbare confirmatie dialog toegevoegd
- Bulk-delete knop in footer (hidden tot checkbox selectie)
- Edit-knop in meal-groups: wit op donkergeel (betere leesbaarheid)
- Meal-groups krijgen geen checkbox

39/39 tests groen
2026-07-24 21:45:57 +02:00
cas
4e34946b0d fix: save-meal checkboxes — niets standaard geselecteerd + 1 item direct enabled
- Checkboxes standaard unchecked (niet checked)
- 1 item: save-btn direct enabled, tekst 'Opslaan als maaltijd'
- 2+ items: save-btn disabled, tekst 'Selecteer N items'
- Bugfix: [] is truthy in JS → selectedIndices.length check
- Meal groups geen checkbox meer
2026-07-24 21:35:06 +02:00
cas
deef227760 fix: meal-group entries krijgen geen checkbox in save-meal selectie
Alleen losse voedingsmiddelen zijn selecteerbaar — al ingevoerde
maaltijden (meal groups) niet. Checkbox verwijderd uit de
eetmoment-meal-group header.
2026-07-24 21:17:00 +02:00
cas
0bceb721ca UX: Save-meal checkbox-selectie — kies welke items in maaltijd gaan
- Checkboxes per item (2+ items) met counter in knoptekst
- Save-meal knop terug naar full-width footer stijl (.save-meal-footer-btn)
- suggestMealName vult nu meteen slimme naam in
- Worker hernoemde .save-meal-btn → .save-meal-footer-btn
- Tests geüpdatet: pre-filled name ipv empty, clear-input voor valideertest
- Coder profiel verwijderd (overbodig naast frontend/backend-eng)

39/39 tests groen
2026-07-24 21:00:50 +02:00
cas
45a32ca964 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)
2026-07-24 20:34:02 +02:00
cas
2077cb060b UX: save-meal knop naar header icon + portie als zichtbare badge
Save-meal: verplaatst naar card header ( icon tussen KH en ▼)
- CSS: inline-flex, 24x24 circle, hover scale(1.1)
- Alleen zichtbaar bij items.length > 0

Portie-edit: .portion-display → .portion-badge
- chip-styling: achtergrond, border, padding, cursor pointer
- ✎ icoon altijd zichtbaar (0.7 opacity)

Revert: playwright.config.js teruggezet naar origineel
(tester worker had workers=1, retries=1, extra projects toegevoegd)
2026-07-24 20:21:34 +02:00
cas
94ce6954ff fix: glucose-e2e test 13 — .eetmoment-card nth(0) ipv nth(1)
nuchter-card is aparte class, niet .eetmoment-card. nth(1) was Tussendoor
die geen glucose-inline heeft.
2026-07-24 20:02:24 +02:00
cas
3d101c4056 Extra glucose e2e scenarios 11-14: volgorde, inline-only, zichtbaarheid, negatieve check 2026-07-24 19:51:07 +02:00
cas
2309cf22ad UX: Glucose inline per eetmoment — nuchter card + inline postprandiale metingen 2026-07-24 19:49:20 +02:00
cas
cfcb77407f chore: sync docker/index.html met glucose feature 2026-07-24 19:36:48 +02:00
cas
dbe39fded7 feat: glucose-metingen — nuchter + postprandiaal met streefwaardes
Data-laag: glucose state, localStorage ('koolhydraat-glucose'), PRIKMOMENTEN met
target ranges (nuchter < 5.4, postprandiaal 5.4–6.7)

UI: glucose-sectie in dagboek met 4 inputvelden (nuchter, na ontbijt, na lunch,
na avondeten). Kleurcodering: groen=binnen range, rood=buiten, grijs=leeg.
Save-on-blur, responsive 2×2 grid op mobiel.

E2e: 10 Playwright tests — invoer, validatie, kleurcodering, persistentie,
datum-navigatie, decimale invoer.

35 tests totaal (25 origineel + 10 glucose)
2026-07-24 19:36:40 +02:00
cas
809f289a46 fix: wit vlak bij infinite scroll — animation-delay gecapped op batchgrootte
Root cause: --i werd op globalIdx gezet (0–2327) → CSS animation-delay = --i × 50ms
→ item 2000 kreeg 100s delay en was nooit zichtbaar.

Fix: --i = idx % SEARCH_PAGE_SIZE (max 49, delay max 2.45s)
2026-07-24 12:13:27 +02:00
cas
b6c89e548d fix: infinite scroll sneller — rootMargin 1200px + 3 batches per trigger
Was: rootMargin=200px, 1 batch (50 items) per intersection trigger
→ bij snel scrollen moest je wachten of terugscrollen

Nu: rootMargin=1200px, tot 3 batches (150 items) per trigger
→ sentinel wordt 1200px eerder gedetecteerd, batches pre-loaden agressief
→ sentinel blijft ver voor de viewport, nooit meer wachten
2026-07-24 11:17:47 +02:00
cas
cb5bb43453 fix: infinite scroll te traag — rootMargin 200px→1200px, tot 3 batches per trigger 2026-07-24 11:17:44 +02:00
cas
35278053a7 test: e2e tests voor infinite scroll — batch loading + search reset
2 nieuwe Playwright tests:
- Sentinels triggeren meer items na scrollIntoView
- Zoekopdracht reset paginering terug naar ≤ SEARCH_PAGE_SIZE

docker/index.html synced met worker-implementatie
2026-07-24 11:13:36 +02:00
cas
544d71e1ac feat: infinite scroll op zoekresultaten — append-based batch loading (50 per batch)
- renderZoeken toont alleen eerste 50 items, geen DOM overload meer
- IntersectionObserver laadt volgende batches via append (behoudt scrollpositie)
- Event delegation voor openAddToMealForMoment (werkt met dynamisch geladen items)
- Pagination reset bij nieuw zoekopdracht, categorie-filter, en tab-switch
- Sentinel-element onder foodList als IntersectionObserver target
- searchSentinel/sentinel CSS + searchLoading styling
2026-07-24 11:10:28 +02:00
cas
1091eb5bf8 fix: closeDialog toegevoegd in showPortieEditDialog — bottom sheet sluit nu correct
Root cause: showPortieEditDialog (r.3217-3401) gebruikte closeDialog op 3 plekken
(r.3279 X-kruisje, r.3280 buiten-klik, r.3348 save) maar definieerde de functie
nergens. showBulkPortieEdit (r.3462-3465) had wél een closeDialog definitie.

Fix: closeDialog definitie toegevoegd met closing-animatie + delayed overlay removal.
E2e test toegevoegd voor single-ingredient portie wijzigen + opslaan scenario.

Kanban: t_044470e2
2026-07-24 09:27:54 +02:00
cas
1f3759786b fix: saveDagboek → saveToStorage (typo) — move/delete werken nu echt
Root cause: saveDagboek() was undefined → JS crashte in confirm/verplaats callbacks → overlays bleven hangen + opslag ging niet door
2026-07-24 03:15:05 +02:00
cas
a08baabe7c fix: event-delegatie naar init() verplaatst (1x registreren, niet per render) — move/delete werken nu
Root cause: listEl.addEventListener werd elke renderDagboek call opnieuw toegevoegd → 4+ handlers per klik. Fix: delegatie in init() met _delegationSetup flag, slechts 1 registratie.
2026-07-24 03:02:17 +02:00
cas
4925169ac9 fix: event-delegatie voor meal-group acties (move/delete/toggle werken nu) + dialog-knoppen gebruiken bestaande Karby-classes (btn-cancel, btn-save, btn-danger-outline) + e2e test voor confirm modal 2026-07-24 02:42:11 +02:00
cas
423977e397 feat: design-conforme bevestigingsmodal + maaltijd verplaatsen/verwijderen uit dagboek
- showConfirmModal vervangt alle confirm() calls met Karby-design modal
- Opslagen maaltijden verwijderen via bevestigingsmodal
- Dagboek: hele maaltijd-groep verwijderen (niet alleen losse items)
- Dagboek: maaltijd verplaatsen naar ander eetmoment
- Delete-knop styling: rode rand + rode tekst
2026-07-24 02:30:24 +02:00
cas
b0833297b4 QA: Nieuwe e2e tests — portie-steppers (minus/disabled/active), modal open animatie, maaltijd validatie, meal-group uitklappen, datumkiezer
21 e2e tests total, all passing against production site.

Nieuwe tests toegevoegd:
- portion stepper: steppers verschijnen in addMealModal met count=1
- portion stepper: plus op tweede stepper reset eerste, activeert tweede
- portion stepper: minus verlaagt naar 0, wordt dan disabled (geen negatieven)
- portion stepper: active class toggles na plus/minus
- modal close animation: closing class tijdens dismiss
- modal open animation: fadeIn/slideUp CSS animaties op open
- tab switching: switching class tijdens crossfade
- meal save: name input leeg bij openen
- meal save: empty name toont rode rand, modal blijft open
- date navigator: prev/next verandert datum, today reset
- zoektab: food items krijgen staggered --i indices
- button press: buttons hebben transition transform
- meal-group uitklappen: saved meal expand/collapse toggles in dagboek
2026-07-24 02:25:54 +02:00
cas
e09cf22b77 feat: toast positioned dynamically at click Y-coordinate — slides out right from interaction point 2026-07-24 02:22:55 +02:00
cas
1bb0a94bdd fix: toast terug naar slideInRight/slideOutRight — rechtsonder gepositioneerd 2026-07-24 02:18:40 +02:00
cas
0713ec62cd feat: haptic feedback (navigator.vibrate) + toast fix + 7 nieuwe e2e tests
- Haptic feedback: 8ms vibrate op elke button press (Android Vibration API)
- Toast fix: slideUp/Down animatie ipv slideInRight (die de pagina verschoof)
- 7 nieuwe e2e tests: steppers, modal-close animatie, tab-switching, date-nav, stagger-indices, button-transitions
- Tests groen: 15/16 passed, 1 skipped
2026-07-24 02:13:35 +02:00
cas
9c3a07bbce feat: animatiesysteem voor alle interacties (knoppen, modals, tabs, toasts, lijsten)
- 9 @keyframes: fadeIn/Out, slideUp/Down, slideInRight/OutRight, scaleIn, pulse, shimmer
- Button press: scale(0.96) op :active met 0.12s transition
- Modals: slideUp open (0.3s cubic-bezier), slideDown close (0.25s)
- Toast: slideInRight open, slideOutRight dismiss na 2s
- Tabs: crossfade switching met .switching class
- List items: staggered fadeIn via --i CSS variable (50ms per item)
- Stepper: pulse animatie op +/− tap
- Chips/pills: scale feedback op :active
- Diary entries: fadeIn + slideUp op nieuwe entries
2026-07-24 01:57:06 +02:00
cas
c2b9074ef9 feat: initiële commit — Karby PWA koolhydratenteller met NEVO database, maaltijden, dagboek, e2e tests
- NEVO dataset (2328 voedingsmiddelen) met zoekfunctie
- Dagboek met eetmomenten, koolhydratenlimiet en progress bar
- Maaltijden opslaan + nesten in dagboek + eenmalig/permanent bewerken
- Portie-systeem met steppers per NEVO-categorie
- Vorteq amber/goud branding met Karby logo
- Voedingscentrum links per product
- 8 Playwright e2e tests (100% groen)
- PWA met offline support

Kanban board: koolhydraat-app
2026-07-24 01:44:19 +02:00