Verbeter anatomie en plaatsing van avataraccessoires (v0.4.46-beta) #1

Open
bes-r wants to merge 192 commits from bes-r/avatar-realism into main AGit
4 changed files with 54 additions and 49 deletions
Showing only changes of commit baf2a4cb13 - Show all commits

View file

@ -413,7 +413,11 @@
.gcard .gn{font-weight:800; margin-top:8px; font-size:15px;}
.gcard .gd{font-size:12.5px; color:var(--muted); margin-top:4px; line-height:1.35;}
/* login + instellingen modals */
#loginModal,#settingsModal{width:min(400px,92vw);}
#loginModal{width:min(400px,92vw);}
/* 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;}
#loginModal input,#settingsModal input{
width:100%; border:2px solid #cdd9e8; border-radius:12px; padding:11px 12px;
font:inherit; font-size:16px; outline:none; margin-bottom:10px;
@ -428,7 +432,7 @@
.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 */
#settingsModal .am-h3:first-of-type{margin-top:0;}
#settingsAccountPanel .am-h3:first-of-type{margin-top:0;}
#settingsModal .am-reset .lrow{margin:0;}
#settingsModal .am-reset .guestnote{margin-top:2px;}
.st-footer{
@ -982,8 +986,7 @@
flex:1; min-width:0; border:2px solid #cdd9e8; border-radius:12px;
padding:10px 12px; font:inherit; font-size:15px; outline:none;
}
/* ---------- beheerpaneel ---------- */
#adminModal{width:min(760px,94vw); max-height:86vh; overflow:auto;}
/* ---------- beheerpaneel (tabblad "Beheer" binnen Instellingen) ---------- */
.am-head{display:flex; align-items:center; justify-content:space-between; margin-bottom:8px;}
.am-head h2{margin:0; font-size:20px;}
.am-h3{margin:14px 0 6px; font-size:14px; color:var(--muted); text-transform:uppercase; letter-spacing:.5px;}

View file

@ -103,7 +103,12 @@
<button class="wclose" id="btnSettingsClose"></button>
</div>
<div class="am-h3" data-i18n="stAccount"></div>
<div class="ed-tabs" id="settingsTabs">
<button type="button" class="active" data-tab="account" data-i18n="stAccount"></button>
<button type="button" data-tab="admin" id="btnAdmin" style="display:none;" data-i18n="beheer"></button>
</div>
<div id="settingsAccountPanel">
<div class="am-reset">
<div class="am-name" id="helloName"></div>
<div class="am-role" id="helloRole"></div>
@ -122,13 +127,6 @@
</div>
</div>
<div class="am-h3" id="stAdminLbl" data-i18n="beheer" style="display:none;"></div>
<div class="am-reset" id="adminBlock" style="display:none;">
<div class="lrow">
<button class="tbtn ghost" id="btnAdmin">👥 <span data-i18n="openAdmin"></span></button>
</div>
</div>
<div class="am-h3" data-i18n="stSession"></div>
<div class="am-reset">
<div class="lrow">
@ -136,6 +134,11 @@
</div>
<div class="guestnote" data-i18n="storedNote"></div>
</div>
</div>
<div id="settingsAdminPanel" style="display:none;">
<div id="adminModal"></div>
</div>
<div class="st-footer">
<span id="verTag"></span>
@ -143,9 +146,6 @@
</div>
</div>
</div>
<div class="modalwrap" id="adminWrap">
<div class="modal" id="adminModal"></div>
</div>
<script src="js/core.js"></script>
<script src="js/permissions.js"></script>

View file

@ -2,7 +2,8 @@
Zichtbaar voor super (alles), admin (eigen school) en teacher (leerlingen). */
"use strict";
(function(){
const wrap = document.getElementById("adminWrap");
/* het beheerpaneel is een tabblad binnen Instellingen (settingsWrap/settingsModal),
geen los venster meer - modal is alleen nog de content-container voor render() */
const modal = document.getElementById("adminModal");
const btn = document.getElementById("btnAdmin");
let SCHOOLS = [], USERS = [], CLASSES = [], selSchool = null;
@ -53,10 +54,9 @@
if(!can("admin.access")) return;
selSchool = currentUser.role==="super" ? (selSchool ?? "") : currentUser.schoolId;
await reload();
wrap.classList.add("open");
switchSettingsTab("admin");
});
wrap.addEventListener("click", e=>{ if(e.target===wrap) wrap.classList.remove("open"); });
document.addEventListener("userchange", ()=>{ if(!currentUser){ wrap.classList.remove("open"); resetResults = null; } });
document.addEventListener("userchange", ()=>{ if(!currentUser) resetResults = null; });
async function reload(){
try{
@ -266,12 +266,6 @@
function render(){
modal.innerHTML = "";
const head = h("div","am-head");
head.appendChild(h("h2", null, T("beheer")));
const close = h("button","wclose","✕");
close.addEventListener("click", ()=>wrap.classList.remove("open"));
head.appendChild(close);
modal.appendChild(head);
/* super: schoolkiezer + nieuwe school */
if(currentUser.role==="super"){

View file

@ -113,7 +113,7 @@ const I18N = {
tmHint:"Sleep aan de rode schijf om de tijd in te stellen.",
login:"Inloggen", loginBtn:"Inloggen", registerBtn:"Account maken", logout:"Uitloggen",
settingsTitle:"Instellingen", tabLogin:"Inloggen", tabLinkCode:"Koppelcode", busy:"Bezig…",
stAccount:"Account", stPassword:"Wachtwoord", stSession:"Sessie", openAdmin:"Beheerpaneel",
stAccount:"Account", stPassword:"Wachtwoord", stSession:"Sessie",
pwChanged:"Wachtwoord gewijzigd ✓",
namePh:"naam", passPh:"wachtwoord",
guestNote:"Zonder inloggen wordt niets bewaard. Log in met je schoolaccount om alles op de server te bewaren.",
@ -239,7 +239,7 @@ const I18N = {
tmHint:"Drag the red disc to set the time.",
login:"Log in", loginBtn:"Log in", registerBtn:"Create account", logout:"Log out",
settingsTitle:"Settings", tabLogin:"Log in", tabLinkCode:"Link code", busy:"Please wait…",
stAccount:"Account", stPassword:"Password", stSession:"Session", openAdmin:"Admin panel",
stAccount:"Account", stPassword:"Password", stSession:"Session",
pwChanged:"Password changed ✓",
namePh:"name", passPh:"password",
guestNote:"Without logging in nothing is saved. Log in with your school account to keep everything on the server.",
@ -376,9 +376,10 @@ const roleKey = r => r==="super" ? "roleSuper" : r==="admin" ? "roleAdmin" : r==
function updateUserUI(){
document.getElementById("userLbl").textContent = currentUser ? currentUser.displayName : T("login");
document.getElementById("btnUser").classList.toggle("on", !!currentUser);
const adminTabBtn = document.getElementById("btnAdmin");
const showAdmin = can("admin.access");
document.getElementById("stAdminLbl").style.display = showAdmin ? "" : "none";
document.getElementById("adminBlock").style.display = showAdmin ? "flex" : "none";
adminTabBtn.style.display = showAdmin ? "" : "none";
if(!showAdmin && adminTabBtn.classList.contains("active")) switchSettingsTab("account");
if(currentUser){
document.getElementById("helloName").textContent = currentUser.displayName;
document.getElementById("helloRole").textContent = T(roleKey(currentUser.role));
@ -394,6 +395,14 @@ function switchLoginTab(tab){
document.querySelectorAll("#loginModal .ed-tabs button").forEach(b=>{
b.addEventListener("click", ()=>switchLoginTab(b.dataset.tab));
});
/* instellingen-tabs: "account" vs "beheer" - alles in één overzicht i.p.v. een los venster */
function switchSettingsTab(tab){
document.querySelectorAll("#settingsTabs button").forEach(b=>b.classList.toggle("active", b.dataset.tab===tab));
document.getElementById("settingsAccountPanel").style.display = tab==="account" ? "block" : "none";
document.getElementById("settingsAdminPanel").style.display = tab==="admin" ? "block" : "none";
}
/* het "beheer"-tabblad heeft zijn eigen klik-handler in admin.js (moet eerst data laden) */
document.querySelector('#settingsTabs button[data-tab="account"]').addEventListener("click", ()=>switchSettingsTab("account"));
async function loadSchools(){
const sel = document.getElementById("liSchool");
try{
@ -404,6 +413,7 @@ async function loadSchools(){
}
function openSettings(){
settingsMsg.textContent = ""; settingsMsg.classList.remove("ok");
switchSettingsTab("account");
settingsWrap.classList.add("open");
}
document.getElementById("btnUser").addEventListener("click", ()=>{
@ -414,8 +424,6 @@ document.getElementById("btnUser").addEventListener("click", ()=>{
loginWrap.classList.add("open");
});
document.getElementById("btnSettingsClose").addEventListener("click", ()=>settingsWrap.classList.remove("open"));
/* Beheer wordt vanuit Instellingen geopend: dat scherm zelf dicht zodat er geen twee modals over elkaar staan */
document.getElementById("btnAdmin").addEventListener("click", ()=>settingsWrap.classList.remove("open"));
loginWrap.addEventListener("click", e=>{ if(e.target===loginWrap) loginWrap.classList.remove("open"); });
settingsWrap.addEventListener("click", e=>{ if(e.target===settingsWrap) settingsWrap.classList.remove("open"); });