From 8b57922307a4d908721703646e82e3de49066f5b Mon Sep 17 00:00:00 2001 From: Ramon Date: Sun, 19 Jul 2026 01:06:39 +0200 Subject: [PATCH] fix: schoolbeheerder zichtbaar als groepsleiding + A+-knop verspringt niet meer (v0.4.22-beta) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Een schoolbeheerder (of systeemmanager) die aan een klas gekoppeld werd, kwam daar niet zichtbaar te staan: de klas-detailweergave en de staf-telling op de klastegel filterden op role==="teacher", terwijl de server al sinds v0.3.38 elke stafrol (teacher/admin/super) toestaat in class_teachers. Puur een weergavebug op de client - de koppeling zelf werkte al goed. Nieuwe isClassStaff()-helper matcht nu exact de serverkant se toegestane rollenset. - De "+" in de A+-zoomknop (toolbar én het per-widget contentzoom-knopje) gebruikte de CJK-volle-breedte "+" (U+FF0B) naast de gewone letter "A" - dat teken valt vermoedelijk terug op een ander lettertype dan Quicksand, waardoor de relatieve positie t.o.v. de "A" verspringt zodra document.body.style.zoom verandert. Vervangen door de gewone ASCII "+" (net als de A−-knop al een normaal minteken gebruikt, niet de volle- breedte variant). --- VERSION | 2 +- public/index.html | 2 +- public/js/admin.js | 10 ++++++++-- public/js/board.js | 4 ++-- public/js/core.js | 2 +- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/VERSION b/VERSION index d692748..1f03f53 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.4.21-beta +0.4.22-beta diff --git a/public/index.html b/public/index.html index b9f1d0a..fa80deb 100644 --- a/public/index.html +++ b/public/index.html @@ -61,7 +61,7 @@ - +
diff --git a/public/js/admin.js b/public/js/admin.js index 965dbe6..56e61df 100644 --- a/public/js/admin.js +++ b/public/js/admin.js @@ -48,6 +48,12 @@ const creatableRoles = () => [...new Set([currentUser.role, ...(currentUser.extraRoles||[])].flatMap(r => CREATABLE_ROLES[r] || []))]; + /* wie er als groepsleiding aan een klas gekoppeld kan staan - zelfde rollenset + als de server accepteert in POST /admin/classes/:id/teachers (niet alleen + "teacher": een schoolbeheerder of systeemmanager mag ook aan een klas + gekoppeld worden, en moet dan ook als zodanig getoond worden). */ + const isClassStaff = u => ["teacher","admin","super"].includes(u.role); + const esc = s => String(s ?? "").replace(/&/g,"&").replace(/{ const el = document.createElement(tag); @@ -1084,7 +1090,7 @@ onClick: ()=>{ navLevel = { type:"flat", kind:"requests" }; render(); } })); } CLASSES.forEach(c=>{ - const staff = USERS.filter(u=>u.role==="teacher" && (u.classIds||[]).some(id=>Number(id)===Number(c.id))).length; + const staff = USERS.filter(u=>isClassStaff(u) && (u.classIds||[]).some(id=>Number(id)===Number(c.id))).length; const cp = pupils.filter(u=>u.classId===c.id).length; grid.appendChild(tile({ label:c.name, stats:[{text:`🧑‍🏫 ${staff}`},{text:`🧒 ${cp}`}], onClick: ()=>{ navLevel = { type:"class", id:c.id }; kebabOpen = false; render(); } })); @@ -1125,7 +1131,7 @@ panel.appendChild(titleRow); if(kebabOpen && canManageClasses) panel.appendChild(classActionsPanel(c, otherSchools)); - const staff = USERS.filter(u=>u.role==="teacher" && (u.classIds||[]).some(id=>Number(id)===Number(c.id))); + const staff = USERS.filter(u=>isClassStaff(u) && (u.classIds||[]).some(id=>Number(id)===Number(c.id))); panel.appendChild(h("p","am-section-label", T("roleTeacher"))); panel.appendChild(peopleList(staff)); if(creatableRoles().includes("teacher")) panel.appendChild(addForm("teacher", c.id)); diff --git a/public/js/board.js b/public/js/board.js index f124323..9a96957 100644 --- a/public/js/board.js +++ b/public/js/board.js @@ -120,7 +120,7 @@ function makeWidget(def, saved){ const lockBtn = document.createElement("button"); lockBtn.className="wmin wlock"; lockBtn.textContent="🔓"; head.appendChild(lockBtn); const previewBtn = document.createElement("button"); previewBtn.className="wmin wpreview"; previewBtn.textContent="◉"; head.appendChild(previewBtn); const zBtn = document.createElement("button"); - zBtn.className = "wmin wz"; zBtn.textContent = "A+"; + zBtn.className = "wmin wz"; zBtn.textContent = "A+"; head.appendChild(zBtn); const minBtn = document.createElement("button"); minBtn.className = "wmin"; minBtn.textContent = "–"; @@ -194,7 +194,7 @@ function makeWidget(def, saved){ function applyWZ(){ body.style.zoom = wz; win.dataset.wz = wz; - zBtn.textContent = wz===1 ? "A+" : Math.round(wz*100)+"%"; + zBtn.textContent = wz===1 ? "A+" : Math.round(wz*100)+"%"; zBtn.classList.toggle("on", wz!==1); zBtn.title = T("wZoom"); } diff --git a/public/js/core.js b/public/js/core.js index 216ffb3..a3b7c15 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.4.21-beta"; +const VERSION = "0.4.22-beta"; (function(){ const tag = document.getElementById("verTag"); tag.textContent = "v"+VERSION;