Textsystem: Bis-Strich mit Leerzeichen (Zahl – Zahl) per Agent-Sweep

562 Ersetzungen in 50 Dateien: Halbgeviertstrich zwischen zwei Ziffern (=
"bis"-Bereich) bekommt Leerzeichen davor/danach (3–4 -> 3 – 4). Regex
/([0-9])\s*–\s*(?=[0-9])/ auf Rohtext (format-erhaltend, CRLF/Einrueckung
unveraendert), Bindestriche in Woertern und Minuszeichen unangetastet, alle
JSON weiter gueltig. Energiemanager-Zeitbloecke sind Display-Labels (kein
Logik-Key) -> safe.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-22 12:38:19 +02:00
parent 9c99359d9c
commit fecd8bb9c9
139 changed files with 1827 additions and 411 deletions
+7 -7
View File
@@ -641,7 +641,7 @@ function _liveBarColor(pct, goodWhen) {
if (goodWhen === 'mid') return '#9a9a9a';
return pct >= 60 ? '#5a8a5e' : pct >= 30 ? '#c9913a' : '#c07a6b';
}
// Mini-Balken UNTER der Zahl (Cockpit „Aktuell"). pct 0100.
// Mini-Balken UNTER der Zahl (Cockpit „Aktuell"). pct 0 100.
function _liveMiniBar(pct, color) {
pct = Math.max(0, Math.min(100, pct||0));
return '<div style="margin-top:3px;height:3px;border-radius:99px;background:rgba(0,0,0,.06);overflow:hidden">'
@@ -1145,7 +1145,7 @@ async function renderLiveCockpit() {
html += '</div></div>';
// === C) Klassen-Fleiß über Zeit + Zeitraum-Filter ===
var rangeBtns = [['day','Tag','Heute · 25 Stunden 024 · Schulkernzeit 813 Uhr hervorgehoben'],
var rangeBtns = [['day','Tag','Heute · 25 Stunden 0 24 · Schulkernzeit 8 13 Uhr hervorgehoben'],
['week','Woche','Aktuelle Kalenderwoche · MoSo · heutiger Tag markiert'],
['month','Monat','Letzte 30 Tage · alle Tage sichtbar'],
['year','Schuljahr','Aktuelles Schuljahr · ab Schulanfang (Land-abh.) bis Schulende']];
@@ -1882,8 +1882,8 @@ function _renderKlimaCompareBody(klimaRows) {
html += '</tbody></table></div>';
html += '<div style="margin-top:.7rem;font-size:.65rem;color:#8a8a8a;display:flex;gap:.7rem;flex-wrap:wrap">'
+ '<span><span style="display:inline-block;width:10px;height:10px;border-radius:2px;background:#5a8a5e;vertical-align:middle;margin-right:.25rem"></span>≥ 75 — gut</span>'
+ '<span><span style="display:inline-block;width:10px;height:10px;border-radius:2px;background:#c9913a;vertical-align:middle;margin-right:.25rem"></span>5074 — mittel</span>'
+ '<span><span style="display:inline-block;width:10px;height:10px;border-radius:2px;background:#c07a6b;vertical-align:middle;margin-right:.25rem"></span>2549 — schwach</span>'
+ '<span><span style="display:inline-block;width:10px;height:10px;border-radius:2px;background:#c9913a;vertical-align:middle;margin-right:.25rem"></span>50 74 — mittel</span>'
+ '<span><span style="display:inline-block;width:10px;height:10px;border-radius:2px;background:#c07a6b;vertical-align:middle;margin-right:.25rem"></span>25 49 — schwach</span>'
+ '<span><span style="display:inline-block;width:10px;height:10px;border-radius:2px;background:#a04a3a;vertical-align:middle;margin-right:.25rem"></span>&lt; 25 — kritisch</span>'
+ '</div>';
html += '</div>';
@@ -2043,7 +2043,7 @@ async function renderLiveSummary() {
// Auto-Zoom: minStart / maxEnd über ALLE Sessions ermitteln, dann auf volle
// Stundenränder runden und 10 min Polster. Wenn niemand aktiv war,
// zeigen wir 0814 Uhr als Standard-Bereich.
// zeigen wir 08 14 Uhr als Standard-Bereich.
var minMs = Infinity, maxMs = -Infinity;
students.forEach(function(s){
(s.sessions||[]).forEach(function(sess){
@@ -2664,7 +2664,7 @@ function ivBuildOverview(cockpit, weeks, studentsCount, matrix){
var m=IV_META[key];
h+='<div class="iv-card" style="--iva:var('+m[2]+')"><div class="iv-chead"><span class="iv-ic"><svg viewBox="0 0 24 24">'+IV_ICON[key]+'</svg></span><div class="iv-ct"><h4>'+m[0]+'</h4><p>'+m[1]+'</p></div><span class="iv-cn num">'+rows.length+'</span></div>';
if(rows.length){
h+='<div class="iv-cols"><span></span><span title="Ø der letzten 3 Läufe, 0100">Erfolg</span><span title="arbeitet gerade? blinkt live">Aktiv</span><span title="aktive Zeit pro Woche">Verlauf</span><span title="Tage seit dem letzten Lauf">Zuletzt</span><span></span></div>';
h+='<div class="iv-cols"><span></span><span title="Ø der letzten 3 Läufe, 0 100">Erfolg</span><span title="arbeitet gerade? blinkt live">Aktiv</span><span title="aktive Zeit pro Woche">Verlauf</span><span title="Tage seit dem letzten Lauf">Zuletzt</span><span></span></div>';
rows.forEach(function(r){
h+='<button class="iv-prow" onclick="ivOpenStudent('+r.sid+')"><span class="iv-nm">'+esc(r.name)+'</span><span style="display:contents">'+ivErf(r.erf)+ivAkt(r.status)+ivSpark(r.secs,maxSec,IV_WEEK_CAP)+'</span>'+ivZuletzt(r.days)+'<svg class="iv-chev" viewBox="0 0 24 24"><path d="m9 6 6 6-6 6"/></svg></button>';
});
@@ -3865,7 +3865,7 @@ function renderFleiss() {
html += '<div style="height:'+maxBarHeight+'px;display:flex;align-items:flex-end;justify-content:center"><span style="display:block;width:60%;height:1px;border-top:1px dashed rgba(0,0,0,.10)"></span></div>';
return;
}
var hPct = _fleissBar(b.sum, sumMax, scale); // 0100 %
var hPct = _fleissBar(b.sum, sumMax, scale); // 0 100 %
var hPx = Math.max(2, Math.round(hPct / 100 * maxBarHeight));
// Tooltip: Datum/Bucket + Modul-Aufteilung
var titleLines = [esc(f.buckets[idx]) + ' · ' + _fleissFmtTime(b.sum)];