diff --git a/client/src/Components/monitors/charts/HistogramDockerContainer.tsx b/client/src/Components/monitors/charts/HistogramDockerContainer.tsx index b7a420fc9..fe6175cdd 100644 --- a/client/src/Components/monitors/charts/HistogramDockerContainer.tsx +++ b/client/src/Components/monitors/charts/HistogramDockerContainer.tsx @@ -1,15 +1,58 @@ -import { BaseChart } from "@/Components/design-elements"; -import { Area, AreaChart, CartesianGrid, ResponsiveContainer } from "recharts"; +import { BaseChart, BaseBox } from "@/Components/design-elements"; +import { Area, AreaChart, CartesianGrid, ResponsiveContainer, Tooltip } from "recharts"; +import Typography from "@mui/material/Typography"; // Types import type { DockerContainerStats } from "@/Types/Monitor"; +import type { TooltipProps } from "recharts"; +import type { NameType, ValueType } from "recharts/types/component/DefaultTooltipContent"; +import type { Theme } from "@mui/material/styles"; +import type { RootState } from "@/Types/state"; // Hooks import { useTheme } from "@mui/material"; import { Fragment, useId } from "react"; +import { useTranslation } from "react-i18next"; +import { useSelector } from "react-redux"; // Utils import { createGradient } from "@/Components/monitors/charts/ChartUtils"; +import { tooltipDateFormatLookup, formatDateWithTz } from "@/Utils/TimeUtils"; +import type { DateRange } from "@/Types/Query"; + +type DockerHistogramToolTipProps = TooltipProps & { + dataKey: string; + range: string; + theme: Theme; + uiTimezone: string; + valueFormatter: (value: number) => string; + labelKey: string; +}; + +const DockerHistogramToolTip = ({ + dataKey, + active, + payload, + range, + theme, + uiTimezone, + valueFormatter, + labelKey, +}: DockerHistogramToolTipProps) => { + const { t } = useTranslation(); + if (!payload) return null; + if (!active) return null; + const format = tooltipDateFormatLookup(range); + const ts = payload[0].payload?._id ?? null; + const dataPoint = payload[0].payload?.[dataKey] ?? null; + + return ( + + {formatDateWithTz(ts, format, uiTimezone)} + {t(labelKey, { value: valueFormatter(dataPoint) })} + + ); +}; interface HistogramDockerContainerProps { title: string; rightTitle: string; @@ -17,6 +60,9 @@ interface HistogramDockerContainerProps { dataKey: string; strokeColor: string; gradientStartColor: string; + range: DateRange; + formatter: (value: number) => string; + labelKey: string; } export const HistogramDockerContainer = ({ @@ -26,11 +72,14 @@ export const HistogramDockerContainer = ({ dataKey, strokeColor, gradientStartColor, + range, + formatter, + labelKey, }: HistogramDockerContainerProps) => { const uniqueId = useId(); const theme = useTheme(); const gradientId = `gradient-${uniqueId}`; - + const uiTimezone = useSelector((state: RootState) => state.ui.timezone); return ( ( + + )} + /> [ { @@ -24,20 +25,29 @@ const getChartConfigs = (theme: Theme, t: TFunction, stats: DockerContainerStats key: "avgCpuPct", color: theme.palette.success.main, rightTitle: formatPercentage(stats?.latest?.container.cpuPct || 0), + formatter: formatPercentage, + labelKey: "common.charts.histogram.avgCpuUsage", }, { title: t("common.charts.labels.memoryUsage"), key: "avgMemoryUsedBytes", color: theme.palette.primary.main, rightTitle: prettyBytes(stats?.latest?.container.memoryUsedBytes || 0), + formatter: prettyBytes, + labelKey: "common.charts.histogram.avgMemoryUsage", }, ]; -export const TabOverview = ({ stats }: { stats: DockerContainerStats }) => { +export const TabOverview = ({ + stats, + range, +}: { + stats: DockerContainerStats; + range: DateRange; +}) => { const theme = useTheme(); const { t } = useTranslation(); const isSmall = useMediaQuery(theme.breakpoints.down("md")); - const { ports, mounts } = stats?.latest?.container ?? {}; const dedupedPorts = dedupeDockerPorts(ports ?? []); return ( @@ -58,6 +68,9 @@ export const TabOverview = ({ stats }: { stats: DockerContainerStats }) => { dataKey={config.key} strokeColor={config.color} gradientStartColor={config.color} + range={range} + formatter={config.formatter} + labelKey={config.labelKey} /> ); diff --git a/client/src/Pages/Docker/ContainerDetails/index.tsx b/client/src/Pages/Docker/ContainerDetails/index.tsx index 6bd30c733..f394559b6 100644 --- a/client/src/Pages/Docker/ContainerDetails/index.tsx +++ b/client/src/Pages/Docker/ContainerDetails/index.tsx @@ -21,7 +21,7 @@ const TAB_MAP = { logs: 1, } as const; -const DockerDetailsPage = ({ open = "logs" }: DockerContainerDetailsProps) => { +const DockerDetailsPage = ({ open = "overview" }: DockerContainerDetailsProps) => { const [activeTab, setActiveTab] = useState(TAB_MAP[open]); const [dateRange, setDateRange] = useState("recent"); const { monitorId, containerName } = useParams<{ @@ -69,7 +69,12 @@ const DockerDetailsPage = ({ open = "logs" }: DockerContainerDetailsProps) => { - {activeTab === 0 && } + {activeTab === 0 && ( + + )} {activeTab === 1 && (