diff --git a/VERSION b/VERSION index 46c023e..44b1339 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.3.90-beta +0.3.91-beta diff --git a/public/css/teach.css b/public/css/teach.css index 57ded36..8c11f9b 100644 --- a/public/css/teach.css +++ b/public/css/teach.css @@ -2043,3 +2043,14 @@ body.hc #settingsModal .am-inp, body.hc #settingsModal .am-sel{border-color:#000 #settingsModal .am-card-sub .am-role{order:3; flex-basis:100%; margin-left:0;} #settingsModal .am-card-sub .am-edit{margin-left:auto;} } + +/* ---- inklapbare koppen: wachtwoordblok (Account) en Inhoud-kaarten ---- */ +#settingsModal .am-h3-toggle{cursor:pointer; user-select:none;} +#settingsModal .am-h3-toggle::after{content:" ▸";} +#settingsModal .am-h3-toggle.open::after{content:" ▾";} +#settingsModal .am-h3-toggle:hover{color:var(--ink);} +#settingsModal #ownPwBlock{display:none;} +#settingsModal #ownPwBlock.open{display:flex;} +#settingsModal .am-card-head.am-card-toggle{cursor:pointer;} +#settingsModal .cms-card-body{padding:10px 12px;} +#settingsModal .cms-card-body .am-reset{border:none; padding:0; background:transparent;} diff --git a/public/index.html b/public/index.html index 55c77e2..4494662 100644 --- a/public/index.html +++ b/public/index.html @@ -205,7 +205,8 @@
-
+
+
@@ -220,6 +221,7 @@
+
diff --git a/public/js/admin.js b/public/js/admin.js index 9c0ebb4..09bcba5 100644 --- a/public/js/admin.js +++ b/public/js/admin.js @@ -1095,14 +1095,28 @@ panel.appendChild(pupilSel); const eventsHolder = h("div","am-list"); panel.appendChild(eventsHolder); + const moreBtn = h("button","am-btn", T("amShowMore")); + moreBtn.type = "button"; + moreBtn.style.display = "none"; + panel.appendChild(moreBtn); pupilSel.addEventListener("change", async ()=>{ eventsHolder.innerHTML = ""; + moreBtn.style.display = "none"; if(!pupilSel.value) return; let events = []; try{ events = (await api("/progress/pupil/"+pupilSel.value)).events || []; } catch(e){ msg(e.message); return; } if(!events.length){ eventsHolder.appendChild(h("div","guestnote", T("amProgressEmpty"))); return; } - events.forEach(ev=>eventsHolder.appendChild(progressRow(ev))); + /* in porties van 30: de tijdlijn kan 200 regels lang zijn */ + let shown = 0; + const showMore = ()=>{ + events.slice(shown, shown+30).forEach(ev=>eventsHolder.appendChild(progressRow(ev))); + shown = Math.min(shown+30, events.length); + moreBtn.style.display = shown < events.length ? "" : "none"; + moreBtn.textContent = `${T("amShowMore")} (${events.length - shown})`; + }; + moreBtn.onclick = showMore; + showMore(); }); } diff --git a/public/js/cms.js b/public/js/cms.js index b6023b2..33bf63b 100644 --- a/public/js/cms.js +++ b/public/js/cms.js @@ -65,6 +65,32 @@ let CMS = {}; } document.addEventListener("langchange", ()=>{ renderAnnouncement(); renderWelcome(); }); + /* welke Inhoud-blokken openstaan (welkom standaard); overleeft re-renders */ + const cmsOpen = new Set(["welcome"]); + function cmsCard(key, titleKey, build){ + const card = cmsEl("div", "am-card"); + const head = cmsEl("div", "am-card-head am-card-toggle"); + const title = cmsEl("span", "am-card-title", T(titleKey)); + const arrow = cmsEl("span", "am-card-sum"); + head.appendChild(title); + head.appendChild(arrow); + const body = cmsEl("div", "cms-card-body"); + build(body); + const sync = ()=>{ + const open = cmsOpen.has(key); + arrow.textContent = open ? "▾" : "▸"; + body.style.display = open ? "" : "none"; + }; + head.addEventListener("click", ()=>{ + if(cmsOpen.has(key)) cmsOpen.delete(key); else cmsOpen.add(key); + sync(); + }); + sync(); + card.appendChild(head); + card.appendChild(body); + return card; + } + /* ---- Inhoud-sectie in Instellingen (alleen systeemmanager) ----------------- */ const host = cmsEl("div", "st-section"); host.dataset.section = "inhoud"; @@ -102,8 +128,7 @@ let CMS = {}; host.innerHTML = ""; /* welkomstwoord */ - host.appendChild(cmsEl("div", "am-h3", T("cmsWelcomeH"))); - const wMsg = cmsEl("div", "formMsg"); + const wMsg = cmsEl("div", "formMsg"); const wNl = langArea("cmsNl", CMS.welcome && CMS.welcome.nl); const wEn = langArea("cmsEn", CMS.welcome && CMS.welcome.en); const wSave = cmsEl("button", "am-btn", T("save")); @@ -111,11 +136,10 @@ let CMS = {}; wSave.addEventListener("click", ()=>save("welcome", { nl: wNl._ta.value.trim(), en: wEn._ta.value.trim() }, wMsg)); const wBlock = cmsEl("div", "am-reset cms-block"); [wNl, wEn, wSave, wMsg].forEach(n=>wBlock.appendChild(n)); - host.appendChild(wBlock); + host.appendChild(cmsCard("welcome", "cmsWelcomeH", b=>b.appendChild(wBlock))); /* update-melding */ - host.appendChild(cmsEl("div", "am-h3", T("cmsAnnounceH"))); - const a = CMS.announcement || {}; + const a = CMS.announcement || {}; const aMsg = cmsEl("div", "formMsg"); const activeLbl = cmsEl("label", "cms-check"); const active = document.createElement("input"); @@ -142,11 +166,10 @@ let CMS = {}; aRow.appendChild(activeLbl); aRow.appendChild(level); [aRow, aNl, aEn, aSave, aMsg].forEach(n=>aBlock.appendChild(n)); - host.appendChild(aBlock); + host.appendChild(cmsCard("announcement", "cmsAnnounceH", b=>b.appendChild(aBlock))); /* widget-uitleg */ - host.appendChild(cmsEl("div", "am-h3", T("cmsWidgetH"))); - const gBlock = cmsEl("div", "am-reset cms-block"); + const gBlock = cmsEl("div", "am-reset cms-block"); const gMsg = cmsEl("div", "formMsg"); const pick = document.createElement("select"); pick.className = "am-sel"; @@ -180,11 +203,10 @@ let CMS = {}; gBlock.appendChild(pick); gBlock.appendChild(editor); gBlock.appendChild(gMsg); - host.appendChild(gBlock); + host.appendChild(cmsCard("widgets", "cmsWidgetH", b=>b.appendChild(gBlock))); /* systeembrede inhoud: ankerdiagrammen/borden en afbeeldingen */ - host.appendChild(cmsEl("div", "am-h3", T("cmsShortcutsH"))); - const sBlock = cmsEl("div", "am-reset cms-block"); + const sBlock = cmsEl("div", "am-reset cms-block"); sBlock.appendChild(cmsEl("div", "guestnote", T("cmsShortcutsHint"))); const shared = cmsEl("button", "tbtn ghost", T("cmsOpenShared")); shared.type = "button"; @@ -202,7 +224,7 @@ let CMS = {}; sRow.appendChild(shared); sRow.appendChild(imgs); sBlock.appendChild(sRow); - host.appendChild(sBlock); + host.appendChild(cmsCard("shortcuts", "cmsShortcutsH", b=>b.appendChild(sBlock))); } registerSettingsSection({ diff --git a/public/js/core.js b/public/js/core.js index af92735..5ef8b30 100644 --- a/public/js/core.js +++ b/public/js/core.js @@ -2,7 +2,7 @@ "use strict"; /* version — shown until /api/version resolves (or if the fetch fails, e.g. offline). Kept in sync by hand with the VERSION file at the repo root on every release. */ -const VERSION = "0.3.90-beta"; +const VERSION = "0.3.91-beta"; (function(){ const tag = document.getElementById("verTag"); tag.textContent = "v"+VERSION; @@ -279,7 +279,7 @@ const I18N = { amDeleteWarn:"Verwijdert dit account definitief, inclusief borden en woorden.", amResultPw:"Nieuw wachtwoord", amResultCode:"Nieuwe koppelcode", amColStatus:"Status", amNeverLoggedIn:"nog niet ingelogd", amFieldSchool:"School", amStatusActive:"actief", - amNoSchool:"— geen school —", amNoSchoolGroup:"Zonder school", + amNoSchool:"— geen school —", amNoSchoolGroup:"Zonder school", amShowMore:"meer tonen", amDetailEmpty:"Selecteer links een gebruiker om te bewerken, of maak een nieuwe aan.", amNewUser:"Nieuwe gebruiker", amRequestOne:"Aanmelding", amReqNew:"nieuw", amParents:"Ouders", @@ -574,7 +574,7 @@ const I18N = { amDeleteWarn:"Deletes this account permanently, including boards and words.", amResultPw:"New password", amResultCode:"New link code", amColStatus:"Status", amNeverLoggedIn:"not signed in yet", amFieldSchool:"School", amStatusActive:"active", - amNoSchool:"— no school —", amNoSchoolGroup:"No school", + amNoSchool:"— no school —", amNoSchoolGroup:"No school", amShowMore:"show more", amDetailEmpty:"Select a user on the left to edit, or create a new one.", amNewUser:"New user", amRequestOne:"Enrolment", amReqNew:"new", amParents:"Parents", @@ -857,7 +857,7 @@ function updateUserUI(){ document.getElementById("helloName").textContent = currentUser.displayName; const roles = [currentUser.role, ...(currentUser.extraRoles||[])]; document.getElementById("helloRole").textContent = roles.map(r=>T(roleKey(r))).join(" + "); - document.getElementById("ownPwBlock").style.display = can("password.own.change") ? "flex" : "none"; + document.getElementById("pwSection").style.display = can("password.own.change") ? "" : "none"; } } /* login-modal tabs: "inloggen" / "koppelcode activeren" / "ouderaccount maken" */ @@ -878,6 +878,15 @@ async function loadSchools(){ list.map(x=>``; } } +/* wachtwoordvelden pas op verzoek: de kop "Wachtwoord" klapt het blok uit */ +{ + const pwHead = document.getElementById("pwToggleHead"); + const pwBlock = document.getElementById("ownPwBlock"); + pwHead.addEventListener("click", ()=>{ + pwBlock.classList.toggle("open"); + pwHead.classList.toggle("open"); + }); +} /* openSettings() zelf woont in settings.js (sectieregister + zoeken); de knoppen hieronder roepen hem via window aan */ /* reservekopieën (Instellingen → Account): automatisch bewaarde eerdere