diff --git a/src/components/Dashboard/ProjectProgressChart.jsx b/src/components/Dashboard/ProjectProgressChart.jsx index 20e0191a..f80bb0d5 100644 --- a/src/components/Dashboard/ProjectProgressChart.jsx +++ b/src/components/Dashboard/ProjectProgressChart.jsx @@ -93,33 +93,6 @@ const ProjectProgressChart = ({
Project Progress

Progress Overview by Project

- - {/* Right: Checkbox and Project Name */} -
- {ShowAllProject == true && ( -
- setShowAllEmployees(e.target.checked)} - /> - -
- )} - {!showAllEmployees && selectedProjectName && ( -

- {selectedProjectName} -

- )} -
{/* Row 2: Time Range Buttons */} diff --git a/src/components/Layout/Header.jsx b/src/components/Layout/Header.jsx index 9c1b4b17..e4bf4e83 100644 --- a/src/components/Layout/Header.jsx +++ b/src/components/Layout/Header.jsx @@ -20,7 +20,7 @@ import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import { MANAGE_PROJECT } from "../../utils/constants"; const Header = () => { - const {profile} = useProfile(); + const { profile } = useProfile(); const location = useLocation(); const dispatch = useDispatch(); const { data, loading } = useMaster(); @@ -32,6 +32,7 @@ const Header = () => { let role = roles.find((role) => role.id === joRoleId); return role ? role.name : "User"; }; + const handleLogout = (e) => { e.preventDefault(); // Prevent default anchor behavior (e.g., page reload) logout(); @@ -39,7 +40,6 @@ const Header = () => { const logout = async () => { try { - // Notify server about the logout (optional) let data = { refreshToken: localStorage.getItem("refreshToken"), }; @@ -54,6 +54,7 @@ const Header = () => { window.location.href = "/auth/login"; }) .catch((error) => { + // Even if logout API fails, clear local storage and redirect localStorage.removeItem("jwtToken"); localStorage.removeItem("refreshToken"); localStorage.removeItem("user"); @@ -71,39 +72,43 @@ const Header = () => { const handleProfilePage = () => { navigate(`/employee/${profile?.employeeInfo?.id}?for=attendance`); }; - // const { projects, loading: projectLoading } = useProjects(); + const { projectNames, loading: projectLoading, fetchData } = useProjectName(); const selectedProject = useSelector( (store) => store.localVariables.projectId ); - const selectedProjectName = projectNames?.find( - (p) => p?.id === selectedProject - )?.name; - + // Determine the display text for the project dropdown let displayText = ""; - if (selectedProjectName) { - displayText = selectedProjectName; - } else if (projectLoading && selectedProject) { - displayText = selectedProject; + if (selectedProject === null) { + displayText = "All Projects"; + } else if (selectedProject) { + const selectedProjectObj = projectNames?.find( + (p) => p?.id === selectedProject + ); + // Fallback to selectedProject ID if name not found during loading or mismatch + displayText = selectedProjectObj ? selectedProjectObj.name : selectedProject; } else if (projectLoading) { displayText = "Loading..."; } const { openChangePassword } = useChangePassword(); + useEffect(() => { if ( projectNames && - selectedProject !== " " && + projectNames.length > 0 && + selectedProject === undefined && !getCachedData("hasReceived") ) { - dispatch(setProjectId(projectNames[0]?.id)); + dispatch(setProjectId(null)); // Set to null for "All Projects" } - }, [projectNames]); + }, [projectNames, selectedProject, dispatch]); - /** Check if current page id project details page */ - const isProjectPath = /^\/projects\/[a-f0-9-]{36}$/.test(location.pathname) + + /** Check if current page is project details page or directory page */ + const isProjectPath = /^\/projects\/[a-f0-9-]{36}$/.test(location.pathname); const isDirectoryPath = /^\/directory$/.test(location.pathname); const handler = useCallback( @@ -111,58 +116,47 @@ const Header = () => { if (!HasManageProjectPermission) { await fetchData(); const projectExist = data.projectIds.some( - (item) => item == selectedProject + (item) => item === selectedProject ); if (projectExist) { cacheData("hasReceived", false); } } }, - [fetchData,projectNames,selectedProject] + [fetchData, selectedProject, HasManageProjectPermission] ); - // useEffect(() => { - // eventBus.on("assign_project_one", handler); - // return () => eventBus.off("assign_project_one", handler); - // }, [handler]); - const newProjectHandler = useCallback( async (msg) => { - if (HasManageProjectPermission && msg.keyword === "Create_Project") { await fetchData(); - } else if (projectNames.some((item) => item.id == msg.response.id)) { - console.log((projectNames.some((item) => item.id == msg.response.id))) + } else if (projectNames?.some((item) => item.id === msg.response.id)) { await fetchData(); } cacheData("hasReceived", false); }, - [HasManageProjectPermission,projectNames] + [HasManageProjectPermission, projectNames, fetchData] ); - // useEffect(() => { - // eventBus.on("project", newProjectHandler); - // return () => eventBus.off("project", newProjectHandler); - // }, [handler]); - - useDispatch( () => - { - dispatch(changeMaster("Job Role")) -},[]) + // Correct way to dispatch an action on mount useEffect(() => { - eventBus.on("assign_project_one", handler); - eventBus.on("project", newProjectHandler); + dispatch(changeMaster("Job Role")); + }, [dispatch]); - return () => { - eventBus.off("assign_project_one", handler); - eventBus.off("project", newProjectHandler); - }; -}, [handler, newProjectHandler]); + // Event bus listeners for project changes + useEffect(() => { + eventBus.on("assign_project_one", handler); + eventBus.on("project", newProjectHandler); + return () => { + eventBus.off("assign_project_one", handler); + eventBus.off("project", newProjectHandler); + }; + }, [handler, newProjectHandler]); return ( ); }; -export default Header; +export default Header; \ No newline at end of file diff --git a/src/pages/project/ProjectDetails.jsx b/src/pages/project/ProjectDetails.jsx index 732255b8..3b09f409 100644 --- a/src/pages/project/ProjectDetails.jsx +++ b/src/pages/project/ProjectDetails.jsx @@ -101,7 +101,7 @@ const ProjectDetails = () => {
- + ); } case "teams": {