From 1c0be858e9cf3eeedeb1534a6b75c9a093cbd35b Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 11 Jun 2025 23:23:14 +0530 Subject: [PATCH] Implemented attendance funcationality in attendance module --- src/components/Activities/AttendcesLogs.jsx | 35 ++++++++++- src/components/Activities/Regularization.jsx | 61 +++++++++++++++----- src/components/Dashboard/Teams.jsx | 26 ++++++++- src/pages/Activities/AttendancePage.jsx | 2 - src/services/signalRService.js | 25 ++++++-- 5 files changed, 124 insertions(+), 25 deletions(-) diff --git a/src/components/Activities/AttendcesLogs.jsx b/src/components/Activities/AttendcesLogs.jsx index a2fb432d..ea9870bc 100644 --- a/src/components/Activities/AttendcesLogs.jsx +++ b/src/components/Activities/AttendcesLogs.jsx @@ -7,6 +7,7 @@ import { useSelector, useDispatch } from "react-redux"; import { fetchAttendanceData } from "../../slices/apiSlice/attedanceLogsSlice"; import DateRangePicker from "../common/DateRangePicker"; import { getCachedData } from "../../slices/apiDataManager"; +import eventBus from "../../services/eventBus"; const usePagination = (data, itemsPerPage) => { const [currentPage, setCurrentPage] = useState(1); @@ -69,7 +70,7 @@ const AttendanceLog = ({ handleModalData, projectId, showOnlyCheckout }) => { setIsRefreshing(false); }, [dateRange, projectId, dispatch, isRefreshing]); - useEffect(() => { + const filtering = (data) => { const filteredData = showOnlyCheckout ? data.filter((item) => item.checkOutTime === null) : data; @@ -108,6 +109,10 @@ const AttendanceLog = ({ handleModalData, projectId, showOnlyCheckout }) => { // Create the final sorted array const finalData = sortedDates.flatMap((date) => groupedByDate[date]); setProcessedData(finalData); + } + + useEffect(() => { + filtering(data) }, [data, showOnlyCheckout]); const { currentPage, totalPages, currentItems: paginatedAttendances, paginate, resetPage } = usePagination( @@ -120,6 +125,34 @@ const AttendanceLog = ({ handleModalData, projectId, showOnlyCheckout }) => { resetPage(); }, [processedData, resetPage]); + const handler = useCallback( + (msg) => { + const { startDate, endDate } = dateRange; + const checkIn = msg.response.checkInTime.substring(0, 10); + + if ( + projectId === msg.projectId && + startDate <= checkIn && + checkIn <= endDate + ) { + const updatedAttendance = data.map((item) => + item.employeeId === msg.response.employeeId + ? { ...item, ...msg.response } + : item + ); + + filtering(updatedAttendance); + resetPage(); + } + }, + [projectId, dateRange, data, filtering, resetPage] +); + + useEffect(() => { + eventBus.on("attendance_log", handler); + return () => eventBus.off("attendance_log", handler); + }, [handler]); + return ( <> diff --git a/src/components/Activities/Regularization.jsx b/src/components/Activities/Regularization.jsx index 5c4fb869..b4ff5609 100644 --- a/src/components/Activities/Regularization.jsx +++ b/src/components/Activities/Regularization.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useCallback, useEffect, useState } from "react"; import Avatar from "../common/Avatar"; import { convertShortTime } from "../../utils/dateUtils"; import RegularizationActions from "./RegularizationActions"; @@ -6,6 +6,8 @@ import { useSelector } from "react-redux"; import { useRegularizationRequests } from "../../hooks/useAttendance"; import moment from "moment"; import usePagination from "../../hooks/usePagination"; +import eventBus from "../../services/eventBus"; +import { cacheData, clearCacheKey } from "../../slices/apiDataManager"; const Regularization = ({ handleRequest }) => { var selectedProject = useSelector((store) => store.localVariables.projectId); @@ -22,16 +24,38 @@ const Regularization = ({ handleRequest }) => { const nameB = b.firstName.toLowerCase() + b.lastName.toLowerCase(); return nameA.localeCompare(nameB); }; - const filteredData = [...regularizesList]?.sort(sortByName); + const handler = useCallback( + (msg) => { + if (selectedProject == msg.projectId) { + const updatedAttendance = regularizes?.filter( item => item.id !== msg.response.id ); + cacheData("regularizedList", { + data: updatedAttendance, + projectId: selectedProject, + }); + // clearCacheKey("regularizedList") + refetch(); + } + }, + [selectedProject, regularizes] + ); + + const filteredData = [...regularizesList]?.sort(sortByName); const { currentPage, totalPages, currentItems, paginate } = usePagination( filteredData, 10 ); + useEffect(() => { + eventBus.on("regularization", handler); + return () => eventBus.off("regularization", handler); + }, [handler]); return ( -
+
@@ -47,7 +71,11 @@ const Regularization = ({ handleRequest }) => { - {loading && } + {loading && ( + + )} {!loading && (regularizes?.length > 0 ? ( @@ -55,7 +83,7 @@ const Regularization = ({ handleRequest }) => { - + }} + > + No Record Found + ))}
Loading... + Loading... +
- @@ -88,17 +116,22 @@ const Regularization = ({ handleRequest }) => { )) ) : (
No Record Found
- {!loading >10 && ( + {!loading > 10 && (