import React, { useState, useEffect } from "react"; import ProjectCard from "../../components/Project/ProjectCard"; import ManageProjectInfo from "../../components/Project/ManageProjectInfo"; import Breadcrumb from "../../components/common/Breadcrumb"; import ProjectRepository from "../../repositories/ProjectRepository"; import { useProjects } from "../../hooks/useProjects"; import { useDispatch } from "react-redux"; import showToast from "../../services/toastService"; import { getCachedData, cacheData } from "../../slices/apiDataManager"; import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import { useProfile } from "../../hooks/useProfile"; import { MANAGE_PROJECT } from "../../utils/constants"; import ProjectListView from "./ProjectListView"; const ProjectList = () => { const { profile: loginUser } = useProfile(); const [listView, setListView] = useState(false); const [showModal, setShowModal] = useState(false); const { projects, loading, error, refetch } = useProjects(); const [projectList, setProjectList] = useState([]); const HasManageProjectPermission = useHasUserPermission(MANAGE_PROJECT); const [HasManageProject, setHasManageProject] = useState( HasManageProjectPermission ); const dispatch = useDispatch(); const [currentPage, setCurrentPage] = useState(1); const [itemsPerPage] = useState(6); const [searchTerm, setSearchTerm] = useState(""); const [selectedStatuses, setSelectedStatuses] = useState([ "b74da4c2-d07e-46f2-9919-e75e49b12731", "603e994b-a27f-4e5d-a251-f3d69b0498ba", "ef1c356e-0fe0-42df-a5d3-8daee355492d", "33deaef9-9af1-4f2a-b443-681ea0d04f81", ]); const handleShow = () => setShowModal(true); const handleClose = () => setShowModal(false); useEffect(() => { if (!loading && Array.isArray(projects)) { const grouped = {}; projects.forEach((project) => { const statusId = project.projectStatusId; if (!grouped[statusId]) grouped[statusId] = []; grouped[statusId].push(project); }); const sortedGrouped = selectedStatuses .filter((statusId) => grouped[statusId]) .flatMap((statusId) => grouped[statusId].sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()) ) ); setProjectList(sortedGrouped); } }, [projects, loginUser?.projects, loading]); useEffect(() => { if (loginUser) { setHasManageProject(HasManageProjectPermission); } else { setHasManageProject(false); } }, [loginUser, HasManageProjectPermission]); const handleSubmitForm = (newProject) => { ProjectRepository.manageProject(newProject) .then((response) => { const cachedProjects = getCachedData("projectslist") || []; const updatedProjects = [...cachedProjects, response.data]; cacheData("projectslist", updatedProjects); setProjectList((prev) => [...prev, response.data]); showToast("Project Created successfully.", "success"); setShowModal(false); }) .catch((error) => { showToast(error.message, "error"); setShowModal(false); }); }; const handleReFresh = () => { if (!projects || projects.length === 0) { refetch(); } }; const handleStatusChange = (statusId) => { setCurrentPage(1); setSelectedStatuses((prev) => prev.includes(statusId) ? prev.filter((id) => id !== statusId) : [...prev, statusId] ); }; const handleStatusFilterFromChild = (statusesFromChild) => { setSelectedStatuses(statusesFromChild); }; const filteredProjects = projectList.filter((project) => { const matchesStatus = selectedStatuses.includes(project.projectStatusId); const matchesSearch = project.name .toLowerCase() .includes(searchTerm.toLowerCase()); return matchesStatus && matchesSearch; }); const indexOfLastItem = currentPage * itemsPerPage; const indexOfFirstItem = indexOfLastItem - itemsPerPage; const currentItems = filteredProjects.slice( indexOfFirstItem, indexOfLastItem ); const totalPages = Math.ceil(filteredProjects.length / itemsPerPage); useEffect(() => { const tooltipTriggerList = Array.from( document.querySelectorAll('[data-bs-toggle="tooltip"]') ); tooltipTriggerList.forEach((el) => new bootstrap.Tooltip(el)); }, []); return ( <>
{ setSearchTerm(e.target.value); setCurrentPage(1); }} />
    {[ { id: "b74da4c2-d07e-46f2-9919-e75e49b12731", label: "Active", }, { id: "603e994b-a27f-4e5d-a251-f3d69b0498ba", label: "On Hold", }, { id: "ef1c356e-0fe0-42df-a5d3-8daee355492d", label: "Inactive", }, { id: "33deaef9-9af1-4f2a-b443-681ea0d04f81", label: "Completed", }, ].map(({ id, label }) => (
  • handleStatusChange(id)} />
  • ))}
{loading &&

Loading...

} {!loading && filteredProjects.length === 0 && !listView && (

No projects found.

)}
{listView ? (
{currentItems.length === 0 ? ( ) : ( currentItems.map((project) => ( )) )}
Project Name Project Manger START DATE DEADLINE Task Progress
    {[ { id: "b74da4c2-d07e-46f2-9919-e75e49b12731", label: "Active", }, { id: "603e994b-a27f-4e5d-a251-f3d69b0498ba", label: "On Hold", }, { id: "ef1c356e-0fe0-42df-a5d3-8daee355492d", label: "Inactive", }, { id: "33deaef9-9af1-4f2a-b443-681ea0d04f81", label: "Completed", }, ].map(({ id, label }) => (
  • handleStatusChange(id)} />
  • ))}
Action
No projects found
) : ( currentItems.map((project) => ( )) )}
{!loading && totalPages > 1 && ( )}
); }; export default ProjectList;