consolidated filter
This commit is contained in:
@@ -3,8 +3,8 @@ import axios from "axios";
|
|||||||
import * as XLSX from "xlsx-js-style";
|
import * as XLSX from "xlsx-js-style";
|
||||||
import { sendEmail, createExcelBook } from "../api";
|
import { sendEmail, createExcelBook } from "../api";
|
||||||
import Navbar from "./Navbar";
|
import Navbar from "./Navbar";
|
||||||
import { toast, ToastContainer } from 'react-toastify';
|
import { toast, ToastContainer } from "react-toastify";
|
||||||
import 'react-toastify/dist/ReactToastify.css';
|
import "react-toastify/dist/ReactToastify.css";
|
||||||
|
|
||||||
const styles = {
|
const styles = {
|
||||||
header: {
|
header: {
|
||||||
@@ -91,6 +91,18 @@ const ConsolidatedTable = () => {
|
|||||||
const tablesPerPage = 5;
|
const tablesPerPage = 5;
|
||||||
const [expandedTeacher, setExpandedTeacher] = useState(null);
|
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(() => {
|
useEffect(() => {
|
||||||
const fetchData = async () => {
|
const fetchData = async () => {
|
||||||
try {
|
try {
|
||||||
@@ -113,6 +125,13 @@ const ConsolidatedTable = () => {
|
|||||||
return <div>Loading...</div>;
|
return <div>Loading...</div>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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
|
// Extract unique faculty names and filter based on the search query
|
||||||
const filteredTeachers = [...new Set(data.map((row) => row.Name))].filter(
|
const filteredTeachers = [...new Set(data.map((row) => row.Name))].filter(
|
||||||
(teacher) => teacher.toLowerCase().includes(searchQuery.toLowerCase()) // Filter by search query
|
(teacher) => teacher.toLowerCase().includes(searchQuery.toLowerCase()) // Filter by search query
|
||||||
@@ -238,11 +257,22 @@ const ConsolidatedTable = () => {
|
|||||||
fontSize: "16px",
|
fontSize: "16px",
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
{/* Academic Year Dropdown */}
|
||||||
|
<select
|
||||||
|
value={selectedYear}
|
||||||
|
onChange={(e) => setSelectedYear(e.target.value)}
|
||||||
|
>
|
||||||
|
{academicYears.map((year) => (
|
||||||
|
<option key={year} value={year}>
|
||||||
|
{year}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style={styles.tableContainer}>
|
<div style={styles.tableContainer}>
|
||||||
{currentTeachers.map((teacher, index) => {
|
{currentTeachers.map((teacher, index) => {
|
||||||
const teacherData = data.filter((row) => row.Name === teacher);
|
const teacherData = filteredData.filter((row) => row.Name === teacher);
|
||||||
console.log(teacherData);
|
console.log(teacherData);
|
||||||
return (
|
return (
|
||||||
<div key={index} style={{ marginBottom: "20px" }}>
|
<div key={index} style={{ marginBottom: "20px" }}>
|
||||||
@@ -316,7 +346,9 @@ const ConsolidatedTable = () => {
|
|||||||
<td style={styles.td}>{row.courseCode}</td>
|
<td style={styles.td}>{row.courseCode}</td>
|
||||||
<td style={styles.td}>{row.courseName}</td>
|
<td style={styles.td}>{row.courseName}</td>
|
||||||
<td style={styles.td}>{row.examType}</td>
|
<td style={styles.td}>{row.examType}</td>
|
||||||
<td style={styles.td}>{row.examPeriod +" "+ row.academicYear}</td>
|
<td style={styles.td}>
|
||||||
|
{row.examPeriod + " " + row.academicYear}
|
||||||
|
</td>
|
||||||
<td style={styles.td}>{row.marks}</td>
|
<td style={styles.td}>{row.marks}</td>
|
||||||
<td style={styles.td}>{row.Name}</td>
|
<td style={styles.td}>{row.Name}</td>
|
||||||
<td style={styles.td}>{row.affiliation}</td>
|
<td style={styles.td}>{row.affiliation}</td>
|
||||||
|
|||||||
@@ -3,19 +3,22 @@ import { useNavigate } from "react-router-dom";
|
|||||||
import "./FilterPage.css";
|
import "./FilterPage.css";
|
||||||
import { fetchCourses } from "../api";
|
import { fetchCourses } from "../api";
|
||||||
import Navbar from "./Navbar";
|
import Navbar from "./Navbar";
|
||||||
import { toast, ToastContainer } from 'react-toastify';
|
import { toast, ToastContainer } from "react-toastify";
|
||||||
import 'react-toastify/dist/ReactToastify.css';
|
import "react-toastify/dist/ReactToastify.css";
|
||||||
|
|
||||||
const FilterPage = () => {
|
const FilterPage = () => {
|
||||||
const currentYear = new Date().getFullYear();
|
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: "",
|
scheme: "",
|
||||||
semester: "",
|
semester: "",
|
||||||
department: "",
|
department: "",
|
||||||
program: "",
|
program: "",
|
||||||
academicYear: `${currentYear}-${(currentYear + 1).toString().slice(-2)}`,
|
academicYear: `${currentYear}-${(currentYear + 1).toString().slice(-2)}`,
|
||||||
});
|
};
|
||||||
|
|
||||||
|
const [formData, setFormData] = useState(savedFilters);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const handleInputChange = (e) => {
|
const handleInputChange = (e) => {
|
||||||
@@ -41,6 +44,7 @@ const FilterPage = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
localStorage.setItem("filterState", JSON.stringify(formData));
|
||||||
const filteredCourses = await fetchCourses(formData);
|
const filteredCourses = await fetchCourses(formData);
|
||||||
if (filteredCourses.length > 0) {
|
if (filteredCourses.length > 0) {
|
||||||
// Save filteredCourses in localStorage
|
// Save filteredCourses in localStorage
|
||||||
|
|||||||
@@ -172,7 +172,6 @@ app.get("/auth/logout", function (req, res) {
|
|||||||
// Refresh Token Endpoint
|
// Refresh Token Endpoint
|
||||||
app.post("/api/refresh", (req, res) => {
|
app.post("/api/refresh", (req, res) => {
|
||||||
const refreshToken = req.cookies.token;
|
const refreshToken = req.cookies.token;
|
||||||
console.log(refreshToken);
|
|
||||||
|
|
||||||
if (!refreshToken) {
|
if (!refreshToken) {
|
||||||
return res.status(401).json({ message: "No refresh token, authorization denied" });
|
return res.status(401).json({ message: "No refresh token, authorization denied" });
|
||||||
|
|||||||
Reference in New Issue
Block a user