diff --git a/client/src/Pages/ConsolidatedTable.jsx b/client/src/Pages/ConsolidatedTable.jsx index 7614f9d..ac9f295 100644 --- a/client/src/Pages/ConsolidatedTable.jsx +++ b/client/src/Pages/ConsolidatedTable.jsx @@ -3,8 +3,8 @@ import axios from "axios"; import * as XLSX from "xlsx-js-style"; import { sendEmail, createExcelBook } from "../api"; import Navbar from "./Navbar"; -import { toast, ToastContainer } from 'react-toastify'; -import 'react-toastify/dist/ReactToastify.css'; +import { toast, ToastContainer } from "react-toastify"; +import "react-toastify/dist/ReactToastify.css"; const styles = { header: { @@ -91,6 +91,18 @@ const ConsolidatedTable = () => { const tablesPerPage = 5; const [expandedTeacher, setExpandedTeacher] = useState(null); + const getAcademicYears = () => { + const currentYear = new Date().getFullYear(); + return Array.from({ length: 6 }, (_, i) => { + const startYear = currentYear - i; + const endYear = (startYear + 1).toString().slice(-2); // Get last two digits + return `${startYear}-${endYear}`; + }); + }; + + const academicYears = getAcademicYears(); + const [selectedYear, setSelectedYear] = useState(academicYears[0]); // Default to current academic year + useEffect(() => { const fetchData = async () => { try { @@ -113,6 +125,13 @@ const ConsolidatedTable = () => { return
Loading...
; } + // Filter data based on search query and selected academic year + const filteredData = data.filter( + (row) => + row.academicYear === selectedYear && // Filter by selected academic year + row.Name.toLowerCase().includes(searchQuery.toLowerCase()) // Filter by search query + ); + // Extract unique faculty names and filter based on the search query const filteredTeachers = [...new Set(data.map((row) => row.Name))].filter( (teacher) => teacher.toLowerCase().includes(searchQuery.toLowerCase()) // Filter by search query @@ -238,11 +257,22 @@ const ConsolidatedTable = () => { fontSize: "16px", }} /> + {/* Academic Year Dropdown */} +
{currentTeachers.map((teacher, index) => { - const teacherData = data.filter((row) => row.Name === teacher); + const teacherData = filteredData.filter((row) => row.Name === teacher); console.log(teacherData); return (
@@ -316,7 +346,9 @@ const ConsolidatedTable = () => { {row.courseCode} {row.courseName} {row.examType} - {row.examPeriod +" "+ row.academicYear} + + {row.examPeriod + " " + row.academicYear} + {row.marks} {row.Name} {row.affiliation} diff --git a/client/src/Pages/FilterPage.jsx b/client/src/Pages/FilterPage.jsx index 53d6fc3..205fdd0 100644 --- a/client/src/Pages/FilterPage.jsx +++ b/client/src/Pages/FilterPage.jsx @@ -3,19 +3,22 @@ import { useNavigate } from "react-router-dom"; import "./FilterPage.css"; import { fetchCourses } from "../api"; import Navbar from "./Navbar"; -import { toast, ToastContainer } from 'react-toastify'; -import 'react-toastify/dist/ReactToastify.css'; +import { toast, ToastContainer } from "react-toastify"; +import "react-toastify/dist/ReactToastify.css"; const FilterPage = () => { const currentYear = new Date().getFullYear(); - const [formData, setFormData] = useState({ + + // Load saved filters from localStorage or set default values + const savedFilters = JSON.parse(localStorage.getItem("filterState")) || { scheme: "", semester: "", department: "", program: "", academicYear: `${currentYear}-${(currentYear + 1).toString().slice(-2)}`, - }); + }; + const [formData, setFormData] = useState(savedFilters); const navigate = useNavigate(); const handleInputChange = (e) => { @@ -41,6 +44,7 @@ const FilterPage = () => { } try { + localStorage.setItem("filterState", JSON.stringify(formData)); const filteredCourses = await fetchCourses(formData); if (filteredCourses.length > 0) { // Save filteredCourses in localStorage diff --git a/server/server.js b/server/server.js index 778f4d1..dbb2088 100644 --- a/server/server.js +++ b/server/server.js @@ -172,7 +172,6 @@ app.get("/auth/logout", function (req, res) { // Refresh Token Endpoint app.post("/api/refresh", (req, res) => { const refreshToken = req.cookies.token; - console.log(refreshToken); if (!refreshToken) { return res.status(401).json({ message: "No refresh token, authorization denied" });