Update metrics-dialog.tsx

This commit is contained in:
MacRimi
2025-10-23 12:47:28 +02:00
parent 21b7d1c3fb
commit 30b236548a

View File

@@ -26,6 +26,8 @@ export function MetricsView({ vmid, vmName, vmType, onBack }: MetricsViewProps)
const [data, setData] = useState<any[]>([]) const [data, setData] = useState<any[]>([])
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
const [error, setError] = useState<string | null>(null) const [error, setError] = useState<string | null>(null)
const [hiddenDiskLines, setHiddenDiskLines] = useState<string[]>([])
const [hiddenNetworkLines, setHiddenNetworkLines] = useState<string[]>([])
useEffect(() => { useEffect(() => {
fetchMetrics() fetchMetrics()
@@ -259,7 +261,7 @@ export function MetricsView({ vmid, vmName, vmType, onBack }: MetricsViewProps)
borderRadius: "6px", borderRadius: "6px",
}} }}
/> />
<Legend verticalAlign="top" height={36} iconType="line" wrapperStyle={{ paddingBottom: "10px" }} /> <Legend content={renderDiskLegend} />
<Area <Area
type="monotone" type="monotone"
dataKey="diskread" dataKey="diskread"
@@ -268,6 +270,7 @@ export function MetricsView({ vmid, vmName, vmType, onBack }: MetricsViewProps)
fillOpacity={0.3} fillOpacity={0.3}
strokeWidth={2} strokeWidth={2}
name="Read" name="Read"
hide={hiddenDiskLines.includes("diskread")}
/> />
<Area <Area
type="monotone" type="monotone"
@@ -277,6 +280,7 @@ export function MetricsView({ vmid, vmName, vmType, onBack }: MetricsViewProps)
fillOpacity={0.3} fillOpacity={0.3}
strokeWidth={2} strokeWidth={2}
name="Write" name="Write"
hide={hiddenDiskLines.includes("diskwrite")}
/> />
</AreaChart> </AreaChart>
</ResponsiveContainer> </ResponsiveContainer>
@@ -313,7 +317,7 @@ export function MetricsView({ vmid, vmName, vmType, onBack }: MetricsViewProps)
borderRadius: "6px", borderRadius: "6px",
}} }}
/> />
<Legend verticalAlign="top" height={36} iconType="line" wrapperStyle={{ paddingBottom: "10px" }} /> <Legend content={renderNetworkLegend} />
<Area <Area
type="monotone" type="monotone"
dataKey="netin" dataKey="netin"
@@ -322,6 +326,7 @@ export function MetricsView({ vmid, vmName, vmType, onBack }: MetricsViewProps)
fillOpacity={0.3} fillOpacity={0.3}
strokeWidth={2} strokeWidth={2}
name="Download" name="Download"
hide={hiddenNetworkLines.includes("netin")}
/> />
<Area <Area
type="monotone" type="monotone"
@@ -331,6 +336,7 @@ export function MetricsView({ vmid, vmName, vmType, onBack }: MetricsViewProps)
fillOpacity={0.3} fillOpacity={0.3}
strokeWidth={2} strokeWidth={2}
name="Upload" name="Upload"
hide={hiddenNetworkLines.includes("netout")}
/> />
</AreaChart> </AreaChart>
</ResponsiveContainer> </ResponsiveContainer>
@@ -339,6 +345,66 @@ export function MetricsView({ vmid, vmName, vmType, onBack }: MetricsViewProps)
) )
} }
const handleDiskLegendClick = (dataKey: string) => {
setHiddenDiskLines((prev) => {
if (prev.includes(dataKey)) {
return prev.filter((key) => key !== dataKey)
} else {
return [...prev, dataKey]
}
})
}
const handleNetworkLegendClick = (dataKey: string) => {
setHiddenNetworkLines((prev) => {
if (prev.includes(dataKey)) {
return prev.filter((key) => key !== dataKey)
} else {
return [...prev, dataKey]
}
})
}
const renderDiskLegend = (props: any) => {
const { payload } = props
return (
<div className="flex justify-center gap-6 pb-2">
{payload.map((entry: any) => (
<button
key={entry.dataKey}
onClick={() => handleDiskLegendClick(entry.dataKey)}
className={`flex items-center gap-2 cursor-pointer transition-opacity hover:opacity-100 ${
hiddenDiskLines.includes(entry.dataKey) ? "opacity-40" : "opacity-100"
}`}
>
<span className="w-3 h-3 rounded-full" style={{ backgroundColor: entry.color }} />
<span className="text-sm">{entry.value}</span>
</button>
))}
</div>
)
}
const renderNetworkLegend = (props: any) => {
const { payload } = props
return (
<div className="flex justify-center gap-6 pb-2">
{payload.map((entry: any) => (
<button
key={entry.dataKey}
onClick={() => handleNetworkLegendClick(entry.dataKey)}
className={`flex items-center gap-2 cursor-pointer transition-opacity hover:opacity-100 ${
hiddenNetworkLines.includes(entry.dataKey) ? "opacity-40" : "opacity-100"
}`}
>
<span className="w-3 h-3 rounded-full" style={{ backgroundColor: entry.color }} />
<span className="text-sm">{entry.value}</span>
</button>
))}
</div>
)
}
return ( return (
<div className="flex flex-col h-full max-h-[90vh]"> <div className="flex flex-col h-full max-h-[90vh]">
{/* Fixed Header */} {/* Fixed Header */}