diff --git a/AppImage/ProxMenux-1.2.2.2-beta.AppImage b/AppImage/ProxMenux-1.2.2.2-beta.AppImage index 82c0867e..970c1cc5 100755 Binary files a/AppImage/ProxMenux-1.2.2.2-beta.AppImage and b/AppImage/ProxMenux-1.2.2.2-beta.AppImage differ diff --git a/AppImage/ProxMenux-Monitor.AppImage.sha256 b/AppImage/ProxMenux-Monitor.AppImage.sha256 index 34594f58..639c4834 100644 --- a/AppImage/ProxMenux-Monitor.AppImage.sha256 +++ b/AppImage/ProxMenux-Monitor.AppImage.sha256 @@ -1 +1 @@ -fd5f754a35e9657ff4868dba0d5e22c0a9538794e5c176137c33e87f9554c587 ProxMenux-1.2.2.2-beta.AppImage +aa78161adc4e3c39ab9c20bdf94ca646745894e3ad09ea188e30997233d92f87 ProxMenux-1.2.2.2-beta.AppImage diff --git a/AppImage/components/disk-temperature-card.tsx b/AppImage/components/disk-temperature-card.tsx index 6210afee..1a9904e8 100644 --- a/AppImage/components/disk-temperature-card.tsx +++ b/AppImage/components/disk-temperature-card.tsx @@ -3,7 +3,7 @@ import { useEffect, useRef, useState } from "react" import { Thermometer } from "lucide-react" import { Badge } from "./ui/badge" -import { AreaChart, Area, ResponsiveContainer, Tooltip } from "recharts" +import { AreaChart, Area, ResponsiveContainer, Tooltip, YAxis } from "recharts" import { fetchApi } from "@/lib/api-config" import { useDiskTempThresholds } from "@/lib/health-thresholds" @@ -145,6 +145,18 @@ export function DiskTemperatureCard({ + {/* Y domain is computed the same way the detail modal + does — floor(min−3) / ceil(max+3), floor at 0 — so + the line shape here matches the bigger chart instead + of recharts' auto-domain collapsing 24 → 29 °C into + a near-flat line that doesn't look like the modal. */} + Math.max(0, Math.floor(dataMin - 3)), + (dataMax: number) => Math.ceil(dataMax + 3), + ]} + /> } cursor={{ stroke: lineColor, strokeOpacity: 0.3, strokeWidth: 1 }} /> 0 - || (plan.lxcs_to_remove?.length || 0) > 0 - || (plan.components_to_uninstall?.length || 0) > 0 + // The destructive "Not in backup — will be deleted on rollback" + // block was removed: operators read it as an action ProxMenux + // would take silently. We only show the "Configurations included + // in backup" section now, which is purely informative. const hasRollback = (plan.vms_to_restore?.length || 0) > 0 || (plan.lxcs_to_restore?.length || 0) > 0 || (plan.components_to_reinstall?.length || 0) > 0 - if (!hasDestructive && !hasRollback) { + if (!hasRollback) { return (
No host-state differences detected — the backup state matches the current host (or the backup didn't include /etc/pve). @@ -7195,70 +7196,43 @@ function RollbackPlanView({ plan }: { plan: RollbackPlan }) { ) } - const Pill = ({ children, tone }: { children: any; tone: "red" | "green" }) => ( - {children} + // Pill renders inline with proper flex wrapping so dozens of VM + // IDs don't overflow the modal on mobile (previous version used + // raw spaces between pills and any value past the viewport got + // clipped). + const Pill = ({ children }: { children: any }) => ( + + {children} + + ) + // Row uses flex-wrap + min-w-0 + gap so labels and pills flow to + // a new line on narrow screens instead of pushing the card wider. + const Row = ({ label, items }: { label: string; items: (string | number)[] }) => ( +
+ {label} +
+ {items.map((id) => {id})} +
+
) return ( -
- {hasDestructive && ( -
-
- Not in backup — will be deleted on rollback -
- {plan.vms_to_remove.length > 0 && ( -
- VMs: - {plan.vms_to_remove.map((id) => {id})} -
- )} - {plan.lxcs_to_remove.length > 0 && ( -
- LXCs: - {plan.lxcs_to_remove.map((id) => {id})} -
- )} - {plan.components_to_uninstall.length > 0 && ( -
- Components: - {plan.components_to_uninstall.map((c) => {c})} -
- )} -
+
+
+ Configurations included in backup +
+ {plan.vms_to_restore.length > 0 && ( + )} - - {hasRollback && ( -
-
- Configurations included in backup -
- {plan.vms_to_restore.length > 0 && ( -
- VM configs: - {plan.vms_to_restore.map((id) => {id})} -
- )} - {plan.lxcs_to_restore.length > 0 && ( -
- LXC configs: - {plan.lxcs_to_restore.map((id) => {id})} -
- )} - {plan.components_to_reinstall.length > 0 && ( -
- Components: - {plan.components_to_reinstall.map((c) => {c})} -
- )} -
- Only the /etc/pve config is restored — disk images stay where they live. -
-
+ {plan.lxcs_to_restore.length > 0 && ( + )} + {plan.components_to_reinstall.length > 0 && ( + + )} +
+ Only the /etc/pve config is restored — disk images stay where they live. +
) } diff --git a/AppImage/components/temperature-detail-modal.tsx b/AppImage/components/temperature-detail-modal.tsx index dc364175..5e5f0653 100644 --- a/AppImage/components/temperature-detail-modal.tsx +++ b/AppImage/components/temperature-detail-modal.tsx @@ -70,7 +70,10 @@ const getStatusInfo = (temp: number) => { } export function TemperatureDetailModal({ open, onOpenChange, liveTemperature }: TemperatureDetailModalProps) { - const [timeframe, setTimeframe] = useState("hour") + // Default to 24 h — matches the disk temperature modal and is the + // useful timeframe for spotting trends; the 1-h view rarely tells + // you anything that the live reading doesn't already show. + const [timeframe, setTimeframe] = useState("day") const [data, setData] = useState([]) const [stats, setStats] = useState({ min: 0, max: 0, avg: 0, current: 0 }) const [loading, setLoading] = useState(true)