diff --git a/config-overrides.js b/config-overrides.js index afa2c65e4a..5642ee368a 100644 --- a/config-overrides.js +++ b/config-overrides.js @@ -1,3 +1,4 @@ +// eslint-disable-next-line import/no-extraneous-dependencies const webpack = require('webpack'); module.exports = function override(config) { diff --git a/src/components/ApplicantsChart/AgeChart.jsx b/src/components/ApplicantsChart/AgeChart.jsx index 90df74219b..999e89df77 100644 --- a/src/components/ApplicantsChart/AgeChart.jsx +++ b/src/components/ApplicantsChart/AgeChart.jsx @@ -8,77 +8,187 @@ import { ResponsiveContainer, LabelList, } from 'recharts'; -import { useSelector } from 'react-redux'; -import styles from './ApplicationChart.module.css'; +import styles from './ApplicantsChart.module.css'; -function AgeChart({ data, compareLabel }) { - const darkMode = useSelector(state => state.theme.darkMode); - const axisColor = darkMode ? '#f3f4f6' : '#111827'; - const axisLineColor = darkMode ? '#d1d5db' : '#374151'; - const gridColor = darkMode ? '#9ca3af' : '#d1d5db'; - const tickFontSize = 14; +function AgeChart({ data, compareLabel, darkMode }) { + // Guard against invalid data + if (!data || !Array.isArray(data) || data.length === 0) { + return null; + } - const formatTooltip = (value, name, props) => { - const { change } = props.payload; - if (compareLabel && change !== undefined) { - let changeText = ''; + // Validate data structure + const validData = data.filter( + item => item && item.ageGroup && typeof item.applicants === 'number' && !isNaN(item.applicants), + ); + + if (validData.length === 0) { + return null; + } + + // Custom tooltip content component + const CustomTooltip = ({ active, payload, label }) => { + if (!active || !payload || !payload.length) { + return null; + } + + const dataPoint = payload[0]; + if (!dataPoint) { + return null; + } + + // Try multiple ways to access the data - Recharts passes data in payload[0].payload + const payloadData = dataPoint.payload || {}; + // Also check if label is passed directly (from XAxis) + const ageGroup = label || payloadData.ageGroup || dataPoint.name || ''; + const applicants = + dataPoint.value !== undefined && dataPoint.value !== null + ? dataPoint.value + : payloadData.applicants !== undefined + ? payloadData.applicants + : 0; + const change = payloadData.change; + + // Debug: log to see what we're getting (remove in production) + // console.log('Tooltip data:', { active, payload, label, dataPoint, payloadData, ageGroup, applicants, change }); + + let changeText = ''; + if (compareLabel && change !== undefined && change !== null) { if (change > 0) { - changeText = `${change}% more than ${compareLabel}`; + changeText = `(${change}% more than ${compareLabel})`; } else if (change < 0) { - changeText = `${Math.abs(change)}% less than ${compareLabel}`; + changeText = `(${Math.abs(change)}% less than ${compareLabel})`; } else { - changeText = `No change from ${compareLabel}`; + changeText = `(No change from ${compareLabel})`; } - return [`${value} (${changeText})`, 'Applicants']; } - return [`${value}`, 'Applicants']; + + // Ensure we always render content, even if some values are missing + const displayAgeGroup = ageGroup || 'N/A'; + const displayApplicants = applicants !== undefined && applicants !== null ? applicants : 0; + + return ( +
+ Loading... +
+ {isValidationError + ? error + : error + ? 'Unable to load chart data.' + : 'No data available to display.'} +
Loading...