From 651b10da1559c215645dfb86f989278ba966de58 Mon Sep 17 00:00:00 2001 From: Kartik sharma Date: Mon, 14 Jul 2025 14:47:01 +0530 Subject: [PATCH 1/4] Add an "All Projects" selection option in the global project dropdown. --- .../Dashboard/ProjectProgressChart.jsx | 27 -- src/components/Layout/Header.jsx | 446 +++--------------- src/pages/project/ProjectDetails.jsx | 2 +- 3 files changed, 62 insertions(+), 413 deletions(-) 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": { -- 2.43.0 From a15084cfbbcec57b4b3fe1a47fc5b5969c39789b Mon Sep 17 00:00:00 2001 From: Kartik sharma Date: Mon, 14 Jul 2025 15:35:45 +0530 Subject: [PATCH 2/4] Changes in Project Selection. --- src/components/Layout/Header.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Layout/Header.jsx b/src/components/Layout/Header.jsx index e4bf4e83..9769e26b 100644 --- a/src/components/Layout/Header.jsx +++ b/src/components/Layout/Header.jsx @@ -80,7 +80,7 @@ const Header = () => { ); // Determine the display text for the project dropdown - let displayText = ""; + let displayText = "All Projects"; if (selectedProject === null) { displayText = "All Projects"; } else if (selectedProject) { -- 2.43.0 From 4bbdcd0db08fe695aad8f928002e86e798316156 Mon Sep 17 00:00:00 2001 From: Kartik sharma Date: Tue, 15 Jul 2025 14:52:23 +0530 Subject: [PATCH 3/4] added needed closed tag --- src/pages/project/ProjectDetails.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/project/ProjectDetails.jsx b/src/pages/project/ProjectDetails.jsx index 206ea20f..f34586aa 100644 --- a/src/pages/project/ProjectDetails.jsx +++ b/src/pages/project/ProjectDetails.jsx @@ -88,7 +88,7 @@ const ProjectDetails = () => {
- + ); } case "teams": { -- 2.43.0 From 05530842b7a0ff63b480753d4825b1ad2577cdca Mon Sep 17 00:00:00 2001 From: Kartik sharma Date: Tue, 15 Jul 2025 15:00:49 +0530 Subject: [PATCH 4/4] Changes in Dashboard dropdown adding All Projects Selection. --- src/components/Layout/Header.jsx | 103 ++++++----- src/components/Project/AboutProject.jsx | 58 ++++--- src/components/Project/ProjectCard.jsx | 24 +-- src/pages/project/ProjectDetails.jsx | 220 ++++++++++-------------- src/pages/project/ProjectListView.jsx | 8 +- src/router/AppRoutes.jsx | 2 +- 6 files changed, 186 insertions(+), 229 deletions(-) diff --git a/src/components/Layout/Header.jsx b/src/components/Layout/Header.jsx index 9769e26b..9023d007 100644 --- a/src/components/Layout/Header.jsx +++ b/src/components/Layout/Header.jsx @@ -1,3 +1,4 @@ + import getGreetingMessage from "../../utils/greetingHandler"; import { cacheData, @@ -26,6 +27,8 @@ const Header = () => { const { data, loading } = useMaster(); const navigate = useNavigate(); const HasManageProjectPermission = useHasUserPermission(MANAGE_PROJECT); + const isDashboard = location.pathname === "/dashboard"; + // const isDirectoryPath = location.pathname === "/directory"; const getRole = (roles, joRoleId) => { if (!Array.isArray(roles)) return "User"; @@ -99,7 +102,7 @@ const Header = () => { if ( projectNames && projectNames.length > 0 && - selectedProject === undefined && + selectedProject === undefined && !getCachedData("hasReceived") ) { dispatch(setProjectId(null)); // Set to null for "All Projects" @@ -108,7 +111,7 @@ const Header = () => { /** Check if current page is project details page or directory page */ - const isProjectPath = /^\/projects\/[a-f0-9-]{36}$/.test(location.pathname); + // const isProjectPath = /^\/projects\/[a-f0-9-]{36}$/.test(location.pathname); const isDirectoryPath = /^\/directory$/.test(location.pathname); const handler = useCallback( @@ -172,69 +175,61 @@ const Header = () => { id="navbar-collapse" > {/* Project Selection Dropdown */} - {projectNames && ( // Ensure projectNames is not null before rendering dropdown + {projectNames && !isDirectoryPath && (
- {(!isProjectPath && !isDirectoryPath) && ( - <> - -
- + +
+ - {/* Render dropdown menu only if there are projects or the "All Projects" option is relevant */} - {projectNames.length > 0 && ( -
    - {/* "All Projects" option */} -
  • + {projectNames.length > 0 && ( +
      + {/* Show "All Projects" only on dashboard */} + {isDashboard && ( +
    • + +
    • + )} + {[...projectNames] + .sort((a, b) => a?.name?.localeCompare(b.name)) + .map((project) => ( +
    • - {[...projectNames] - .sort((a, b) => a?.name?.localeCompare(b.name)) - .map((project) => ( -
    • - -
    • - ))} -
    - )} -
- - )} + ))} + + )} +
)} {/* Display project name on project details or directory pages */} - {isProjectPath && ({displayText})} + {/* { ({displayText})} */} {/* User Profile and Shortcuts */}