From 679ae95b8c51da54061e3b77f50db5c1f0076526 Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Mon, 17 Nov 2025 15:21:31 +0530 Subject: [PATCH 1/3] Removing project selection at Job Creation. --- src/components/ServiceProject/ManageJob.jsx | 41 +++++++++------------ 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/src/components/ServiceProject/ManageJob.jsx b/src/components/ServiceProject/ManageJob.jsx index 8f151da3..d769470b 100644 --- a/src/components/ServiceProject/ManageJob.jsx +++ b/src/components/ServiceProject/ManageJob.jsx @@ -20,8 +20,11 @@ import { AppFormProvider, useAppForm, } from "../../hooks/appHooks/useAppForm"; +import { useParams } from "react-router-dom"; const ManageJob = ({ Job }) => { + const { projectId } = useParams(); + const methods = useAppForm({ resolver: zodResolver(jobSchema), defaultValues: defaultJobValue, @@ -54,7 +57,6 @@ const ManageJob = ({ Job }) => { isError: isJobError, error: jobError, } = useServiceProjectJobDetails(Job); - // const {} = useSer const { mutate: CreateJob, isPending } = useCreateServiceProjectJob(() => { reset(); @@ -68,22 +70,33 @@ const ManageJob = ({ Job }) => { formData.startDate = localToUtc(formData.startDate); formData.dueDate = localToUtc(formData.dueDate); + formData.projectId = projectId; CreateJob(formData); }; useEffect(() => { + if (!JobData && !Job) { + reset({ + ...defaultJobValue, + projectId: projectId, + }); + return; + } + if (!JobData || !Job) return; + const assignedEmployees = (JobData.assignees || []).map((e) => e.id); + reset({ title: JobData.title ?? "", description: JobData.description ?? "", - projectId: JobData.project.id ?? "", + projectId: JobData.project?.id ?? projectId, assignees: assignedEmployees, startDate: JobData.startDate ?? null, dueDate: JobData.dueDate ?? null, tags: JobData.tags ?? [], }); - }, [JobData]); + }, [JobData, Job, projectId]); return (
@@ -97,25 +110,7 @@ const ManageJob = ({ Job }) => { className="form-control form-control" />
-
- ( - - )} - /> -
+
{ minDate={watch("startDate")} name="dueDate" className="w-full" - size="md" + size="md" />
From 6598ec9f730c8b35d5c5a24aff117f59d5a79296 Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Mon, 17 Nov 2025 15:44:03 +0530 Subject: [PATCH 2/3] Adding placeholder and adding in TagInput a background color. --- src/components/Directory/ManageContact.jsx | 17 +++---- src/components/ServiceProject/ManageJob.jsx | 2 + src/components/common/TagInput.jsx | 49 +++++++++++---------- 3 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/components/Directory/ManageContact.jsx b/src/components/Directory/ManageContact.jsx index 56d45e32..f55ed858 100644 --- a/src/components/Directory/ManageContact.jsx +++ b/src/components/Directory/ManageContact.jsx @@ -23,7 +23,7 @@ import Label from "../common/Label"; const ManageContact = ({ contactId, closeModal }) => { // fetch master data const { buckets, loading: bucketsLoaging } = useBuckets(); - const { data:projects, loading: projectLoading } = useProjects(); + const { data: projects, loading: projectLoading } = useProjects(); const { contactCategory, loading: contactCategoryLoading } = useContactCategory(); const { organizationList } = useOrganization(); @@ -205,12 +205,12 @@ const ManageContact = ({ contactId, closeModal }) => { - setValue("organization", val, { shouldValidate: true })} - error={errors.organization?.message} -/> + setValue("organization", val, { shouldValidate: true })} + error={errors.organization?.message} + />
@@ -408,6 +408,7 @@ const ManageContact = ({ contactId, closeModal }) => { label="Tags" options={contactTags} isRequired={true} + placeholder="Enter Tag" /> {errors.tags && ( {errors.tags.message} @@ -482,7 +483,7 @@ const ManageContact = ({ contactId, closeModal }) => { - + diff --git a/src/components/ServiceProject/ManageJob.jsx b/src/components/ServiceProject/ManageJob.jsx index d769470b..3207957d 100644 --- a/src/components/ServiceProject/ManageJob.jsx +++ b/src/components/ServiceProject/ManageJob.jsx @@ -108,6 +108,7 @@ const ManageJob = ({ Job }) => { type="text" {...register("title")} className="form-control form-control" + placeholder="Enter Title" /> @@ -144,6 +145,7 @@ const ManageJob = ({ Job }) => { options={JobTags?.data} name="tags" label="Tag" + placeholder="Enter Tag" required /> diff --git a/src/components/common/TagInput.jsx b/src/components/common/TagInput.jsx index 3241d548..d0a015ae 100644 --- a/src/components/common/TagInput.jsx +++ b/src/components/common/TagInput.jsx @@ -2,7 +2,7 @@ import { useFormContext, useWatch } from "react-hook-form"; import React, { useEffect, useState } from "react"; import Label from "./Label"; -const TagInput = ({ label, name, placeholder, color = "#e9ecef", required=false, options = [] }) => { +const TagInput = ({ label, name, placeholder, color = "#e9ecef", required = false, options = [] }) => { const { setValue, watch } = useFormContext(); const tags = watch(name) || []; const [input, setInput] = useState(""); @@ -33,29 +33,29 @@ const TagInput = ({ label, name, placeholder, color = "#e9ecef", required=false, } }; -const handleChange = (e) => { - const val = e.target.value; - setInput(val); + const handleChange = (e) => { + const val = e.target.value; + setInput(val); - if (val) { - setSuggestions( - options - .filter((opt) => { - const label = typeof opt === "string" ? opt : opt.name; - return ( - label.toLowerCase().includes(val.toLowerCase()) && - !tags.some((t) => t.name === label) - ); - }) - .map((opt) => ({ - name: typeof opt === "string" ? opt : opt.name, - isActive: true, - })) - ); - } else { - setSuggestions([]); - } -}; + if (val) { + setSuggestions( + options + .filter((opt) => { + const label = typeof opt === "string" ? opt : opt.name; + return ( + label.toLowerCase().includes(val.toLowerCase()) && + !tags.some((t) => t.name === label) + ); + }) + .map((opt) => ({ + name: typeof opt === "string" ? opt : opt.name, + isActive: true, + })) + ); + } else { + setSuggestions([]); + } + }; const handleSuggestionClick = (sugg) => { handleAdd(sugg); @@ -105,6 +105,9 @@ const handleChange = (e) => { outline: "none", flex: 1, minWidth: "120px", + backgroundColor: "white", + color: "black" + }} /> From 78eafd2e5a5ca29125fe67c3f2e8562237ba71d4 Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Mon, 17 Nov 2025 16:15:36 +0530 Subject: [PATCH 3/3] Showing ProjectName at the breadcrum in Services Project. --- .../ServiceProject/ServiceProjectDetail.jsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/pages/ServiceProject/ServiceProjectDetail.jsx b/src/pages/ServiceProject/ServiceProjectDetail.jsx index ac5eecc5..f8de3964 100644 --- a/src/pages/ServiceProject/ServiceProjectDetail.jsx +++ b/src/pages/ServiceProject/ServiceProjectDetail.jsx @@ -5,8 +5,18 @@ import { ComingSoonPage } from "../Misc/ComingSoonPage"; import ServiceProjectProfile from "../../components/ServiceProject/ServiceProjectProfile"; import Jobs from "../../components/ServiceProject/Jobs"; import ProjectTeam from "../../components/ServiceProject/ServiceProjectTeam/ProjectTeam"; +import { useSelectedProject } from "../../slices/apiDataManager"; +import { useParams } from "react-router-dom"; +import { useServiceProject } from "../../hooks/useServiceProject"; const ServiceProjectDetail = () => { + const { projectId } = useParams(); + const { + data: projectdata, + isLoading: isProjectLoading, + isProjectError, + } = useServiceProject(projectId); + const [activePill, setActivePill] = useState( sessionStorage.getItem("servicePrjectTab") || "profile" ); @@ -18,21 +28,22 @@ const ServiceProjectDetail = () => { switch (activePill) { case "profile": return ; - case "teams": + case "teams": return ; - case "jobs": + case "jobs": return ; default: return ; } }; + return (