Befunde der Schlussdurchsicht (Attrappe des Backends, 320 x 568 bis 1440 px):
- Rueckfragen: Bei 320 x 568 lagen "Installieren"/"Abbrechen" unter dem Bildschirmrand
und liessen sich nicht erreichen (Dialog 791 px hoch, kein Scrollen). Jetzt hoechstens
Bildschirmhoehe, der Text scrollt, die Knoepfe bleiben unten stehen. Gilt fuer alle.
- Installieren: Die Rueckfrage sagt jetzt, dass llama-swap beim Eintragen sofort neu laedt
(--watch-config): laufende Antworten von Lucy/OpenChamber brechen ab, mit Rolle nach dem
Download noch einmal. Der Ersatz-Hinweis nennt, dass das bisherige Modell "heavy" behaelt.
- Abbrechen nur noch bei Downloads (eigener Prozess). Updates und die Suche laufen als
Shell-Kette, ein Abbruch stoppt dort nicht sicher alles.
- Auftragstitel in den Worten der Oberflaeche ("Update Motor (llama.cpp)" statt
"Engine-Update (llama.cpp Vulkan)"); "Laeuft seit ... min" zaehlt weiter, auch wenn der
Auftrag nichts schreibt; Ueberschriftenebene passend zum Panel.
- Updates: "Alles jetzt aktualisieren" richtet sich wie die Zeilen nach den frischen
Details (vorher nur nach dem bis zu 10 min alten Start-Stand); "Nach Neuem suchen"
sperrt, solange eine Suche laeuft (zwei apt-get update stolpern ueber die Sperre);
Rueckfragetext sagt genau, was gesichert wird.
- Nach Auftragsende nur nachladen, was betroffen ist (Download: Modelle/Platte; sonst
Versionen/Verlauf/Sicherungen) - die Update-Pruefung fragt GitHub, apt und git.
- Radar "Uebernehmen"/"Verwerfen" und "Endgueltig loeschen": Ja-Knopf gesperrt, solange
die Aktion laeuft, und ein zweiter Klick waehrend des Schliessens loest nichts mehr aus.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 lines
1.4 KiB
TypeScript
44 lines
1.4 KiB
TypeScript
import { useJobAbbrechen, useJobs } from "@/lib/abfragen"
|
|
import { jobTitel, sichtbareJobs } from "@/lib/wartung"
|
|
import { JobKarte } from "./JobKarte"
|
|
import { Panel } from "./Panel"
|
|
|
|
/**
|
|
* Laufende und zuletzt beendete Aufträge — egal, woher sie kommen (Update, Modell-Download, Suche
|
|
* nach Neuem). Solange nichts läuft und nichts frisch beendet ist, zeigt sie gar nichts.
|
|
*/
|
|
export function Auftraege({ alsPanel = false }: { alsPanel?: boolean }) {
|
|
const jobs = useJobs()
|
|
const abbrechen = useJobAbbrechen()
|
|
const liste = sichtbareJobs(jobs.data?.jobs ?? [])
|
|
|
|
let inhalt
|
|
if (liste.length > 0) {
|
|
inhalt = (
|
|
<div className="grid items-start gap-2.5 lg:grid-cols-2">
|
|
{liste.map((j) => (
|
|
<JobKarte
|
|
key={j.id}
|
|
job={j}
|
|
ebene={alsPanel ? 3 : 4}
|
|
abbrechenGesperrt={abbrechen.isPending}
|
|
onAbbrechen={(job) => abbrechen.mutate({ id: job.id, titel: jobTitel(job) })}
|
|
/>
|
|
))}
|
|
</div>
|
|
)
|
|
} else if (jobs.isError && !jobs.data) {
|
|
inhalt = <p role="alert" className="text-sm text-rot-text">Die Aufträge lassen sich gerade nicht lesen: {jobs.error.message}</p>
|
|
} else {
|
|
return null
|
|
}
|
|
|
|
if (alsPanel) return <Panel titel="Aufträge">{inhalt}</Panel>
|
|
return (
|
|
<section aria-label="Aufträge" className="flex flex-col gap-2.5">
|
|
<h3 className="schild m-0 text-sm text-text-3">Aufträge</h3>
|
|
{inhalt}
|
|
</section>
|
|
)
|
|
}
|