From 200ef5ae0ae7332132946e93dd3546ee47e39acc Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 18 Jun 2025 11:57:55 +0530 Subject: [PATCH] Implemented signalR in Employee module --- src/components/Activities/AttendcesLogs.jsx | 24 ++++++++++- src/components/Activities/Regularization.jsx | 14 +++++++ src/components/Project/AssignRole.jsx | 24 ++++++++++- src/components/Project/Teams.jsx | 13 ++++++ src/pages/Activities/AttendancePage.jsx | 43 ++++++++++++++++---- src/pages/employee/EmployeeList.jsx | 19 ++++++++- src/services/signalRService.js | 13 +++++- 7 files changed, 136 insertions(+), 14 deletions(-) diff --git a/src/components/Activities/AttendcesLogs.jsx b/src/components/Activities/AttendcesLogs.jsx index 7b96dd7f..7bf6a989 100644 --- a/src/components/Activities/AttendcesLogs.jsx +++ b/src/components/Activities/AttendcesLogs.jsx @@ -6,8 +6,9 @@ import RenderAttendanceStatus from "./RenderAttendanceStatus"; import { useSelector, useDispatch } from "react-redux"; import { fetchAttendanceData } from "../../slices/apiSlice/attedanceLogsSlice"; import DateRangePicker from "../common/DateRangePicker"; -import { getCachedData } from "../../slices/apiDataManager"; +import { clearCacheKey, getCachedData } from "../../slices/apiDataManager"; import eventBus from "../../services/eventBus"; +import AttendanceRepository from "../../repositories/AttendanceRepository"; const usePagination = (data, itemsPerPage) => { const [currentPage, setCurrentPage] = useState(1); @@ -177,6 +178,27 @@ const AttendanceLog = ({ return () => eventBus.off("attendance_log", handler); }, [handler]); + const employeeHandler = useCallback( + (msg) => { + const { startDate, endDate } = dateRange; + if (data.some((item) => item.employeeId == msg.employeeId)) { + dispatch( + fetchAttendanceData({ + projectId, + fromDate: startDate, + toDate: endDate, + }) + ) + } + }, + [projectId, dateRange,data] + ); + + useEffect(() => { + eventBus.on("employee", employeeHandler); + return () => eventBus.off("employee", employeeHandler); + }, [employeeHandler]); + return ( <>
{ return () => eventBus.off("regularization", handler); }, [handler]); + const employeeHandler = useCallback( + (msg) => { + if (regularizes.some((item) => item.employeeId == msg.employeeId)) { + refetch(); + } + }, + [regularizes] + ); + + useEffect(() => { + eventBus.on("employee", employeeHandler); + return () => eventBus.off("employee", employeeHandler); + }, [employeeHandler]); + return (
{ // Calculate maxPlanned based on assignData @@ -77,7 +78,7 @@ const AssignRoleModel = ({ assignData, onClose, setAssigned }) => { const selectedProject = useSelector( (store) => store.localVariables.projectId ); - const { employees, loading: employeeLoading } = useEmployeesAllOrByProjectId( + const { employees, loading: employeeLoading,recallEmployeeData } = useEmployeesAllOrByProjectId( selectedProject, false ); @@ -188,6 +189,25 @@ const AssignRoleModel = ({ assignData, onClose, setAssigned }) => { onClose(); }; + const handler = useCallback( + (msg) => { + if(employees.some((item) => item.id == msg.employeeId)){ + console.log("handller function start") + clearCacheKey("employeeListByProject"); + clearCacheKey("allEmployeeList"); + clearCacheKey("allInactiveEmployeeList"); + clearCacheKey("employeeProfile"); + recallEmployeeData(false); + console.log("handller function end") + } + },[employees] + ); + + useEffect(() => { + eventBus.on("employee",handler); + return () => eventBus.off("employee",handler) + },[handler]) + return (
{ return () => eventBus.off("assign_project_all", handler); }, [handler]); + const employeeHandler = useCallback( + (msg) => { + if(filteredEmployees.some((item) => item.employeeId == msg.employeeId)){ + fetchEmployees(); + } + },[filteredEmployees] + ); + + useEffect(() => { + eventBus.on("employee",employeeHandler); + return () => eventBus.off("employee",employeeHandler) + },[employeeHandler]) + return ( <>
{ const [activeTab, setActiveTab] = useState("all"); const [ShowPending, setShowPending] = useState(false); const loginUser = getCachedProfileData(); var selectedProject = useSelector((store) => store.localVariables.projectId); - const { projects, loading: projectLoading } = useProjects(); + // const { projects, loading: projectLoading } = useProjects(); const { attendance, loading: attLoading, @@ -62,6 +64,22 @@ const AttendancePage = () => { [selectedProject, attrecall] ); + const employeeHandler = useCallback( + (msg) => { + if (attendances.some((item) => item.employeeId == msg.employeeId)) { + AttendanceRepository.getAttendance(selectedProject) + .then((response) => { + cacheData("Attendance", { data: response.data, selectedProject }); + setAttendances(response.data); + }) + .catch((error) => { + console.error(error); + }); + } + }, + [selectedProject, attendances] + ); + const getRole = (roleId) => { if (!empRoles) return "Unassigned"; if (!roleId) return "Unassigned"; @@ -135,13 +153,20 @@ const AttendancePage = () => { // ) // : attendances; const filteredAttendance = ShowPending - ? attendances?.filter((att) => att?.checkInTime !== null && att?.checkOutTime === null) + ? attendances?.filter( + (att) => att?.checkInTime !== null && att?.checkOutTime === null + ) : attendances; useEffect(() => { eventBus.on("attendance", handler); return () => eventBus.off("attendance", handler); }, [handler]); + + useEffect(() => { + eventBus.on("employee", employeeHandler); + return () => eventBus.off("employee", employeeHandler); + }, [employeeHandler]); return ( <> {isCreateModalOpen && modelConfig && ( @@ -242,11 +267,8 @@ const AttendancePage = () => {
- - {activeTab === "all" && ( <> -
{ showOnlyCheckout={ShowPending} />
- {!attLoading && filteredAttendance?.length === 0 && ( -

{ShowPending ? "No Pending Available" : "No Employee assigned yet."}

+ {!attLoading && filteredAttendance?.length === 0 && ( +

+ {" "} + {ShowPending + ? "No Pending Available" + : "No Employee assigned yet."}{" "} +

)} )} @@ -279,7 +306,7 @@ const AttendancePage = () => {
)} - {attLoading && Loading..} + {attLoading && Loading..} {!attLoading && !attendances && Not Found}
diff --git a/src/pages/employee/EmployeeList.jsx b/src/pages/employee/EmployeeList.jsx index 2d40ceff..930f183d 100644 --- a/src/pages/employee/EmployeeList.jsx +++ b/src/pages/employee/EmployeeList.jsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useRef } from "react"; +import React, { useState, useEffect, useRef, useCallback } from "react"; import moment from "moment"; import showToast from "../../services/toastService"; import { Link, NavLink, useNavigate } from "react-router-dom"; @@ -23,6 +23,8 @@ import EmployeeRepository from "../../repositories/EmployeeRepository"; import ManageEmployee from "../../components/Employee/ManageEmployee"; import ConfirmModal from "../../components/common/ConfirmModal"; import { useSelector } from "react-redux"; +import eventBus from "../../services/eventBus"; +import { newlineChars } from "pdf-lib"; const EmployeeList = () => { const selectedProjectId = useSelector((store) => store.localVariables.projectId); @@ -202,7 +204,6 @@ const EmployeeList = () => { }; const handleOpenDelete = (employee) => { - console.log(employee); setSelectedEmpFordelete(employee); setIsDeleteModalOpen(true); }; @@ -218,6 +219,20 @@ const EmployeeList = () => { setSelectedProject(selectedProjectId || ""); }, [selectedProjectId]); + const handler = useCallback( + (msg) => { + if(employees.some((item) => item.id == msg.employeeId)){ + setEmployeeList([]); + recallEmployeeData(showInactive); + } + },[employees] + ); + + useEffect(() => { + eventBus.on("employee",handler); + return () => eventBus.off("employee",handler) + },[handler]) + return ( <> diff --git a/src/services/signalRService.js b/src/services/signalRService.js index 9b9e2cc1..f04dd3dc 100644 --- a/src/services/signalRService.js +++ b/src/services/signalRService.js @@ -77,9 +77,20 @@ export function startSignalR(loggedUser) { } // if created or updated infra if (data.keyword == "Infra") { - console.log("Infra") eventBus.emit("infra", data); } + + // if created or updated Employee + if (data.keyword == "Employee") { + clearCacheKey("employeeListByProject"); + clearCacheKey("allEmployeeList"); + clearCacheKey("allInactiveEmployeeList"); + clearCacheKey("employeeProfile"); + clearCacheKey("Attendance"); + clearCacheKey("regularizedList") + clearCacheKey("AttendanceLogs") + eventBus.emit("employee", data); + } } });