import React, { useState, useEffect, useCallback } 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, clearCacheKey } from "../../slices/apiDataManager"; import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import { useProfile } from "../../hooks/useProfile"; import { ITEMS_PER_PAGE, MANAGE_PROJECT } from "../../utils/constants"; import ProjectListView from "./ProjectListView"; import eventBus from "../../services/eventBus"; import { clearApiCacheKey } from "../../slices/apiCacheSlice"; import { defaultCheckBoxAppearanceProvider } from "pdf-lib"; 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(ITEMS_PER_PAGE); 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); const sortingProject = (projects) => { 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); } }; useEffect(() => { sortingProject(projects); }, [projects, loginUser?.projects, loading]); useEffect(() => { if (loginUser) { setHasManageProject(HasManageProjectPermission); } else { setHasManageProject(false); } }, [loginUser, HasManageProjectPermission]); const handleSubmitForm = (newProject, setloading, reset) => { ProjectRepository.manageProject(newProject) .then((response) => { const cachedProjects = getCachedData("projectslist") || []; const updatedProjects = [...cachedProjects, response.data]; cacheData("projectslist", updatedProjects); setProjectList((prev) => [...prev, response.data]); setloading(false); reset(); sortingProject(getCachedData("projectslist")); 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)); }, []); const handler = useCallback( async (msg) => { if (HasManageProject && msg.keyword === "Create_Project") { const updatedProjects = [...projectList, msg.response]; cacheData("projectslist", updatedProjects); setProjectList(updatedProjects); sortingProject(updatedProjects); } if ( msg.keyword === "Update_Project" && projectList.some((item) => item.id === msg.response.id) ) { ProjectRepository.getProjectList() .then((response) => { cacheData("projectslist", response?.data); sortingProject(response?.data); }) .catch((e) => { console.error(e) }); } }, [HasManageProject, projectList, sortingProject] ); useEffect(() => { eventBus.on("project", handler); return () => eventBus.off("project", handler); }, [handler]); const assignProjectHandler = useCallback( async (data) => { clearCacheKey("projectslist"); await refetch(); sortingProject(projects); }, [refetch] ); useEffect(() => { eventBus.on("assign_project_one", assignProjectHandler); return () => eventBus.off("assign_project_one", assignProjectHandler); }, [handler]); 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 Contact Person 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;