From b6502ba3626c30eb7af426debfde16344a25824f Mon Sep 17 00:00:00 2001 From: Mitchell-Johnson Date: Fri, 18 Sep 2026 13:41:38 -0700 Subject: [PATCH] Disks: one toggle opens SMART for every drive, remembered per device Co-Authored-By: Claude Fable 5.1 --- web/src/Disks.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/web/src/Disks.tsx b/web/src/Disks.tsx index 74680ea..a74f76b 100644 --- a/web/src/Disks.tsx +++ b/web/src/Disks.tsx @@ -73,8 +73,10 @@ function SmartPanel({ dev, rotational }: { dev: string; rotational: boolean }) { } // ---- device card ---- -function DeviceCard({ d, live }: { d: StorageDevice; live?: { read_bps: number; write_bps: number; util_pct: number } }) { - const [open, setOpen] = useState(false) +function DeviceCard({ d, live, forceOpen }: { d: StorageDevice; live?: { read_bps: number; write_bps: number; util_pct: number }; forceOpen: boolean | null }) { + const [own, setOwn] = useState(false) + const open = forceOpen ?? own + const setOpen = (v: boolean) => setOwn(v) return (
@@ -93,7 +95,7 @@ function DeviceCard({ d, live }: { d: StorageDevice; live?: { read_bps: number;
))} {d.parts.length === 0 &&
No partitions.
} -
+ {forceOpen === null &&
} {open && }
) @@ -179,6 +181,7 @@ export default function Disks() { const [live, setLive] = useState(null) const [err, setErr] = useState('') const [task, setTask] = useState(null) + const [allSmart, setAllSmart] = useState(() => localStorage.getItem('hamlab.disks.smart') === '1') const rate = useRefreshMs() const load = useCallback(async () => { @@ -205,13 +208,14 @@ export default function Disks() {

Devices · {devs.length}

+ {hasSmart && } {!hasSmart && { try { const t = await api.installPackages(['smartmontools']); setTask(t.id) } catch (e) { toast(e instanceof Error ? e.message : 'failed', 'err') } }}>Install smartmontools} ↻
{!hasSmart &&
SMART health needs smartmontools on this host. Install it with the button, then reload.
} {task && { toast(`${t.title}: ${t.exit_code === 0 ? 'finished' : `exited ${t.exit_code}`}`, t.exit_code === 0 ? 'ok' : 'err'); load() }} />}
- {devs.map((d) => )} + {devs.map((d) => )}

ZFS