Add app command/search (#622)

This commit is contained in:
Saeed Vaziry
2025-06-22 22:58:05 +02:00
committed by GitHub
parent 5689e751af
commit dc7fa6b55c
12 changed files with 287 additions and 87 deletions

View File

@ -1,12 +1,11 @@
import * as React from 'react';
import { Area, AreaChart, XAxis, YAxis } from 'recharts';
import { Area, AreaChart, XAxis } from 'recharts';
import { Card, CardContent } from '@/components/ui/card';
import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart';
import { Metric } from '@/types/metric';
import { Button } from '@/components/ui/button';
import { router } from '@inertiajs/react';
import { cn } from '@/lib/utils';
import { Formatter } from 'recharts/types/component/DefaultTooltipContent';
interface Props {
title: string;
@ -14,12 +13,10 @@ interface Props {
dataKey: 'load' | 'memory_used' | 'disk_used';
label: string;
chartData: Metric[];
link: string;
formatter?: (value: unknown, name: unknown) => string | number;
single?: boolean;
formatter?: Formatter<number | string, string>;
}
export function ResourceUsageChart({ title, color, dataKey, label, chartData, link, formatter, single }: Props) {
export function ResourceUsageChart({ title, color, dataKey, label, chartData, formatter }: Props) {
const chartConfig = {
[dataKey]: {
label: label,
@ -27,37 +24,37 @@ export function ResourceUsageChart({ title, color, dataKey, label, chartData, li
},
} satisfies ChartConfig;
const getCurrentValue = () => {
if (chartData.length === 0) return 'N/A';
const value = chartData[chartData.length - 1][dataKey];
if (formatter) {
return formatter(value, dataKey);
}
return typeof value === 'number' ? value.toLocaleString() : String(value);
};
return (
<Card>
<CardContent className="overflow-hidden p-0">
<div className="flex items-start justify-between p-4">
<div className="space-y-2 py-[7px]">
<h2 className="text-muted-foreground text-sm">{title}</h2>
<span className="text-3xl font-bold">
{chartData.length > 0
? formatter
? formatter(chartData[chartData.length - 1][dataKey], dataKey)
: chartData[chartData.length - 1][dataKey].toLocaleString()
: 'N/A'}
</span>
<span className="text-3xl font-bold">{getCurrentValue()}</span>
</div>
{!single && (
<Button variant="ghost" onClick={() => router.visit(link)}>
View
</Button>
)}
<Button variant="ghost">View</Button>
</div>
<ChartContainer config={chartConfig} className={cn('aspect-auto w-full overflow-hidden rounded-b-xl', single ? 'h-[400px]' : 'h-[100px]')}>
<AreaChart accessibilityLayer data={chartData} margin={{ left: 0, right: 0, top: 0, bottom: 0 }}>
<ChartContainer config={chartConfig} className="aspect-auto h-[100px] w-full overflow-hidden rounded-b-xl">
<AreaChart data={chartData} margin={{ left: 0, right: 0, top: 0, bottom: 0 }}>
<defs>
<linearGradient id={`fill-${dataKey}`} x1="0" y1="0" x2="0" y2="1">
<stop offset="5%" stopColor={color} stopOpacity={0.8} />
<stop offset="95%" stopColor={color} stopOpacity={0.1} />
</linearGradient>
</defs>
<YAxis dataKey={dataKey} hide />
<XAxis
hide={!single}
hide
dataKey="date"
tickLine={false}
axisLine={false}
@ -74,7 +71,7 @@ export function ResourceUsageChart({ title, color, dataKey, label, chartData, li
}}
/>
<ChartTooltip
cursor={true}
cursor={false}
content={
<ChartTooltipContent
labelFormatter={(value) => {
@ -90,7 +87,7 @@ export function ResourceUsageChart({ title, color, dataKey, label, chartData, li
/>
}
/>
<Area dataKey={dataKey} type="monotone" fill={`url(#fill-${dataKey})`} stroke={color} />
<Area dataKey={dataKey} type="natural" fill={`url(#fill-${dataKey})`} stroke={color} />
</AreaChart>
</ChartContainer>
</CardContent>