teach/test
Ramon e7bb76b76d
All checks were successful
dev - build & deploy naar test / build-and-deploy (push) Successful in 1m9s
feat: klassenmanagement - niveaugroep + niveau per leerling per vakgebied (v0.4.34-beta)
- Grootste openstaande roadmap-punt. Nieuwe tabel pupil_levels
  (db/019_pupil_levels.sql, zelfde class_id/pupil_id-vorm als
  assignments) legt per vakgebied (taal/rekenen/world) een niveaugroep
  vast (groep 1-8, gebaseerd op de leerjaren van de basisschool waaraan
  de leerdoelen gekoppeld zijn) + niveau (1-3, fijnmazige verfijning
  BINNEN die groep). Klas-standaard met individuele leerling-overrides,
  net zo laagdrempelig instelbaar als de standaard - het speciaal-
  onderwijs-geval waar dat vanaf het begin de norm is.
- Server: GET/PUT/DELETE /levels/class/:id en /levels/pupil/:id
  (src/api.js) hergebruiken exact het assignments-patroon (upsert via
  partial-unique-index, pupil-eerst-dan-klas-resolutie), plus
  GET /my/level voor de leerling-kant. Zelfde permissie
  (assignments.manage) en sameSchool/teacherOnly/pupilAccessible-
  guards als de bestaande toewijzingsroutes.
- Nieuwe admin-tab "Klassenmanagement": klas + vakgebied kiezen, een
  klas-standaard instellen, en per leerling de effectieve groep/niveau
  zien (overerft van de klas tenzij een eigen afwijking is ingesteld)
  met bewerk- en terug-naar-standaard-knoppen.
- ECHTE inhoudskoppeling, niet alleen een standaardwaarde: rekenen is
  het eerste vakgebied waarvan de SLO/TULE-leerlijn direct in
  getalgrenzen te vertalen is (groep 3 t/m 20, groep 4 t/m 100, groep 5
  t/m 1000, groep 6 t/m 10.000). Nieuwe SLO_MATH_RANGES/mathRangeFor()
  in data.js; math.js's gen() gebruikt dit voor de daadwerkelijke
  getallen zodra een leerling een groep heeft (S.yearGroup), met het
  bestaande niveau 1-3 als verfijning daarbinnen. Zonder groep blijft
  het oude vaste 10/20/100-gedrag exact bestaan.
- pupil.js geeft groep/niveau door aan taal/rekenen-widgets bij het
  mounten: niveau is een standaardwaarde (een al opgeslagen bord-niveau
  blijft leidend), groep wordt voor rekenen-widgets altijd meegegeven
  (er is geen "oud" groep-concept om te respecteren). Terzijde ook de
  stille .catch() op de nieuwe async renderPupilWidgets() opgelost.
- Taal/wereldoriëntatie krijgen deze ronde nog geen eigen
  inhoudskoppeling (vraagt een eigen contentbron per groep, nog niet
  uitgezocht) - eerlijk benoemd als vervolgstap, geen loze belofte.
- Tests: test/pupil-levels.test.js (10 tests) dekt de server-routes
  (mocked-pool-patroon) én - via dezelfde vm-techniek als elders in
  test/widgets.test.js voor MONEY_LEVELS - een ECHTE (niet regex-)test
  van mathRangeFor die bevestigt dat elke groep de juiste getalgrens
  oplevert en niveau nooit boven de groep-grens uitkomt. Twee bugs
  gevonden en gefixt tijdens het schrijven van deze tests: null-yearGroup
  werd per ongeluk als groep 1 behandeld i.p.v. "geen groep", en de
  testrol had geen klas-eigenaarschap waardoor 403 in plaats van 200
  terugkwam. Volledige testsuite: 128/128.
- Live geverifieerd in de sandbox: klas-standaard + leerling-override
  instellen in de nieuwe admin-tab, en drie scenario's in de
  leerling-omgeving die bevestigen dat de daadwerkelijk gegenereerde
  sommen binnen de juiste groep-grens blijven (geen klassenmanagement →
  ongewijzigd oud gedrag; groep zonder eigen bord-niveau → volledige
  groep-grens; groep mét een al opgeslagen bord-niveau → dat niveau
  blijft leidend, geschaald naar de juiste groep-grens).
- public/js/data.js bevatte al niet-gerelateerde, nog niet gecommitte
  wijzigingen van vóór deze sessie (extra taalthema's/woorden) - alleen
  de SLO_MATH_RANGES/mathRangeFor-hunk is hier meegenomen (git add -p),
  de rest blijft bewust ongemoeid staan, net als test/language-library.test.js.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014EPxzBVRXZZnBPvSAaPAbJ
2026-07-19 15:31:26 +02:00
..
api-security.test.js v0.3.03-beta: versterk publieke beveiliging 2026-07-14 12:42:16 +02:00
auth.test.js v0.3.03-beta: versterk publieke beveiliging 2026-07-14 12:42:16 +02:00
body-parser.test.js fix: alle DELETE-verzoeken faalden op een lege JSON-body (v0.4.02-beta) 2026-07-18 03:44:39 +02:00
cms.test.js feat: server-kant CMS voor de systeemmanager (v0.3.83-beta) 2026-07-16 19:29:08 +02:00
frontend.test.js perf: compressie, cache-headers, cache-busting en parallel ladende scripts (v0.3.81-beta) 2026-07-16 19:01:25 +02:00
images.test.js feat: voeg afbeeldingscatalogus en opslagquota toe 2026-07-15 23:45:17 +02:00
language-library.test.js feat: breid taalwidgets en plaatjesbibliotheek uit (v0.3.80-beta) 2026-07-16 16:27:38 +02:00
parent-portal.test.js fix: gebruikerslijst per school laadde nooit (SELECT DISTINCT/ORDER BY) (v0.3.99-beta) 2026-07-18 03:19:36 +02:00
progress-export.test.js feat: exporteren van resultaten per klas (CSV) (v0.4.29-beta) 2026-07-19 12:54:48 +02:00
progress-logging.test.js fix: leerling in werken-modus kreeg abusievelijk readonly:true (v0.4.33-beta) 2026-07-19 14:39:00 +02:00
pupil-levels.test.js feat: klassenmanagement - niveaugroep + niveau per leerling per vakgebied (v0.4.34-beta) 2026-07-19 15:31:26 +02:00
save-system.test.js v0.3.24-beta: bewaar ankerdiagrammen los van het bord (bibliotheek) 2026-07-14 22:14:37 +02:00
schools.test.js test: expliciete regressietest voor de beperkte rechten van groepsleiding (v0.4.08-beta) 2026-07-18 04:49:10 +02:00
security-config.test.js perf: gzip-vangnet in nginx voor geproxyde responses (v0.3.82-beta) 2026-07-16 19:02:53 +02:00
shared-library.test.js v0.3.28-beta: alleen-lezen-vlag voor gedeelde items (server) 2026-07-14 22:49:17 +02:00
widgets.test.js feat: eigen personage (avatar) voor leerlingen, ouders en staf (v0.4.23-beta) 2026-07-19 07:34:25 +02:00