From 9763c455923cfc55210694173e814d05fded336c Mon Sep 17 00:00:00 2001 From: "kartik.sharma" Date: Mon, 26 May 2025 12:54:24 +0530 Subject: [PATCH 01/15] In Report Popup from Daily Progress Report where validation message not showing properly in Completed Work Text box. --- src/components/Activities/ReportTask.jsx | 37 +++++++++++++++++------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/components/Activities/ReportTask.jsx b/src/components/Activities/ReportTask.jsx index 58d8ccd5..1b1f0188 100644 --- a/src/components/Activities/ReportTask.jsx +++ b/src/components/Activities/ReportTask.jsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState,useEffect } from "react"; import { formatDate } from "../../utils/dateUtils"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; @@ -13,15 +13,23 @@ export const ReportTask = ({ report, closeModal, refetch }) => { report?.workItem?.plannedWork - report?.workItem?.completedWork; const schema = z.object({ - completedTask: z - .number() - .min(0, "Completed Work must be greater than 0") - .max(maxPending, { - message: `Completed task cannot exceed total pending tasks: ${maxPending}`, - }) - .optional(), - comment: z.string().min(1, "Comment cannot be empty"), - }); + completedTask: z + .preprocess( + (val) => (val === "" || val === null || Number.isNaN(val) ? undefined : Number(val)), + z + .number({ + required_error: "Completed Work must be a number", + invalid_type_error: "Completed Work must be a number", + }) + .min(1, "Completed Work must be greater than 0") + .max(maxPending, { + message: `Completed task cannot exceed total pending tasks: ${maxPending}`, + }) + ), + comment: z.string().min(1, "Comment cannot be empty"), +}); + + const { register, handleSubmit, @@ -32,6 +40,14 @@ export const ReportTask = ({ report, closeModal, refetch }) => { defaultValues: { completedTask: 0, comment: "" }, }); + +useEffect(() => { + if (report) { + reset({ completedTask: 0, comment: "" }); // optional: customize default if needed + } +}, [report, reset]); + + const onSubmit = async (data) => { try { setloading(true); @@ -56,6 +72,7 @@ export const ReportTask = ({ report, closeModal, refetch }) => { }; const handleClose = () => { closeModal(); + reset(); }; return ( -- 2.43.0 From 126ed3809f68cec77427de9cf399c82949ffe026 Mon Sep 17 00:00:00 2001 From: "kartik.sharma" Date: Tue, 27 May 2025 09:58:20 +0530 Subject: [PATCH 02/15] In Assign Role popup double loading is visible. --- src/components/Project/AssignRole.jsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/components/Project/AssignRole.jsx b/src/components/Project/AssignRole.jsx index a639abc8..65badfb7 100644 --- a/src/components/Project/AssignRole.jsx +++ b/src/components/Project/AssignRole.jsx @@ -273,13 +273,6 @@ const AssignRoleModel = ({ assignData, onClose }) => { - {employeeLoading &&
Loading employees...
} - {!employeeLoading && - filteredEmployees?.length === 0 && - employees && ( -
No employees found for the selected role.
- )} -
{selectedRole !== "" && ( -- 2.43.0 From 50d5c69db1edab5d40e28a78cec25c4693eba67c Mon Sep 17 00:00:00 2001 From: "kartik.sharma" Date: Tue, 27 May 2025 11:53:56 +0530 Subject: [PATCH 03/15] Convert all date to DD-MM-YYYY accross all component. --- src/components/Activities/AttendcesLogs.jsx | 4 +-- src/components/common/DateRangePicker.jsx | 2 +- src/pages/Activities/DailyTask.jsx | 38 +++++++++++---------- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/components/Activities/AttendcesLogs.jsx b/src/components/Activities/AttendcesLogs.jsx index b57a9c75..feda6c77 100644 --- a/src/components/Activities/AttendcesLogs.jsx +++ b/src/components/Activities/AttendcesLogs.jsx @@ -127,7 +127,7 @@ const AttendanceLog = ({ handleModalData, projectId, showOnlyCheckout }) => { id="DataTables_Table_0_length" >
- +
{ acc.push( - {moment(currentDate).format("YYYY-MM-DD")} + {moment(currentDate).format("DD-MM-YYYY")} ); diff --git a/src/components/common/DateRangePicker.jsx b/src/components/common/DateRangePicker.jsx index 07c36e11..c56e742e 100644 --- a/src/components/common/DateRangePicker.jsx +++ b/src/components/common/DateRangePicker.jsx @@ -12,7 +12,7 @@ const DateRangePicker = ({ onRangeChange, DateDifference = 7, defaultStartDate = const fp = flatpickr(inputRef.current, { mode: "range", - dateFormat: "Y-m-d", + dateFormat: "d-m-Y", defaultDate: [fifteenDaysAgo, today], static: true, clickOpens: true, diff --git a/src/pages/Activities/DailyTask.jsx b/src/pages/Activities/DailyTask.jsx index 5b69c596..58e7d57e 100644 --- a/src/pages/Activities/DailyTask.jsx +++ b/src/pages/Activities/DailyTask.jsx @@ -6,7 +6,7 @@ import { useTaskList } from "../../hooks/useTasks"; import { useProjects } from "../../hooks/useProjects"; import { setProjectId } from "../../slices/localVariablesSlice"; import { useProfile } from "../../hooks/useProfile"; -import { formatDate } from "../../utils/dateUtils"; +// import { formatDate } from "../../utils/dateUtils"; // Removed this import import GlobalModel from "../../components/common/GlobalModel"; import AssignRoleModel from "../../components/Project/AssignRole"; import { ReportTask } from "../../components/Activities/ReportTask"; @@ -14,6 +14,7 @@ import ReportTaskComments from "../../components/Activities/ReportTaskComments"; import DateRangePicker from "../../components/common/DateRangePicker"; import DatePicker from "../../components/common/DatePicker"; import { useSearchParams } from "react-router-dom"; +import moment from "moment"; const DailyTask = () => { const [searchParams] = useSearchParams(); @@ -141,6 +142,7 @@ const DailyTask = () => {
@@ -188,7 +190,7 @@ const DailyTask = () => { )} {!task_loading && TaskList.length === 0 && ( - +

No Reports Found

@@ -199,7 +201,7 @@ const DailyTask = () => { - {date} + {moment(date).format("DD-MM-YYYY")} {TaskLists.filter((task) => @@ -246,7 +248,7 @@ const DailyTask = () => { task.workItem.completedWork} {task.completedTask} - {formatDate(task.assignmentDate)} + {moment(task.assignmentDate).format("DD-MM-YYYY")}
{ ${task.teamMembers .map( (member) => ` -
-
- - ${ - member?.firstName?.charAt( - 0 - ) || "" - }${ +
+
+ + ${ + member?.firstName?.charAt( + 0 + ) || "" + }${ member?.lastName?.charAt(0) || "" } - -
- ${member.firstName} ${ + +
+ ${member.firstName} ${ member.lastName } -
- ` +
+ ` ) .join("")}
@@ -362,4 +364,4 @@ const DailyTask = () => { ); }; -export default DailyTask; +export default DailyTask; \ No newline at end of file -- 2.43.0 From 235ddb58baae3a642a62639c896b3c84834dcfd8 Mon Sep 17 00:00:00 2001 From: "kartik.sharma" Date: Tue, 27 May 2025 15:06:12 +0530 Subject: [PATCH 04/15] In Create New Project form is not empty when we click on cancel button or cross. --- src/components/Project/ManageProjectInfo.jsx | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/components/Project/ManageProjectInfo.jsx b/src/components/Project/ManageProjectInfo.jsx index 41d2cb24..a03077f9 100644 --- a/src/components/Project/ManageProjectInfo.jsx +++ b/src/components/Project/ManageProjectInfo.jsx @@ -102,13 +102,21 @@ const ManageProjectInfo = ({ project, handleSubmitForm, onClose }) => { const onSubmitForm = (updatedProject) => { setLoading(true); handleSubmitForm( updatedProject, setLoading,reset ); - - + }; + const handleCancel = () => { + reset({ + id: project?.id || "", + name: project?.name || "", + contactPerson: project?.contactPerson || "", + projectAddress: project?.projectAddress || "", + startDate: formatDate(project?.startDate) || currentDate, + endDate: formatDate(project?.endDate) || currentDate, + projectStatusId: String(project?.projectStatusId || "00000000-0000-0000-0000-000000000000"), + }); + onClose(); }; - - return (
{
@@ -280,7 +288,7 @@ const ManageProjectInfo = ({ project, handleSubmitForm, onClose }) => { -

Activity Summary

+
+ Activity Summary +
+ +

- {comments && comments[0]?.comment} + {commentsData?.workItem?.workArea?.floor?.building?.description}

+

Assigned By : @@ -126,7 +140,7 @@ const ReportTaskComments = ({ commentsData, closeModal }) => { Completed Work : {commentsData?.completedTask}

-

Team:

+

Team :

{commentsData?.teamMembers?.map((member, idx) => ( @@ -147,7 +161,7 @@ const ReportTaskComments = ({ commentsData, closeModal }) => { {...register("comment")} className="form-control" id="exampleFormControlTextarea1" - rows="1" + // rows="2" placeholder="Enter comment" /> {errors.comment && ( @@ -170,8 +184,8 @@ const ReportTaskComments = ({ commentsData, closeModal }) => {
    {comments && comments @@ -196,9 +210,9 @@ const ReportTaskComments = ({ commentsData, closeModal }) => {
-
-

{fullName}

-

+

+

{fullName}

+

{moment.utc(data?.commentDate).local().fromNow()}

-- 2.43.0 From 94c943040637af2f71d71014390d84782e5b455f Mon Sep 17 00:00:00 2001 From: "kartik.sharma" Date: Tue, 27 May 2025 17:24:14 +0530 Subject: [PATCH 06/15] Changes in Comment popup --- src/components/Activities/ReportTaskComments.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Activities/ReportTaskComments.jsx b/src/components/Activities/ReportTaskComments.jsx index 5b494758..91399b79 100644 --- a/src/components/Activities/ReportTaskComments.jsx +++ b/src/components/Activities/ReportTaskComments.jsx @@ -212,7 +212,7 @@ const ReportTaskComments = ({ commentsData, closeModal }) => {

{fullName}

-

+

{moment.utc(data?.commentDate).local().fromNow()}

-- 2.43.0 From 08805405606de51d92d7a764977a281bd9dc1cf5 Mon Sep 17 00:00:00 2001 From: "kartik.sharma" Date: Wed, 28 May 2025 12:03:36 +0530 Subject: [PATCH 07/15] Comments popup submit button issue. --- .../Activities/ReportTaskComments.jsx | 84 +++++++++++-------- 1 file changed, 47 insertions(+), 37 deletions(-) diff --git a/src/components/Activities/ReportTaskComments.jsx b/src/components/Activities/ReportTaskComments.jsx index 91399b79..9db42b3a 100644 --- a/src/components/Activities/ReportTaskComments.jsx +++ b/src/components/Activities/ReportTaskComments.jsx @@ -25,12 +25,11 @@ const schema = z.object({ const ReportTaskComments = ({ commentsData, closeModal }) => { const [loading, setloading] = useState(false); const [comments, setComment] = useState([]); - const [bgClass, setBgClass] = useState(""); const { register, handleSubmit, formState: { errors }, - reset, + reset, // Destructure reset from useForm } = useForm({ resolver: zodResolver(schema), }); @@ -38,19 +37,28 @@ const ReportTaskComments = ({ commentsData, closeModal }) => { const containerRef = useRef(null); const firstRender = useRef(true); - useEffect(() => { - setComment(commentsData?.comments); + const taskList = getCachedData("taskList"); + if (taskList && taskList.data && commentsData?.id) { + const currentTask = taskList.data.find(task => task.id === commentsData.id); + if (currentTask && currentTask.comments) { + setComment(currentTask.comments); + } else { + setComment(commentsData?.comments || []); + } + } else { + setComment(commentsData?.comments || []); + } + firstRender.current = true; }, [commentsData]); - // Scroll logic: scroll to bottom when new comments are added useEffect(() => { if (!firstRender.current && containerRef.current) { containerRef.current.scrollTop = containerRef.current.scrollHeight; } else { - firstRender.current = false; // Mark the first render as complete + firstRender.current = false; } - }, [comments]); // Run this when comments array is updated + }, [comments]); const onSubmit = async (data) => { let sendComment = { @@ -61,34 +69,40 @@ const ReportTaskComments = ({ commentsData, closeModal }) => { try { setloading(true); const resp = await TasksRepository.taskComments(sendComment); + setComment((prevItems) => [...prevItems, resp.data]); + const taskList = getCachedData("taskList"); - const updatedTaskList = taskList.data.map((task) => { - if (task.id === resp.data.taskAllocationId) { - const existingComments = Array.isArray(task.comments) - ? task.comments - : []; - return { - ...task, - comments: [...existingComments, resp.data], - }; - } - return task; - }); - cacheData("taskList", { - data: updatedTaskList, - projectId: taskList.projectId, - }); - reset(); + + if (taskList && taskList.data) { + const updatedTaskList = taskList.data.map((task) => { + if (task.id === resp.data.taskAllocationId) { + const existingComments = Array.isArray(task.comments) + ? task.comments + : []; + return { + ...task, + comments: [...existingComments, resp.data], + }; + } + return task; + }); + + cacheData("taskList", { + data: updatedTaskList, + projectId: taskList.projectId, + }); + } + + reset(); setloading(false); showToast("Successfully Sent", "success"); - // closeModal(); } catch (error) { setloading(false); showToast(error.response.data?.message || "Something went wrong", "error"); } }; - console.log("Kartik", commentsData) + return (
{ Activity Summary -

{commentsData?.workItem?.workArea?.floor?.building?.description}

@@ -114,9 +127,9 @@ const ReportTaskComments = ({ commentsData, closeModal }) => {

Assigned By : - {commentsData?.assignedBy.firstName + + {commentsData?.assignedBy?.firstName + " " + - commentsData?.assignedBy.lastName} + commentsData?.assignedBy?.lastName} {" "}

@@ -161,7 +174,6 @@ const ReportTaskComments = ({ commentsData, closeModal }) => { {...register("comment")} className="form-control" id="exampleFormControlTextarea1" - // rows="2" placeholder="Enter comment" /> {errors.comment && ( @@ -176,7 +188,7 @@ const ReportTaskComments = ({ commentsData, closeModal }) => { > Close -
@@ -184,23 +196,21 @@ const ReportTaskComments = ({ commentsData, closeModal }) => {
    {comments && comments ?.slice() - .reverse() + .reverse() .map((data, idx) => { const fullName = `${data?.employee?.firstName} ${data?.employee?.lastName}`; - const bgClass = getBgClassFromHash(fullName); return (
  • {
    -
    +

    {fullName}

    {moment.utc(data?.commentDate).local().fromNow()} -- 2.43.0 From 15d313baf1eb149a5246b6894353085734a900bb Mon Sep 17 00:00:00 2001 From: Pramod Mahajan Date: Fri, 30 May 2025 11:38:02 +0530 Subject: [PATCH 08/15] chnaged badge type --- src/components/common/FloatingMenu.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/common/FloatingMenu.jsx b/src/components/common/FloatingMenu.jsx index de4ee268..6d965c8b 100644 --- a/src/components/common/FloatingMenu.jsx +++ b/src/components/common/FloatingMenu.jsx @@ -13,7 +13,7 @@ const FloatingMenu = () => { actions.map((action, index) => (

    +
    +
    -- 2.43.0 From 445a5e00647b63c5df1a283d86cb51d4d594de9f Mon Sep 17 00:00:00 2001 From: Pramod Mahajan Date: Fri, 30 May 2025 11:39:18 +0530 Subject: [PATCH 10/15] loader, not found text moved in centered area --- src/components/Directory/ManageBucket.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Directory/ManageBucket.jsx b/src/components/Directory/ManageBucket.jsx index 86ba6dfe..ef8b5e54 100644 --- a/src/components/Directory/ManageBucket.jsx +++ b/src/components/Directory/ManageBucket.jsx @@ -296,7 +296,7 @@ const ManageBucket = () => {loading && ( - + {" "}
    Loading... @@ -306,7 +306,7 @@ const ManageBucket = () => )} {!loading && buckets.length == 0 && ( - +
    Bucket Not Available.
    @@ -315,7 +315,7 @@ const ManageBucket = () => )} {!loading && sortedBucktesList.length == 0 && ( - +
    No Matching Bucket Found.
    -- 2.43.0 From e93062bdf4afe18f2860e271110fe9ee2c08f6a0 Mon Sep 17 00:00:00 2001 From: Pramod Mahajan Date: Fri, 30 May 2025 11:39:44 +0530 Subject: [PATCH 11/15] changed directory menu icon --- src/data/menuData.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/menuData.json b/src/data/menuData.json index f0b6b12f..3b660827 100644 --- a/src/data/menuData.json +++ b/src/data/menuData.json @@ -66,7 +66,7 @@ }, { "text": "Directory", - "icon": "bx bx-folder", + "icon": "bx bx-group", "available": true, "link": "/directory" }, -- 2.43.0 From 3594b78253415072fc1fc00e22ffc358e569fd10 Mon Sep 17 00:00:00 2001 From: Pramod Mahajan Date: Fri, 30 May 2025 11:40:47 +0530 Subject: [PATCH 12/15] added more option for sorting contact list - projectId --- src/hooks/useDirectory.js | 10 +++++----- src/repositories/DirectoryRepository.jsx | 12 +++++++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/hooks/useDirectory.js b/src/hooks/useDirectory.js index 1c0c3433..7c2fb13f 100644 --- a/src/hooks/useDirectory.js +++ b/src/hooks/useDirectory.js @@ -2,7 +2,7 @@ import { useEffect, useState } from "react"; import { DirectoryRepository } from "../repositories/DirectoryRepository"; import { cacheData, getCachedData } from "../slices/apiDataManager"; -export const useDirectory = (isActive) => { +export const useDirectory = (isActive,prefernceContacts) => { const [contacts, setContacts] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); @@ -10,7 +10,7 @@ export const useDirectory = (isActive) => { const fetch = async (activeParam = isActive) => { setLoading(true); try { - const response = await DirectoryRepository.GetContacts(activeParam); + const response = await DirectoryRepository.GetContacts(activeParam,prefernceContacts); setContacts(response.data); cacheData("contacts", { data: response.data, isActive: activeParam }); } catch (error) { @@ -22,12 +22,12 @@ export const useDirectory = (isActive) => { useEffect(() => { const cachedContacts = getCachedData("contacts"); - if (!cachedContacts?.data || cachedContacts.isActive !== isActive) { - fetch(isActive); + if (!cachedContacts?.data || cachedContacts.isActive !== isActive || prefernceContacts) { + fetch(isActive,prefernceContacts); } else { setContacts(cachedContacts.data); } - }, [isActive]); + }, [isActive,prefernceContacts]); return { contacts, diff --git a/src/repositories/DirectoryRepository.jsx b/src/repositories/DirectoryRepository.jsx index ac9fa617..065859f6 100644 --- a/src/repositories/DirectoryRepository.jsx +++ b/src/repositories/DirectoryRepository.jsx @@ -3,7 +3,17 @@ import {api} from "../utils/axiosClient"; export const DirectoryRepository = { GetOrganizations:()=>api.get('/api/directory/organization'), - GetContacts: (isActive) => api.get( `/api/directory?active=${isActive}` ), + GetContacts: (isActive, projectId) => { + const params = new URLSearchParams(); + params.append("active", isActive); + + if (projectId) { + params.append("projectId", projectId); + } + + return api.get(`/api/Directory?${params.toString()}`); +} +, CreateContact: ( data ) => api.post( '/api/directory', data ), UpdateContact: ( id, data ) => api.put( `/api/directory/${ id }`, data ), DeleteContact: ( id,isActive) => api.delete( `/api/directory/${ id }/?active=${isActive}` ), -- 2.43.0 From 677495755872699cd7a88ee9ce2220e5769f82bd Mon Sep 17 00:00:00 2001 From: Pramod Mahajan Date: Fri, 30 May 2025 11:42:27 +0530 Subject: [PATCH 13/15] Added props to hide component based on role; identifies if it's a page or component --- src/pages/Directory/Directory.jsx | 55 ++++++++++++--------- src/pages/Directory/DirectoryPageHeader.jsx | 4 +- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/pages/Directory/Directory.jsx b/src/pages/Directory/Directory.jsx index a9ceab49..ad3e1052 100644 --- a/src/pages/Directory/Directory.jsx +++ b/src/pages/Directory/Directory.jsx @@ -21,8 +21,9 @@ import ManageBucket from "../../components/Directory/ManageBucket"; import {useFab} from "../../Context/FabContext"; import {DireProvider, useDir} from "../../Context/DireContext"; -const Directory = () => +const Directory = ({IsPage=true,prefernceContacts}) => { + const[projectPrefernce,setPerfence] = useState(null) const[IsActive,setIsActive] = useState(true) const [isOpenModal, setIsOpenModal] = useState(false); const [isOpenModalNote, setIsOpenModalNote] = useState(false); @@ -44,7 +45,7 @@ const Directory = () => const { dirActions, setDirActions } = useDir(); - const { contacts, loading , refetch} = useDirectory(IsActive); + const { contacts, loading , refetch} = useDirectory(IsActive,projectPrefernce); const { contactCategory, loading: contactCategoryLoading } = useContactCategory(); const {buckets} = useBuckets(); @@ -72,7 +73,7 @@ const Directory = () => // cacheData("Contacts", {data:updatedContacts,isActive:IsActive}); // setContactList(updatedContacts); - refetch() + refetch(IsActive,prefernceContacts) } catch (error) { const msg = error.response?.data?.message || @@ -216,35 +217,43 @@ const handleDeleteContact = async (overrideId = null) => { }; - useEffect(() => { - setActions([ - { - label: "New Contact", - icon: "bx bx-plus-circle", - color: "warning", - onClick: () => setIsOpenModal(true), - }, - { - label: "Manage Bucket", - icon: "fa-solid fa-bucket fs-5 ", - color: "primary", - onClick: () => setOpenBucketModal(true), - }, - - ]); + useEffect(() => { + const actions = []; - return () => setActions([]); // Clean up - }, []); + if (IsPage) { + actions.push({ + label: "Manage Bucket", + icon: "fa-solid fa-bucket fs-5", + color:"primary", + onClick: () => setOpenBucketModal(true), + }); + } + actions.push({ + label: "New Contact", + icon: "bx bx-plus-circle", + color: "warning", + onClick: () => setIsOpenModal(true), + } ); + + + setActions(actions); + + return () => setActions([]); +}, [IsPage]); + useEffect( () => + { + setPerfence(prefernceContacts) +},[prefernceContacts]) return (
    - + >)} {isOpenModal && (
    -
    +
    -
    +
  • -
  • + {DirAdmin || DireManager || DirUser && ( +
  • { Directory
  • + )} +
); -- 2.43.0