import React, { useState, useMemo } from "react"; import { useSelector } from "react-redux"; import ReactApexChart from "react-apexcharts"; import { useAttendanceOverviewData } from "../../hooks/useDashboard_Data"; import flatColors from "../Charts/flatColor"; import ChartSkeleton from "../Charts/Skelton"; import { useSelectedProject } from "../../slices/apiDataManager"; import { formatDate_DayMonth } from "../../utils/dateUtils"; const AttendanceOverview = () => { const [dayRange, setDayRange] = useState(7); const [view, setView] = useState("chart"); const selectedProject = useSelectedProject(); const { data: attendanceOverviewData, isLoading, isError, error } = useAttendanceOverviewData( selectedProject, dayRange ); // Use empty array while loading const attendanceData = attendanceOverviewData || []; const { tableData, roles, dates } = useMemo(() => { if (!attendanceData || attendanceData.length === 0) { return { tableData: [], roles: [], dates: [] }; } const map = new Map(); attendanceData.forEach((entry) => { const date = formatDate_DayMonth(entry.date); if (!map.has(date)) map.set(date, {}); map.get(date)[entry.role.trim()] = entry.present; }); const uniqueRoles = [...new Set(attendanceData.map((e) => e.role.trim()))]; const sortedDates = [...map.keys()]; const tableData = sortedDates.map((date) => { const row = { date }; uniqueRoles.forEach((role) => { row[role] = map.get(date)?.[role] ?? 0; }); return row; }); return { tableData, roles: uniqueRoles, dates: sortedDates }; }, [attendanceData]); const chartSeries = roles.map((role) => ({ name: role, data: tableData.map((row) => row[role]), })); const chartOptions = { chart: { type: "bar", stacked: true, height: 400, toolbar: { show: false } }, plotOptions: { bar: { borderRadius: 2, columnWidth: "60%" } }, xaxis: { categories: tableData.map((row) => row.date) }, yaxis: { show: true, axisBorder: { show: true, color: "#78909C" }, axisTicks: { show: true, color: "#78909C", width: 6 } }, legend: { position: "bottom" }, fill: { opacity: 1 }, colors: roles.map((_, i) => flatColors[i % flatColors.length]), }; return (
{/* Optional subtle loading overlay */} {isLoading && (
Loading...
)} {/* Header */}
Attendance Overview

Role-wise present count

{/* Content */}
{view === "chart" ? (
) : (
{dates.map((date, idx) => ( ))} {roles.map((role) => ( {tableData.map((row, idx) => { const value = row[role]; return ; })} ))}
Role{date}
{role} 0 ? { backgroundColor: "#d5d5d5" } : {}}>{value}
)}
); }; export default AttendanceOverview;