From 6a00b9207e905d14841018de85bce80eb5e349e4 Mon Sep 17 00:00:00 2001 From: "fredy.siswanto" Date: Wed, 26 Feb 2025 00:35:53 +0700 Subject: [PATCH] feat: add bar and subscription chart components, update dashboard integration --- app/components/ui/chart.tsx | 167 +++++++++++++++++++++++++++++++++- app/pages/dashboard/index.tsx | 34 ++++--- 2 files changed, 187 insertions(+), 14 deletions(-) diff --git a/app/components/ui/chart.tsx b/app/components/ui/chart.tsx index ed1074a..c003539 100644 --- a/app/components/ui/chart.tsx +++ b/app/components/ui/chart.tsx @@ -3,12 +3,29 @@ import { ArcElement, Tooltip, Legend, + CategoryScale, + LinearScale, + BarElement, + Title, type ChartOptions, + type ChartEvent, + type ActiveElement, } from 'chart.js' -import { Pie } from 'react-chartjs-2' -ChartJS.register(ArcElement, Tooltip, Legend) +import { useState } from 'react' +import { Bar, Doughnut, Pie } from 'react-chartjs-2' +ChartJS.register( + ArcElement, + CategoryScale, + LinearScale, + BarElement, + Title, + Tooltip, + Legend, +) -export const ChartPie = () => { +type HandleChartClick = (event: ChartEvent, elements: ActiveElement[]) => void + +export const UiChartPie = () => { const data = { labels: [ 'Pidana', @@ -64,3 +81,147 @@ export const ChartPie = () => { ) } + +export const UiChartBar = () => { + const yearlyData = { + labels: ['2022', '2023', '2024'], + datasets: [ + { + label: 'Total Sales', + data: [800, 950, 1200], + backgroundColor: '#1E3A8A', + }, + ], + } + + const monthlyData = { + labels: [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec', + ], + datasets: [ + { + label: 'Monthly Sales', + data: [70, 90, 750, 80, 90, 95, 75, 85, 78, 88, 95, 0], + backgroundColor: '#2E2F7C', + }, + ], + } + + const [view, setView] = useState('month') // Default tampil bulanan + const [selectedYear, setSelectedYear] = useState('') + + const handleChartClick: HandleChartClick = (event, elements) => { + if (elements.length > 0 && view === 'year') { + const clickedIndex = elements[0].index + const year = yearlyData.labels[clickedIndex] + setSelectedYear(year) + setView('month') + } + } + + const handleBackToYear = () => { + setView('year') + setSelectedYear('') + } + + const options = { + responsive: true, + maintainAspectRatio: false, + onClick: handleChartClick, + scales: { + y: { + beginAtZero: true, + max: selectedYear ? 100 : 1500, + ticks: { + stepSize: 25, + }, + }, + }, + } + + return ( +
+
+

+ {view === 'year' + ? 'Penjualan Tahunan' + : `Penjualan Bulanan ${selectedYear || '2024'}`} +

+ {view === 'month' && ( + + )} +
+ +
+ +
+
+ ) +} + +export const ChartSubscription = () => { + const data = { + labels: ['Selesai', 'Belum Selesai'], + datasets: [ + { + data: [70, 30], + backgroundColor: ['#1e3a8a', '#e5e7eb'], + borderWidth: 0, + cutout: '70%', + circumference: 180, + rotation: 270, + }, + ], + } + + const options: ChartOptions<'doughnut'> = { + responsive: true, + maintainAspectRatio: false, + plugins: { + legend: { + position: 'right', + labels: { + usePointStyle: true, + pointStyle: 'circle', + boxWidth: 10, + }, + }, + tooltip: { + enabled: false, + }, + }, + } + + return ( +
+

Subscription Selesai

+
+
+ +
+
+
+ ) +} diff --git a/app/pages/dashboard/index.tsx b/app/pages/dashboard/index.tsx index 72edebc..e16feb6 100644 --- a/app/pages/dashboard/index.tsx +++ b/app/pages/dashboard/index.tsx @@ -1,10 +1,28 @@ import { CardReport } from '~/components/ui/card-report' -import { ChartPie } from '~/components/ui/chart' +import { + ChartSubscription, + UiChartBar, + UiChartPie, +} from '~/components/ui/chart' import { HISTORY, REPORT } from './data' export const DashboardPage = () => { return (
+
+

Dashboard

+
+ Tanggal: + + +
+
{REPORT.map(({ title, amount, icon }, index) => ( { /> ))}
- +
-
+
- +
- +