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 { SpinnerLoader } from "../common/Loader"; const formatDate = (dateStr) => { const date = new Date(dateStr); return date.toLocaleDateString("en-GB", { day: "2-digit", month: "long", }); }; const AttendanceOverview = () => { const [dayRange, setDayRange] = useState(7); const [view, setView] = useState("chart"); const projectId = useSelector((store) => store.localVariables.projectId); const { attendanceOverviewData, loading, error } = useAttendanceOverviewData( projectId, dayRange ); const { tableData, roles, dates } = useMemo(() => { const map = new Map(); attendanceOverviewData.forEach((entry) => { const date = formatDate(entry.date); if (!map.has(date)) map.set(date, {}); map.get(date)[entry.role.trim()] = entry.present; }); const uniqueRoles = [ ...new Set(attendanceOverviewData.map((e) => e.role.trim())), ]; const sortedDates = [...map.keys()]; const data = sortedDates.map((date) => { const row = { date }; uniqueRoles.forEach((role) => { row[role] = map.get(date)?.[role] ?? 0; }); return row; }); return { tableData: data, roles: uniqueRoles, dates: sortedDates, }; }, [attendanceOverviewData]); 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", offsetX: 0, offsetY: 0, }, axisTicks: { show: true, borderType: "solid", color: "#78909C", width: 6, offsetX: 0, offsetY: 0, }, }, legend: { position: "bottom", }, fill: { opacity: 1, }, colors: roles.map((_, i) => flatColors[i % flatColors.length]), }; return (
{/* Header */}
Attendance Overview

Role-wise present count

{/* Content */}
{loading ? ( ) : error ? (

{error}

) : attendanceOverviewData.length === 0 || attendanceOverviewData.every((item) => item.present === 0) ? (
No data found
) : view === "chart" ? (
) : (
{dates.map((date, idx) => ( ))} {roles.map((role) => ( {tableData.map((row, idx) => { const value = row[role]; const cellStyle = value > 0 ? { backgroundColor: "#d5d5d5" } : {}; return ( ); })} ))}
Role {date}
{role} {value}
)}
); }; export default AttendanceOverview;