import { useMemo, useState } from "react"; import Link from "next/link"; export default function AppealLpaStatusDashboard({ statusObj = [] }) { const [openAppeals, setOpenAppeals] = useState({}); const [openLpaSections, setOpenLpaSections] = useState({}); const [openAppealLpas, setOpenAppealLpas] = useState({}); const [openLpaAppeals, setOpenLpaAppeals] = useState({}); const percentageOf = (value, total) => total ? `${(((value || 0) / total) * 100).toFixed(1)}%` : "0.0%"; const totalCases = useMemo( () => statusObj.reduce((total, item) => total + (item.caseCount || 0), 0), [statusObj] ); const groupedAppeals = useMemo(() => { const grouped = statusObj.reduce((acc, item) => { const appealKey = item.appealType; if (!acc[appealKey]) { acc[appealKey] = { appealType: item.appealType, appealTypeName: item.appealTypeName, caseCount: 0, lpas: {} }; } acc[appealKey].caseCount += item.caseCount || 0; const lpaKey = item.lpaId || "unknown-lpa"; if (!acc[appealKey].lpas[lpaKey]) { acc[appealKey].lpas[lpaKey] = { lpaId: item.lpaId, lpaName: item.lpaName || "Unknown LPA", caseCount: 0, statuses: [] }; } acc[appealKey].lpas[lpaKey].caseCount += item.caseCount || 0; acc[appealKey].lpas[lpaKey].statuses.push({ statuscode: item.statuscode, status: item.status, caseCount: item.caseCount || 0 }); return acc; }, {}); return Object.values(grouped) .map((appeal) => ({ ...appeal, lpas: Object.values(appeal.lpas) .map((lpa) => ({ ...lpa, statuses: lpa.statuses.sort( (a, b) => (b.caseCount || 0) - (a.caseCount || 0) ) })) .sort((a, b) => (b.caseCount || 0) - (a.caseCount || 0)) })) .sort((a, b) => (b.caseCount || 0) - (a.caseCount || 0)); }, [statusObj]); const groupedLpas = useMemo(() => { const grouped = statusObj.reduce((acc, item) => { const lpaKey = item.lpaId || "unknown-lpa"; if (!acc[lpaKey]) { acc[lpaKey] = { lpaId: item.lpaId, lpaName: item.lpaName || "Unknown LPA", caseCount: 0, appeals: {} }; } acc[lpaKey].caseCount += item.caseCount || 0; const appealKey = item.appealType; if (!acc[lpaKey].appeals[appealKey]) { acc[lpaKey].appeals[appealKey] = { appealType: item.appealType, appealTypeName: item.appealTypeName, caseCount: 0, statuses: [] }; } acc[lpaKey].appeals[appealKey].caseCount += item.caseCount || 0; acc[lpaKey].appeals[appealKey].statuses.push({ statuscode: item.statuscode, status: item.status, caseCount: item.caseCount || 0 }); return acc; }, {}); return Object.values(grouped) .map((lpa) => ({ ...lpa, appeals: Object.values(lpa.appeals) .map((appeal) => ({ ...appeal, statuses: appeal.statuses.sort( (a, b) => (b.caseCount || 0) - (a.caseCount || 0) ) })) .sort((a, b) => (b.caseCount || 0) - (a.caseCount || 0)) })) .sort((a, b) => (b.caseCount || 0) - (a.caseCount || 0)); }, [statusObj]); const toggleAppeal = (appealType) => { setOpenAppeals((current) => ({ ...current, [appealType]: !current[appealType] })); }; const toggleLpaSection = (lpaId) => { setOpenLpaSections((current) => ({ ...current, [lpaId]: !current[lpaId] })); }; const toggleAppealLpa = (key) => { setOpenAppealLpas((current) => ({ ...current, [key]: !current[key] })); }; const toggleLpaAppeal = (key) => { setOpenLpaAppeals((current) => ({ ...current, [key]: !current[key] })); }; const sortedAppeals = useMemo( () => [...statusObj].sort((a, b) => (b.lpaId || 0) - (a.lpaId || 0)), [statusObj] ); const allStatuses = sortedAppeals.flatMap((appeal) => (appeal.statuses || []).map((status) => ({ ...status, lpaId: appeal.lpaId, lpaName: appeal.lpaName })) ); const statusTotals = allStatuses.reduce((acc, status) => { if (!acc[status.statuscode]) { acc[status.statuscode] = { value: status.value, statuscode: status.statuscode, caseCount: 0 }; } acc[status.statuscode].caseCount += status.caseCount || 0; return acc; }, {}); const largestAppeal = groupedLpas[0]; const mostCommonStatus = Object.values(groupedAppeals).sort( (a, b) => b.caseCount - a.caseCount )[0]; const maxAppealCount = largestAppeal?.caseCount || 1; const maxGroupedAppealCount = groupedAppeals[0]?.caseCount || 1; const allAppealsExpanded = groupedAppeals.length > 0 && groupedAppeals.every((appeal) => openAppeals[appeal.appealType]); const allLpasExpanded = groupedLpas.length > 0 && groupedLpas.every((lpa) => openLpaSections[lpa.lpaId]); const showAllAppeals = () => { const allOpen = {}; groupedAppeals.forEach((appeal) => { allOpen[appeal.appealType] = true; }); setOpenAppeals(allOpen); }; const showAllLpas = () => { const allOpen = {}; groupedLpas.forEach((lpa) => { allOpen[lpa.lpaId] = true; }); setOpenLpaSections(allOpen); }; const hideAllAppeals = () => { setOpenAppeals({}); setOpenAppealLpas({}); }; const hideAllLpas = () => { setOpenLpaSections({}); setOpenLpaAppeals({}); }; return (
Select an appeal type row to show the LPA and then case stage breakdown.
{title}
{value}
{caption && ({caption}
)}