mirror of
https://github.com/fankes/beszel.git
synced 2025-10-20 02:09:28 +08:00
use one x axis component for all charts
This commit is contained in:
@@ -1,9 +1,8 @@
|
|||||||
import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from 'recharts'
|
import { Area, AreaChart, CartesianGrid, YAxis } from 'recharts'
|
||||||
|
|
||||||
import { ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart'
|
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from '@/components/ui/chart'
|
||||||
import {
|
import {
|
||||||
useYAxisWidth,
|
useYAxisWidth,
|
||||||
chartTimeData,
|
|
||||||
cn,
|
cn,
|
||||||
formatShortDate,
|
formatShortDate,
|
||||||
toFixedWithoutTrailingZeros,
|
toFixedWithoutTrailingZeros,
|
||||||
@@ -88,18 +87,7 @@ export default memo(function AreaChartDefault({
|
|||||||
tickLine={false}
|
tickLine={false}
|
||||||
axisLine={false}
|
axisLine={false}
|
||||||
/>
|
/>
|
||||||
<XAxis
|
{xAxis(chartData)}
|
||||||
dataKey="created"
|
|
||||||
domain={chartData.domain}
|
|
||||||
ticks={chartData.ticks}
|
|
||||||
allowDataOverflow
|
|
||||||
type="number"
|
|
||||||
scale="time"
|
|
||||||
minTickGap={30}
|
|
||||||
tickMargin={8}
|
|
||||||
axisLine={false}
|
|
||||||
tickFormatter={chartTimeData[chartTime].format}
|
|
||||||
/>
|
|
||||||
<ChartTooltip
|
<ChartTooltip
|
||||||
animationEasing="ease-out"
|
animationEasing="ease-out"
|
||||||
animationDuration={150}
|
animationDuration={150}
|
||||||
|
@@ -1,14 +1,14 @@
|
|||||||
import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from 'recharts'
|
import { Area, AreaChart, CartesianGrid, YAxis } from 'recharts'
|
||||||
import {
|
import {
|
||||||
ChartConfig,
|
ChartConfig,
|
||||||
ChartContainer,
|
ChartContainer,
|
||||||
ChartTooltip,
|
ChartTooltip,
|
||||||
ChartTooltipContent,
|
ChartTooltipContent,
|
||||||
|
xAxis,
|
||||||
} from '@/components/ui/chart'
|
} from '@/components/ui/chart'
|
||||||
import { memo, useMemo } from 'react'
|
import { memo, useMemo } from 'react'
|
||||||
import {
|
import {
|
||||||
useYAxisWidth,
|
useYAxisWidth,
|
||||||
chartTimeData,
|
|
||||||
cn,
|
cn,
|
||||||
formatShortDate,
|
formatShortDate,
|
||||||
decimalString,
|
decimalString,
|
||||||
@@ -37,7 +37,7 @@ export default memo(function ContainerChart({
|
|||||||
const filter = useStore($containerFilter)
|
const filter = useStore($containerFilter)
|
||||||
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
||||||
|
|
||||||
const { containerData, ticks, domain, chartTime } = chartData
|
const { containerData } = chartData
|
||||||
|
|
||||||
const isNetChart = chartName === 'net'
|
const isNetChart = chartName === 'net'
|
||||||
|
|
||||||
@@ -153,18 +153,7 @@ export default memo(function ContainerChart({
|
|||||||
tickLine={false}
|
tickLine={false}
|
||||||
axisLine={false}
|
axisLine={false}
|
||||||
/>
|
/>
|
||||||
<XAxis
|
{xAxis(chartData)}
|
||||||
dataKey="created"
|
|
||||||
domain={domain}
|
|
||||||
allowDataOverflow
|
|
||||||
ticks={ticks}
|
|
||||||
type="number"
|
|
||||||
scale="time"
|
|
||||||
minTickGap={35}
|
|
||||||
tickMargin={8}
|
|
||||||
axisLine={false}
|
|
||||||
tickFormatter={chartTimeData[chartTime].format}
|
|
||||||
/>
|
|
||||||
<ChartTooltip
|
<ChartTooltip
|
||||||
animationEasing="ease-out"
|
animationEasing="ease-out"
|
||||||
animationDuration={150}
|
animationDuration={150}
|
||||||
|
@@ -1,9 +1,8 @@
|
|||||||
import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from 'recharts'
|
import { Area, AreaChart, CartesianGrid, YAxis } from 'recharts'
|
||||||
|
|
||||||
import { ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart'
|
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from '@/components/ui/chart'
|
||||||
import {
|
import {
|
||||||
useYAxisWidth,
|
useYAxisWidth,
|
||||||
chartTimeData,
|
|
||||||
cn,
|
cn,
|
||||||
formatShortDate,
|
formatShortDate,
|
||||||
decimalString,
|
decimalString,
|
||||||
@@ -25,8 +24,6 @@ export default memo(function DiskChart({
|
|||||||
}) {
|
}) {
|
||||||
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
||||||
|
|
||||||
// console.log('rendered at', new Date())
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<ChartContainer
|
<ChartContainer
|
||||||
@@ -49,18 +46,7 @@ export default memo(function DiskChart({
|
|||||||
return updateYAxisWidth(toFixedFloat(v, 2) + u)
|
return updateYAxisWidth(toFixedFloat(v, 2) + u)
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<XAxis
|
{xAxis(chartData)}
|
||||||
dataKey="created"
|
|
||||||
domain={chartData.domain}
|
|
||||||
ticks={chartData.ticks}
|
|
||||||
allowDataOverflow
|
|
||||||
type="number"
|
|
||||||
scale="time"
|
|
||||||
minTickGap={30}
|
|
||||||
tickMargin={8}
|
|
||||||
axisLine={false}
|
|
||||||
tickFormatter={chartTimeData[chartData.chartTime].format}
|
|
||||||
/>
|
|
||||||
<ChartTooltip
|
<ChartTooltip
|
||||||
animationEasing="ease-out"
|
animationEasing="ease-out"
|
||||||
animationDuration={150}
|
animationDuration={150}
|
||||||
|
@@ -1,9 +1,8 @@
|
|||||||
import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from 'recharts'
|
import { Area, AreaChart, CartesianGrid, YAxis } from 'recharts'
|
||||||
|
|
||||||
import { ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart'
|
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from '@/components/ui/chart'
|
||||||
import {
|
import {
|
||||||
useYAxisWidth,
|
useYAxisWidth,
|
||||||
chartTimeData,
|
|
||||||
cn,
|
cn,
|
||||||
toFixedFloat,
|
toFixedFloat,
|
||||||
decimalString,
|
decimalString,
|
||||||
@@ -45,18 +44,7 @@ export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<XAxis
|
{xAxis(chartData)}
|
||||||
dataKey="created"
|
|
||||||
domain={chartData.domain}
|
|
||||||
ticks={chartData.ticks}
|
|
||||||
allowDataOverflow
|
|
||||||
type="number"
|
|
||||||
scale="time"
|
|
||||||
minTickGap={30}
|
|
||||||
tickMargin={8}
|
|
||||||
axisLine={false}
|
|
||||||
tickFormatter={chartTimeData[chartData.chartTime].format}
|
|
||||||
/>
|
|
||||||
<ChartTooltip
|
<ChartTooltip
|
||||||
// cursor={false}
|
// cursor={false}
|
||||||
animationEasing="ease-out"
|
animationEasing="ease-out"
|
||||||
|
@@ -1,9 +1,8 @@
|
|||||||
import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from 'recharts'
|
import { Area, AreaChart, CartesianGrid, YAxis } from 'recharts'
|
||||||
|
|
||||||
import { ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart'
|
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from '@/components/ui/chart'
|
||||||
import {
|
import {
|
||||||
useYAxisWidth,
|
useYAxisWidth,
|
||||||
chartTimeData,
|
|
||||||
cn,
|
cn,
|
||||||
formatShortDate,
|
formatShortDate,
|
||||||
toFixedWithoutTrailingZeros,
|
toFixedWithoutTrailingZeros,
|
||||||
@@ -36,18 +35,7 @@ export default memo(function SwapChart({ chartData }: { chartData: ChartData })
|
|||||||
axisLine={false}
|
axisLine={false}
|
||||||
tickFormatter={(value) => updateYAxisWidth(value + ' GB')}
|
tickFormatter={(value) => updateYAxisWidth(value + ' GB')}
|
||||||
/>
|
/>
|
||||||
<XAxis
|
{xAxis(chartData)}
|
||||||
dataKey="created"
|
|
||||||
domain={chartData.domain}
|
|
||||||
ticks={chartData.ticks}
|
|
||||||
allowDataOverflow
|
|
||||||
type="number"
|
|
||||||
scale="time"
|
|
||||||
minTickGap={30}
|
|
||||||
tickMargin={8}
|
|
||||||
axisLine={false}
|
|
||||||
tickFormatter={chartTimeData[chartData.chartTime].format}
|
|
||||||
/>
|
|
||||||
<ChartTooltip
|
<ChartTooltip
|
||||||
animationEasing="ease-out"
|
animationEasing="ease-out"
|
||||||
animationDuration={150}
|
animationDuration={150}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { CartesianGrid, Line, LineChart, XAxis, YAxis } from 'recharts'
|
import { CartesianGrid, Line, LineChart, YAxis } from 'recharts'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
ChartContainer,
|
ChartContainer,
|
||||||
@@ -6,10 +6,10 @@ import {
|
|||||||
ChartLegendContent,
|
ChartLegendContent,
|
||||||
ChartTooltip,
|
ChartTooltip,
|
||||||
ChartTooltipContent,
|
ChartTooltipContent,
|
||||||
|
xAxis,
|
||||||
} from '@/components/ui/chart'
|
} from '@/components/ui/chart'
|
||||||
import {
|
import {
|
||||||
useYAxisWidth,
|
useYAxisWidth,
|
||||||
chartTimeData,
|
|
||||||
cn,
|
cn,
|
||||||
formatShortDate,
|
formatShortDate,
|
||||||
toFixedWithoutTrailingZeros,
|
toFixedWithoutTrailingZeros,
|
||||||
@@ -70,18 +70,7 @@ export default memo(function TemperatureChart({ chartData }: { chartData: ChartD
|
|||||||
tickLine={false}
|
tickLine={false}
|
||||||
axisLine={false}
|
axisLine={false}
|
||||||
/>
|
/>
|
||||||
<XAxis
|
{xAxis(chartData)}
|
||||||
dataKey="created"
|
|
||||||
domain={chartData.domain}
|
|
||||||
ticks={chartData.ticks}
|
|
||||||
allowDataOverflow
|
|
||||||
type="number"
|
|
||||||
scale="time"
|
|
||||||
minTickGap={30}
|
|
||||||
tickMargin={8}
|
|
||||||
axisLine={false}
|
|
||||||
tickFormatter={chartTimeData[chartData.chartTime].format}
|
|
||||||
/>
|
|
||||||
<ChartTooltip
|
<ChartTooltip
|
||||||
animationEasing="ease-out"
|
animationEasing="ease-out"
|
||||||
animationDuration={150}
|
animationDuration={150}
|
||||||
|
@@ -612,7 +612,7 @@ function ChartCard({
|
|||||||
</CardHeader>
|
</CardHeader>
|
||||||
<div className="pl-0 w-[calc(100%-1.6em)] h-52 relative">
|
<div className="pl-0 w-[calc(100%-1.6em)] h-52 relative">
|
||||||
{<Spinner />}
|
{<Spinner />}
|
||||||
{isIntersecting && <Suspense>{children}</Suspense>}
|
{isIntersecting && children}
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
)
|
)
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
import * as RechartsPrimitive from 'recharts'
|
import * as RechartsPrimitive from 'recharts'
|
||||||
|
|
||||||
import { cn } from '@/lib/utils'
|
import { chartTimeData, cn } from '@/lib/utils'
|
||||||
|
import { ChartData } from '@/types'
|
||||||
|
|
||||||
// Format: { THEME_NAME: CSS_SELECTOR }
|
// Format: { THEME_NAME: CSS_SELECTOR }
|
||||||
const THEMES = { light: '', dark: '.dark' } as const
|
const THEMES = { light: '', dark: '.dark' } as const
|
||||||
@@ -331,11 +332,34 @@ function getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key:
|
|||||||
return configLabelKey in config ? config[configLabelKey] : config[key as keyof typeof config]
|
return configLabelKey in config ? config[configLabelKey] : config[key as keyof typeof config]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let cachedAxis: JSX.Element
|
||||||
|
const xAxis = function ({ domain, ticks, chartTime }: ChartData) {
|
||||||
|
if (cachedAxis && domain[0] === cachedAxis.props.domain[0]) {
|
||||||
|
return cachedAxis
|
||||||
|
}
|
||||||
|
cachedAxis = (
|
||||||
|
<RechartsPrimitive.XAxis
|
||||||
|
dataKey="created"
|
||||||
|
domain={domain}
|
||||||
|
ticks={ticks}
|
||||||
|
allowDataOverflow
|
||||||
|
type="number"
|
||||||
|
scale="time"
|
||||||
|
minTickGap={15}
|
||||||
|
tickMargin={8}
|
||||||
|
axisLine={false}
|
||||||
|
tickFormatter={chartTimeData[chartTime].format}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
return cachedAxis
|
||||||
|
}
|
||||||
|
|
||||||
export {
|
export {
|
||||||
ChartContainer,
|
ChartContainer,
|
||||||
ChartTooltip,
|
ChartTooltip,
|
||||||
ChartTooltipContent,
|
ChartTooltipContent,
|
||||||
ChartLegend,
|
ChartLegend,
|
||||||
ChartLegendContent,
|
ChartLegendContent,
|
||||||
|
xAxis,
|
||||||
// ChartStyle,
|
// ChartStyle,
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user