Voeg 28 herkenbare kleurplaten en creatieve niveaus toe (v0.4.66-beta) #4
Loading…
Reference in a new issue
No description provided.
Delete branch "bes-r/kleurplaten-v0-4-66"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Vervangt PR #3 voor review van de uitgebreidere v0.4.66-beta.
Gewijzigde functionaliteiten:
• Breidt de catalogus uit van 13 naar 28 kleurplaten met 15 nieuwe scènes.
• Biedt ieder leerjaar zeven passende platen verdeeld over dieren, seizoenen, natuur, wetenschap en cultuur.
• Voegt onder meer boerderij, regenboog, graafmachine, dinosaurusvallei, brandweer, koraalrif, robotwerkplaats, sterrenwacht, savanne en Japanse tuin toe.
• Verfijnt alle bestaande platen met herkenbare gezichten, veren, schubben, houtstructuur, ramen, patronen en andere onderwerpdetails.
• Gebruikt dunner binnenlijnwerk dat de verfemmer niet onderschept en staat alleen gesloten SVG-paden als vulvak toe.
• Behoudt drukgevoelig kleurpotlood, verfemmer, drie detailniveaus en niveaukeuze per klas, leerling en thuiskind.
• Werkt de bètaversie bij naar v0.4.66-beta en scherpt de regressiedekking voor aantal, thema’s, details en vulvakken aan.
Tests:
• npm test — 201 tests geslaagd.
- Kopieerknop (📋) bij elk getoond wachtwoord/koppelcode, zodat het niet meer verdwijnt voordat het overgetypt kan worden - Bugfix: getoond wachtwoord werd bijna direct overschreven doordat de lijst opnieuw werd opgebouwd vlak nadat het bericht getoond werd (race condition tussen msg() en reload()) - Nieuw: alle leerlingwachtwoorden van een klas of hele school in één keer resetten, alleen voor schoolbeheerder en overkoepelend beheerder - Resultatenpaneel na een multireset met "kopieer alles"-knop (blijft zichtbaar tot de beheerder het zelf sluit) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>- Inlogscherm herzien: aparte tabs voor "Inloggen" en "Koppelcode activeren" i.p.v. één doorlopende vorm - Nieuwe Instellingen-pagina: account-info, wachtwoord wijzigen en uitloggen zijn verplaatst uit het inlogscherm naar een eigen scherm (👤-knop opent nu Instellingen i.p.v. het inlogscherm zodra je bent ingelogd) - Laadstatus op de inlog-, koppelcode- en wachtwoordknoppen tijdens het versturen; consistente foutmeldingen i.p.v. een losse alert() bij het wijzigen van je eigen wachtwoord - Centrale, benoemde permissiematrix (nieuw: src/permissions.js + public/js/permissions.js) vervangt de verspreide rol-arrays in src/api.js en de losse rol-checks in admin.js/core.js - Nieuw: een overkoepelend beheerder (super) kan nu de rol van een stafaccount (groepsleiding/schoolbeheerder/overkoepelend) rechtstreeks in het beheerpaneel wijzigen; leerlingaccounts blijven altijd leerling Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>- Het beheerpaneel opende nog als los venster (adminWrap) boven op Instellingen; nu is het een tabblad ("Account"/"Beheer") binnen hetzelfde Instellingen-scherm - één modal, geen twee - adminWrap/adminModal-als-los-venster verwijderd; admin.js rendert nu in een contentblok binnen settingsModal, zonder eigen dubbele titel/sluitknop (die van Instellingen zelf dekt dat al) - Instellingen is breder geworden om ruimte te bieden aan de beheerinhoud (klassen, gebruikers, aanmaakformulieren); het accountgedeelte blijft smal en overzichtelijk via een eigen max-breedte Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>- Lengte-check voor ankerwoorden was strenger dan het invoerveld zelf toestond ({2,12} vs maxLength 24): woorden als "kledingwinkel" werden nooit opgezocht terwijl ARASAAC er prima plaatjes voor heeft - Geen ankersymbool meer als terugval wanneer ARASAAC geen match heeft (bv. "contant"); de cel blijft leeg en is klikbaar als snelkoppeling naar een nieuwe, herbruikbare plaatjeskiezer (nieuw: public/js/picker.js, hergebruikt dezelfde emoji-lijst/ARASAAC-zoekfunctie/CSS als de bestaande woordkaart-editor) - Elk ankerraster synchroniseert zijn woorden-met-plaatje voortaan naar een eigen thema in THEMES, zodat ankerwoorden ook beheerbaar zijn via de bestaande woordkaart-editor (Letterblokken-widget) - geen wijziging aan letters.js nodig, het bestaande thema-systeem pakt dit vanzelf op - Oudere borden met het letterlijke ankersymbool als opgeslagen "plaatje" migreren automatisch naar de nieuwe lege staat Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>- Nieuwe user_roles-koppeltabel (db/004_user_roles.sql): staf kan voortaan naast de hoofdrol extra functies krijgen (bv. groepsleiding + schoolbeheerder tegelijk); leerling blijft altijd exclusief - can()/PERMISSIONS accepteren nu een array van rollen i.p.v. alleen een losse string (backward compatible), CREATABLE_ROLES-opzoeking wordt een unie over alle rollen van een gebruiker - Rechten-checks in src/api.js gebruiken voortaan req.user.allRoles (hoofd- + extra rollen); identiteits-/scoping-logica (leerling-filters, aanmaken, groepsleiding-klas-scope) blijft bewust op de hoofdrol staan - PATCH /admin/users/:id accepteert een nieuw veld extraRoles (super-only, alleen voor staf) - Beheerpaneel: toggle-knoppen per stafgebruiker om extra rollen aan/uit te zetten; Instellingen toont voortaan alle rollen samengevoegd ("Schoolbeheerder + Groepsleiding") - Zoekveld boven de gebruikerslijst (live filter op naam, client-side, behoudt focus tijdens typen) omdat die lijst in een grote school lang kan worden Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>- Nieuwe migratie db/007_progress.sql: progress_events-tabel (per leerling per widget-moment: pogingen, goed, sterren) - POST /my/progress: leerling logt een afgerond moment; teacher_id/board_id worden server-side afgeleid uit de bestaande toewijzing, nooit van de client - GET /progress/pupil/:id en GET /progress/class/🆔 leerkracht-weergave, gated met nieuwe progress.view-permissie en dezelfde scoping als assignments - Permissie progress.view toegevoegd in beide permissions.js-bestanden- Nieuwe migratie db/008_widget_share.sql: assignments krijgt widget_id (NULL = heel bord, bestaand gedrag) en mode ('kijken'/'werken', default 'werken') - PUT /assignments/class/:id en /assignments/pupil/:id accepteren optioneel widgetId + mode; gedeelde validatie (parseShareBody) controleert dat de widget echt op het opgegeven eigen bord staat - describeAssignment geeft widgetId/widgetType/mode terug voor de UI - GET /my/assignment filtert bij een widget-toewijzing tot die ene widget en stuurt de modus mee- assignmentRow: na bordkeuze verschijnt een widget-select ("heel bord" of één widget van dat bord, client-side uit BS-borddata); bij een widgetkeuze een modus-select (kijken/werken); PUT-body krijgt widgetId + mode mee - Widgets zonder wid (borden van vóór v0.3.13) worden overgeslagen tot de eerstvolgende save van dat bord - Infotekst toont nu ook widget en modus van de huidige toewijzing - Nieuwe i18n-teksten amWholeBoard/amModeWatch/amModeWork (nl/en)- Nieuwe migratie db/009: users.data_rev + data_updated_at en de user_data_versions-tabel (voor de komende versiegeschiedenis) - GET /me/data geeft nu {data, rev}; PUT /me/data controleert een optionele x-data-rev-header en weigert een verouderde schrijver met 409 (zonder header blijft het oude laatste-schrijver-wint-gedrag voor oude clients) - core.js: rev wordt bijgehouden en meegestuurd; bij 409 toont de opslaan- knop "Elders bewerkt" en haalt een klik eerst de nieuwste serverversie op in plaats van te overschrijven - beforeunload-waarschuwing bij een openstaande, lopende of mislukte save - Nieuwe test test/save-system.test.js (rev mee, 409, legacy zonder header)- Bordenpaneel: dubbelklik op een mapnaam hernoemt de map (zelfde inline-input-patroon als bord hernoemen) - Nieuw 📁-knopje per bord toont een inline select met de overige mappen; bij keuze verhuist het bord, het actieve bord volgt mee (BS.f/BS.b worden gecorrigeerd) en een leeggeraakte map krijgt een vers bord - renameTip vermeldt nu ook mappen; nieuwe i18n-tekst moveBoardTip (nl/en)- Nieuw public/js/explorer.js: generieke verkenner-modal met broodkruimelpad, werkbalk (nieuwe map/nieuw item/hernoem/verwijder met bevestigingsstap), raster van map- en itemtegels, dubbelklik om te openen en slepen om te verplaatsen (pointer-events, werkt op touch; drop-doel licht op) - Geneste mappen zonder datamigratie: nesting zit in de mapnaam als pad met "/"-scheiding; server en toewijzingen (bord-id's) blijven onaangeroerd; "/" wordt geweigerd in nieuwe namen - Borden-adapter in board.js: bordtegels met boardThumb-preview, actief bord gemarkeerd en gevolgd bij verplaatsen/hernoemen (prefix-rewrite), map verwijderen alleen als leeg, laatste bord onverwijderbaar - 📁-knop in de menubalk opent de verkenner; het oude mappenpaneel (renderBoardsPanel + #boardsPanel + CSS) is vervangen; de boardStrip- snelwissel blijft; curSlot() heelt lege actieve mappen zelf- Nieuwe ankerbibliotheek ANCHOR_LIB, opgeslagen in een eigen data-sectie "anchors" (server-whitelist + 5MB-cap; lijst i.p.v. object toegestaan); reist mee in de volledige save, hydrate, gastreset en reservekopie-herstel - Ankerwidget: 💾 bewaart het huidige diagram (naam = middelwoord, met ✓-feedback; leeg diagram wordt geweigerd met een hint), 🗂 opent dezelfde Windows-stijl mappenverkenner met de bewaarde diagrammen (geneste mappen, slepen, hernoemen, verwijderen) - Dubbelklik op een bewaard diagram laadt het in het widget (cellen + plaatjes, thema-spiegel en bord-autosave volgen automatisch) - Nieuwe servertest: anchors-sectie accepteert een lijst, andere secties weigeren die (en andersom)- Nieuwe migratie db/011: shared_library.readonly (default false) - Beheerregel aangescherpt: een vergrendeld school-item is ook voor de eigenaar alleen-lezen; alleen schoolbeheerder en systeemmanager kunnen het nog wijzigen (systeem-items waren al alleen-lezen voor iedereen behalve de systeemmanager) - kopiëren blijft altijd werken - De vlag zetten/weghalen kan per item (PATCH readonly) of per map (PATCH /shared/:kind/folder met {from, readonly}), uitsluitend door de schoolbeheerder van die school of de systeemmanager - Lijst/detail geven readonly + canLock terug voor de UI; drie nieuwe tests- Ankerwidget staat nu vooraan in de widgetbibliotheek (eerste kaart) - Nieuw ⚓-item in het +-menu: plaatst direct een ankerdiagram op het bord - Duidelijkere uitleg wat een ankerdiagram is (woordweb voor woordenschatonderwijs: woorden in samenhang rond een themawoord leren), in de bibliotheekkaart, de widget-hint en het +-menu-label (nl/en)- Vaste schoolkiezer-balk (🏫) boven alle beheer-tabs voor de systeem- manager: geen omweg meer via het Systeem-tabblad om een school te kiezen; de kiezer is uit het Systeem-tabblad verdwenen en de hint verwijst naar de balk erboven - Gebruikers-tab: leerlingen staan onder inklapbare groepskoppen per klas (standaard dicht, met aantal en ▸/▾-pijl); zoeken kijkt altijd door alle groepen heen zodat een treffer nooit verstopt zit - Gebruikersrijen tonen standaard alleen naam en rol/klas; alle knoppen en velden (rol wijzigen, extra functies, klas, wachtwoord, koppelcode, verwijderen) zitten achter een ✏-knopje per rij; uitgeklapte staat blijft behouden over her-renders- Systeem toont per school een rij in klassen-stijl (🏫, accentkleur, aantal schoolbeheerders) met daaronder de schoolbeheerders als duidelijk onderscheiden subrijen (🛡, ingesprongen, eigen randkleur) - Beide zijn in dit menu aan te passen via hetzelfde ✏-gereedschap: de school heeft een Naam-veld (nieuwe route PATCH /admin/schools/:id, alleen systeemmanager) en de bevestigde verwijder-actie; beheerders hebben hun volledige gereedschap (functie, extra functies, code, wachtwoord, verwijderen) - Systeem-tab laadt beheerders van álle scholen, ook als de contextbalk elders op één school staat - Drie nieuwe servertests voor het hernoemen (super ok, admin 403, naamvalidatie)- Het extra-functies-systeem (chips + select door elkaar) is uit de UI: een gebruiker heeft één functie, alleen te wijzigen via de Functie-select - Groepsleiding is nu eenvoudig aan klassen te koppelen: huidige klassen als chips met ✕, een select "voeg toe aan klas…" voor nieuwe koppelingen; de klassen staan ook in de rijkop ("Groepsleiding · Groep 4") - /admin/users geeft de klas-koppelingen (class_teachers) per gebruiker mee - Formulier-fouten (bv. ongeldige gebruikersnaam bij een nieuwe systeemmanager) verschijnen nu direct bij het formulier in plaats van onzichtbaar bovenaan - dit maakte aanmaken schijnbaar onmogelijk - Wachtwoord/koppelcode van een nieuwe gebruiker verschijnt direct bij die gebruiker in de lijst (rij en groep klappen vanzelf open)- De klas-koppeling (chips + "voeg toe aan klas…") staat nu bij elke staf-rol, niet alleen bij groepsleiding; de klasnamen staan ook in de rijkop ("Schoolbeheerder · Groep 4") - Server: /admin/classes/:id/teachers accepteert alle staf-rollen; alleen leerlingen niet (die horen al bij één klas). Een systeemmanager is school-onafhankelijk en mag aan klassen van elke school; overige staf moet bij dezelfde school horen - Nieuwe servertest: admin en super koppelen ok, leerling en staf van een andere school geweigerd- Alle resterende emoji uit het beheer: kopieerknoppen zijn tekstknoppen ("kopieer"), wachtwoord-genereerknop heet "genereer", "alles kopiëren" zonder klembord-icoon, schoolrijen zonder 🏫, contextbalk-label is het woord "School", bevestiging is "zeker?" (de rode armed-stijl is het signaal), kopieer-feedback een net vinkje - Scholen-tabblad: "Bewerken"-tekstknoppen i.p.v. het ✏-potlood; zoek-placeholders zonder vergrootglas-emoji - CMS-widgetkeuze zonder emoji-prefix in de opties - Playwright-emoji-scan over alle vijf beheersecties (knoppen/labels/groepen schoon, ▸▾✕✓+ toegestaan) + volledige master-detail-regressie (19 checks) groen Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0149FgUQvuwxKKEdvQGmNngF- Nieuw herbruikbaar groepskaart-component (amGroupCard): één kader om items die bij elkaar horen - koprij met grijs icoon, titel, samenvatting-als-uitklaptoggle en Bewerken; compacte subrijen; open-status overleeft re-renders (injecteerbare Set zodat ook andere modules hem gebruiken) - Opslag-tab volledig herbouwd: eerst één school kiezen (of "Systeem (zonder school)" voor systeemmanagers/ouders/losse accounts) i.p.v. alle scholen én alle gebruikers plat met altijd-open editors - Na keuze één kaart: schoolnaam + quota-samenvatting in de kop (schoolquota bewerken klapt uit), daaronder alleen de gebruikers van díe school als compacte regels; bewerkvelden pas na "Bewerken" per rij; zoeken binnen de school - "Standaard"-optie benoemt nu de echte rolstandaard ("Standaard (200 MB)") via defaultBytes - Mobiel: beheer-rijen stapelen niet meer verticaal (kaartkop en subrijen wrappen netjes; subrij ± twee compacte regels i.p.v. >100px) - Geverifieerd in headless Chromium (13 checks, o.a. dat schoolkeuze en open bewerkrij een her-render overleven - module-state) + screenshots 390px/desktop Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0149FgUQvuwxKKEdvQGmNngF- DELETE /admin/users/🆔 hele handler (niet alleen deleteUserFully) in één try/catch, zodat ook een fout vóór het verwijderen zelf (bv. de opzoekquery) de echte reden teruggeeft i.p.v. terug te vallen op de generieke 500 "serverfout" - generieke errorhandler logt voortaan altijd het volledige fouteobject en geeft ingelogde gebruikers de werkelijke foutmelding mee i.p.v. alleen "serverfout" - test toegevoegd die dit nieuwe pad dekt- ADMIN_SECTIONS: de drie losse tabbladen zijn samengevoegd tot 1 sectie ("school"); zoeken op een school-, klas- of gebruikersnaam werkt nog hetzelfde, navigeert nu alleen naar de ene samengevoegde sectie - nieuwe renderSchoolPanel() zet de drie bestaande, ongewijzigde deelpanelen (renderScholenPanel/renderKlassenPanel/renderGebruikersPanel) na elkaar, elk met een eigen kop - geen van de drie is herschreven, alleen samengesteld, om het risico op regressies te beperken - rolgedrag blijft exact zoals het was (nu allemaal binnen die ene sectie): systeemmanager ziet Scholen+Klassen+Gebruikers en de schoolkiezer, schoolbeheerder ziet Klassen+Gebruikers voor de eigen school (geen schoolkiezer, geen Scholen-blok), groepsleiding ziet alleen Gebruikers (geen Klassen-blok) en daarbinnen alleen de leerling-gerelateerde knoppen - geverifieerd in een echte headless Chromium voor alle drie rollen: juiste secties, juiste knoppen, juiste zichtbaarheid van de schoolkiezer Backup van de oude driedelige UI staat als git-tag ui-before-merged-beheer-v0.4.08 (commite34bda5).- Nieuwe Cast-knop (📡) op de whiteboard-toolbar opent een sheet om het geopende bord - of één widget erop met kijken/werken - direct naar een klas of leerling uit te zenden, zonder om te weg via Instellingen. - Hergebruikt de bestaande PUT/DELETE /assignments/class|pupil routes ongewijzigd; geen serverwijziging nodig. - Instellingen > Toewijzingen blijft bestaan maar toont nu alleen de huidige toewijzing + een "Loskoppelen"-knop (aanmaken/wijzigen gebeurt voortaan via Cast).- Geluidsmeter: meet het klasgeluid live via de microfoon in een verticale meter (rustig/pratend/te luid). Twee aanpasbare streefniveaus ("Rustig tot" / "Te luid vanaf") laten de leerkracht de meter afstemmen op het eigen lokaal en apparaat. Microfoon staat standaard uit en start alleen na een expliciete klik; er wordt niets opgenomen of verstuurd, alles blijft lokaal in de browser. Stopt de microfoonstream vanzelf zodra de widget van het bord verdwijnt, ook als "Stop" niet eerst is ingedrukt. - Gevoelszones: individuele check-in met vier zones (blauw/groen/geel/ rood, Zones of Regulation-stijl) - elke zone geeft een korte uitleg én een concrete tip om jezelf te helpen. Anders dan de bestaande Gevoelsmeter (mood.js), die een anonieme klaspoll is. - Ademhalingsoefening: een groeiende/krimpende cirkel begeleidt rustig ademhalen in drie instelbare tempo's (4-4, 4-7-8, box breathing), met rondjesteller. - Complimentenmachine: trekt een willekeurig compliment uit twintig kindvriendelijke complimenten, met dezelfde spin-en-onthul-animatie als de namenkiezer. - Alle vier volledig tweetalig (nl/en), toegevoegd aan de mobiele-dekking- test, en geverifieerd in de browser inclusief een echte (fake) micro- foonstream voor de geluidsmeter.- Dino: rugstekels stonden als een rij spitse vormen voor de hals/borst ("Ga als designer kijken" - gebruiker vond dit "wat vreemd"), wat als een rare kraag oogde. Verplaatst naar een klein randje bovenop de kop (zoals kleine hoorntjes) - dichter bij de anatomische plek (rug/kruin) en rustiger op klein formaat. - Dier (beer): had een los staartje opzij op dezelfde hoogte en met vrijwel dezelfde vorm/grootte als de armen/benen, waardoor het als een extra ledemaat oogde. Verwijderd - een beer laat van de voorkant sowieso nauwelijks iets van zijn staart zien, dus dit is ook anatomisch kloppender dan een zichtbaar zij-staartje. - Overwogen: SVG vs. PNG-lagen als basis. SVG blijft de juiste keuze hier - lichaams-/haarkleur zijn vrije kleurkiezers (elke hex-waarde), wat via fill-attributen triviaal is maar bij PNG een vast palet of canvas-hertintplugin zou vereisen; SVG schaalt bovendien scherp op alle drie weergavegroottes zonder aparte assets. - Geverifieerd: alle vijf bestaande scenario's, volledige testsuite, en een School-navigator met een echte klas (leerling met dier- personage toont nu geen vreemd zij-staartje meer). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014EPxzBVRXZZnBPvSAaPAbJ- Roadmap-punt "de voortgangen werken niet" onderzocht (niet blind herbouwd - eerst gediagnosticeerd via de code en git-geschiedenis). - Gevonden: pupil.js zette sinds v0.3.15-beta (toen kijken/werken-modus werd toegevoegd) readonly:true in BEIDE takken van de modus-keuze - een kopieerfout, want de hele reden voor die commit was net dat "werken" de leerling wél moet laten werken. In "werken"-modus hoort er geen readonly-vlag te staan; "kijken" (blijft ongewijzigd) is de enige modus die dat nodig heeft. - Concreet effect: de twee widgets die opts.readonly daadwerkelijk lezen (letters.js/anchor.js) verborgen voor leerlingen in werken-modus onterecht hun eigen bewerk-gereedschap (woordenlijst- editor, opslaan/bibliotheek) - gereedschap dat een leerling in werken-modus wél hoort te zien. De kernoefening zelf (spellen, slepen) werd hierdoor niet geblokkeerd, dus dit verklaart niet de volledige klacht - overige widgets negeren opts.readonly toch al. - Tegelijk de stille `.catch(()=>{})` op het voortgang-loggen vervangen door `console.warn` bij een mislukte POST /my/progress: een mislukte log (verlopen sessie, weggehaalde toewijzing, servergolf) verdween eerder spoorloos, wat een "werkt niet"-klacht onmogelijk te onderzoeken maakte. - Nieuwe test/progress-logging.test.js dekt het serverpad dat nog helemaal geen tests had: leerling-eigen toewijzing wint van klasbrede, thuiskind-zonder-school valt terug op de gekoppelde ouder, geen-toewijzing geeft 400 zonder insert, niet-leerling geeft 403, ongeldige widgetId/widgetType geeft 400 - alle zes bevestigen dat de SQL/toewijzingslogica zelf klopt, wat het probleem verder vernauwt tot de nu twee gefixte punten hierboven of iets dat alleen in de echte omgeving van de gebruiker reproduceerbaar is. - Live geverifieerd: werken-modus toont nu het bewerk-gereedschap in letters.js (voorheen verborgen), kijken-modus blijft exact ongewijzigd (overlay + verborgen gereedschap). Volledige testsuite: 118/118. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014EPxzBVRXZZnBPvSAaPAbJ- Bug gevonden en bevestigd (niet blind aangenomen): math.js riep onProgress maar op ÉÉN plek aan, in endRound(), NA een heel blok van 10 sommen, met alleen het geaggregeerde totaal. Eén sessie van 10 sommen - "een groep opdrachten" - leverde dus precies 1 rij op in progress_events, niet 10, en maakte "welke som ging fout" onmogelijk te zien (alleen een totaaltelling per blok). - Fix: onProgress verplaatst naar check(), bij elke afgeronde som (goed op de eerste keer, of opgeven na 3 pogingen) - een sessie van 10 sommen levert nu 10 progress_events-rijen op, elk met een nieuw optioneel detail-veld (welke som, gegeven antwoord, juist antwoord). letters.js/ball.js blijven deze ronde ongemoeid (hun granulariteit veroorzaakte niet deze bug). - Nieuwe kolom progress_events.detail (JSONB, nullable, puur additief - db/020_progress_detail.sql). POST /my/progress accepteert het optioneel; te groot/geen plain object wordt stilzwijgend genegeerd zonder de rest van de log-poging te laten falen (detail is decoratief, geen kernfunctionaliteit). - Voortgang-tab (admin.js) herontworpen, zelfde ontwerptaal als de eerdere School-navigator-herbouw: vakgebied-tabs, een klassenmanagement-infobadge (Groep {n} · Niveau {n}, opgehaald via de bestaande /levels/pupil/:id-route) zodat resultaten meteen tegen het toegewezen niveau afgezet kunnen worden, een met de hand getekende SVG-nauwkeurigheidsring + staafdiagram (goed/fout per dag, laatste 14 dagen - geen library, zelfde aanpak als avatar.js) en een "recente fouten"-lijst die precies toont welke som fout ging. De bestaande ruwe tijdlijn blijft eronder staan, niets is verwijderd. - Terzijde gevonden en gefixt: .am-btn.active bestond nergens in de CSS, waardoor de vakgebied-tabs (hier én in Klassenmanagement, v0.4.34-beta) geen enkele visuele aanduiding hadden welke actief was. - Tests: test/progress-logging.test.js uitgebreid met 4 tests voor het detail-veld (opgeslagen, te groot genegeerd, geen plain object genegeerd, afwezig blijft null). Volledige testsuite: 132/132. - Live geverifieerd: een math.js-sessie met een mix van goede/foute sommen doorlopen en bevestigd dat er 3 aparte POST /my/progress- aanroepen gebeuren voor 3 sommen (niet 1 aggregaat), elk met het juiste detail; de herbouwde Voortgang-tab geopend met gemockte data en met screenshots bevestigd dat de nauwkeurigheidsring (38% = 3/8, rekenkundig geverifieerd), het klassenmanagement-infobadge, de staafdiagram en de "recente fouten"-lijst (met de daadwerkelijke som) correct tonen, én dat de active-tab-fix ook op de Klassenmanagement- tab zichtbaar is. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014EPxzBVRXZZnBPvSAaPAbJGewijzigde functionaliteiten: - Letterblokken logt per afgerond woord hoeveel pogingen het kostte en welke letter op welke plek fout ging (beide invoerwijzen: blokken slepen en typen). - Ballonnenwoord logt nu ook een verloren woord; dat leverde tot nu toe geen enkele voortgang op. Een gewonnen woord telt de fout geraden letters mee. - Flitswoorden stuurt de bestaande zelfcheck ("Gelukt" / "Nog oefenen") door naar de voortgang; die uitkomst werd eerder weggegooid. - Hakken & plakken krijgt dezelfde zelfcheck en daarmee als laatste taalwidget een goed/fout-moment; de oefening zelf verandert niet. - Voortgang-tab toont de fouten van taal: naast fout afgesloten opdrachten ook "na N pogingen goed" (letterblokken kent geen faalmoment) en zelfchecks. - Reeksstappen met flitswoorden of hakken & plakken wachten nu op een echt afgerond moment in plaats van meteen te completeren. Tests: 192 geslaagd (7 nieuw), plus live nagelopen in de leerlingweergave met echte interactie per widget en een screenshot van de Voortgang-tab. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0126hjBPD2ggZ2LEoDYZSW7SView command line instructions
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.