(null)
- const mitUpdate = new Set(start.data?.updates.bausteine.map((b) => b.id) ?? [])
+ const neuLautStart = new Map((start.data?.updates.bausteine ?? []).map((b) => [b.id, b.neu]))
const festgehalten = new Map((start.data?.updates.festgehalten ?? []).map((f) => [f.baustein, f]))
- const wartungsJobs = (jobs.data?.jobs ?? []).filter((j) => (j as { group?: string }).group === "maintenance")
- const laeuft = wartungsJobs.some((j) => j.state === "running" || j.state === "queued")
+ const alleJobs = jobs.data?.jobs ?? []
+ // Nur ein Update gleichzeitig (Riegel im Backend) — auch der Sonntags-Lauf zählt.
+ const updateLaeuft =
+ alleJobs.some((j) => j.group === "maintenance" && laeuftNoch(j)) || (start.data?.zustand.update_laeuft ?? false)
+ // Die Suche hat im Backend (noch) keine Gruppe; sobald sie "pruefen" heißt, sperrt der Knopf auch hier.
+ const suchtGerade = alleJobs.some((j) => j.group === "pruefen" && laeuftNoch(j))
+ const gesperrt = updateLaeuft || updateStarten.isPending
+ const zurueckMoeglich = sicherungen.data?.available ?? false
+
+ let tabelle
+ if (start.isPending) {
+ tabelle =
+ } else if (start.isError && !start.data) {
+ tabelle =
+ } else {
+ tabelle = (
+
+
+ Baustein
+ Läuft
+ Neu
+ Was sich ändert
+ Aktion
+
+ {BAUSTEINE.map((b) => (
+
setFrage({ art: "einzeln", id: b.id, name: b.name })}
+ onFreigeben={() => {
+ const f = festgehalten.get(b.id)
+ if (f) setFrage({ art: "freigeben", id: b.id, name: b.name, grund: f.grund })
+ }}
+ />
+ ))}
+
+ )
+ }
+
+ let verlaufInhalt
+ if (verlauf.isPending) {
+ verlaufInhalt = Wird gelesen …
+ } else if (verlauf.isError && !verlauf.data) {
+ verlaufInhalt = Der Verlauf lässt sich gerade nicht lesen: {verlauf.error.message}
+ } else if (!verlauf.data?.laeufe.length) {
+ verlaufInhalt = Noch keine Update-Läufe aufgezeichnet.
+ } else {
+ verlaufInhalt = (
+
+ {verlauf.data.laeufe.map((l) => )}
+
+ )
+ }
+
+ let sicherungsInhalt
+ if (sicherungen.isPending) {
+ sicherungsInhalt = Wird gelesen …
+ } else if (sicherungen.isError && !sicherungen.data) {
+ sicherungsInhalt = Die Sicherungen lassen sich gerade nicht lesen: {sicherungen.error.message}
+ } else if (!sicherungen.data?.backups.length) {
+ sicherungsInhalt = Noch keine Sicherung vorhanden.
+ } else {
+ sicherungsInhalt = (
+
+ {sicherungen.data.backups.slice(0, 5).map((s) => (
+ -
+ {sicherungsZeit(s)}
+
+ {s.size_mb.toLocaleString("de-DE")} MB
+
+
+
+ ))}
+
+ )
+ }
return (
<>
@@ -154,10 +363,14 @@ export function UpdatesSeite() {
titel="Updates"
rechts={
-
@@ -166,103 +379,79 @@ export function UpdatesSeite() {
Jeden Sonntag um 04:30 automatisch. Vorher wird gesichert, danach geprüft.
- {start.isPending ? (
-
- ) : (
-
-
- Baustein
- Läuft
- Neu
- Was sich ändert
- Aktion
-
- {BAUSTEINE.map((b) => (
-
updateStarten.mutate(b.id)}
- onFreigeben={() => freigeben.mutate(b.id)}
- />
- ))}
-
- )}
- {wartungsJobs.length > 0 && (
-
-
Laufende und letzte Aufträge
- {wartungsJobs.slice(-3).reverse().map((j) => )}
-
+ {updateLaeuft && (
+
+ Gerade läuft ein Update. Weitere lassen sich erst starten, wenn es fertig ist.
+
)}
+ {tabelle}
+
-
- {verlauf.data?.laeufe.length ? (
-
- {verlauf.data.laeufe.map((l) => )}
-
- ) : (
-
- {verlauf.isPending ? "Wird gelesen …" : "Noch keine Update-Läufe aufgezeichnet."}
-
- )}
-
+
{verlaufInhalt}
sichern.mutate(undefined)} disabled={sichern.isPending}>
- Jetzt sichern
+ {sichern.isPending ? "Sichert …" : "Jetzt sichern"}
}
>
Täglich um 03:35, mit Kopie auf einem zweiten Gerät.
-
- {(sicherungen.data?.backups ?? []).slice(0, 5).map((s) => (
- -
- {sicherungsZeit(s)}
-
- {s.size_mb.toLocaleString("de-DE")} MB
- setFrage({ art: "zurueck", datei: s.file, zeit: sicherungsZeit(s) })}
- >
- Zurückspielen
-
-
-
- ))}
-
+ {sicherungen.data && !zurueckMoeglich && (
+ Zurückspielen geht nur auf der Box selbst.
+ )}
+ {sicherungsInhalt}
setFrage(null)}
onJa={() => {
updateStarten.mutate("alle")
setFrage(null)
}}
/>
+ setFrage(null)}
+ onJa={() => {
+ if (frage?.art === "einzeln") updateStarten.mutate(frage.id)
+ setFrage(null)
+ }}
+ />
+ setFrage(null)}
+ onJa={() => {
+ if (frage?.art === "freigeben") freigeben.mutate(frage.id)
+ setFrage(null)
+ }}
+ />
setFrage(null)}
onJa={() => {
if (frage?.art === "zurueck") zurueck.mutate(frage.datei)