modelle: Aufraeumen-Listen eingeklappt mit Zusammenfassung, ruhigere Loeschknoepfe
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
8cb6f6f878
commit
7f1bc6055e
@@ -1,7 +1,7 @@
|
||||
import { useEffect, useRef, useState } from "react"
|
||||
import { type ReactNode, useEffect, useRef, useState } from "react"
|
||||
import { useQueryClient } from "@tanstack/react-query"
|
||||
import { useLocation } from "@tanstack/react-router"
|
||||
import { Search } from "lucide-react"
|
||||
import { ChevronRight, Search } from "lucide-react"
|
||||
import { Auftraege } from "@/components/cockpit/Auftraege"
|
||||
import { Bestaetigen } from "@/components/cockpit/Bestaetigen"
|
||||
import { Chip, type ChipArt, Zustandsfeld } from "@/components/cockpit/Chip"
|
||||
@@ -325,6 +325,25 @@ function RadarPanel({ hirn, coder }: { hirn: string | undefined; coder: string |
|
||||
)
|
||||
}
|
||||
|
||||
/** Löschen in Listen: ruhig und erst beim Zeigen rot — die Rückfrage danach ist rot und endgültig. */
|
||||
const LOESCHKNOPF = "text-rot-text hover:bg-rot-grund hover:text-rot-text"
|
||||
|
||||
/** Eine eingeklappte Liste mit Zusammenfassung — lange Aufräum-Listen erst auf Wunsch. */
|
||||
function Klappe({ titel, zusatz, children }: { titel: string; zusatz: string; children: ReactNode }) {
|
||||
return (
|
||||
<details className="group rounded-xl border border-linie bg-erhaben/40 px-4 open:pb-2">
|
||||
<summary className="flex min-h-12 cursor-pointer list-none items-center justify-between gap-3 [&::-webkit-details-marker]:hidden">
|
||||
<span className="flex items-center gap-2 text-[15px] font-medium">
|
||||
<ChevronRight className="size-4 text-text-3 transition-transform group-open:rotate-90" aria-hidden />
|
||||
{titel}
|
||||
</span>
|
||||
<span className="ziffern text-sm text-text-2">{zusatz}</span>
|
||||
</summary>
|
||||
<div className="flex flex-col gap-2 pb-1">{children}</div>
|
||||
</details>
|
||||
)
|
||||
}
|
||||
|
||||
/** Was ungenutzt Platz belegt. Gelöscht wird nur auf Knopfdruck, mit Rückfrage — Löschen ist endgültig. */
|
||||
function AufraeumenPanel() {
|
||||
const liste = useAufraeumen()
|
||||
@@ -355,6 +374,7 @@ function AufraeumenPanel() {
|
||||
) : kandidaten.length === 0 ? (
|
||||
<p className="text-[15px] text-text-2">Nichts aufzuräumen.</p>
|
||||
) : (
|
||||
<Klappe titel="Modelle und Ordner" zusatz={`${kandidaten.length} Einträge · bis zu ${summe.toLocaleString("de-DE", { maximumFractionDigits: 0 })} GB`}>
|
||||
<ul className="m-0 flex list-none flex-col p-0">
|
||||
{kandidaten.map((k) => (
|
||||
<li key={`${k.art}-${k.name}`} className="flex flex-wrap items-center justify-between gap-3 border-t border-linie py-3">
|
||||
@@ -367,13 +387,14 @@ function AufraeumenPanel() {
|
||||
</span>
|
||||
<span className="flex items-center gap-3">
|
||||
<span className="ziffern text-sm text-text-2">{k.groesse_gb.toLocaleString("de-DE")} GB</span>
|
||||
<Button variant="gefahr" size="sm" disabled={loeschen.isPending} onClick={() => setFrage(k)}>
|
||||
<Button variant="ghost" size="sm" className={LOESCHKNOPF} disabled={loeschen.isPending} onClick={() => setFrage(k)}>
|
||||
Löschen
|
||||
</Button>
|
||||
</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</Klappe>
|
||||
)}
|
||||
<Bestaetigen
|
||||
offen={frage !== null}
|
||||
@@ -410,14 +431,6 @@ function Altreste() {
|
||||
const summe = reste.reduce((s, a) => s + a.groesse_bytes, 0)
|
||||
return (
|
||||
<div className="flex flex-col gap-2">
|
||||
<div className="flex flex-wrap items-center justify-between gap-3 border-t border-linie pt-4">
|
||||
<h3 className="schild text-sm text-text-3">Altreste neben dem Betrieb</h3>
|
||||
{reste.length > 0 && <span className="ziffern text-sm text-text-2">zusammen {mengeText(summe)}</span>}
|
||||
</div>
|
||||
<p className="text-sm text-text-2">
|
||||
Test-Ordner, alte Umgebungen und Arbeitskopien, die nichts mehr nutzt. Die Box prüft sie gegen eine feste Liste und
|
||||
löscht auch hier nie von selbst.
|
||||
</p>
|
||||
{liste.isPending ? (
|
||||
<p className="text-[15px] text-text-2">Wird gelesen …</p>
|
||||
) : liste.isError && !liste.data ? (
|
||||
@@ -425,6 +438,11 @@ function Altreste() {
|
||||
) : reste.length === 0 ? (
|
||||
<p className="text-[15px] text-text-2">Keine Altreste mehr.</p>
|
||||
) : (
|
||||
<Klappe titel="Altreste neben dem Betrieb" zusatz={`${reste.length} Einträge · ${mengeText(summe)}`}>
|
||||
<p className="text-sm text-text-2">
|
||||
Test-Ordner, alte Umgebungen und Arbeitskopien, die nichts mehr nutzt. Die Box prüft sie gegen eine feste Liste
|
||||
und löscht auch hier nie von selbst.
|
||||
</p>
|
||||
<ul className="m-0 flex list-none flex-col p-0">
|
||||
{reste.map((a) => (
|
||||
<li key={a.id} className="flex flex-wrap items-center justify-between gap-3 border-t border-linie py-3">
|
||||
@@ -438,13 +456,14 @@ function Altreste() {
|
||||
</span>
|
||||
<span className="flex items-center gap-3">
|
||||
<span className="ziffern text-sm text-text-2">{a.groesse}</span>
|
||||
<Button variant="gefahr" size="sm" disabled={loeschen.isPending} onClick={() => setFrage(a)}>
|
||||
<Button variant="ghost" size="sm" className={LOESCHKNOPF} disabled={loeschen.isPending} onClick={() => setFrage(a)}>
|
||||
Löschen
|
||||
</Button>
|
||||
</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</Klappe>
|
||||
)}
|
||||
<Bestaetigen
|
||||
offen={frage !== null}
|
||||
|
||||
Reference in New Issue
Block a user