From 0d2d0d242c4234b3a72238874801f129e1b07787 Mon Sep 17 00:00:00 2001 From: Hollujay <165713167+Hollujay@users.noreply.github.com> Date: Wed, 22 Jul 2026 12:44:45 +0000 Subject: [PATCH] Add chart empty state (#212) --- src/components/Chart.jsx | 21 +++++++++++++++++- src/components/Chart.stories.jsx | 38 ++++++++++++++++++++++++++++++++ test/components/Chart.test.jsx | 33 ++++++++++++++++++++++++++- 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 src/components/Chart.stories.jsx diff --git a/src/components/Chart.jsx b/src/components/Chart.jsx index 1a31c44..db82831 100644 --- a/src/components/Chart.jsx +++ b/src/components/Chart.jsx @@ -1,8 +1,15 @@ import React, { useRef } from 'react'; import './Chart.css'; import Button from './Button.jsx'; +import EmptyState from './EmptyState.jsx'; -export default function Chart({ data, title }) { +export default function Chart({ + data, + title, + emptyStateIcon = '📊', + emptyStateTitle = 'No chart data', + emptyStateMessage = 'Add some data to visualize.' +}) { const chartRef = useRef(null); const downloadChart = () => { @@ -20,6 +27,18 @@ export default function Chart({ data, title }) { URL.revokeObjectURL(url); }; + if (!data || data.length === 0) { + return ( +
+ +
+ ); + } + const maxValue = Math.max(...data.map(d => d.value), 1); return ( diff --git a/src/components/Chart.stories.jsx b/src/components/Chart.stories.jsx new file mode 100644 index 0000000..d90e975 --- /dev/null +++ b/src/components/Chart.stories.jsx @@ -0,0 +1,38 @@ +import Chart from './Chart.jsx' + +export default { + title: 'Components/Chart', + component: Chart, + tags: ['autodocs'], + argTypes: { + data: { control: 'object' }, + title: { control: 'text' }, + emptyStateIcon: { control: 'text' }, + emptyStateTitle: { control: 'text' }, + emptyStateMessage: { control: 'text' } + } +} + +export const Default = { + args: { + data: [{ value: 10 }, { value: 20 }, { value: 15 }, { value: 30 }], + title: 'Monthly Transfers' + } +} + +export const Empty = { + args: { + data: [], + title: 'Monthly Transfers' + } +} + +export const CustomEmptyState = { + args: { + data: [], + title: 'Monthly Transfers', + emptyStateIcon: '💸', + emptyStateTitle: 'No transfers yet', + emptyStateMessage: 'Your first transfer will appear here.' + } +} diff --git a/test/components/Chart.test.jsx b/test/components/Chart.test.jsx index e0dfbec..71f71f2 100644 --- a/test/components/Chart.test.jsx +++ b/test/components/Chart.test.jsx @@ -3,9 +3,40 @@ import { describe, expect, it } from 'vitest' import Chart from '../../src/components/Chart.jsx' describe('Chart component', () => { - it('renders correctly', () => { + it('renders correctly with data', () => { const data = [{ value: 10 }, { value: 20 }] render() expect(screen.getByText('Test Chart')).toBeInTheDocument() }) + + it('shows empty state when data is an empty array', () => { + render() + expect(screen.getByText('No chart data')).toBeInTheDocument() + expect(screen.getByText('Add some data to visualize.')).toBeInTheDocument() + expect(screen.queryByText('Download SVG')).not.toBeInTheDocument() + }) + + it('shows empty state when data is null', () => { + render() + expect(screen.getByText('No chart data')).toBeInTheDocument() + }) + + it('shows empty state when data is undefined', () => { + render() + expect(screen.getByText('No chart data')).toBeInTheDocument() + }) + + it('uses custom empty state props when provided', () => { + render( + + ) + expect(screen.getByText('Nothing to show')).toBeInTheDocument() + expect(screen.getByText('Please add some data.')).toBeInTheDocument() + }) })