diff --git a/src/pages/employee/AttendancesEmployeeRecords.jsx b/src/pages/employee/AttendancesEmployeeRecords.jsx new file mode 100644 index 00000000..ee363d11 --- /dev/null +++ b/src/pages/employee/AttendancesEmployeeRecords.jsx @@ -0,0 +1,267 @@ +import React, { useState, useEffect } from "react"; +import moment from "moment"; +import { useAttendanceByEmployee } from "../../hooks/useAttendance"; +import DateRangePicker from "../../components/common/DateRangePicker"; +import { useDispatch, useSelector } from "react-redux"; +import { fetchEmployeeAttendanceData } from "../../slices/apiSlice/employeeAttendanceSlice"; +import usePagination from "../../hooks/usePagination"; +import Avatar from "../../components/common/Avatar"; +import { convertShortTime } from "../../utils/dateUtils"; +import RenderAttendanceStatus from "../../components/Activities/RenderAttendanceStatus"; +import AttendLogs from "../../components/Activities/AttendLogs"; + +const AttendancesEmployeeRecords = ({ employee }) => { + const [attendances, setAttendnaces] = useState([]); + const [selectedDate, setSelectedDate] = useState(""); + const [dateRange, setDateRange] = useState({ startDate: "", endDate: "" }); + const [isModalOpen, setIsModalOpen] = useState(false); + const [attendanceId, setAttendanecId] = useState(); + const dispatch = useDispatch(); + const { data, loading, error } = useSelector( + (store) => store.employeeAttendance + ); + + const [isRefreshing, setIsRefreshing] = useState(true); + + const today = new Date(); + today.setHours(0, 0, 0, 0); + + const isSameDay = (dateStr) => { + if (!dateStr) return false; + const d = new Date(dateStr); + d.setHours(0, 0, 0, 0); + return d.getTime() === today.getTime(); + }; + + const isBeforeToday = (dateStr) => { + if (!dateStr) return false; + const d = new Date(dateStr); + d.setHours(0, 0, 0, 0); + return d.getTime() < today.getTime(); + }; + + const sortByName = (a, b) => { + const nameA = a.firstName.toLowerCase() + a.lastName.toLowerCase(); + const nameB = b.firstName.toLowerCase() + b.lastName.toLowerCase(); + return nameA.localeCompare(nameB); + }; + + const group1 = data + .filter((d) => d.activity === 1 && isSameDay(d.checkInTime)) + .sort(sortByName); + const group2 = data + .filter((d) => d.activity === 4 && isSameDay(d.checkOutTime)) + .sort(sortByName); + const group3 = data + .filter((d) => d.activity === 1 && isBeforeToday(d.checkInTime)) + .sort(sortByName); + const group4 = data + .filter((d) => d.activity === 4 && isBeforeToday(d.checkOutTime)) + .sort(sortByName); + const group5 = data.filter((d) => d.activity === 5).sort(sortByName); + + const sortedFinalList = [ + ...group1, + ...group2, + ...group3, + ...group4, + ...group5, + ]; + + const currentDate = new Date().toLocaleDateString("en-CA"); + const { currentPage, totalPages, currentItems, paginate } = usePagination( + sortedFinalList, + 5 + ); + + useEffect(() => { + const { startDate, endDate } = dateRange; + if (startDate && endDate) { + dispatch( + fetchEmployeeAttendanceData({ + employeeId: employee, + fromDate: startDate, + toDate: endDate, + }) + ); + } + }, [dateRange, employee]); + + const openModal = (id) => { + setAttendanecId(id); + setIsModalOpen(true); + }; + const closeModal = () => setIsModalOpen(false); + + return ( + <> +
+ {" "} +
+
+
+ + + +
+
+
+
+
+
+
+ +
+
+ setIsRefreshing(!isRefreshing)} + /> +
+
+
+ {data && data.length > 0 ? ( + + + + + + + + + + + + {loading && } + {error && } + {data && data.length === 0 && ( + + + + )} + + {currentItems?.map((attendance, index) => ( + + + + + + + + + ))} + +
+ Name + Date + {" "} + Check-In + + {" "} + Check-Out + Action
Loading...{error}
No Data Found
+ + + {" "} + {moment(attendance.checkInTime).format("DD-MMM-YYYY")} + {convertShortTime(attendance.checkInTime)} + {attendance.checkOutTime + ? convertShortTime(attendance.checkOutTime) + : "--"} + + +
+ ) : ( + No employee logs + )} +
+ {!loading && ( + + )} +
+ + ); +}; + +export default AttendancesEmployeeRecords;