From bdb5ef9875cae1df13aee5d9b65ba1540eb04e5d Mon Sep 17 00:00:00 2001 From: Ramon Date: Thu, 16 Jul 2026 07:07:53 +0200 Subject: [PATCH] feat: instellingen volledig herbouwd - sectieregister, rolweergaven en zoeken (v0.3.60-beta) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 Claude-Session: https://claude.ai/code/session_0149FgUQvuwxKKEdvQGmNngF --- VERSION | 2 +- public/css/teach.css | 73 ++++++++++++++-- public/index.html | 30 ++++--- public/js/admin.js | 111 ++++++++++++++++-------- public/js/core.js | 73 ++++++++-------- public/js/settings.js | 171 +++++++++++++++++++++++++++++++++++++ src/api.js | 7 +- test/parent-portal.test.js | 10 +++ 8 files changed, 383 insertions(+), 94 deletions(-) create mode 100644 public/js/settings.js diff --git a/VERSION b/VERSION index 161196a..361cf3e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.3.59-beta +0.3.60-beta diff --git a/public/css/teach.css b/public/css/teach.css index ee0616d..f28328c 100644 --- a/public/css/teach.css +++ b/public/css/teach.css @@ -513,7 +513,8 @@ /* instellingen is breder dan het inlogscherm: het beheerpaneel (tabblad) heeft de ruimte nodig van wat vroeger een eigen, brede modal was (#adminModal) */ #settingsModal{width:min(760px,94vw); max-height:86vh; overflow:auto;} - #settingsAccountPanel{max-width:400px;} + .st-section[data-section="account"]{max-width:420px;} + .st-section[data-section="account"] .am-h3:first-of-type{margin-top:0;} #loginModal input,#settingsModal input{ width:100%; border:1px solid var(--line); border-radius:var(--radius); height:var(--control-h); padding:0 12px; @@ -530,15 +531,76 @@ .guestnote{font-size:13px; color:var(--muted); margin-top:12px; line-height:1.45;} /* instellingen: neutrale kaarten per sectie (.am-reset, hergebruikt van het beheerpaneel) i.p.v. het speelse bord-uiterlijk - dit scherm is voor volwassenen */ - #settingsAccountPanel .am-h3:first-of-type{margin-top:0;} #settingsModal .am-reset .lrow{margin:0;} #settingsModal .am-reset .guestnote{margin-top:2px;} .st-footer{ display:flex; justify-content:space-between; align-items:center; gap:8px; - margin-top:16px; padding-top:12px; border-top:1.5px solid var(--line); - font-size:11px; color:var(--muted); + margin-top:12px; padding-top:12px; border-top:1.5px solid var(--line); + font-size:11px; color:var(--muted); flex:none; } #settingsModal .am-name{font-size:16px;} + /* ---------- Instellingen-schil: nav links, inhoud rechts, zoeken boven ----- */ + .st-modal{ + width:min(980px,96vw); height:min(700px,92vh); max-height:92vh; + display:flex; flex-direction:column; overflow:hidden; padding:18px 22px; + } + .st-head{display:flex; align-items:center; gap:14px; flex:none; padding-bottom:12px;} + .st-head h2{margin:0; font-size:19px;} + #stSearch{ + flex:1; max-width:360px; margin-left:auto; min-width:120px; + height:var(--control-h); padding:0 12px; font-size:14px; + border:1.5px solid var(--line); border-radius:10px; + background:var(--surface-2); color:var(--ink); outline:none; + } + #stSearch:focus{border-color:var(--accent);} + .st-body{display:flex; flex:1; min-height:0; border-top:1.5px solid var(--line);} + #stNav{ + width:200px; flex:none; overflow-y:auto; padding:12px 12px 12px 0; + border-right:1.5px solid var(--line); + display:flex; flex-direction:column; gap:2px; align-content:flex-start; + } + .st-nav-group{ + font-size:10.5px; font-weight:800; color:var(--muted); + text-transform:uppercase; letter-spacing:.5px; margin:12px 6px 4px; + } + .st-nav-group:first-child{margin-top:0;} + .st-nav-btn{ + display:flex; gap:9px; align-items:center; border:none; background:transparent; + padding:8px 10px; border-radius:9px; cursor:pointer; text-align:left; + font-size:14px; font-weight:650; color:var(--ink); + } + .st-nav-btn:hover{background:var(--surface-3);} + .st-nav-btn.active{background:var(--accent-soft); color:var(--accent-ink);} + .st-nav-ico{flex:none; width:20px; text-align:center;} + #stContent{flex:1; min-width:0; overflow-y:auto; padding:14px 4px 14px 18px;} + #stSecHead{margin-bottom:12px;} + #stSecHead:empty{display:none;} + .st-sec-title{font-size:17px; font-weight:800;} + .st-sec-sub{font-size:12.5px; color:var(--muted); margin-top:2px;} + /* zoekresultaten: gegroepeerd per sectie, klik = navigeren */ + #stSearchResults{display:flex; flex-direction:column; gap:2px;} + .st-result{ + display:flex; gap:9px; align-items:center; border:none; background:transparent; + padding:8px 10px; border-radius:9px; cursor:pointer; text-align:left; + font-size:14px; color:var(--ink); width:100%; + } + .st-result:hover{background:var(--surface-3);} + .st-result-lbl{font-weight:650; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;} + .st-result-sub{margin-left:auto; flex:none; font-size:12px; color:var(--muted);} + /* smal scherm: nav wordt een horizontale strook boven de inhoud */ + @media (max-width:720px){ + .st-modal{padding:14px;} + .st-body{flex-direction:column;} + #stNav{ + width:auto; flex-direction:row; overflow-x:auto; overflow-y:hidden; + border-right:none; border-bottom:1.5px solid var(--line); + padding:8px 0; gap:4px; + } + .st-nav-group{display:none;} + .st-nav-btn{flex:none; padding:7px 10px;} + #stContent{padding:12px 2px;} + #stSearch{max-width:none;} + } /* ========================================================= Letter game widget ==========================================================*/ @@ -719,9 +781,6 @@ .ed-tabs{ display:flex; gap:2px; border-bottom:1px solid var(--line); margin-bottom:14px; } - /* de instellingen-balk bevat nu ook alle beheer-tabs: laten omlopen op - smalle schermen i.p.v. overlopen */ - #settingsTabs{flex-wrap:wrap;} .ed-tabs button{ border:none; border-radius:0; padding:10px 15px 11px; font:inherit; font-weight:700; font-size:14px; background:transparent; color:var(--muted); cursor:pointer; diff --git a/public/index.html b/public/index.html index d68996d..cbc1ac0 100644 --- a/public/index.html +++ b/public/index.html @@ -149,19 +149,20 @@
-