update charts to use fixed time for x axis

This commit is contained in:
Henry Dollman
2024-07-16 16:40:37 -04:00
parent cdb069e633
commit 4f3796e9bc
7 changed files with 141 additions and 59 deletions

View File

@@ -8,10 +8,14 @@ import {
ChartTooltipContent,
} from '@/components/ui/chart'
import { useMemo } from 'react'
import { formatShortDate, formatShortTime } from '@/lib/utils'
import { calculateXaxisTicks, formatShortDate, formatShortTime } from '@/lib/utils'
import Spinner from '../spinner'
export default function ({ chartData }: { chartData: Record<string, number | string>[] }) {
export default function ContainerCpuChart({
chartData,
}: {
chartData: Record<string, number | string>[]
}) {
const chartConfig = useMemo(() => {
let config = {} as Record<
string,
@@ -47,6 +51,8 @@ export default function ({ chartData }: { chartData: Record<string, number | str
return config satisfies ChartConfig
}, [chartData])
const ticks = useMemo(() => calculateXaxisTicks(chartData), [chartData])
if (!chartData.length) {
return <Spinner />
}
@@ -64,7 +70,7 @@ export default function ({ chartData }: { chartData: Record<string, number | str
<CartesianGrid vertical={false} />
<YAxis
domain={[0, (max: number) => Math.max(Math.ceil(max), 0.4)]}
// tickCount={5}
width={47}
tickLine={false}
axisLine={false}
unit={'%'}
@@ -72,6 +78,10 @@ export default function ({ chartData }: { chartData: Record<string, number | str
/>
<XAxis
dataKey="time"
domain={[ticks[0], ticks.at(-1)!]}
ticks={ticks}
type="number"
scale={'time'}
tickLine={true}
axisLine={false}
tickMargin={8}
@@ -79,8 +89,10 @@ export default function ({ chartData }: { chartData: Record<string, number | str
tickFormatter={formatShortTime}
/>
<ChartTooltip
cursor={false}
labelFormatter={formatShortDate}
// cursor={false}
animationEasing="ease-out"
animationDuration={150}
labelFormatter={(_, data) => formatShortDate(data[0].payload.time)}
// @ts-ignore
itemSorter={(a, b) => b.value - a.value}
content={<ChartTooltipContent unit="%" indicator="line" />}

View File

@@ -8,10 +8,14 @@ import {
ChartTooltipContent,
} from '@/components/ui/chart'
import { useMemo } from 'react'
import { formatShortDate, formatShortTime } from '@/lib/utils'
import { calculateXaxisTicks, formatShortDate, formatShortTime } from '@/lib/utils'
import Spinner from '../spinner'
export default function ({ chartData }: { chartData: Record<string, number | string>[] }) {
if (!chartData.length) {
return <Spinner />
}
const chartConfig = useMemo(() => {
let config = {} as Record<
string,
@@ -47,9 +51,7 @@ export default function ({ chartData }: { chartData: Record<string, number | str
return config satisfies ChartConfig
}, [chartData])
if (!chartData.length) {
return <Spinner />
}
const ticks = useMemo(() => calculateXaxisTicks(chartData), [chartData])
return (
<ChartContainer config={chartConfig} className="h-full w-full absolute aspect-auto">
@@ -78,6 +80,10 @@ export default function ({ chartData }: { chartData: Record<string, number | str
/>
<XAxis
dataKey="time"
domain={[ticks[0], ticks.at(-1)!]}
ticks={ticks}
type="number"
scale={'time'}
tickLine={true}
axisLine={false}
tickMargin={8}
@@ -85,8 +91,10 @@ export default function ({ chartData }: { chartData: Record<string, number | str
tickFormatter={formatShortTime}
/>
<ChartTooltip
cursor={false}
labelFormatter={formatShortDate}
// cursor={false}
animationEasing="ease-out"
animationDuration={150}
labelFormatter={(_, data) => formatShortDate(data[0].payload.time)}
// @ts-ignore
itemSorter={(a, b) => b.value - a.value}
content={<ChartTooltipContent unit=" MiB" indicator="line" />}

View File

@@ -6,8 +6,9 @@ import {
ChartTooltip,
ChartTooltipContent,
} from '@/components/ui/chart'
import { formatShortDate, formatShortTime } from '@/lib/utils'
import { calculateXaxisTicks, formatShortDate, formatShortTime } from '@/lib/utils'
import Spinner from '../spinner'
import { useMemo } from 'react'
const chartConfig = {
cpu: {
@@ -16,11 +17,13 @@ const chartConfig = {
},
} satisfies ChartConfig
export default function CpuChart({ chartData }: { chartData: { time: string; cpu: number }[] }) {
export default function CpuChart({ chartData }: { chartData: { time: number; cpu: number }[] }) {
if (!chartData?.length) {
return <Spinner />
}
const ticks = useMemo(() => calculateXaxisTicks(chartData), [chartData])
return (
<ChartContainer config={chartConfig} className="h-full w-full absolute aspect-auto">
<AreaChart accessibilityLayer data={chartData} margin={{ top: 10 }}>
@@ -35,15 +38,24 @@ export default function CpuChart({ chartData }: { chartData: { time: string; cpu
{/* todo: short time if first date is same day, otherwise short date */}
<XAxis
dataKey="time"
domain={[ticks[0], ticks.at(-1)!]}
ticks={ticks}
type="number"
scale={'time'}
axisLine={false}
tickMargin={8}
minTickGap={30}
minTickGap={35}
tickFormatter={formatShortTime}
/>
<ChartTooltip
cursor={false}
animationEasing="ease-out"
animationDuration={150}
content={
<ChartTooltipContent unit="%" labelFormatter={formatShortDate} indicator="line" />
<ChartTooltipContent
unit="%"
labelFormatter={(_, data) => formatShortDate(data[0].payload.time)}
indicator="line"
/>
}
/>
<Area

View File

@@ -6,7 +6,7 @@ import {
ChartTooltip,
ChartTooltipContent,
} from '@/components/ui/chart'
import { formatShortDate, formatShortTime } from '@/lib/utils'
import { calculateXaxisTicks, formatShortDate, formatShortTime } from '@/lib/utils'
import { useMemo } from 'react'
import Spinner from '../spinner'
// for (const data of chartData) {
@@ -23,12 +23,18 @@ const chartConfig = {
export default function DiskChart({
chartData,
}: {
chartData: { time: string; disk: number; diskUsed: number }[]
chartData: { time: number; disk: number; diskUsed: number }[]
}) {
if (!chartData.length) {
return <Spinner />
}
const diskSize = useMemo(() => {
return Math.round(chartData[0]?.disk)
}, [chartData])
const ticks = useMemo(() => calculateXaxisTicks(chartData), [chartData])
// const ticks = useMemo(() => {
// let ticks = [0]
// for (let i = 1; i < diskSize; i += diskSize / 5) {
@@ -38,10 +44,6 @@ export default function DiskChart({
// return ticks
// }, [diskSize])
if (!chartData.length) {
return <Spinner />
}
return (
<ChartContainer config={chartConfig} className="h-full w-full absolute aspect-auto">
<AreaChart
@@ -68,6 +70,10 @@ export default function DiskChart({
{/* todo: short time if first date is same day, otherwise short date */}
<XAxis
dataKey="time"
domain={[ticks[0], ticks.at(-1)!]}
ticks={ticks}
type="number"
scale={'time'}
tickLine={true}
axisLine={false}
tickMargin={8}
@@ -77,7 +83,11 @@ export default function DiskChart({
<ChartTooltip
cursor={false}
content={
<ChartTooltipContent unit=" GiB" labelFormatter={formatShortDate} indicator="line" />
<ChartTooltipContent
unit=" GiB"
labelFormatter={(_, data) => formatShortDate(data[0].payload.time)}
indicator="line"
/>
}
/>
<Area

View File

@@ -6,15 +6,21 @@ import {
ChartTooltip,
ChartTooltipContent,
} from '@/components/ui/chart'
import { formatShortDate, formatShortTime } from '@/lib/utils'
import { calculateXaxisTicks, formatShortDate, formatShortTime } from '@/lib/utils'
import { useMemo } from 'react'
import Spinner from '../spinner'
export default function ({
export default function MemChart({
chartData,
}: {
chartData: { time: string; mem: number; memUsed: number; memCache: number }[]
chartData: { time: number; mem: number; memUsed: number; memCache: number }[]
}) {
if (!chartData.length) {
return <Spinner />
}
const ticks = useMemo(() => calculateXaxisTicks(chartData), [chartData])
const totalMem = useMemo(() => {
return Math.ceil(chartData[0]?.mem)
}, [chartData])
@@ -33,10 +39,6 @@ export default function ({
[]
) satisfies ChartConfig
if (!chartData.length) {
return <Spinner />
}
return (
<ChartContainer config={chartConfig} className="h-full w-full absolute aspect-auto">
<AreaChart
@@ -59,6 +61,10 @@ export default function ({
{/* todo: short time if first date is same day, otherwise short date */}
<XAxis
dataKey="time"
domain={[ticks[0], ticks.at(-1)!]}
ticks={ticks}
type="number"
scale={'time'}
tickLine={true}
axisLine={false}
tickMargin={8}
@@ -66,13 +72,15 @@ export default function ({
tickFormatter={formatShortTime}
/>
<ChartTooltip
cursor={false}
// cursor={false}
animationEasing="ease-out"
animationDuration={150}
content={
<ChartTooltipContent
unit="GiB"
// @ts-ignore
itemSorter={(a, b) => a.name.localeCompare(b.name)}
labelFormatter={formatShortDate}
labelFormatter={(_, data) => formatShortDate(data[0].payload.time)}
indicator="line"
/>
}