import React, { useState, useEffect, useMemo } from "react"; import { useTaskList } from "../../hooks/useTasks"; import { useSelectedProject } from "../../slices/apiDataManager"; import { useProjectName } from "../../hooks/useProjects"; import DailyProgrssReport, { useDailyProgrssContext, } from "../../pages/DailyProgressReport/DailyProgrssReport"; import { useDispatch } from "react-redux"; import { setProjectId } from "../../slices/localVariablesSlice"; import { APPROVE_TASK, ASSIGN_REPORT_TASK, ITEMS_PER_PAGE, } from "../../utils/constants"; import { formatNumber, formatUTCToLocalTime } from "../../utils/dateUtils"; import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import Pagination from "../common/Pagination"; import { TaskReportListSkeleton } from "./TaskRepprtListSkeleton"; import HoverPopup from "../common/HoverPopup"; const TaskReportList = () => { const [currentPage, setCurrentPage] = useState(1); const [filters, setFilters] = useState({ selectedBuilding: "", selectedFloors: [], selectedActivities: [], }); const dispatch = useDispatch(); const ApprovedTaskRights = useHasUserPermission(APPROVE_TASK); const ReportTaskRights = useHasUserPermission(ASSIGN_REPORT_TASK); const { service, openModal, closeModal,filter } = useDailyProgrssContext(); const selectedProject = useSelectedProject(); const { projectNames } = useProjectName(); const { data, isLoading, isError, error } = useTaskList( selectedProject, ITEMS_PER_PAGE, currentPage, service,filter ); const ProgrssReportColumn = [ { key: "activity", label: "Activity", getValue: (task) => task.workItem.activityMaster?.activityName || "N/A", align: "text-start", }, { key: "assigned", label: "Total Assigned", getValue: (task) => task.plannedTask ?? "N/A", align: "text-start", }, { key: "completed", label: "Completed", getValue: (task) => task.completedTask ?? "N/A", align: "text-start", }, { key: "assignAt", label: "Assign Date", getValue: (task) => task.assignmentDate ? formatUTCToLocalTime(task.assignmentDate) : "N/A", align: "text-start", }, { key: "team", label: "Team", getValue: (task) => task.teamMembers?.map((m) => `${m.firstName} ${m.lastName}`).join(", ") || "N/A", align: "text-start", }, ]; const paginate = (page) => { if (page >= 1 && page <= (data?.totalPages ?? 1)) { setCurrentPage(page); } }; useEffect(() => { if (!selectedProject && projectNames.length > 0) { dispatch(setProjectId(projectNames[0].id)); } }, [selectedProject, projectNames, dispatch]); useEffect(() => { setFilters({ selectedBuilding: "", selectedFloors: [], selectedActivities: [], }); }, [selectedProject]); // Filter and Group wise data const filteredTasks = useMemo(() => { if (!data?.data) return []; return data?.data.filter((task) => { const { selectedBuilding, selectedFloors, selectedActivities } = filters; if ( selectedBuilding && task?.workItem?.workArea?.floor?.building?.name !== selectedBuilding ) return false; if ( selectedFloors.length > 0 && !selectedFloors.includes(task?.workItem?.workArea?.floor?.floorName) ) return false; if ( selectedActivities.length > 0 && !selectedActivities.includes( task?.workItem?.activityMaster?.activityName ) ) return false; return true; }); }, [data?.data, filters, currentPage]); const groupedTasks = useMemo(() => { const groups = {}; filteredTasks.forEach((task) => { const date = task.assignmentDate.split("T")[0]; if (!groups[date]) groups[date] = []; groups[date].push(task); }); return Object.keys(groups) .sort((a, b) => new Date(b) - new Date(a)) .map((date) => ({ date, tasks: groups[date] })); }, [filteredTasks, paginate, currentPage, selectedProject]); const renderTeamMembers = (task, refIndex) => (
${task.teamMembers .map( (m) => `
${m?.firstName?.charAt(0) || ""}${m?.lastName?.charAt(0) || "" }
${m.firstName} ${m.lastName}
` ) .join("")}
`} > {task.teamMembers.slice(0, 3).map((m) => (
{m?.firstName.slice(0, 1)}
))} {task.teamMembers.length > 3 && (
+{task.teamMembers.length - 3}
)} ); if (isLoading) return ; if (isError) return
Loading....
; return (
{groupedTasks.length === 0 && ( )} {groupedTasks.map(({ date, tasks }) => ( {tasks.map((task, idx) => ( ))} ))}
Activity Total Pending{" "} This shows the total pending tasks for each activity on that date.

} >
Reported/Planned{" "} This shows the reported versus planned tasks for each activity on that date.

} >
Assign Date Team Actions
No reports available
{formatUTCToLocalTime(date)}
{task.workItem.activityMaster?.activityName || "No Activity Name"}
{task.workItem.workArea?.floor?.building?.name} ›{" "} {task.workItem.workArea?.floor?.floorName} ›{" "} {task.workItem.workArea?.areaName}
{formatNumber(task.workItem.plannedWork)} {`${formatNumber(task.completedTask)} / ${formatNumber(task.plannedTask)}`} {formatUTCToLocalTime(task.assignmentDate)} {renderTeamMembers(task, idx)}
{ReportTaskRights && !task.reportedDate && ( )} {ApprovedTaskRights && task.reportedDate && !task.approvedBy && ( )}
{data?.data?.length > 0 && ( )}
); }; export default TaskReportList;