add spacing for long temperature chart tooltip (#1299)

This commit is contained in:
henrygd
2025-10-20 14:32:27 -04:00
parent a87b9af9d5
commit 62f5f986bb
2 changed files with 51 additions and 30 deletions

View File

@@ -41,6 +41,7 @@ import { useIntersectionObserver } from "@/lib/use-intersection-observer"
import { import {
chartTimeData, chartTimeData,
cn, cn,
compareSemVer,
debounce, debounce,
decimalString, decimalString,
formatBytes, formatBytes,
@@ -170,8 +171,9 @@ export default memo(function SystemDetail({ id }: { id: string }) {
const [system, setSystem] = useState({} as SystemRecord) const [system, setSystem] = useState({} as SystemRecord)
const [systemStats, setSystemStats] = useState([] as SystemStatsRecord[]) const [systemStats, setSystemStats] = useState([] as SystemStatsRecord[])
const [containerData, setContainerData] = useState([] as ChartData["containerData"]) const [containerData, setContainerData] = useState([] as ChartData["containerData"])
const netCardRef = useRef<HTMLDivElement>(null) const temperatureChartRef = useRef<HTMLDivElement>(null)
const persistChartTime = useRef(false) const persistChartTime = useRef(false)
const [bottomSpacing, setBottomSpacing] = useState(0)
const [chartLoading, setChartLoading] = useState(true) const [chartLoading, setChartLoading] = useState(true)
const isLongerChart = !["1m", "1h"].includes(chartTime) // true if chart time is not 1m or 1h const isLongerChart = !["1m", "1h"].includes(chartTime) // true if chart time is not 1m or 1h
const userSettings = $userSettings.get() const userSettings = $userSettings.get()
@@ -396,6 +398,21 @@ export default memo(function SystemDetail({ id }: { id: string }) {
}[] }[]
}, [system, t]) }, [system, t])
/** Space for tooltip if more than 10 sensors and no containers table */
useEffect(() => {
const sensors = Object.keys(systemStats.at(-1)?.stats.t ?? {})
if (!temperatureChartRef.current || sensors.length < 10 || containerData.length > 0) {
setBottomSpacing(0)
return
}
const tooltipHeight = (sensors.length - 10) * 17.8 - 40
const wrapperEl = chartWrapRef.current as HTMLDivElement
const wrapperRect = wrapperEl.getBoundingClientRect()
const chartRect = temperatureChartRef.current.getBoundingClientRect()
const distanceToBottom = wrapperRect.bottom - chartRect.bottom
setBottomSpacing(tooltipHeight - distanceToBottom)
}, [])
// keyboard navigation between systems // keyboard navigation between systems
useEffect(() => { useEffect(() => {
if (!systems.length) { if (!systems.length) {
@@ -728,14 +745,9 @@ export default memo(function SystemDetail({ id }: { id: string }) {
</ChartCard> </ChartCard>
{containerFilterBar && containerData.length > 0 && ( {containerFilterBar && containerData.length > 0 && (
<div
ref={netCardRef}
className={cn({
"col-span-full": !grid,
})}
>
<ChartCard <ChartCard
empty={dataEmpty} empty={dataEmpty}
grid={grid}
title={dockerOrPodman(t`Docker Network I/O`, system)} title={dockerOrPodman(t`Docker Network I/O`, system)}
description={dockerOrPodman(t`Network traffic of docker containers`, system)} description={dockerOrPodman(t`Network traffic of docker containers`, system)}
cornerEl={containerFilterBar} cornerEl={containerFilterBar}
@@ -747,7 +759,6 @@ export default memo(function SystemDetail({ id }: { id: string }) {
chartConfig={containerChartConfigs.network} chartConfig={containerChartConfigs.network}
/> />
</ChartCard> </ChartCard>
</div>
)} )}
{/* Swap chart */} {/* Swap chart */}
@@ -777,6 +788,10 @@ export default memo(function SystemDetail({ id }: { id: string }) {
{/* Temperature chart */} {/* Temperature chart */}
{systemStats.at(-1)?.stats.t && ( {systemStats.at(-1)?.stats.t && (
<div
ref={temperatureChartRef}
className={cn("odd:last-of-type:col-span-full", { "col-span-full": !grid })}
>
<ChartCard <ChartCard
empty={dataEmpty} empty={dataEmpty}
grid={grid} grid={grid}
@@ -787,6 +802,7 @@ export default memo(function SystemDetail({ id }: { id: string }) {
> >
<TemperatureChart chartData={chartData} /> <TemperatureChart chartData={chartData} />
</ChartCard> </ChartCard>
</div>
)} )}
{/* Battery chart */} {/* Battery chart */}
@@ -974,10 +990,13 @@ export default memo(function SystemDetail({ id }: { id: string }) {
})} })}
</div> </div>
)} )}
{id && containerData.length > 0 && ( {containerData.length > 0 && compareSemVer(chartData.agentVersion, parseSemVer("0.14.0")) >= 0 && (
<LazyContainersTable systemId={id} /> <LazyContainersTable systemId={id} />
)} )}
</div> </div>
{/* add space for tooltip if more than 12 containers */}
{bottomSpacing > 0 && <span className="block" style={{ height: bottomSpacing }} />}
</> </>
) )
}) })

View File

@@ -2,6 +2,8 @@
- Add `MFA_OTP` environment variable to enable email-based one-time password for users and/or superusers. - Add `MFA_OTP` environment variable to enable email-based one-time password for users and/or superusers.
- Add spacing for long temperature chart tooltip. (#1299)
## 0.14.0 ## 0.14.0
- Add `/containers` page for viewing current status of all running containers. (#928) - Add `/containers` page for viewing current status of all running containers. (#928)