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 (
Role-wise present count
{error}
) : attendanceOverviewData.length === 0 || attendanceOverviewData.every((item) => item.present === 0) ? (| Role | {dates.map((date, idx) => ({date} | ))}
|---|---|
| {role} | {tableData.map((row, idx) => { const value = row[role]; const cellStyle = value > 0 ? { backgroundColor: "#d5d5d5" } : {}; return ({value} | ); })}