Lehrer-Live: idle-pausierte gelten in Aktuell als pausiert (nicht aktiv) + Tag-App-Symbol immer sichtbar

- Aktuell: paused beruecksichtigt jetzt __idlePaused/__paused (heartbeatet trotz Pause weiter)
  -> kein Widerspruch mehr "navigiert UND pausiert" (Klara).
- Tag: App-Symbol als immer sichtbares Overlay am Balkenstart, auch bei winzigem Balken (darf ueberstehen).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-23 15:11:20 +02:00
parent abbc0580c5
commit cc83493055
+14 -5
View File
@@ -1569,9 +1569,12 @@ async function renderLive() {
var simStr = sinceSimBase ? _fmtSince(sinceSim) : '—';
var missionStr = sinceMissionBase ? _fmtSince(sinceMission) : '—';
var lastSeen = ls.last_seen_ms ? Math.max(0, Math.round((Date.now() - ls.last_seen_ms)/1000)) : 0;
var paused = !_liveIsActive(ls);
var dotColor = lastSeen < 8 ? '#5a8a5e' : lastSeen < 20 ? '#e8833a' : '#c07a6b';
var s = ls.state || {};
// Pausiert = veralteter Heartbeat ODER die Sim/Plattform meldet Pause
// (Idle-Overlay __idlePaused / Sim-Pause __paused). Sonst gilt ein idle-
// pausierter, aber weiter heartbeatender Schüler fälschlich als „aktiv".
var paused = !_liveIsActive(ls) || !!(s.__idlePaused || s.__paused);
var dotColor = lastSeen < 8 ? '#5a8a5e' : lastSeen < 20 ? '#e8833a' : '#c07a6b';
var help = !paused && _liveNeedsHelp(ls.module_id, s);
var restBg = help ? '#fdf3ee' : (paused ? '#f6f5f2' : '');
var hoverBg = help ? '#f9e7e0' : '#f0efe9';
@@ -2275,9 +2278,9 @@ async function renderLiveSummary() {
+ ' · ' + _fmtHM(sess.startMs) + '' + _fmtHM(endMs)
+ ' · ' + _liveFmtMin(realDurSec) + ' · ' + stateWord
+ (score!=null?' · Erfolg '+score+' %':'');
// Symbol immer sichtbar; ab etwas Breite zusätzlich der Sim-Name
var inner = (pctW < 2) ? '' : (pctW < 9 ? '<span style="font-size:.82rem">'+icon+'</span>'
: '<span style="font-size:.82rem">'+icon+'</span> <span style="font-weight:700">'+esc(simName)+'</span>');
// Sim-Name nur bei breiterem Balken IM Balken (mit Platz für das Symbol links);
// das App-Symbol selbst kommt separat als IMMER sichtbares Overlay (s.u.).
var inner = (pctW < 9) ? '' : '<span style="font-weight:700;padding-left:1.15rem">'+esc(simName)+'</span>';
var sessKey = s.studentId + ':' + sess.simId + ':' + (sess.lessonLabel||'_') + ':' + sess.startMs;
html += '<div onclick="openLiveSessionDetail(\''+sessKey+'\')" '
+ 'title="'+esc(tip)+'" '
@@ -2287,6 +2290,12 @@ async function renderLiveSummary() {
+ 'white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;'
+ 'text-shadow:0 1px 1px rgba(0,0,0,.3);box-shadow:0 1px 2px rgba(0,0,0,.12)">'
+ inner + '</div>';
// App-Symbol IMMER sichtbar am Balkenstart — auch bei winzigem Balken (steht dann
// über den Rand hinaus, das ist gewollt). Schatten macht es auf Balken UND Hintergrund lesbar.
html += '<span onclick="openLiveSessionDetail(\''+sessKey+'\')" title="'+esc(tip)+'" '
+ 'style="position:absolute;left:calc('+pctL+'% + 2px);top:5px;height:'+barH+'px;line-height:'+barH+'px;'
+ 'font-size:.82rem;z-index:4;cursor:pointer;white-space:nowrap;'
+ 'text-shadow:0 0 3px rgba(0,0,0,.55),0 1px 2px rgba(0,0,0,.55)">'+icon+'</span>';
// Pausen im Verlauf: jede geloggte Pausen-Spanne bleibt als halbhohes,
// gedämpftes Segment im Balken stehen — auch nachdem die Schüler:in wieder
// weiterarbeitet. So sieht man, WANN und WIE LANGE pausiert wurde.