Aktuell/Fortschritt: "Heute bereits aktiv" mit allen Aktivitaeten pro Name
Umbenannt von "Heute nicht mehr aktiv"; zeigt jetzt ALLE heutigen Aktivitaeten pro Schueler:in (group by name, eine Zeile je Aktivitaet, Trennlinie zwischen Personen) mit Uhrzeit + Leistung. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+25
-18
@@ -1375,39 +1375,46 @@ async function _renderInactiveToday(activeSet) {
|
||||
try { data = await api('live?summary=1&class_id=' + currentClassId + '&date=' + encodeURIComponent(today)); }
|
||||
catch(e){ return ''; }
|
||||
if (!data || data.error || !Array.isArray(data.students)) return '';
|
||||
var rows = [];
|
||||
var groups = [];
|
||||
data.students.forEach(function(s){
|
||||
if (activeSet && activeSet[s.studentId]) return; // gerade online → oben
|
||||
var sess = (s.sessions||[]).filter(function(x){ return x.startMs; });
|
||||
if (!sess.length) return; // heute nichts gespielt
|
||||
if (sess.some(function(x){ return x.isLive || x.success==='running'; })) return; // läuft noch → oben
|
||||
sess.sort(function(a,b){ return (b.endMs||0)-(a.endMs||0); });
|
||||
rows.push({ s:s, last:sess[0] });
|
||||
sess.sort(function(a,b){ return (a.startMs||0)-(b.startMs||0); }); // chronologisch
|
||||
var lastEnd = 0; sess.forEach(function(x){ if((x.endMs||0)>lastEnd) lastEnd = x.endMs||0; });
|
||||
groups.push({ s:s, sess:sess, lastEnd:lastEnd });
|
||||
});
|
||||
if (!rows.length) return '';
|
||||
rows.sort(function(a,b){ return (b.last.endMs||0)-(a.last.endMs||0); });
|
||||
var html = '<div class="card" style="margin-top:.8rem"><div class="card-h">Heute nicht mehr aktiv · '+rows.length+'</div>';
|
||||
html += '<p style="font-size:.7rem;color:#8a8a8a;margin-bottom:.5rem">Heute schon gearbeitet, gerade aber offline — mit letzter Aktivität und deren Leistung.</p>';
|
||||
if (!groups.length) return '';
|
||||
groups.sort(function(a,b){ return b.lastEnd - a.lastEnd; }); // zuletzt aktive Person oben
|
||||
var html = '<div class="card" style="margin-top:.8rem"><div class="card-h">Heute bereits aktiv · '+groups.length+'</div>';
|
||||
html += '<p style="font-size:.7rem;color:#8a8a8a;margin-bottom:.5rem">Heute schon gearbeitet, gerade aber offline — alle Aktivitäten mit Uhrzeit und Leistung.</p>';
|
||||
html += '<div style="overflow-x:auto"><table style="width:100%;border-collapse:collapse;font-size:.74rem">';
|
||||
html += '<thead><tr style="background:#f7f6f3;border-bottom:2px solid rgba(0,0,0,.08)">'
|
||||
+ '<th style="text-align:left;padding:.4rem .5rem;white-space:nowrap">Schüler*in</th>'
|
||||
+ '<th style="text-align:left;padding:.4rem .5rem;white-space:nowrap">Zuletzt aktiv</th>'
|
||||
+ '<th style="text-align:left;padding:.4rem .5rem;white-space:nowrap">Aktivität</th>'
|
||||
+ '<th style="text-align:right;padding:.4rem .5rem;white-space:nowrap">Leistung</th></tr></thead><tbody>';
|
||||
rows.forEach(function(r){
|
||||
var s=r.s, last=r.last;
|
||||
groups.forEach(function(g){
|
||||
var s = g.s;
|
||||
var av = (typeof s.emoji === 'string' && s.emoji.indexOf('avatar:')===0)
|
||||
? '<img src="assets/img/avatars/thumbs/avatar-'+s.emoji.substring(7)+'.webp" alt="" style="width:1.5em;height:1.5em;border-radius:50%;object-fit:cover;vertical-align:middle">'
|
||||
: '<span style="font-size:1.05rem">'+(s.emoji||'🧑🎓')+'</span>';
|
||||
var score = (last.score!=null)?last.score:(last.stars!=null?Math.round(last.stars/5*100):null);
|
||||
var perf = score!=null
|
||||
? '<span style="font-weight:700;color:'+_tagTraffic(score)+'">'+score+' %</span>'
|
||||
: (last.success==='aborted' ? '<span style="color:#b03a2a">abgebrochen</span>' : '<span style="color:#8a8a8a">—</span>');
|
||||
html += '<tr style="border-bottom:1px solid rgba(0,0,0,.04);cursor:pointer" onclick="ivOpenStudent('+s.studentId+')">'
|
||||
+ '<td style="padding:.4rem .5rem;white-space:nowrap"><span style="display:inline-flex;align-items:center;gap:.4rem">'+av+'<strong>'+esc(s.displayName)+'</strong></span></td>'
|
||||
+ '<td style="padding:.4rem .5rem;color:#3a3a3a;font-variant-numeric:tabular-nums">'+_hhmm(last.endMs)+' Uhr</td>'
|
||||
+ '<td style="padding:.4rem .5rem">'+esc((last.simIcon||'📚')+' '+(last.simTitle||last.simId))+(last.lessonLabel?' · '+esc(last.lessonLabel):'')+'</td>'
|
||||
+ '<td style="text-align:right;padding:.4rem .5rem">'+perf+'</td></tr>';
|
||||
g.sess.forEach(function(last, j){
|
||||
var score = (last.score!=null)?last.score:(last.stars!=null?Math.round(last.stars/5*100):null);
|
||||
var perf = score!=null
|
||||
? '<span style="font-weight:700;color:'+_tagTraffic(score)+'">'+score+' %</span>'
|
||||
: (last.success==='aborted' ? '<span style="color:#b03a2a">abgebrochen</span>' : '<span style="color:#8a8a8a">—</span>');
|
||||
var nameCell = (j===0)
|
||||
? '<span style="display:inline-flex;align-items:center;gap:.4rem">'+av+'<strong>'+esc(s.displayName)+'</strong></span>'
|
||||
: '';
|
||||
var sep = (j===0) ? 'border-top:2px solid rgba(0,0,0,.07);' : ''; // neue Person → Trennlinie
|
||||
html += '<tr style="border-bottom:1px solid rgba(0,0,0,.03);'+sep+'cursor:pointer" onclick="ivOpenStudent('+s.studentId+')">'
|
||||
+ '<td style="padding:.35rem .5rem;white-space:nowrap">'+nameCell+'</td>'
|
||||
+ '<td style="padding:.35rem .5rem;color:#3a3a3a;font-variant-numeric:tabular-nums">'+_hhmm(last.endMs)+' Uhr</td>'
|
||||
+ '<td style="padding:.35rem .5rem">'+esc((last.simIcon||'📚')+' '+(last.simTitle||last.simId))+(last.lessonLabel?' · '+esc(last.lessonLabel):'')+'</td>'
|
||||
+ '<td style="text-align:right;padding:.35rem .5rem">'+perf+'</td></tr>';
|
||||
});
|
||||
});
|
||||
html += '</tbody></table></div></div>';
|
||||
return html;
|
||||
|
||||
Reference in New Issue
Block a user