fix(gui): Speicherkarte wieder vollstaendig, Zeilen brechen nicht mehr um

Der vermeintlich fehlende Wert war ein Zeilenumbruch: bei "Gesamt fuer
Aufnahmen 27,5 GB" rutschte die Einheit allein in die naechste Zeile.
Balken, Restplatz, Vorratsgroesse, Erklaertext und Partitions-Fusszeile
sind wieder da; .sys-row steht auf white-space: nowrap und die Karte
waechst stattdessen in die Breite (min-width 285px).

Doku: Kapitel 07 + Changelog (inkl. Hinweis, dass WAV-Rohdateien und
Papierkorb-Aufnahmen in der Summe mitzaehlen).
This commit is contained in:
Claude
2026-08-17 22:23:06 +02:00
parent 51c1e0f675
commit 3c434e20ec
4 changed files with 48 additions and 17 deletions
+10 -1
View File
@@ -98,9 +98,14 @@ function sysmonMarkup() {
<circle class="ring-fg" cx="18" cy="18" r="15.9155" stroke-dasharray="0 100" data-disk-ring/> <circle class="ring-fg" cx="18" cy="18" r="15.9155" stroke-dasharray="0 100" data-disk-ring/>
</svg> </svg>
<span class="sys-val mono" data-disk-pct>–</span> <span class="sys-val mono" data-disk-pct>–</span>
<div class="sys-pop"> <div class="sys-pop sys-pop-disk">
<div class="sys-pop-h">Speicher für Aufnahmen</div> <div class="sys-pop-h">Speicher für Aufnahmen</div>
<div class="sys-row"><span>Aufnahmen</span><b data-disk-used>–</b></div> <div class="sys-row"><span>Aufnahmen</span><b data-disk-used>–</b></div>
<div class="sys-bar"><i data-disk-bar style="width:0%"></i></div>
<div class="sys-row"><span>Noch frei</span><b data-disk-free>–</b></div>
<div class="sys-row"><span>Gesamt für Aufnahmen</span><b data-disk-total>–</b></div>
<div class="sys-note">100 % = freier Platz + alle vorhandenen Aufnahmen<br>(also der Platz eines frisch aufgesetzten Systems)</div>
<div class="sys-row sys-sub"><span>Partition gesamt</span><b data-disk-part>–</b></div>
</div> </div>
</div> </div>
<div class="sys-chip" id="sysload" tabindex="0" role="group" aria-label="Systemlast"> <div class="sys-chip" id="sysload" tabindex="0" role="group" aria-label="Systemlast">
@@ -152,7 +157,11 @@ function paintSysmon(s) {
set('[data-disk-pct]', p + '%'); set('[data-disk-pct]', p + '%');
const ring = document.querySelector('[data-disk-ring]'); const ring = document.querySelector('[data-disk-ring]');
if (ring) ring.setAttribute('stroke-dasharray', `${Math.max(0, Math.min(100, s.disk.usedPct)).toFixed(1)} 100`); if (ring) ring.setAttribute('stroke-dasharray', `${Math.max(0, Math.min(100, s.disk.usedPct)).toFixed(1)} 100`);
const db = document.querySelector('[data-disk-bar]'); if (db) db.style.width = Math.min(100, s.disk.usedPct) + '%';
set('[data-disk-used]', `${sysGb(s.disk.recBytes)}${s.disk.recFiles ? ` · ${s.disk.recFiles} Dateien` : ''}`); set('[data-disk-used]', `${sysGb(s.disk.recBytes)}${s.disk.recFiles ? ` · ${s.disk.recFiles} Dateien` : ''}`);
set('[data-disk-free]', sysGb(s.disk.freeBytes));
set('[data-disk-total]', sysGb(s.disk.budgetBytes));
set('[data-disk-part]', `${sysGb(s.disk.totalBytes)} · ${Math.round(s.disk.partPct)} % belegt`);
} }
const cpu = s.cpu ? s.cpu.pct : 0; const cpu = s.cpu ? s.cpu.pct : 0;
+10 -2
View File
@@ -161,7 +161,7 @@ nav { display: flex; gap: 6px; flex-wrap: wrap; }
/* Klappkarte bei Mauskontakt (oder Tastaturfokus) */ /* Klappkarte bei Mauskontakt (oder Tastaturfokus) */
.sys-pop { .sys-pop {
display: none; position: absolute; top: calc(100% + 8px); right: 0; z-index: 60; display: none; position: absolute; top: calc(100% + 8px); right: 0; z-index: 60;
min-width: 215px; max-width: 300px; padding: 10px 12px; color: var(--fg); min-width: 215px; padding: 10px 12px; color: var(--fg);
background: var(--surface); border: 1px solid var(--line); border-radius: 12px; background: var(--surface); border: 1px solid var(--line); border-radius: 12px;
box-shadow: 0 8px 24px rgba(0, 0, 0, .28); box-shadow: 0 8px 24px rgba(0, 0, 0, .28);
} }
@@ -170,9 +170,17 @@ nav { display: flex; gap: 6px; flex-wrap: wrap; }
font-size: 11px; font-weight: 700; color: var(--muted); font-size: 11px; font-weight: 700; color: var(--muted);
text-transform: uppercase; letter-spacing: .05em; margin-bottom: 7px; text-transform: uppercase; letter-spacing: .05em; margin-bottom: 7px;
} }
.sys-row { display: flex; justify-content: space-between; gap: 14px; font-size: 13px; padding: 2px 0; } /* Beschriftung und Wert bleiben je einzeilig — sonst rutscht z. B. die Einheit
(„GB“) allein in die nächste Zeile und sieht aus wie ein fehlender Wert.
Die Karte wächst stattdessen in die Breite. */
.sys-row { display: flex; justify-content: space-between; gap: 18px; font-size: 13px; padding: 2px 0; white-space: nowrap; }
.sys-row span { color: var(--muted); } .sys-row span { color: var(--muted); }
.sys-row b { font-weight: 600; font-variant-numeric: tabular-nums; } .sys-row b { font-weight: 600; font-variant-numeric: tabular-nums; }
.sys-pop-disk { min-width: 285px; }
.sys-pop-disk .sys-note { white-space: normal; }
.sys-note { font-size: 11px; line-height: 1.35; color: var(--muted); margin: 6px 0 4px; }
.sys-row.sys-sub { border-top: 1px solid var(--line); margin-top: 4px; padding-top: 5px; font-size: 12px; }
.sys-row.sys-sub b { font-weight: 500; color: var(--muted); }
.sys-bar { height: 5px; border-radius: 3px; background: var(--inset); overflow: hidden; margin: 3px 0 7px; } .sys-bar { height: 5px; border-radius: 3px; background: var(--inset); overflow: hidden; margin: 3px 0 7px; }
.sys-bar i { display: block; height: 100%; background: var(--accent); transition: width .4s ease; } .sys-bar i { display: block; height: 100%; background: var(--accent); transition: width .4s ease; }
.sys-chip.ok .sys-bar i { background: var(--ok); } .sys-chip.ok .sys-bar i { background: var(--ok); }
+12 -5
View File
@@ -88,7 +88,7 @@ Boards ohne SSH zeigen:
| Symbol | Zeigt an | Klappkarte bei Mauskontakt | | Symbol | Zeigt an | Klappkarte bei Mauskontakt |
|---|---|---| |---|---|---|
| Ring + Prozentzahl | Anteil des **Aufnahme-Vorrats**, den die Aufnahmen schon belegen | eine Zeile: Aufnahmen in GB + Dateizahl | | Ring + Prozentzahl | Anteil des **Aufnahme-Vorrats**, den die Aufnahmen schon belegen | Aufnahmen (GB + Dateizahl) mit Balken, Noch frei, Gesamt für Aufnahmen, Partition als Fußzeile |
| Ventilator | CPU-Last — je höher, desto schneller die Drehung | CPU % (+ Kernzahl), RAM % mit GB, Temperatur mit Zone | | Ventilator | CPU-Last — je höher, desto schneller die Drehung | CPU % (+ Kernzahl), RAM % mit GB, Temperatur mit Zone |
**Bezugsgröße der Prozentzahl** (Wunsch des Nutzers, 2026-08-17): nicht die Partition, sondern der Platz, **Bezugsgröße der Prozentzahl** (Wunsch des Nutzers, 2026-08-17): nicht die Partition, sondern der Platz,
@@ -100,10 +100,17 @@ belegt = Summe aller Audiodateien unter recordings/
``` ```
System, Modelle und `node_modules` zählen also weder oben noch unten mit — die Anzeige beantwortet System, Modelle und `node_modules` zählen also weder oben noch unten mit — die Anzeige beantwortet
„wie viel von meinem Aufnahme-Vorrat ist weg?“ und nicht „wie voll ist die eMMC?“. Die Klappkarte zeigt „wie viel von meinem Aufnahme-Vorrat ist weg?“ und nicht „wie voll ist die eMMC?“ (der `df`-Wert steht
auf Wunsch des Nutzers **nur noch** die Zeile „Aufnahmen: x,y GB · n Dateien“; Restplatz, Vorratsgröße, als Fußzeile in der Klappkarte).
Erklärtext und Partitionswert wurden wieder entfernt. Die Zahlen dahinter liefert `/api/sysstat`
weiterhin (`freeBytes`, `budgetBytes`, `partPct`) — nur die GUI zeigt sie nicht mehr an. **Mitgezählt wird jede Audiodatei unter `recordings/`, nicht nur die MP3s** — zu jeder Aufnahme liegt
dort auch die WAV-Rohdatei, und die ist rund viermal so groß wie das MP3 (Stand 2026-08-17: 52 MP3 =
0,39 GB, 51 WAV = 1,57 GB). Ebenso zählen die Aufnahmen im **Papierkorb** mit, denn deren Dateien
liegen bis zum Ablauf der 30 Tage weiter auf der Platte (Stand 2026-08-17: 16 aktiv, 36 im Papierkorb).
**Zeilenumbruch:** `.sys-row` steht auf `white-space: nowrap`, die Karte wächst stattdessen in die
Breite (`.sys-pop-disk { min-width: 285px }`). Vorher rutschte bei „Gesamt für Aufnahmen 27,5 GB“ die
Einheit allein in die nächste Zeile und sah aus wie ein fehlender Wert.
- Datenquelle: `GET /api/sysstat` (`app/sysstat.js`). `/proc`, `fs.statfsSync` und ein **gepufferter** - Datenquelle: `GET /api/sysstat` (`app/sysstat.js`). `/proc`, `fs.statfsSync` und ein **gepufferter**
Größenscan über `recordings/` (`readdir` rekursiv + `stat`, TTL 60 s, nur Audio-Endungen) — **kein** Größenscan über `recordings/` (`readdir` rekursiv + `stat`, TTL 60 s, nur Audio-Endungen) — **kein**
+16 -9
View File
@@ -3,17 +3,24 @@
Chronik der Entwicklungsschritte. **Regel: jede zukünftige Änderung bekommt hier einen Eintrag** (Datum, Chronik der Entwicklungsschritte. **Regel: jede zukünftige Änderung bekommt hier einen Eintrag** (Datum,
Was, Warum, betroffene Dateien/Backups). Was, Warum, betroffene Dateien/Backups).
## 2026-08-17 (Nachtrag 2) — Speicherkarte auf eine Zeile gekürzt ## 2026-08-17 (Nachtrag 3) — Karte wieder vollständig, dafür umbruchfrei
Der Nutzer wollte alles unterhalb der GB-Zeile weg: Fortschrittsbalken, „Noch frei“, „Gesamt für Der vermeintlich „fehlende Wert“ war ein **Zeilenumbruch**: bei „Gesamt für Aufnahmen 27,5 GB“ rutschte
Aufnahmen“, der Erklärtext und die Partitions-Fußzeile sind raus, übrig bleibt die Einheit allein in die nächste Zeile. Also alles wieder rein (Balken, „Noch frei“, „Gesamt für
„Aufnahmen: 1,8 GB · 103 Dateien“. Die Prozentzahl steht ohnehin am Ring in der Kopfzeile. Aufnahmen“, Erklärtext, Partitions-Fußzeile) und stattdessen der Umbruch abgestellt:
`.sys-row { white-space: nowrap }` + `.sys-pop-disk { min-width: 285px }`, der Erklärtext darf als
einziger weiter umbrechen. Die in Nachtrag 2 entfernte Media-Query bleibt entfernt — die Prozentzahl am
Ring war unter 900 px Fensterbreite ausgeblendet, das soll sie nicht sein.
Dazu die Rückfrage „warum steht da kein Wert?“: Kandidat war der **unbeschriftete Balken** unter der Nur Frontend (`main.js`, `style.css` + Vite-Build), kein Dienstneustart.
Zeile (jetzt weg) — und die Media-Query `@media (max-width: 900px) { .sys-val { display: none } }`, die
bei schmalem Fenster die Prozentzahl **neben dem Ring** ausblendete. Die Regel ist entfernt, die Zahl ## 2026-08-17 (Nachtrag 2) — Speicherkarte kurzzeitig auf eine Zeile gekürzt
steht jetzt in jeder Fensterbreite. Nur Frontend geändert (`main.js`, `style.css` + Vite-Build), kein
Dienstneustart. Auf Zuruf alles unterhalb der GB-Zeile entfernt (Balken, „Noch frei“, „Gesamt für Aufnahmen“,
Erklärtext, Partitions-Fußzeile) und die Media-Query
`@media (max-width: 900px) { .sys-val { display: none } }` gestrichen, die bei schmalem Fenster die
Prozentzahl neben dem Ring ausblendete. Die Kürzung wurde in Nachtrag 3 wieder zurückgenommen, das
Entfernen der Media-Query bleibt.
## 2026-08-17 (Nachtrag) — Ventilator statt Turbine, Speicher relativ zum Aufnahme-Vorrat ## 2026-08-17 (Nachtrag) — Ventilator statt Turbine, Speicher relativ zum Aufnahme-Vorrat