diff --git a/src/components/ServiceProject/JobList.jsx b/src/components/ServiceProject/JobList.jsx index 8a7f1639..0cf9b3cc 100644 --- a/src/components/ServiceProject/JobList.jsx +++ b/src/components/ServiceProject/JobList.jsx @@ -4,17 +4,20 @@ import { getJobStatusBadge, getNextBadgeColor, } from "../../utils/appUtils"; -import { useServiceProjectJobs } from "../../hooks/useServiceProject"; -import { ITEMS_PER_PAGE } from "../../utils/constants"; +import { useServiceProjectJobs, useUpdateServiceProjectJob } from "../../hooks/useServiceProject"; +import { ITEMS_PER_PAGE, JOBS_STATUS_IDS } from "../../utils/constants"; import EmployeeAvatarGroup from "../common/EmployeeAvatarGroup"; import { formatUTCToLocalTime } from "../../utils/dateUtils"; import { SpinnerLoader } from "../common/Loader"; import { useParams } from "react-router-dom"; import ProjectPage from "../../pages/project/ProjectPage"; import { useServiceProjectJobContext } from "./Jobs"; +import ConfirmModal from "../common/ConfirmModal"; const JobList = () => { const { setSelectedJob, setManageJob } = useServiceProjectJobContext(); + const { mutate: UpdateJob } = useUpdateServiceProjectJob(() => { + }); const { projectId } = useParams(); const { data, isLoading, isError, error } = useServiceProjectJobs( ITEMS_PER_PAGE, @@ -22,6 +25,29 @@ const JobList = () => { true, projectId ); + const [isArchiveModalOpen, setIsArchiveModalOpen] = useState(false); + const [archiveJobId, setArchiveJobId] = useState(null); + + + const handleArchive = () => { + const payload = [ + { + op: "replace", + path: "/isArchive", + value: true, + }, + ]; + + UpdateJob({ + id: archiveJobId, + payload, + isArchiveAction: true, + }); + + setIsArchiveModalOpen(false); + setArchiveJobId(null); + }; + const jobGrid = [ { @@ -86,65 +112,85 @@ const JobList = () => { }, ]; + const canArchive = (statusId) => { + const closedId = JOBS_STATUS_IDS.find((s) => s.label === "Closed")?.id; + const workDoneId = JOBS_STATUS_IDS.find((s) => s.label === "Work Done")?.id; + + return statusId === closedId || statusId === workDoneId; + }; + + return ( -
- - - - {jobGrid.map((col) => ( -
-
{col.label}
+ <> + + {isArchiveModalOpen && ( + setIsArchiveModalOpen(false)} + loading={false} + /> + )} + +
+ + + + {jobGrid.map((col) => ( + + ))} + - ))} - - - + + - - {Array.isArray(data?.data) && data.data.length > 0 ? ( - data.data.map((row, i) => ( - - {jobGrid.map((col) => ( - - ))} - + {jobGrid.map((col) => ( + + ))} + + + )) + ) : ( + + - )) - ) : ( - - - - )} - -
+
{col.label}
+
+ Actions - Actions -
- setSelectedJob({ showCanvas: true, job: row?.id }) - } - > - {col.getValue(row)} - -
-
+ setSelectedJob({ showCanvas: true, job: row?.id }) + } > - - -
+ {col.getValue(row)} +
+
- - <> +
+ + <> - + + + {canArchive(row?.status?.id) && ( + + )} + +
- +
+ {isLoading ? : "Not Found Jobs."}
- {isLoading ? : "Not Found Jobs."} -
-
+ )} + +
+
+ ); }; diff --git a/src/components/common/ConfirmModal.jsx b/src/components/common/ConfirmModal.jsx index dd0158eb..d2f10213 100644 --- a/src/components/common/ConfirmModal.jsx +++ b/src/components/common/ConfirmModal.jsx @@ -17,7 +17,7 @@ const ConfirmModal = ({ case "delete": return ; case "success": - return ; + return ; case "warning": return ; default: diff --git a/src/hooks/useServiceProject.jsx b/src/hooks/useServiceProject.jsx index bc0c269d..293e5e8a 100644 --- a/src/hooks/useServiceProject.jsx +++ b/src/hooks/useServiceProject.jsx @@ -257,19 +257,27 @@ export const useCreateServiceProjectJob = (onSuccessCallback) => { export const useUpdateServiceProjectJob = (onSuccessCallback) => { const queryClient = useQueryClient(); + return useMutation({ - mutationFn: async ({ id, payload }) => { - // Call the repository patch + mutationFn: async ({ id, payload, isArchiveAction = false }) => { const resp = await ServiceProjectRepository.UpdateJob(id, payload); - return resp; + return { resp, isArchiveAction }; }, - onSuccess: () => { + + onSuccess: ({ isArchiveAction }) => { queryClient.invalidateQueries({ queryKey: ["serviceProjectJobs"] }); queryClient.invalidateQueries({ queryKey: ["service-job"] }); + if (onSuccessCallback) onSuccessCallback(); - showToast("Job Updated successfully", "success"); + + if (isArchiveAction) { + showToast("Job archived successfully", "success"); + } else { + showToast("Job Updated successfully", "success"); + } }, + onError: (error) => { showToast( error?.response?.data?.message || @@ -281,6 +289,7 @@ export const useUpdateServiceProjectJob = (onSuccessCallback) => { }); }; + //#endregion //#region Branch @@ -384,7 +393,7 @@ export const useDeleteBranch = () => { const queryClient = useQueryClient(); return useMutation({ - mutationFn: async ({ id, isActive}) => + mutationFn: async ({ id, isActive }) => await ServiceProjectRepository.DeleteBranch(id, isActive), onSuccess: () => { diff --git a/src/utils/constants.jsx b/src/utils/constants.jsx index 2375b010..1ca271ec 100644 --- a/src/utils/constants.jsx +++ b/src/utils/constants.jsx @@ -210,4 +210,35 @@ export const PAYEE_RECURRING_EXPENSE = [ //#region Service Project and Jobs export const STATUS_JOB_CLOSED = "3ddeefb5-ae3c-4e10-a922-35e0a452bb69" -//#endregion \ No newline at end of file +//#endregion + +export const JOBS_STATUS_IDS = [ + { + id: "32d76a02-8f44-4aa0-9b66-c3716c45a918", + label: "New", + }, + { + id: "cfa1886d-055f-4ded-84c6-42a2a8a14a66", + label: "Assigned", + }, + { + id: "5a6873a5-fed7-4745-a52f-8f61bf3bd72d", + label: "In Progress", + }, + { + id: "aab71020-2fb8-44d9-9430-c9a7e9bf33b0", + label: "Work Done", + }, + { + id: "ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7", + label: "Review Done", + }, + { + id: "3ddeefb5-ae3c-4e10-a922-35e0a452bb69", + label: "Closed", + }, + { + id: "75a0c8b8-9c6a-41af-80bf-b35bab722eb2", + label: "On Hold", + }, +]; \ No newline at end of file