From 7a0671e1ac02c27eeb415eedf422796b515163b2 Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Mon, 24 Nov 2025 11:02:24 +0530 Subject: [PATCH] Adding lIst view. --- .../ServiceProjectTeam/ServiceProjectList.jsx | 227 ++++++++++++++++++ .../ServiceProject/ServiceProjectDisplay.jsx | 4 +- 2 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 src/components/ServiceProject/ServiceProjectTeam/ServiceProjectList.jsx diff --git a/src/components/ServiceProject/ServiceProjectTeam/ServiceProjectList.jsx b/src/components/ServiceProject/ServiceProjectTeam/ServiceProjectList.jsx new file mode 100644 index 00000000..e79750f0 --- /dev/null +++ b/src/components/ServiceProject/ServiceProjectTeam/ServiceProjectList.jsx @@ -0,0 +1,227 @@ +import React, { useState } from "react"; +import { MANAGE_PROJECT,PROJECT_STATUS } from "../../../utils/constants"; +import { useProjects } from "../../../hooks/useProjects"; +import { formatNumber,formatUTCToLocalTime } from "../../../utils/dateUtils"; +import ProgressBar from "../../common/ProgressBar"; +import { getProjectStatusColor,getProjectStatusName } from "../../../utils/projectStatus"; +import { useDispatch } from "react-redux"; +import { setProjectId } from "../../../slices/localVariablesSlice"; +import { useNavigate } from "react-router-dom"; +import { useHasUserPermission } from "../../../hooks/useHasUserPermission"; +import { useProjectContext } from "../../../pages/project/ProjectPage"; +import usePagination from "../../../hooks/usePagination"; +import Pagination from "../../common/Pagination"; + +const ServiceProjectList = ({ data, currentPage, totalPages, paginate }) => { + const dispatch = useDispatch(); + const navigate = useNavigate(); + const { setMangeProject } = useProjectContext(); + // const { data, isLoading, isError, error } = useProjects(); + + // check Permissions + const canManageProject = useHasUserPermission(MANAGE_PROJECT); + + const projectColumns = [ + { + key: "projectName", + label: "Project Name", + className: "text-start py-3", + getValue: (p) => ( +
{ + dispatch(setProjectId(p.id)); + navigate(`/projects/details`); + }} + > + {p.shortName ? `${p.name} (${p.shortName})` : p.name} +
+ ), + }, + { + key: "contactPerson", + label: "Contact Person", + className: "text-start small", + getValue: (p) => `${p?.contactPerson ?? ""}`.trim() || "N/A", + }, + { + key: "startDate", + label: "Start Date", + className: "text-center small", + getValue: (p) => formatUTCToLocalTime(p?.startDate) || "N/A", + }, + { + key: "deadline", + label: "Deadline", + className: "text-center small", + getValue: (p) => formatUTCToLocalTime(p?.endDate) || "N/A", + }, + { + key: "task", + label: "Task", + colSpan: 2, + className: "text-center small", + getValue: (p) => formatNumber(p?.plannedWork) || "0", + }, + { + key: "progress", + label: "Progress", + className: "text-start small", + + getValue: (p) => ( + + ), + }, + { + key: "status", + label: "Status", + className: "text-center small", + isFilter: true, + customRender: (_, selectedStatuses, handleStatusChange) => ( +
+ +
    + {PROJECT_STATUS.map(({ id, label }) => ( +
  • +
    + handleStatusChange(id)} + /> + +
    +
  • + ))} +
+
+ ), + getValue: (p) => ( + + {getProjectStatusName(p.projectStatusId)} + + ), + }, + ]; + + const handleViewActivities = (project) => { + dispatch(setProjectId(project)); + navigate(`/activities/records?project=${project}`); + }; + + return ( +
+
+ + + + {projectColumns.map((col) => ( + + ))} + + + + + {data?.map((project) => ( + + {projectColumns.map((col) => ( + + ))} + + + ))} + +
+ {col.label} + Action
+ {col.getValue + ? col.getValue(project) + : project[col.key] || "N/A"} + + +
+
+ + +
+ ); +}; + +export default ServiceProjectList; diff --git a/src/pages/ServiceProject/ServiceProjectDisplay.jsx b/src/pages/ServiceProject/ServiceProjectDisplay.jsx index 1d59f1f2..528a0683 100644 --- a/src/pages/ServiceProject/ServiceProjectDisplay.jsx +++ b/src/pages/ServiceProject/ServiceProjectDisplay.jsx @@ -11,6 +11,7 @@ import GlobalModel from "../../components/common/GlobalModel"; import ManageServiceProject from "../../components/ServiceProject/ManageServiceProject"; import { SpinnerLoader } from "../../components/common/Loader"; import ServiceProjectCard from "../../components/ServiceProject/ServiceProjectTeam/ServiceProjectCard"; +import ServiceProjectList from "../../components/ServiceProject/ServiceProjectTeam/ServiceProjectList"; const ServiceProjectDisplay = ({ listView ,selectedStatuses }) => { const [currentPage, setCurrentPage] = useState(1); @@ -49,7 +50,8 @@ const ServiceProjectDisplay = ({ listView ,selectedStatuses }) => { return (
{listView ? ( -

List

+ //

List

+ ) : ( filteredProjects?.map((project) => (