added iniial state of daly progress filte panel

This commit is contained in:
pramod.mahajan 2025-09-25 19:30:55 +05:30
parent 69c225ac72
commit fb08e48edd
11 changed files with 139 additions and 41 deletions

View File

@ -1,4 +1,3 @@
import React, { useState, useEffect } from "react"; import React, { useState, useEffect } from "react";
import "../../components/Project/ProjectInfra.css"; import "../../components/Project/ProjectInfra.css";
import BuildingModel from "../Project/Infrastructure/BuildingModel"; import BuildingModel from "../Project/Infrastructure/BuildingModel";
@ -8,25 +7,33 @@ import WorkAreaModel from "../Project/Infrastructure/WorkAreaModel";
import TaskModel from "../Project/Infrastructure/TaskModel"; import TaskModel from "../Project/Infrastructure/TaskModel";
import ProjectRepository from "../../repositories/ProjectRepository"; import ProjectRepository from "../../repositories/ProjectRepository";
import Breadcrumb from "../../components/common/Breadcrumb"; import Breadcrumb from "../../components/common/Breadcrumb";
import {useProjectDetails, useProjectInfra, useProjects} from "../../hooks/useProjects"; import {
import {useHasUserPermission} from "../../hooks/useHasUserPermission"; useCurrentService,
import {APPROVE_TASK, ASSIGN_REPORT_TASK, MANAGE_PROJECT_INFRA} from "../../utils/constants"; useProjectDetails,
import {useDispatch, useSelector} from "react-redux"; useProjectInfra,
import {useProfile} from "../../hooks/useProfile"; useProjects,
import {refreshData, setProjectId} from "../../slices/localVariablesSlice"; } from "../../hooks/useProjects";
import { useHasUserPermission } from "../../hooks/useHasUserPermission";
import {
APPROVE_TASK,
ASSIGN_REPORT_TASK,
MANAGE_PROJECT_INFRA,
} from "../../utils/constants";
import { useDispatch, useSelector } from "react-redux";
import { useProfile } from "../../hooks/useProfile";
import { refreshData, setProjectId } from "../../slices/localVariablesSlice";
import InfraTable from "../Project/Infrastructure/InfraTable"; import InfraTable from "../Project/Infrastructure/InfraTable";
import { useSelectedProject } from "../../slices/apiDataManager"; import { useSelectedProject } from "../../slices/apiDataManager";
import Loader from "../common/Loader"; import Loader from "../common/Loader";
const InfraPlanning = () => { const InfraPlanning = () => {
const { profile: LoggedUser, refetch: fetchData } = useProfile(); const { profile: LoggedUser, refetch: fetchData } = useProfile();
const dispatch = useDispatch(); const dispatch = useDispatch();
const selectedProject = useSelectedProject(); const selectedProject = useSelectedProject();
const selectedService = useCurrentService();
const { projectInfra, isLoading, isError, error, isFetched } = useProjectInfra(selectedProject); const { projectInfra, isLoading, isError, error, isFetched } =
useProjectInfra(selectedProject, selectedService || "" );
const canManageInfra = useHasUserPermission(MANAGE_PROJECT_INFRA); const canManageInfra = useHasUserPermission(MANAGE_PROJECT_INFRA);
const canApproveTask = useHasUserPermission(APPROVE_TASK); const canApproveTask = useHasUserPermission(APPROVE_TASK);
@ -63,9 +70,9 @@ const InfraPlanning = () => {
return ( return (
<div className="col-md-12 col-lg-12 col-xl-12 order-0 mb-4"> <div className="col-md-12 col-lg-12 col-xl-12 order-0 mb-4">
<div className="card-body" style={{ padding: "0.5rem" }}> <div className="card-body" style={{ padding: "0.5rem" }}>
<div className="row"> <div className="row">
<InfraTable buildings={projectInfra} projectId={selectedProject} /> <InfraTable buildings={projectInfra} projectId={selectedProject} />
</div> </div>
</div> </div>
</div> </div>
@ -73,4 +80,3 @@ const InfraPlanning = () => {
}; };
export default InfraPlanning; export default InfraPlanning;

View File

@ -1,10 +1,68 @@
import React from 'react' import React, { useState } from 'react'
import { useCurrentService, useProjectInfra } from '../../hooks/useProjects'
import { useSelectedProject } from '../../slices/apiDataManager';
import { FormProvider, useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { TaskReportDefaultValue, TaskReportFilterSchema } from './TaskRportScheam';
import { DateRangePicker1 } from '../common/DateRangePicker';
import SelectMultiple from '../common/SelectMultiple';
const TaskReportFilterPanel = () => { const TaskReportFilterPanel = () => {
const [resetKey, setResetKey] = useState(0);
const selectedProjec = useSelectedProject()
const selectedService = useCurrentService();
const {projectInfra, isLoading, error, isFetched } = useProjectInfra(selectedProjec,selectedService);
const methods = useForm({resolver:zodResolver(TaskReportFilterSchema),defaultValues:TaskReportDefaultValue})
const {register,reset,handleSubmit, formState:{errors}} = methods;
const onSubmit =(formData)=>{}
return ( return (
<div> <FormProvider {...methods}>
<form onSubmit={handleSubmit(onSubmit)} className="p-2 text-start">
</div> <div className="mb-3 w-100">
<label className="fw-semibold">Choose Date Range:</label>
<DateRangePicker1
placeholder="DD-MM-YYYY To DD-MM-YYYY"
startField="startDate"
endField="endDate"
resetSignal={resetKey}
defaultRange={false}
/>
</div>
<div className="row g-2">
<SelectMultiple
name="buildingIds"
label="Projects"
options={projectInfra}
labelKey="buildingName"
valueKey="id"
/>
</div>
<div className="row g-2">
<SelectMultiple
name="floorIds"
label="Floor"
options={projectInfra}
labelKey="floorName"
valueKey="id"
/>
</div>
<div className="d-flex justify-content-end py-3 gap-2">
<button
type="button"
className="btn btn-label-secondary btn-xs"
>
Clear
</button>
<button type="submit" className="btn btn-primary btn-xs">
Apply
</button>
</div>
</form>
</FormProvider>
) )
} }

View File

@ -0,0 +1,15 @@
import { z } from "zod";
export const TaskReportFilterSchema = z.object({
buildingIds: z.array(z.string()).optional(),
floorIds: z.array(z.string()).optional(),
startDate: z.string().optional(),
endDate: z.string().optional(),
});
export const TaskReportDefaultValue = {
buildingIds:[],
floorIds:[],
startDate:null,
endDate:null
}

View File

@ -49,7 +49,9 @@ const ManageProjectInfo = ({ project, handleSubmitForm, onClose, isPending }) =>
.default(currentDate), .default(currentDate),
projectStatusId: z projectStatusId: z
.string() .string()
.min(1, { message: "Status is required" }) .min(1, { message: "Status is required" }),
promoterId:z.string().min(1,{message:"Promoter is required"}),
pmcId:z.string().min(1,{message:"PMC is required"})
}) })
.refine( .refine(
(data) => { (data) => {
@ -80,12 +82,13 @@ const ManageProjectInfo = ({ project, handleSubmitForm, onClose, isPending }) =>
projectAddress: project?.projectAddress || "", projectAddress: project?.projectAddress || "",
startDate: formatDate(project?.startDate) || currentDate, startDate: formatDate(project?.startDate) || currentDate,
endDate: formatDate(project?.endDate) || currentDate, endDate: formatDate(project?.endDate) || currentDate,
// projectStatusId: String(project?.projectStatusId || "00000000-0000-0000-0000-000000000000"),
projectStatusId: project?.projectStatusId && project.projectStatusId !== DEFAULT_EMPTY_STATUS_ID projectStatusId: project?.projectStatusId && project.projectStatusId !== DEFAULT_EMPTY_STATUS_ID
? String(project.projectStatusId) ? String(project.projectStatusId)
: ACTIVE_STATUS_ID, : ACTIVE_STATUS_ID,
promoterId:project.promoterId,
pmcId:project.pmcId
}, },
mode: "onChange", mode: "onChange",
}); });

View File

@ -121,7 +121,7 @@ const MapUsers = ({
<button type="button" className="btn-close" data-bs-dismiss="modal" aria-label="Close"> <button type="button" className="btn-close" data-bs-dismiss="modal" aria-label="Close">
</button> </button>
</div> </div>
<p className="m-0 fw-semibold fs-5">Assign Employee</p> <p className="m-0 fw-semibold fs-5">Add Employee To Project</p>
<div className="px-4 mt-4 col-md-4 text-start"> <div className="px-4 mt-4 col-md-4 text-start">
{(filteredData.length > 0 || {(filteredData.length > 0 ||

View File

@ -35,7 +35,10 @@ const ProjectInfra = ({ data, onDataChange, eachSiteEngineer }) => {
const selectedService = useCurrentService(); const selectedService = useCurrentService();
const reloadedData = useSelector((store) => store.localVariables.reload); const reloadedData = useSelector((store) => store.localVariables.reload);
const [expandedBuildings, setExpandedBuildings] = useState([]); const [expandedBuildings, setExpandedBuildings] = useState([]);
const { projectInfra, isLoading, error } = useProjectInfra(projectId); const { projectInfra, isLoading, error } = useProjectInfra(
projectId,
selectedService
);
const { projects_Details, refetch, loading } = useProjectDetails(data?.id); 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 ManageInfra = useHasUserPermission(MANAGE_PROJECT_INFRA);
@ -48,7 +51,6 @@ const ProjectInfra = ({ data, onDataChange, eachSiteEngineer }) => {
const { data: assignedServices, isLoading: servicesLoading } = const { data: assignedServices, isLoading: servicesLoading } =
useProjectAssignedServices(projectId); useProjectAssignedServices(projectId);
useEffect(() => { useEffect(() => {
setProject(projectInfra); setProject(projectInfra);
}, [data, projects_Details]); }, [data, projects_Details]);

View File

@ -29,7 +29,7 @@ const ProjectAssignedOrgs = () => {
label: "Service Name", label: "Service Name",
getValue: (org) => ( getValue: (org) => (
<div className="d-flex gap-2 py-1 "> <div className="d-flex gap-2 py-1 ">
N/A {org?.service?.name}
</div> </div>
), ),
align: "text-start", align: "text-start",

View File

@ -190,17 +190,17 @@ export const useProjectName = () => {
}; };
}; };
export const useProjectInfra = (projectId) => { export const useProjectInfra = (projectId,serviceId) => {
const { const {
data: projectInfra, data: projectInfra,
isLoading, isLoading,
error, error,
isFetched, isFetched,
} = useQuery({ } = useQuery({
queryKey: ["ProjectInfra", projectId], queryKey: ["ProjectInfra", projectId,serviceId],
queryFn: async () => { queryFn: async () => {
if (!projectId) return null; if (!projectId) return null;
const res = await ProjectRepository.getProjectInfraByproject(projectId); const res = await ProjectRepository.getProjectInfraByproject(projectId,serviceId);
return res.data; return res.data;
}, },
enabled: !!projectId, enabled: !!projectId,

View File

@ -64,7 +64,7 @@ const TaskPlanning = () => {
{/* Planning Component */} {/* Planning Component */}
{selectedProject ? ( {selectedProject ? (
<InfraPlanning selectedService={selectedService} /> <InfraPlanning />
) : ( ) : (
<div className="text-center py-3">Please select a project</div> <div className="text-center py-3">Please select a project</div>
)} )}

View File

@ -87,10 +87,10 @@ const DailyProgrssReport = () => {
onChange={(e) => setService(e.target.value)} onChange={(e) => setService(e.target.value)}
> >
{isLoading ? ( {isLoading ? (
<option>Loading...</option> <option value="lading" disabled>Loading...</option>
) : ( ) : (
<> <>
<option value="" selected> <option value="">
All Services All Services
</option> </option>
{data?.data?.map((service) => ( {data?.data?.map((service) => (

View File

@ -19,7 +19,6 @@ const ProjectRepository = {
return api.get(url); return api.get(url);
}, },
getEmployeesByProject: (projectId) => getEmployeesByProject: (projectId) =>
api.get(`/api/Project/employees/get/${projectId}`), api.get(`/api/Project/employees/get/${projectId}`),
@ -42,7 +41,14 @@ const ProjectRepository = {
projectNameList: () => api.get("/api/project/list/basic"), projectNameList: () => api.get("/api/project/list/basic"),
getProjectDetails: (id) => api.get(`/api/project/details/${id}`), getProjectDetails: (id) => api.get(`/api/project/details/${id}`),
getProjectInfraByproject: (id) => api.get(`/api/project/infra-details/${id}`), getProjectInfraByproject: (projectId, serviceId) => {
let url = `/api/project/infra-details/${projectId}`;
if (serviceId) {
url + `?serviceId=${serviceId}`;
}
return api.get(url);
},
getProjectTasksByWorkArea: (workAreaId, serviceId) => { getProjectTasksByWorkArea: (workAreaId, serviceId) => {
let url = `/api/project/tasks/${workAreaId}`; let url = `/api/project/tasks/${workAreaId}`;
if (serviceId) { if (serviceId) {
@ -58,16 +64,24 @@ const ProjectRepository = {
// Permission Managment for Employee at Project Level // Permission Managment for Employee at Project Level
getProjectLevelEmployeeList: (projectId) => api.get(`/api/Project/get/proejct-level/employees/${projectId}`), getProjectLevelEmployeeList: (projectId) =>
getProjectLevelModules: () => api.get(`/api/Project/get/proejct-level/modules`), api.get(`/api/Project/get/proejct-level/employees/${projectId}`),
getProjectLevelEmployeePermissions: (employeeId, projectId) => api.get(`/api/Project/get/project-level-permission/employee/${employeeId}/project/${projectId}`), getProjectLevelModules: () =>
updateProjectLevelEmployeePermission: (data) => api.post(`/api/Project/assign/project-level-permission`, data), api.get(`/api/Project/get/proejct-level/modules`),
getAllProjectLevelPermission: (projectId) => api.get(`/api/Project/get/all/project-level-permission/${projectId}`), getProjectLevelEmployeePermissions: (employeeId, projectId) =>
api.get(
`/api/Project/get/project-level-permission/employee/${employeeId}/project/${projectId}`
),
updateProjectLevelEmployeePermission: (data) =>
api.post(`/api/Project/assign/project-level-permission`, data),
getAllProjectLevelPermission: (projectId) =>
api.get(`/api/Project/get/all/project-level-permission/${projectId}`),
// Services // Services
getProjectAssignedServices: (projectId) => api.get(`/api/Project/get/assigned/services/${projectId}`), getProjectAssignedServices: (projectId) =>
getProjectAssignedOrganizations: (projectId) => api.get(`/api/Project/get/assigned/organization/${projectId}`) api.get(`/api/Project/get/assigned/services/${projectId}`),
getProjectAssignedOrganizations: (projectId) =>
api.get(`/api/Project/get/assigned/organization/${projectId}`),
}; };
export const TasksRepository = { export const TasksRepository = {