import React, { useEffect, useMemo, useState } from "react"; import { useDispatch } from "react-redux"; import { useTaskList } from "../../hooks/useTasks"; import { useProjectName } from "../../hooks/useProjects"; import { setProjectId } from "../../slices/localVariablesSlice"; import Breadcrumb from "../../components/common/Breadcrumb"; import DateRangePicker from "../../components/common/DateRangePicker"; import FilterIcon from "../../components/common/FilterIcon"; import GlobalModel from "../../components/common/GlobalModel"; import ReportTask from "../../components/Activities/ReportTask"; import ReportTaskComments from "../../components/Activities/ReportTaskComments"; import SubTask from "../../components/Activities/SubTask"; import { formatNumber, formatUTCToLocalTime } from "../../utils/dateUtils"; import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import { APPROVE_TASK, ASSIGN_REPORT_TASK } from "../../utils/constants"; import { useSelectedProject } from "../../slices/apiDataManager"; import moment from "moment"; import Loader from "../../components/common/Loader"; const DailyTask = () => { const dispatch = useDispatch(); const selectedProject = useSelectedProject(); const { projectNames } = useProjectName(); const ApprovedTaskRights = useHasUserPermission(APPROVE_TASK); const ReportTaskRights = useHasUserPermission(ASSIGN_REPORT_TASK); const [filters, setFilters] = useState({ selectedBuilding: "", selectedFloors: [], selectedActivities: [], }); const [dateRange, setDateRange] = useState({ startDate: "", endDate: "" }); const { TaskList, loading: taskLoading } = useTaskList( selectedProject || null, dateRange?.startDate || null, dateRange?.endDate || null ); // Ensure project is set useEffect(() => { if (!selectedProject && projectNames.length > 0) { debugger dispatch(setProjectId(projectNames[0].id)); } }, [selectedProject, projectNames, dispatch]); // 🔹 Reset filters when project changes useEffect(() => { setFilters({ selectedBuilding: "", selectedFloors: [], selectedActivities: [], }); }, [selectedProject]); // Memoized filtering const filteredTasks = useMemo(() => { if (!TaskList) return []; return TaskList.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; }); }, [TaskList, filters]); // Memoized dates 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]); // --- Modal State const [modal, setModal] = useState({ type: null, data: null }); const openModal = (type, data = null) => setModal({ type, data }); const closeModal = () => setModal({ type: null, data: null }); // --- Render helpers 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}
)} ); return ( <> {/* --- Modals --- */} {modal.type === "report" && ( )} {modal.type === "comments" && ( { if (isSubTask) openModal("subtask", modal.data.task); else closeModal(); }} closeModal={closeModal} /> )} {modal.type === "subtask" && ( )}
{!selectedProject && (
Please Select Project
)} {/* --- Filters --- */}
{/* --- Table --- */}
{taskLoading && ( )} {!taskLoading && groupedTasks.length === 0 && ( )} {!taskLoading && groupedTasks.map(({ date, tasks }) => ( {tasks.map((task, idx) => ( ))} ))}
Activity Assigned Completed Assign On Team Actions
No Reports Found
{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.plannedTask)} / {formatNumber(task.workItem.plannedWork - task.workItem.completedWork)} {task.completedTask} {formatUTCToLocalTime(task.assignmentDate)} {renderTeamMembers(task, idx)}
{ReportTaskRights && !task.reportedDate && ( )} {ApprovedTaskRights && task.reportedDate && !task.approvedBy && ( )}
); }; export default DailyTask;