refactor: make chart titles and descriptions dynamic via component props and update dashboard content labels

This commit is contained in:
Yoga Pangestu 2026-04-23 20:37:29 +07:00
parent d182401670
commit 50953e1c37
6 changed files with 86 additions and 32 deletions

View File

@ -28,12 +28,20 @@ const chartConfig = {
}, },
} satisfies ChartConfig } satisfies ChartConfig
export function AovTrendChart({ data }: { data: any[] }) { export function AovTrendChart({
data,
title = "Tren AOV",
description = "Rata-rata nilai belanja per pesanan pelanggan setiap bulannya."
}: {
data: any[],
title?: string,
description?: string
}) {
return ( return (
<Card> <Card>
<CardHeader> <CardHeader>
<CardTitle>Tren AOV</CardTitle> <CardTitle>{title}</CardTitle>
<CardDescription>Rata-rata nilai belanja per pesanan</CardDescription> <CardDescription>{description}</CardDescription>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<ChartContainer config={chartConfig} className="aspect-auto h-[300px] w-full"> <ChartContainer config={chartConfig} className="aspect-auto h-[300px] w-full">

View File

@ -30,12 +30,20 @@ const chartConfig = {
}, },
} satisfies ChartConfig } satisfies ChartConfig
export function RevenueVsProfitChart({ data }: { data: any[] }) { export function RevenueVsProfitChart({
data,
title = "Pendapatan vs Laba",
description = "Analisis pendapatan kotor dibandingkan dengan laba bersih."
}: {
data: any[],
title?: string,
description?: string
}) {
return ( return (
<Card> <Card>
<CardHeader> <CardHeader>
<CardTitle>Pendapatan vs Laba Bersih</CardTitle> <CardTitle>{title}</CardTitle>
<CardDescription>Perbandingan Pendapatan vs Laba Bersih per bulan.</CardDescription> <CardDescription>{description}</CardDescription>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<ChartContainer config={chartConfig} className="aspect-auto h-[300px] w-full"> <ChartContainer config={chartConfig} className="aspect-auto h-[300px] w-full">

View File

@ -32,12 +32,20 @@ const chartConfig = {
}, },
} satisfies ChartConfig } satisfies ChartConfig
export function RevenueVsPurchasesChart({ data }: { data: any[] }) { export function RevenueVsPurchasesChart({
data,
title = "Penjualan vs Belanja",
description = "Perbandingan total nilai penjualan dan belanja stok barang."
}: {
data: any[],
title?: string,
description?: string
}) {
return ( return (
<Card> <Card>
<CardHeader> <CardHeader>
<CardTitle>Penjualan vs Belanja</CardTitle> <CardTitle>{title}</CardTitle>
<CardDescription>Perbandingan total penjualan dan belanja per bulan</CardDescription> <CardDescription>{description}</CardDescription>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<ChartContainer config={chartConfig} className="aspect-auto h-[300px] w-full"> <ChartContainer config={chartConfig} className="aspect-auto h-[300px] w-full">

View File

@ -28,12 +28,20 @@ const chartConfig = {
}, },
} satisfies ChartConfig } satisfies ChartConfig
export function TransactionVolumeChart({ data }: { data: any[] }) { export function TransactionVolumeChart({
data,
title = "Volume Transaksi",
description = "Total jumlah pesanan yang diproses per bulan."
}: {
data: any[],
title?: string,
description?: string
}) {
return ( return (
<Card> <Card>
<CardHeader> <CardHeader>
<CardTitle>Volume Transaksi</CardTitle> <CardTitle>{title}</CardTitle>
<CardDescription>Total pesanan masuk per bulan</CardDescription> <CardDescription>{description}</CardDescription>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<ChartContainer config={chartConfig} className="aspect-auto h-[300px] w-full"> <ChartContainer config={chartConfig} className="aspect-auto h-[300px] w-full">

View File

@ -56,18 +56,36 @@ export default function Analisa() {
{/* Main Trends Grid */} {/* Main Trends Grid */}
<div className="grid grid-cols-1 gap-4 lg:grid-cols-2"> <div className="grid grid-cols-1 gap-4 lg:grid-cols-2">
<RevenueVsProfitChart data={revenueVsProfit} /> <RevenueVsProfitChart
<RevenueVsPurchasesChart data={salesByMonth} /> data={revenueVsProfit}
title="Pendapatan vs Laba"
description="Analisis pendapatan kotor dibandingkan dengan laba bersih."
/>
<RevenueVsPurchasesChart
data={salesByMonth}
title="Penjualan vs Belanja"
description="Perbandingan total nilai penjualan dan belanja stok barang."
/>
</div> </div>
{/* Activity & Volume Grid */} {/* Activity & Volume Grid */}
<div className="grid grid-cols-1 gap-4 lg:grid-cols-2"> <div className="grid grid-cols-1 gap-4 lg:grid-cols-2">
<TransactionVolumeChart data={transactionVolume} /> <TransactionVolumeChart
<AovTrendChart data={transactionVolume} /> data={transactionVolume}
title="Volume Transaksi"
description="Total jumlah pesanan yang diproses per bulan."
/>
<AovTrendChart
data={transactionVolume}
title="Tren AOV"
description="Rata-rata nilai belanja per pesanan pelanggan setiap bulannya."
/>
</div> </div>
<SalesByHourChart <SalesByHourChart
data={salesByHour} data={salesByHour}
title="Jam Sibuk"
description="Grafik aktivitas transaksi berdasarkan waktu (jam) dalam sehari."
config={{ config={{
total: { total: {
label: "Total Penjualan", label: "Total Penjualan",
@ -79,25 +97,25 @@ export default function Analisa() {
<div className="grid grid-cols-1 gap-4 lg:grid-cols-2 @4xl/main:grid-cols-4"> <div className="grid grid-cols-1 gap-4 lg:grid-cols-2 @4xl/main:grid-cols-4">
<CustomPieChart <CustomPieChart
title="Metode Pembayaran" title="Metode Pembayaran"
description="Distribusi pesanan berdasarkan metode pembayaran." description="Distribusi transaksi berdasarkan metode pembayaran yang digunakan."
data={paymentMethods} data={paymentMethods}
colorOffset={0} colorOffset={0}
/> />
<CustomPieChart <CustomPieChart
title="Status Pesanan" title="Status Pesanan"
description="Distribusi pesanan berdasarkan status." description="Status terkini dari seluruh pesanan yang masuk."
data={orderStatuses} data={orderStatuses}
colorOffset={120} colorOffset={120}
/> />
<CustomPieChart <CustomPieChart
title="Channel Pesanan" title="Channel Pesanan"
description="Distribusi pesanan berdasarkan channel/platform." description="Sumber pesanan berdasarkan platform atau saluran penjualan."
data={orderChannels} data={orderChannels}
colorOffset={240} colorOffset={240}
/> />
<CustomPieChart <CustomPieChart
title="Top 5 Kategori" title="Top 5 Kategori"
description="Distribusi penjualan berdasarkan kategori produk." description="Kategori produk yang paling banyak menyumbang penjualan."
data={topCategories} data={topCategories}
colorOffset={60} colorOffset={60}
/> />
@ -105,14 +123,14 @@ export default function Analisa() {
<div className="grid grid-cols-1 gap-4 lg:grid-cols-2"> <div className="grid grid-cols-1 gap-4 lg:grid-cols-2">
<CustomBarChart <CustomBarChart
title="Top 5 Produk Terlaris" title="Top 5 Produk"
description="Berdasarkan jumlah produk yang terjual." description="Daftar produk dengan volume penjualan tertinggi."
data={topProducts} data={topProducts}
colorOffset={45} colorOffset={45}
/> />
<CustomBarChart <CustomBarChart
title="Top 5 Pelanggan Setia" title="Top 5 Pelanggan"
description="Berdasarkan total nominal belanja." description="Pelanggan dengan total nominal belanja tertinggi (setia)."
data={topCustomers} data={topCustomers}
colorOffset={180} colorOffset={180}
isCurrency={true} isCurrency={true}

View File

@ -110,24 +110,28 @@ return {
))} ))}
</div> </div>
<SalesByHourChart data={salesByHour} /> <SalesByHourChart
title="Jam Sibuk"
description="Grafik aktivitas transaksi berdasarkan waktu (jam) dalam sehari."
data={salesByHour}
/>
<div className="grid grid-cols-1 gap-4 lg:grid-cols-3"> <div className="grid grid-cols-1 gap-4 lg:grid-cols-3">
<CustomPieChart <CustomPieChart
title="Metode Pembayaran" title="Metode Pembayaran"
description="Distribusi pesanan berdasarkan metode pembayaran." description="Distribusi transaksi berdasarkan metode pembayaran yang digunakan."
data={paymentMethods} data={paymentMethods}
colorOffset={0} colorOffset={0}
/> />
<CustomPieChart <CustomPieChart
title="Status Pesanan" title="Status Pesanan"
description="Distribusi pesanan berdasarkan status." description="Status terkini dari seluruh pesanan yang masuk."
data={orderStatuses} data={orderStatuses}
colorOffset={120} colorOffset={120}
/> />
<CustomPieChart <CustomPieChart
title="Channel Pesanan" title="Channel Pesanan"
description="Distribusi pesanan berdasarkan channel/platform." description="Sumber pesanan berdasarkan platform atau saluran penjualan."
data={orderChannels} data={orderChannels}
colorOffset={240} colorOffset={240}
/> />
@ -135,14 +139,14 @@ return {
<div className="grid grid-cols-1 gap-4 lg:grid-cols-2"> <div className="grid grid-cols-1 gap-4 lg:grid-cols-2">
<CustomBarChart <CustomBarChart
title="Top 5 Produk Terlaris" title="Top 5 Produk"
description="Berdasarkan jumlah produk yang terjual." description="Daftar produk dengan volume penjualan tertinggi."
data={topProducts} data={topProducts}
colorOffset={45} colorOffset={45}
/> />
<CustomBarChart <CustomBarChart
title="Top 5 Pelanggan Setia" title="Top 5 Pelanggan"
description="Berdasarkan total nominal belanja." description="Pelanggan dengan total nominal belanja tertinggi (setia)."
data={topCustomers} data={topCustomers}
colorOffset={180} colorOffset={180}
isCurrency={true} isCurrency={true}