From c79ef691addd053518e349e6e99ca15a0403a73d Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 25 Aug 2026 02:25:35 +0200 Subject: [PATCH] Lehrer-View-Uebersicht: Vorschau einheitliches Leistungs-% (Sterne raus) - Vorschau-Karte: %+Balken-Standardanzeige, 5-stufige Farbskala, Triage-Felder (Foerdern/Begleiten/Laeuft gut) aus %xFleiss mit Grenzen = Farbgrenzen (50/65), damit Farbe<->Feld immer stimmen. - Neue Spalte 'Leistung' je Sim: Vorschlags-Formel auf die Testdaten gerechnet (PERF), als pctBar + Triage-Chip. Busfahrt/Flug/Sonnensystem Naeherung (Rohwerte fehlen in Testdaten). - Bewertungs-Block je Sim um 'Vorschlag %' (PROPOSED_PCT) erweitert. Co-Authored-By: Claude Opus 4.8 --- App/admin-lehrer-view.html | 87 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/App/admin-lehrer-view.html b/App/admin-lehrer-view.html index 224eb50..32ea8da 100644 --- a/App/admin-lehrer-view.html +++ b/App/admin-lehrer-view.html @@ -100,6 +100,7 @@
Vorschlag (ein System): Jede App liefert genau eine Funktion → Leistungs-% (0–100) als Wahrheit (grün→rot-Balken). Sterne werden daraus mit denselben globalen Schwellen für alle abgeleitet (z. B. ≥90→5★ · ≥75→4 · ≥55→3 · ≥35→2 · sonst 1). Dann bedeuten Sterne überall dasselbe und % ↔ Sterne sind konsistent.
+

Alle Werte sind Beispieldaten zur Ansicht. Render-Logik gespiegelt aus teacher.html · renderLive(). Grün/Grau ist Atlas' Vorschlag — bitte prüfen & korrigieren.

@@ -516,6 +517,66 @@ var SCORING = { }, }; +/* ============================================================ + 3c) VORSCHLAG — einheitliches Leistungs-% (0–100) je Sim, + 5-stufige Farbskala, %+Balken-Komponente, Triage (%×Fleiß). + ============================================================ */ +var PROPOSED_PCT = { + farmer:'gewichteter 0–100-Score (wie heute intern berechnet) — künftig auch LIVE senden.', + klima:'vorhandener 0–100-Score (Temp+Flut+Budget+Bev.) übernehmen.', + fluss:'vorhandener Score Ø(Biodiv,Wirtschaft,Schutz) − 5×Verluste übernehmen.', + energiemanager:'ausgeglichene Blöcke / (Tage×8) ×100 − 15 je Blackout.', + 'eu-werkstatt':'saubere Erstversuche / Schritte ×100 − 5 je Mülleimer.', + weltkueche:'richtige / (richtige+falsche) ×100 (= 100 − Fehlerquote).', + busfahrt:'Topo-Punkte / (Aufträge×3) ×100.', + fluggesellschaft:'Topo-Punkte / (Flüge×3) ×100.', + heli:'kontinuierlich aus PlanPct + Start + Landung (0–100), nicht gerundete Sterne.', + kofferdetektiv:'vorhandener score100 (0–100) übernehmen.', + sonnensystem:'Erstversuch-Quote ×100.', + tourismustal:'Ziele/gesamt ×100, gewichtet mit Zufriedenheit/Natur.', + tourismusregion:'vorhandener gewichteter 0–100-Score übernehmen.', + logistik:'Kontostand→% (0 €→0, Zielbudget→100) — UND ans Backend senden.', +}; + +// 5-stufige Farbskala (= _tagTraffic). +function pctColor(v){ v=Math.max(0,Math.min(100,v||0)); return v>=80?'#1f7a3d':v>=65?'#7cb342':v>=50?'#f9c33b':v>=35?'#ef8b2c':'#d8453a'; } +// Standard-Anzeige überall: Prozent in Ampelfarbe + dünner Balken darunter. +function pctBar(pct){ + if (pct==null) return ''; + var c=pctColor(pct); + return '
' + + '
'+pct+' %
' + + '
' + + '
'; +} +// Triage aus Leistungs-% × Aktivität — Grenzen = Farbgrenzen, damit Feld ↔ Farbe stimmen. +function triage(pct, active){ + if (pct==null || !active) return {lab:'inaktiv', col:'#8a8a8a', bg:'#efeee8'}; + if (pct<50) return {lab:'Fördern', col:'#b04a3e', bg:'#f7e2dc'}; + if (pct<65) return {lab:'Begleiten', col:'#9a6a12', bg:'#f7edd6'}; + return {lab:'Läuft gut', col:'#3a6b3e', bg:'#dceadd'}; +} +function triageChip(pct, active){ var t=triage(pct,active); return ''+t.lab+''; } + +// Vorschlags-Leistungs-% auf die Testdaten gerechnet (Vorschau). +function _cl(v,a,b){ return Math.max(a,Math.min(b,v)); } +var PERF = { + klima:function(s){ var sp=(s.level>=3)?7000:6000; return Math.round(_cl(35-(s.temp-15.5)*20,0,35)+Math.max(0,25*(1-(s.floodedPct||0)/50))+_cl((s.budget||0)/10,0,20)+_cl((s.population||0)/sp*20,0,20)); }, + fluss:function(s){ return _cl(Math.round((s.biodiv+s.economy+s.flood)/3)-(s.settlementsLost||0)*5,0,100); }, + kofferdetektiv:function(s){ return s.score!=null?s.score:null; }, + tourismusregion:function(s){ return Math.round(0.6*((s.avgStars||0)/5*100)+0.4*(s.env||0)); }, + tourismustal:function(s){ if(!s.goalsTotal) return null; return Math.round(0.5*(s.goalsDone/s.goalsTotal*100)+0.3*(s.satisfaction||0)+0.2*(s.nature||0)); }, + heli:function(s){ if(s.totalStars!=null) return Math.round(s.totalStars/5*100); if(s.planTotal) return Math.round((s.planCorrect||0)/s.planTotal*100); return null; }, + farmer:function(s){ var money=_cl(50+(s.cash||0)/300,0,100),co2=_cl(100-(s.co2_kg||0)/80,0,100),dis=_cl(100-(s.diseases||0)*20,0,100),crop=_cl((s.crops_used||0)/10*100,0,100),country=_cl((s.countries||0)/6*100,0,100); return Math.round(0.25*money+0.20*(s.hit_rate||0)+0.15*co2+0.10*dis+0.10*crop+0.10*country+0.10*70); }, + energiemanager:function(s){ var d=(s.day||1)*(s.blockTotal||8); return _cl(Math.round((s.setBlocksBalanced||0)/d*100)-15*(s.blackouts||0),0,100); }, + 'eu-werkstatt':function(s){ if(!s.stepsTotal) return null; return _cl(Math.round((s.firstTryHits||0)/s.stepsTotal*100)-5*(s.muelleimerCount||0),0,100); }, + weltkueche:function(s){ var t=(s.correctClicks||0)+(s.wrongClicks||0); return t?Math.round((s.correctClicks||0)/t*100):null; }, + busfahrt:function(s){ return s.orderIndex?Math.round((s.quizFirstTry||0)/s.orderIndex*100):null; }, + fluggesellschaft:function(s){ return s.orderIndex?Math.round((s.quizFirstTry||0)/s.orderIndex*100):null; }, + sonnensystem:function(s){ return s.taskTotal?Math.round((s.completed||0)/s.taskTotal*100):null; }, + logistik:function(s){ return s.balance==null?null:_cl(Math.round(s.balance/16000*100),0,100); }, +}; + /* ============================================================ 4) Testdaten je Sim (3 Schüler:innen: stark · schwach · mittel) ============================================================ */ @@ -616,6 +677,7 @@ function renderScoring(id){ var h = '

🎯 So entsteht die Bewertung

'; h += '
Sterne'+sc.stars+'
'; h += '
Prozent'+sc.pct+'
'; + if (PROPOSED_PCT[id]) h += '
Vorschlag %'+PROPOSED_PCT[id]+'
'; (sc.flags||[]).forEach(function(f){ h += '
⚠ '+f+'
'; }); h += '
'; return h; @@ -640,6 +702,7 @@ function renderSim(meta){ h += '
'; h += ''; h += ''; + h += ''; fields.forEach(function(f){ var align=f.align||'right'; var isG=!!greenSet[f.k]; @@ -670,6 +733,8 @@ function renderSim(meta){ h += ''; h += ''; h += ''; + var perfPct = (PERF[meta.id]) ? PERF[meta.id](s) : null; + h += ''; fields.forEach(function(f){ var align=f.align||'right'; var isG=!!greenSet[f.k]; @@ -713,8 +778,30 @@ function renderSim(meta){ return h; } +// Vorschau-Karte: neues Bewertungssystem (Skala · %+Balken · Triage) +function renderPreviewCard(){ + var samples=[92,71,55,40,22]; + var h='
'; + h+='

🎯 Neues Bewertungssystem — Vorschau zum Abnehmen

'; + h+='

Standard überall: ein Leistungs-% (0–100) in der Ampelfarbe + dünner Balken darunter — Sterne fallen weg. Beispiele:

'; + h+='
'+samples.map(function(v){return pctBar(v);}).join('')+'
'; + h+='

5-stufige Farbskala (= bestehende Tag-Skala):

'; + h+='
' + +[['≥ 80','sehr gut',92],['65–79','gut',71],['50–64','solide',55],['35–49','wackelig',40],['< 35','kritisch',22]] + .map(function(b){var c=pctColor(b[2]);return ''+b[0]+' % · '+b[1]+'';}).join('')+'
'; + h+='

Triage-Felder aus %×Fleiß — die Grenzen sind die Farbgrenzen, damit Balkenfarbe und Feld immer übereinstimmen:

'; + h+='
' + +[22,55,80].map(function(v){return '
'+pctBar(v)+'
'+triageChip(v,true)+'
';}).join('') + +'
'+pctBar(null)+'
'+triageChip(null,false)+'
'+'
'; + h+='
< 50 % → Fördern · 50–64 % → Begleiten · ≥ 65 % → Läuft gut — jeweils nur, wenn aktiv gearbeitet wurde; sonst „inaktiv".
'; + h+='

Unten hat jede Tabelle die neue Spalte 🎯 Leistung — die Vorschlags-Formel je Sim, auf die Testdaten gerechnet. Bei Busfahrt · Fluggesellschaft · Sonnensystem ist der Wert eine Näherung (Topo-/Erstversuch-Rohwerte fehlen in den Testdaten).

'; + h+='
'; + return h; +} + // TOC + Inhalt aufbauen var toc = SIM_META.map(function(m){ return ''+m.icon+' '+esc(m.title)+''; }).join(''); +document.getElementById('preview').innerHTML = renderPreviewCard(); document.getElementById('toc').innerHTML = toc; document.getElementById('content').innerHTML = SIM_META.map(renderSim).join('');
Schüler*indisplayNameSeitmissionStartedAt / started_at🎯 Leistungleistung_pct (Vorschlag)EIN Wert
'+(help?'🆘':(paused?'':''))+avatarHtml+''+esc(ls.displayName)+'
'+missionStr+'
'+simStr+' ges.
'+pctBar(perfPct)+'
'+triageChip(perfPct, perfPct!=null)+'