From af5519fd6005e98cc43d085fa889e299b58163e8 Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Fri, 19 Sep 2025 14:53:40 +0530 Subject: [PATCH 01/16] Adding Dropdown and Organization Column in Teams --- src/components/Project/Teams.jsx | 65 +++++++++++++++++++------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/src/components/Project/Teams.jsx b/src/components/Project/Teams.jsx index 3a8d78cf..e39a4b13 100644 --- a/src/components/Project/Teams.jsx +++ b/src/components/Project/Teams.jsx @@ -21,8 +21,6 @@ import { import { useSelectedProject } from "../../slices/apiDataManager"; const Teams = () => { - // const {projectId} = useParams() - // const projectId = useSelector((store)=>store.localVariables.projectId) const projectId = useSelectedProject(); const dispatch = useDispatch(); @@ -136,7 +134,6 @@ const Teams = () => { useEffect(() => { if (projectEmployees) { setEmployees(projectEmployees); - //setFilteredEmployees(projectEmployees?.filter((emp) => emp.isActive)); const filtered = projectEmployees.filter((emp) => emp.isActive); setFilteredEmployees(filtered); } @@ -179,13 +176,6 @@ const Teams = () => { const handleFilterEmployee = (e) => { const filterValue = e.target.value; - // if (filterValue === "true") { - // setActiveEmployee(true); - // setFilteredEmployees(employees.filter((emp) => emp.isActive)); - // } else { - // setFilteredEmployees(employees.filter((emp) => !emp.isActive)); - // setActiveEmployee(false); - // } setActiveEmployee(filterValue === "true"); setSearchTerm(""); }; @@ -274,6 +264,27 @@ const Teams = () => { onChange={handleSearch} /> + {/* Services-Dropdown */} + +
+ +
{
+ + +
+ + {item.organizationName || "N/A"} + - {" "} - {moment(item.allocationDate).format( - "DD-MMM-YYYY" - )}{" "} + {moment(item.allocationDate).format("DD-MMM-YYYY")} {!activeEmployee && ( {item.reAllocationDate - ? moment(item.reAllocationDate).format( - "DD-MMM-YYYY" - ) + ? moment(item.reAllocationDate).format("DD-MMM-YYYY") : "Present"} )} @@ -373,7 +385,7 @@ const Teams = () => { - {item.isActive && ( + {item.isActive ? ( + ) : ( + Not in project )} - {!item.isActive && Not in project} ))} + )} {!employeeLodaing && filteredEmployees.length === 0 && (
From ea219b717696cf618678abaa53789f73ea1f074d Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Fri, 19 Sep 2025 15:03:25 +0530 Subject: [PATCH 02/16] Adding Services Dropdown in Infrastructure. --- src/components/Project/ProjectInfra.jsx | 124 ++++++++++++++---------- 1 file changed, 72 insertions(+), 52 deletions(-) diff --git a/src/components/Project/ProjectInfra.jsx b/src/components/Project/ProjectInfra.jsx index 38c05567..c99b08c9 100644 --- a/src/components/Project/ProjectInfra.jsx +++ b/src/components/Project/ProjectInfra.jsx @@ -21,18 +21,17 @@ import { useProjectDetails, useProjectInfra } from "../../hooks/useProjects"; import { useDispatch, useSelector } from "react-redux"; import { refreshData } from "../../slices/localVariablesSlice"; import eventBus from "../../services/eventBus"; -import {useParams} from "react-router-dom"; +import { useParams } from "react-router-dom"; import GlobalModel from "../common/GlobalModel"; -const ProjectInfra = ( {data, onDataChange, eachSiteEngineer} ) => -{ +const ProjectInfra = ({ data, onDataChange, eachSiteEngineer }) => { // const projectId = useSelector((store)=>store.localVariables.projectId) const projectId = useSelectedProject(); const reloadedData = useSelector((store) => store.localVariables.reload); - const [ expandedBuildings, setExpandedBuildings ] = useState( [] ); - const {projectInfra,isLoading,error} = useProjectInfra(projectId) + const [expandedBuildings, setExpandedBuildings] = useState([]); + const { projectInfra, isLoading, error } = useProjectInfra(projectId) const { projects_Details, refetch, loading } = useProjectDetails(data?.id); - const [ project, setProject ] = useState( projects_Details ); + const [project, setProject] = useState(projects_Details); const ManageInfra = useHasUserPermission(MANAGE_PROJECT_INFRA); const ManageTask = useHasUserPermission(MANAGE_TASK) const [showModalFloor, setshowModalFloor] = useState(false); @@ -58,29 +57,29 @@ const ProjectInfra = ( {data, onDataChange, eachSiteEngineer} ) => return ( <> - {showModalBuilding && setshowModalBuilding( false )}> + {showModalBuilding && setshowModalBuilding(false)}> setshowModalBuilding( false )} + onClose={() => setshowModalBuilding(false)} /> - } - {showModalFloor && setshowModalFloor(false)}> + } + {showModalFloor && setshowModalFloor(false)}> setshowModalFloor(false)} - /> + project={projectInfra} + onClose={() => setshowModalFloor(false)} + /> } - {showModalWorkArea && setshowModalWorkArea(false)} > - setshowModalWorkArea(false)} - /> + {showModalWorkArea && setshowModalWorkArea(false)} > + setshowModalWorkArea(false)} + /> } - {showModalTask && ( setshowModalTask(false)}> + {showModalTask && ( setshowModalTask(false)}> setshowModalTask(false)} - /> + project={projectInfra} + onClose={() => setshowModalTask(false)} + /> )}
@@ -88,38 +87,59 @@ const ProjectInfra = ( {data, onDataChange, eachSiteEngineer} ) =>
- {ManageInfra && (<> - - - )} - + +
+ + {/* Buttons Section (aligned to right) */} +
+ {ManageInfra && ( + <> + + + )} + {(ManageTask || ManageInfra) && (
- {/* Buttons Section (aligned to right) */}
{ManageInfra && ( From 7d17422681e73d55e1720203bcd569ce5a733470 Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Fri, 19 Sep 2025 16:02:36 +0530 Subject: [PATCH 04/16] Calling Api for Services dropdown. --- src/components/Project/Teams.jsx | 50 ++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/src/components/Project/Teams.jsx b/src/components/Project/Teams.jsx index e39a4b13..fcac139e 100644 --- a/src/components/Project/Teams.jsx +++ b/src/components/Project/Teams.jsx @@ -17,6 +17,7 @@ import eventBus from "../../services/eventBus"; import { useEmployeesByProjectAllocated, useManageProjectAllocation, + useProjectAssignedServices, } from "../../hooks/useProjects"; import { useSelectedProject } from "../../slices/apiDataManager"; @@ -35,6 +36,13 @@ const Teams = () => { const [activeEmployee, setActiveEmployee] = useState(true); const [deleteEmployee, setDeleteEmplyee] = useState(null); const [searchTerm, setSearchTerm] = useState(""); // State for search term + const { data: assignedServices, isLoading: servicesLoading } = useProjectAssignedServices(projectId); + + const [selectedService, setSelectedService] = useState(""); + + const handleServiceChange = (e) => { + setSelectedService(e.target.value); + }; const navigate = useNavigate(); @@ -266,25 +274,29 @@ const Teams = () => {
{/* Services-Dropdown */} -
- -
+
+ +
Date: Fri, 19 Sep 2025 16:13:09 +0530 Subject: [PATCH 05/16] Adding Dropdown in Create Task Popup. --- .../Project/Infrastructure/TaskModel.jsx | 43 ++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/src/components/Project/Infrastructure/TaskModel.jsx b/src/components/Project/Infrastructure/TaskModel.jsx index f0bb5c35..e7c1438d 100644 --- a/src/components/Project/Infrastructure/TaskModel.jsx +++ b/src/components/Project/Infrastructure/TaskModel.jsx @@ -6,9 +6,10 @@ import { useActivitiesMaster, useWorkCategoriesMaster, } from "../../../hooks/masterHook/useMaster"; -import { useManageTask } from "../../../hooks/useProjects"; +import { useManageTask, useProjectAssignedServices } from "../../../hooks/useProjects"; import showToast from "../../../services/toastService"; import Label from "../../common/Label"; +import { useSelectedProject } from "../../../slices/apiDataManager"; const taskSchema = z.object({ buildingID: z.string().min(1, "Building is required"), @@ -37,6 +38,15 @@ const TaskModel = ({ project, onSubmit, onClose }) => { const { activities, loading: activityLoading } = useActivitiesMaster(); const { categories, categoryLoading } = useWorkCategoriesMaster(); + const projectId = useSelectedProject(); + + const { data: assignedServices, isLoading: servicesLoading } = useProjectAssignedServices(projectId); + + const [selectedService, setSelectedService] = useState(""); + + const handleServiceChange = (e) => { + setSelectedService(e.target.value); + }; const { register, handleSubmit, @@ -96,10 +106,12 @@ const TaskModel = ({ project, onSubmit, onClose }) => { }, [categories]); const onSubmitForm = async (data) => { - const payload = [data]; - CreateTask({payload:payload,buildingId: data.buildingID, + const payload = [data]; + CreateTask({ + payload: payload, buildingId: data.buildingID, floorId: data.floorId, - workAreaId: data.workAreaId, PreviousPlannedWork:0,previousCompletedWork:0}); + workAreaId: data.workAreaId, PreviousPlannedWork: 0, previousCompletedWork: 0 + }); }; return ( @@ -107,6 +119,27 @@ const TaskModel = ({ project, onSubmit, onClose }) => {
Manage Task
+
+ + + {errors.buildingID && ( +

{errors.buildingID.message}

+ )} +
+ {servicesLoading && } + {assignedServices?.map((service) => ( + + ))} + +
+ + {/* 🔹 InfraPlanning only when project is selected */} {selectedProject ? ( - + ) : (
Please Select Project
)} From e9d8b6daea9f1b0cdf4ad976f4d5f3f7f4ad768d Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Fri, 19 Sep 2025 16:43:44 +0530 Subject: [PATCH 07/16] Adding Dropdown and API call in Daily Progress Report. --- src/pages/Activities/DailyTask.jsx | 58 +++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/src/pages/Activities/DailyTask.jsx b/src/pages/Activities/DailyTask.jsx index fc51f756..87bc52e2 100644 --- a/src/pages/Activities/DailyTask.jsx +++ b/src/pages/Activities/DailyTask.jsx @@ -1,7 +1,7 @@ import React, { useEffect, useMemo, useState } from "react"; import { useDispatch } from "react-redux"; import { useTaskList } from "../../hooks/useTasks"; -import { useProjectName } from "../../hooks/useProjects"; +import { useProjectAssignedServices, useProjectName } from "../../hooks/useProjects"; import { setProjectId } from "../../slices/localVariablesSlice"; import Breadcrumb from "../../components/common/Breadcrumb"; import DateRangePicker from "../../components/common/DateRangePicker"; @@ -24,6 +24,14 @@ const DailyTask = () => { const ApprovedTaskRights = useHasUserPermission(APPROVE_TASK); const ReportTaskRights = useHasUserPermission(ASSIGN_REPORT_TASK); + const { data: assignedServices, isLoading: servicesLoading } = useProjectAssignedServices(selectedProject); + + const [selectedService, setSelectedService] = useState(""); + + const handleServiceChange = (e) => { + setSelectedService(e.target.value); + }; + const [filters, setFilters] = useState({ selectedBuilding: "", selectedFloors: [], @@ -38,7 +46,6 @@ const DailyTask = () => { dateRange?.endDate || null ); - // Ensure project is set useEffect(() => { if (!selectedProject && projectNames.length > 0) { debugger @@ -46,7 +53,6 @@ const DailyTask = () => { } }, [selectedProject, projectNames, dispatch]); - // 🔹 Reset filters when project changes useEffect(() => { setFilters({ selectedBuilding: "", @@ -55,7 +61,6 @@ const DailyTask = () => { }); }, [selectedProject]); - // Memoized filtering const filteredTasks = useMemo(() => { if (!TaskList) return []; return TaskList.filter((task) => { @@ -69,7 +74,6 @@ const DailyTask = () => { }); }, [TaskList, filters]); - // Memoized dates const groupedTasks = useMemo(() => { const groups = {}; filteredTasks.forEach((task) => { @@ -82,13 +86,11 @@ const DailyTask = () => { .map((date) => ({ date, tasks: groups[date] })); }, [filteredTasks]); - // --- Modal State const [modal, setModal] = useState({ type: null, data: null }); const openModal = (type, data = null) => setModal({ type, data }); const closeModal = () => setModal({ type: null, data: null }); - // --- Render helpers const renderTeamMembers = (task, refIndex) => (
{ return ( <> - {/* --- Modals --- */} {modal.type === "report" && ( @@ -165,7 +166,7 @@ const DailyTask = () => {
{!selectedProject && (
Please Select Project
)} {/* --- Filters --- */} -
+ {/*
{ currentSelectedActivities={filters.selectedActivities} selectedProject={selectedProject} /> +
*/} + +
+ +
+ + +
+ +
+ +
+ + {/* --- Table --- */}
From 1da587d010a33042a47512c357942231772329ab Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Fri, 19 Sep 2025 19:13:02 +0530 Subject: [PATCH 08/16] Adding condition if single or no project assigned then dropdown is not shown --- src/components/Project/Teams.jsx | 87 ++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 39 deletions(-) diff --git a/src/components/Project/Teams.jsx b/src/components/Project/Teams.jsx index fcac139e..afde352a 100644 --- a/src/components/Project/Teams.jsx +++ b/src/components/Project/Teams.jsx @@ -37,6 +37,7 @@ const Teams = () => { const [deleteEmployee, setDeleteEmplyee] = useState(null); const [searchTerm, setSearchTerm] = useState(""); // State for search term const { data: assignedServices, isLoading: servicesLoading } = useProjectAssignedServices(projectId); + const handleToggleActive = e => setActiveEmployee(e.target.checked); const [selectedService, setSelectedService] = useState(""); @@ -262,22 +263,10 @@ const Teams = () => {
-
- -
- {/* Services-Dropdown */} - -
+
+ {servicesLoading ? ( + Loading... + ) : assignedServices?.length > 1 ? ( -
-
-
-
- + {assignedServices?.length === 1 + ? assignedServices[0].name + : "No service available"} +
+ )}
- +
+ +
+ +
+
+
+ + +
{/* Buttons Section (aligned to right) */}
From 00d6774e06c95111b3e1710db62d19d02d4c679f Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Fri, 19 Sep 2025 19:26:46 +0530 Subject: [PATCH 10/16] Change the position of Services in Create Task popup in Infrastructure. --- .../Project/Infrastructure/TaskModel.jsx | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/src/components/Project/Infrastructure/TaskModel.jsx b/src/components/Project/Infrastructure/TaskModel.jsx index e7c1438d..9c65fa6f 100644 --- a/src/components/Project/Infrastructure/TaskModel.jsx +++ b/src/components/Project/Infrastructure/TaskModel.jsx @@ -119,27 +119,6 @@ const TaskModel = ({ project, onSubmit, onClose }) => {
Manage Task
-
- - - {errors.buildingID && ( -

{errors.buildingID.message}

- )} -
+ {servicesLoading && } + {assignedServices?.map((service) => ( + + ))} + + {errors.buildingID && ( +

{errors.buildingID.message}

+ )} +
+ )} + + {/* Activity Selection */} {selectedWorkArea && (
@@ -225,6 +231,7 @@ const TaskModel = ({ project, onSubmit, onClose }) => {
)} + {selectedWorkArea && (
From 27b62c858df737cb29933ff26f404576d294d6b8 Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Fri, 19 Sep 2025 19:50:50 +0530 Subject: [PATCH 11/16] Change the position of Datepicker and Dropdown box. --- src/pages/Activities/DailyTask.jsx | 86 +++++++++++++++++------------- 1 file changed, 48 insertions(+), 38 deletions(-) diff --git a/src/pages/Activities/DailyTask.jsx b/src/pages/Activities/DailyTask.jsx index 87bc52e2..b935b0a6 100644 --- a/src/pages/Activities/DailyTask.jsx +++ b/src/pages/Activities/DailyTask.jsx @@ -165,28 +165,48 @@ const DailyTask = () => {
{!selectedProject && (
Please Select Project
)} - {/* --- Filters --- */} - {/*
- - -
*/}
-
- + {/* --- Left: Service Dropdown + Filter Icon --- */} +
+
+ {servicesLoading ? ( + Loading... + ) : assignedServices?.length > 1 ? ( + + ) : ( +
+ {assignedServices?.length === 1 + ? assignedServices[0].name + : "No service available"} +
+ )} +
+ { />
-
- + {/* --- Right: DateRangePicker --- */} +
+
- - - {/* --- Table --- */}
@@ -288,4 +298,4 @@ const DailyTask = () => { ); }; -export default DailyTask; +export default DailyTask; \ No newline at end of file From 9223f7a1768ea61544224d76bce87212d2965fc7 Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Fri, 19 Sep 2025 20:03:36 +0530 Subject: [PATCH 12/16] Adding Card in Daily Progress Report. --- src/components/Activities/InfraPlanning.jsx | 4 +- src/components/Project/ProjectInfra.jsx | 2 +- src/pages/Activities/TaskPlannng.jsx | 70 ++++++++++++++------- 3 files changed, 49 insertions(+), 27 deletions(-) diff --git a/src/components/Activities/InfraPlanning.jsx b/src/components/Activities/InfraPlanning.jsx index dc237c63..0e9c9590 100644 --- a/src/components/Activities/InfraPlanning.jsx +++ b/src/components/Activities/InfraPlanning.jsx @@ -55,7 +55,7 @@ const InfraPlanning = () => { if (isFetched && (!projectInfra || projectInfra.length === 0)) { return ( -
+

No Result Found

); @@ -63,11 +63,9 @@ const InfraPlanning = () => { return (
-
-
diff --git a/src/components/Project/ProjectInfra.jsx b/src/components/Project/ProjectInfra.jsx index 38c05567..a0a137cf 100644 --- a/src/components/Project/ProjectInfra.jsx +++ b/src/components/Project/ProjectInfra.jsx @@ -129,7 +129,7 @@ const ProjectInfra = ( {data, onDataChange, eachSiteEngineer} ) =>
{isLoading &&

Loading....

} {projectInfra && projectInfra?.length > 0 && ( - { const selectedProject = useSelectedProject(); const dispatch = useDispatch(); @@ -35,30 +36,53 @@ const TaskPlannng = () => { ]} /> - {/* 🔹 Service Dropdown */} -
- -
+
+
+ {/* Service Dropdown */} +
+ {assignedServices?.length > 1 ? ( + + ) : ( +
+ {assignedServices?.length === 1 + ? assignedServices[0].name + : "No service available"} +
+ )} +
- {/* 🔹 InfraPlanning only when project is selected */} - {selectedProject ? ( - - ) : ( -
Please Select Project
- )} + + {/* Infra Planning Component */} + {selectedProject ? ( + + ) : ( +
Please Select Project
+ )} +
+
); }; From b39df5f6653843a1cf492a915717013be64a6ccf Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Sat, 20 Sep 2025 11:21:56 +0530 Subject: [PATCH 13/16] Changes in Teams dropdown. --- src/components/Project/Teams.jsx | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/components/Project/Teams.jsx b/src/components/Project/Teams.jsx index afde352a..ab048c89 100644 --- a/src/components/Project/Teams.jsx +++ b/src/components/Project/Teams.jsx @@ -265,7 +265,7 @@ const Teams = () => {
{servicesLoading ? ( - Loading... + ) : assignedServices?.length > 1 ? (
+
*/}
-
+
{ {activeEmployee ? "Active Employees" : "Inactive Employees"}
+
+ +
diff --git a/src/components/Project/ProjectInfra.jsx b/src/components/Project/ProjectInfra.jsx index 86195381..0669c136 100644 --- a/src/components/Project/ProjectInfra.jsx +++ b/src/components/Project/ProjectInfra.jsx @@ -90,7 +90,7 @@ const ProjectInfra = ({ data, onDataChange, eachSiteEngineer }) => { id="DataTables_Table_0_length" > {servicesLoading ? ( - Loading... + ) : assignedServices?.length > 1 ? (