- Nieuwe architectuur: één sectieregister (settings.js) als enige bron van waarheid; secties melden zich aan met rol-zichtbaarheid, activate() en zoekgegevens - de schil kent het beheer niet van binnen
- Nieuwe indeling: navigatie links (gegroepeerd Persoonlijk / School / Systeem), inhoud rechts met sectiekop + toelichting; zakelijk en rustig, responsief op smalle schermen
- Alles doorzoekbaar: één zoekbalk vindt secties, instellingen (trefwoorden, o.a. wachtwoord/thema/taal) én data - gebruikers, klassen en scholen op naam; klik navigeert en filtert de gebruikerslijst direct op de treffer
- Per rol alleen de essentie: gast alleen Weergave; leerling en ouder Account + Weergave; groepsleiding + Gebruikers/Toewijzingen/Voortgang; schoolbeheerder ook Klassen; systeemmanager ook Systeem en Opslag
- Thuiskinderen (leerling zonder school) krijgen nu zoals ontworpen het volledige whiteboard met eigen opslag en reservekopieën; schoolleerlingen blijven beperkt tot de toewijzing
- Oude dubbele tabbalk en #adminTabsSlot verwijderd; beheerdata laadt één keer per bezoek en wordt tussen secties hergebruikt
- 28 Playwright-checks over zes rollen (navigatie, zoeken, filteren, thuiskind-whiteboard)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149FgUQvuwxKKEdvQGmNngF
- Ouders (school_id NULL) vielen buiten elke schoolgescopeerde gebruikerslijst; /admin/users levert nu ook de ouders die aan leerlingen van de school gekoppeld zijn (groepsleiding: alleen ouders van leerlingen uit eigen klassen)
- Ouder-rijen tonen de namen van hun gekoppelde kinderen (childNames)
- Servertest voor de gekoppelde-ouders-lijst
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149FgUQvuwxKKEdvQGmNngF
- Derde tab "Ouders" in het inlogscherm: ouderaccount registreren (naam + 2× wachtwoord) met directe login
- Nieuw ouderportaal (parent.js): kinderenlijst met school/klas of "thuis", kind toevoegen (wachtwoord eenmalig als badge bij de rij), koppelen via ouder-code, aanmelden bij een school via doorzoekbare lijst met aanmeldstatus op de rij, voortgang per kind uitklapbaar, ontkoppelen met bevestiging
- Beheer: blok "Aanmeldingen (n)" bovenaan de Gebruikers-tab met per verzoek adopteren (klas + optionele andere gebruikersnaam bij naamconflict), koppelen aan een bestaande leerling, of afwijzen
- Beheer: actie "👪 Ouder-code" op elke leerlingrij (eenmalige code als badge); groep "Ouders" in de gebruikerslijst
- Foutmeldingen in het inlogscherm nu zichtbaar op alle drie de tabs
- i18n nl/en; volledige ouder- en schoolflow geverifieerd in headless Chromium (21 checks)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149FgUQvuwxKKEdvQGmNngF
- Functie-select in gebruikersbeheer alleen zichtbaar voor staf-rollen (teacher/admin/super)
- Klaskoppeling-UI alleen voor staf-rollen
- Server: rolwijziging alleen tussen staf-rollen onderling (leerlingen en toekomstige ouder-accounts kunnen nooit promoveren)
- Server: klaskoppeling weigert alle niet-staf-rollen expliciet
- canPersist() sluit de komende ouderrol uit van borden-opslag
- Servertest: ouder-achtige rol krijgt geen promotie en geen klaskoppeling
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149FgUQvuwxKKEdvQGmNngF
- 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
- 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)
- 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)
- Systeem-tabblad toont nu een overzicht van alle scholen als volwaardige
rijen met een bevestigde verwijder-actie
- Het school-toevoegen-formulier zit achter een "+ School"-knop (zelfde
patroon als gebruikers) en houdt de naam-bevestiging; de uitlegtekst is
weg - teksten kort en krachtig
- Alle formulieren en knoppen in het beheer op dezelfde controlhoogte;
fix: de rij-flexregels van invoervelden drukten velden binnen een
veldlabel (kolom-flex) verticaal plat
- Ontbrekende veldlabel-tekst "Naam" toegevoegd (nl/en)
- Elk invoerveld/select/knopgroep in het beheer heeft nu een zichtbaar
mini-label (field-helper): Functie, Extra functies, Klas, Wachtwoord,
Naam, Acties - een placeholder alleen is geen toelichting meer
- Acties met gevolgen (nieuw wachtwoord, nieuwe koppelcode, verwijderen,
wachtwoord-resets) zijn een aparte knopklasse: rood-zacht, tooltip die
het gevolg uitlegt, en een tweede klik als bevestiging (arm-then-confirm,
wapening loopt na 4s af); alle native confirm()-dialogen zijn vervangen
- Nieuw gegenereerde wachtwoorden/koppelcodes verschijnen direct bij de
gebruiker in de rij (badge met kopieerknop, rij klapt vanzelf open),
niet meer bovenaan; de topbalk is alleen nog voor fouten
- Klassen zijn volwaardige rijen op dezelfde maat als de gebruikersvakken,
met leerlingaantal en de reset/verwijder-acties als bevestigde knoppen
- Systeem-tabblad: schoolkiezer-balk daar verborgen (school-onafhankelijk);
school aanmaken heeft nu een uitleg, een naam-label, een knop die pas
actief wordt bij een echte naam en een bevestigingsstap met de naam erin
- Toevoegen van gebruikers/klassen: knop pas actief bij geldige naam
- 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
- De beheer-tabs (Systeem/Klassen/Gebruikers/Toewijzingen/Voortgang) staan
nu als losse knoppen direct in de instellingen-tabbalk naast Account en
Weergave, in plaats van een tweede tabbalk binnen het Beheer-tabblad
- admin.js vult #adminTabsSlot en herbouwt bij gebruikers-/taalwissel;
data wordt geladen bij binnenkomst in het beheer-deel, wisselen tussen
beheer-tabs onderling hergebruikt de geladen data
- De losse "Beheer"-knop en de geneste .ed-tabs-balk zijn verwijderd;
de tabbalk loopt om op smalle schermen (flex-wrap)
- roleSuper heet nu "Systeemmanager" (en: "System manager"); het
beheertabblad en de stafgroep "Overkoepelend" heten nu "Systeem"
- Alle overige teksten en commentaren met "overkoepelend beheerder"
meegenomen; de interne rolcode "super" blijft ongewijzigd
- 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 "Voortgang"-tab naast Toewijzingen: leerkracht kiest een leerling
(zelfde per-klas gegroepeerde select) en ziet de volledige tijdlijn van
GET /progress/pupil/:id (widgettype, score, tijdstip)
- fillPupilSelect(): gedeelde helper voor de per-klas leerlingselectie,
onttrokken uit Toewijzingen zodat Voortgang hem ook gebruikt
- Nieuwe i18n-teksten amProgress/amProgressEmpty (nl/en)
- Nieuwe tabel `assignments`: een leerkracht koppelt één van haar eigen
borden aan een klas (standaard) of een individuele leerling (uitzondering,
voor wie op een ander niveau werkt).
- Geen momentopname: /my/assignment zoekt het bord live op bij de
leerkracht, dus nieuwe woorden die zij toevoegt komen vanzelf door zodra
de leerling-pagina opnieuw pollt (elke 20s).
- Leerlingen loggen in op een vereenvoudigde pagina zonder whiteboard/
tekengereedschap: enkel de toegewezen taal-/rekenwidgets, als vaste
(niet-sleepbare) kaarten in speelmodus.
- Speelmodus verbergt bewerkfuncties in Ankerwoorden (plaatje kiezen,
woord typen, kleur wijzigen) en Letterblokken (thema/woordbeheer) -
overige widgets waren al zuiver speelgericht.
- Elk bord krijgt een stabiel id (board.js) zodat een toewijzing een bord
blijft vinden ook na hernoemen of herordenen.
- Nieuw tabblad "Toewijzingen" in het beheerpaneel: per klas of leerling
een eigen bord kiezen, met een expliciete toewijs-stap.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuxHJtk5aHe2pA3xwCLEAk
- 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>
- "Scholen"-tabblad hernoemd naar "Overkoepelend" en het aanmaken van een overkoepelend beheerder verplaatst hierheen vanuit Gebruikers - die rol hoort niet bij één school, dus dat schoolgebonden tabblad was de verkeerde plek
- Klassen-tabblad toonde een lege, onverklaarde pagina als een super nog geen school had gekozen; laat nu een duidelijke hint zien
- Bugfix: leerlingen met een klas-koppeling verdwenen onterecht helemaal uit de Gebruikers-lijst wanneer een super naar "alle scholen" keek (CLASSES was dan leeg, dus geen enkele klas-groep kon ze tonen) - valt nu terug op een platte lijst zoals bij groepsleiding
- VERSION-bestand dit keer wél meteen bijgewerkt
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- GET /admin/users: groepsleiding (teacher) ziet voortaan alleen leerlingen uit de eigen klas(sen) (via class_teachers), i.p.v. de hele school - staf blijft zichtbaar zoals voorheen
- Gebruikers-tab: leerlingen worden voor schoolbeheerder/super gegroepeerd per klas getoond (met een "geen klas"-groep), i.p.v. één platte lijst los van de Klassen-tab; groepsleiding houdt een platte lijst (nu vanzelf al beperkt tot eigen klas door de backend-scope)
- Alle "gebruiker toevoegen"-formulieren (staf + leerling, incl. de nieuwe per-klas toevoegrij) starten ingeklapt als alleen een "+ …"-knop; pas na een klik verschijnen de invoervelden
- Verwijderen van een gebruiker had al een bevestigingsvraag - ongewijzigd, bevestigd dat dit blijft werken
- Koppelcode-functie bewust ongewijzigd gelaten (privacy-optie naast direct-wachtwoord-aanmaken)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- render() bouwde tot nu toe alles in één lange, doorlopende lijst; nu drie tabbladen die hetzelfde ed-tabs-patroon hergebruiken als de login- en Instellingen-tabs
- "Scholen" alleen zichtbaar voor super, "Gebruikers" is het standaard-tabblad
- Actief tabblad blijft behouden na acties (nieuwe klas/gebruiker toevoegen springt niet meer terug naar het eerste tabblad)
- Zuiver een frontend-herstructurering: geen gedragswijziging aan de onderliggende functionaliteit (reload/msg/classSel/userRow/addForm/resetPanel ongewijzigd)
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>
- 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>
- Responsive breakpoints toegevoegd (tablet ≤1024px, telefoon ≤600px) en
grotere tikzones op aanraakschermen (pointer:coarse) - er waren nog
geen @media-regels in de hele stylesheet
- Bugfix: #boardsPanel had een vaste 300px-breedte en overflowde op een
telefoon; nu net zo responsive als #boardStrip
- Widgets (letters, rekenen, schrijfblok, mindmap, ...) krijgen niet
langer harde desktop-pixelmaten die van het scherm afvallen - grootte
en positie worden nu geclampt aan de zichtbare bordgrootte
- Eigen, groter aanraakbare resize-greep voor widgets i.p.v. de
piepkleine native browser-grip (resize:both)
- Beheerpaneel: dichte rijen (wachtwoordveld + knoppen) stapelen nu
netjes op smalle schermen i.p.v. verdrukt te wrappen
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 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>
- Beheerders kunnen bij groepsleiding/schoolbeheer/super meteen zelf een
wachtwoord instellen of genereren, als alternatief voor de koppelcode.
- Nieuwe directe wachtwoord-reset voor deze rollen, los van koppelcode-reset.
- Leerling-wachtwoord is na de eerste keer inloggen niet langer inzichtelijk
voor groepsleiding/beheer; alleen opnieuw genereren kan dan nog.
- Wachtwoordeisen aangescherpt en overal consistent gecontroleerd (leerling
min. 4 tekens, groepsleiding/beheer min. 8 met letter en cijfer).
- Bevestigingsveld en toon/verberg-knop bij accountactivatie en eigen
wachtwoord wijzigen, om typefouten te voorkomen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>