Project dropdown should only include active ,On Hold and In Progress Projects only show in Projects page. #281

Merged
vikas.nale merged 5 commits from Kartik_Bug#792 into Issues_July_4W 2025-07-24 10:29:30 +00:00
Showing only changes of commit d3822c3590 - Show all commits

View File

@ -33,9 +33,11 @@ const Header = () => {
/^\/dashboard$/.test(location.pathname) || /^\/$/.test(location.pathname); /^\/dashboard$/.test(location.pathname) || /^\/$/.test(location.pathname);
// Define the specific project status IDs you want to filter by // Define the specific project status IDs you want to filter by
// Changed to explicitly include only 'Active', 'On Hold', 'In Progress'
const allowedProjectStatusIds = [ const allowedProjectStatusIds = [
"603e994b-a27f-4e5d-a251-f3d69b0498ba", // On Hold "603e994b-a27f-4e5d-a251-f3d69b0498ba", // On Hold
"cdad86aa-8a56-4ff4-b633-9c629057dfef", // In Progress "cdad86aa-8a56-4ff4-b633-9c629057dfef", // In Progress
"ef1c356e-0fe0-42df-a5d3-8daee355492d", // Inactive - Removed as per requirement
"b74da4c2-d07e-46f2-9919-e75e49b12731", // Active "b74da4c2-d07e-46f2-9919-e75e49b12731", // Active
]; ];
@ -66,6 +68,7 @@ const Header = () => {
window.location.href = "/auth/login"; window.location.href = "/auth/login";
}) })
.catch((error) => { .catch((error) => {
// Even if logout API fails, clear local storage and redirect
localStorage.removeItem("jwtToken"); localStorage.removeItem("jwtToken");
localStorage.removeItem("refreshToken"); localStorage.removeItem("refreshToken");
localStorage.removeItem("user"); localStorage.removeItem("user");
@ -91,10 +94,9 @@ const Header = () => {
); );
// Conditional filtering for projectsForDropdown // Conditional filtering for projectsForDropdown
// This list will be shown in the dropdown for regular users (without MANAGE_PROJECT permission) // If on Dashboard, show all projects. Otherwise, filter by allowedProjectStatusIds.
// On Dashboard, it will contain all projects. On other pages, only allowed statuses.
const projectsForDropdown = isDashboard const projectsForDropdown = isDashboard
? projectNames // On dashboard, show all projects for selection if managing permission is given ? projectNames // On dashboard, show all projects
: projectNames?.filter(project => : projectNames?.filter(project =>
allowedProjectStatusIds.includes(project.projectStatusId) allowedProjectStatusIds.includes(project.projectStatusId)
); );
@ -104,9 +106,11 @@ const Header = () => {
if (selectedProject === null) { if (selectedProject === null) {
displayText = "All Projects"; displayText = "All Projects";
} else if (selectedProject) { } else if (selectedProject) {
// Find the selected project from the full projectNames list
const selectedProjectObj = projectNames?.find( const selectedProjectObj = projectNames?.find(
(p) => p?.id === selectedProject (p) => p?.id === selectedProject
); );
// Fallback to selectedProject ID if name not found during loading or mismatch
displayText = selectedProjectObj ? selectedProjectObj.name : selectedProject; displayText = selectedProjectObj ? selectedProjectObj.name : selectedProject;
} else if (projectLoading) { } else if (projectLoading) {
displayText = "Loading..."; displayText = "Loading...";
@ -121,22 +125,15 @@ const Header = () => {
selectedProject === undefined && selectedProject === undefined &&
!getCachedData("hasReceived") !getCachedData("hasReceived")
) { ) {
if (isDashboard && HasManageProjectPermission) { if (isDashboard) {
dispatch(setProjectId(null)); // "All Projects" default for managers on dashboard dispatch(setProjectId(null)); // Always set to null for "All Projects" on Dashboard initial load
} else if (isDashboard && !HasManageProjectPermission) {
// If regular user on dashboard, and only one project, select that one
if (projectNames.length === 1) {
dispatch(setProjectId(projectNames[0].id));
} else {
dispatch(setProjectId(null)); // If multiple projects, default to "All Projects" for regular users on dashboard
}
} else { } else {
// If not dashboard, set to the first project that matches the allowed statuses if available // If not dashboard, set to the first project that matches the allowed statuses if available
const firstAllowedProject = projectNames.find(project => allowedProjectStatusIds.includes(project.projectStatusId)); const firstAllowedProject = projectNames.find(project => allowedProjectStatusIds.includes(project.projectStatusId));
dispatch(setProjectId(firstAllowedProject?.id || null)); dispatch(setProjectId(firstAllowedProject?.id || null)); // Fallback to null if no allowed projects
} }
} }
}, [projectNames, selectedProject, dispatch, isDashboard, HasManageProjectPermission]); }, [projectNames, selectedProject, dispatch, isDashboard]);
const handler = useCallback( const handler = useCallback(
@ -181,27 +178,17 @@ const Header = () => {
}, [handler, newProjectHandler]); }, [handler, newProjectHandler]);
const handleProjectChange = (project) => { const handleProjectChange = (project) => {
dispatch(setProjectId(project)); dispatch(setProjectId(project)); // Always set the projectId
if (isProjectPath && project !== null) { if (isProjectPath && project !== null) {
navigate("/projects/details"); navigate("/projects/details"); // Navigate only if on /projects and a specific project is selected
} }
// No navigation if on dashboard or if "All Projects" is selected
}; };
// Determine if the dropdown should be shown // Determine if the dropdown should be shown
const shouldShowDropdown = (() => { const shouldShowDropdown =
if (HasManageProjectPermission) { isDashboard || (projectsForDropdown && projectsForDropdown.length > 1);
// Managers always see the dropdown if there's more than one project (total)
return projectNames && projectNames.length > 1;
} else {
// Regular users only see the dropdown if they have more than one *assigned* project
return projectsForDropdown && projectsForDropdown.length > 1;
}
})();
// Determine if "All Projects" option should be displayed in the dropdown
const shouldShowAllProjectsOption = HasManageProjectPermission || (isDashboard && projectsForDropdown && projectsForDropdown.length > 1);
return ( return (
<nav <nav
@ -224,6 +211,7 @@ const Header = () => {
<div className="align-items-center"> <div className="align-items-center">
<i className="rounded-circle bx bx-building-house bx-sm-lg bx-md me-2"></i> <i className="rounded-circle bx bx-building-house bx-sm-lg bx-md me-2"></i>
<div className="btn-group"> <div className="btn-group">
{/* Conditionally render the button based on shouldShowDropdown */}
{shouldShowDropdown ? ( {shouldShowDropdown ? (
<button <button
className={`btn btn-sm-sm btn-xl ${projectsForDropdown && projectsForDropdown.length > 0 ? "dropdown-toggle" : "" className={`btn btn-sm-sm btn-xl ${projectsForDropdown && projectsForDropdown.length > 0 ? "dropdown-toggle" : ""
@ -235,7 +223,7 @@ const Header = () => {
{displayText} {displayText}
</button> </button>
) : ( ) : (
// If only one project, or no dropdown needed, just display its name // If only one project, just display its name without a dropdown
<span className="btn btn-sm-sm btn-xl px-1"> <span className="btn btn-sm-sm btn-xl px-1">
{projectsForDropdown && projectsForDropdown.length === 1 {projectsForDropdown && projectsForDropdown.length === 1
? projectsForDropdown[0].name ? projectsForDropdown[0].name
@ -243,22 +231,23 @@ const Header = () => {
</span> </span>
)} )}
{shouldShowDropdown && ( {/* Only render the dropdown menu if shouldShowDropdown is true */}
{shouldShowDropdown && projectsForDropdown && projectsForDropdown.length > 0 && (
<ul <ul
className="dropdown-menu" className="dropdown-menu"
style={{ overflow: "auto", maxHeight: "300px" }} style={{ overflow: "auto", maxHeight: "300px" }}
> >
{shouldShowAllProjectsOption && ( {isDashboard && (
<li> <li>
<button <button
className="dropdown-item" className="dropdown-item"
onClick={() => handleProjectChange(null)} onClick={() => handleProjectChange(null)} // Set projectId to null for "All Projects"
> >
All Projects All Projects
</button> </button>
</li> </li>
)} )}
{[...projectsForDropdown] {[...projectsForDropdown] // Sort the conditionally filtered list
.sort((a, b) => a?.name?.localeCompare(b.name)) .sort((a, b) => a?.name?.localeCompare(b.name))
.map((project) => ( .map((project) => (
<li key={project?.id}> <li key={project?.id}>