import React, { useState, useEffect } from "react"; import axios from "axios"; import { jsPDF } from "jspdf"; import autoTable from "jspdf-autotable"; import Navbar from "./Navbar"; const CourseConsolidated = () => { const [data, setData] = useState([]); const [loading, setLoading] = useState(true); const [currentPage, setCurrentPage] = useState(1); const tablesPerPage = 5; const [expandedCourse, setExpandedCourse] = useState(null); useEffect(() => { const fetchData = async () => { try { const response = await axios.get( "http://localhost:8080/api/table/course-consolidated" ); setData(response.data); setLoading(false); } catch (error) { console.error("Error fetching table data:", error); setLoading(false); } }; fetchData(); }, []); if (loading) { return
Loading...
; } // Extract unique courses by courseCode const uniqueCourses = [...new Set(data.map((row) => row.courseCode))]; // Pagination const indexOfLastTable = currentPage * tablesPerPage; const indexOfFirstTable = indexOfLastTable - tablesPerPage; const currentCourses = uniqueCourses.slice( indexOfFirstTable, indexOfLastTable ); const totalPages = Math.ceil(uniqueCourses.length / tablesPerPage); const handleNextPage = () => { if (currentPage < totalPages) setCurrentPage((prevPage) => prevPage + 1); }; const handlePrevPage = () => { if (currentPage > 1) setCurrentPage((prevPage) => prevPage - 1); }; const generateAppointmentPDF = async (courseData, courseName) => { const doc = new jsPDF(); const maroon = [128, 0, 0]; // College Logo const logoUrl = "/logo.png"; // Ensure the logo is placed in the public folder const logoWidth = 40; const logoHeight = 40; const logoX = 10; const logoY = 10; const loadImage = async (url) => { const response = await fetch(url); const blob = await response.blob(); return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result); reader.onerror = (error) => reject(error); reader.readAsDataURL(blob); }); }; try { const logoBase64 = await loadImage(logoUrl); doc.addImage(logoBase64, "PNG", logoX, logoY, logoWidth, logoHeight); } catch (error) { console.error("Failed to load logo:", error); } // Title Section doc.setFont("times", "normal"); doc.setTextColor(0, 0, 0); doc.setFontSize(12); doc.text("Date: " + new Date().toLocaleDateString(), 150, 20); doc.setFontSize(14); doc.text("CONFIDENTIAL", 10, 60); doc.setFontSize(16); doc.text( "LETTER OF APPOINTMENT AS QUESTION PAPER SETTER", 105, 70, { align: "center" } ); // Appointment Table const table1Data = [ ...(courseData.oralPracticalTeachers?.map((teacher) => [ teacher, "K. J. Somaiya School of Engineering", "Oral/Practical Teacher", "Contact Number", ]) || []), ...(courseData.assessmentTeachers?.map((teacher) => [ teacher, "K. J. Somaiya School of Engineering", "Reassessment Teacher", "Contact Number", ]) || []), ...(courseData.reassessmentTeachers?.map((teacher) => [ teacher, "K. J. Somaiya School of Engineering", "Reassessment Teacher", "Contact Number", ]) || []), ...(courseData.paperSettingTeachers?.map((teacher) => [ teacher, "K. J. Somaiya School of Engineering", "Paper Setter", "Contact Number", ]) || []), ...(courseData.moderationTeachers?.map((teacher) => [ teacher, "K. J. Somaiya School of Engineering", "Moderator", "Contact Number", ]) || []), ...(courseData.pwdPaperSettingTeachers?.map((teacher) => [ teacher, "K. J. Somaiya School of Engineering", "PwD Paper Setter", "Contact Number", ]) || []), ]; autoTable(doc, { head: [["Name", "Affiliation", "Appointment Role", "Email"]], body: table1Data, startY: 80, theme: "grid", headStyles: { fillColor: maroon, textColor: [255, 255, 255] }, styles: { textColor: [0, 0, 0] }, // Keep body text black }); // Content Table const detailsTableData = [ ["Programme:", courseData.courseName], ["Exam Category:", "Regular Examination"], ["Exam Type:", courseData.examType], ["Exam Season:", "Second Half - Winter Examination 2023"], ["Number of Sets Required:", courseData.paperSettingTeachers.length], ["Year:", courseData.year], ["Semester:", courseData.semester], ["Course Name:", courseName], ["Course Code:", courseData.courseCode], ]; autoTable(doc, { body: detailsTableData, startY: doc.previousAutoTable.finalY + 10, theme: "grid", // Plain table style styles: { textColor: [0, 0, 0] }, }); // Footer Section const footerY = doc.previousAutoTable.finalY + 10; // Dynamic Y-coordinate doc.setFontSize(12); doc.text("Dr. S. K. Ukarande", 10, footerY); doc.text("Principal", 10, footerY + 5); doc.text("K. J. Somaiya School of Engineering", 10, footerY + 10); // Footer Contact Details const footerContactY = footerY + 20; doc.setFontSize(10); doc.text( "Somaiya Vidyavihar, Vidyavihar (East), Mumbai-400 022, India", 10, footerContactY ); doc.text("Telephone: (91-22) 44444400, 44444404", 10, footerContactY + 5); doc.text("Email: principal.tech@somaiya.edu", 10, footerContactY + 10); doc.text("Web: www.somaiya.edu/kjsieit", 10, footerContactY + 15); // Save PDF doc.save(`${courseName} - AppointmentOrder.pdf`); }; return ( <>

Course Tables with Download Options

{currentCourses.map((courseCode, index) => { const courseData = data.filter( (row) => row.courseCode === courseCode ); const courseName = courseData[0]?.courseName; // Get course name from first item return (
setExpandedCourse( expandedCourse === courseCode ? null : courseCode ) } >

{courseName}'s Table

{expandedCourse === courseCode && ( {courseData.map((row, idx) => ( ))}
Semester Course Code Course Name Exam Type Year Oral/Practical Assessment Reassessment Paper Setting Moderation PwD Paper Setting
{row.semester} {row.courseCode} {row.courseName} {row.examType} {row.year} {row.oralPracticalTeachers && row.oralPracticalTeachers.length > 0 ? (
    {row.oralPracticalTeachers.map((teacher, idx) => (
  • {teacher}
  • ))}
) : ( "N/A" )}
{row.assessmentTeachers && row.assessmentTeachers.length > 0 ? (
    {row.assessmentTeachers.map((teacher, idx) => (
  • {teacher}
  • ))}
) : ( "N/A" )}
{row.reassessmentTeachers && row.reassessmentTeachers.length > 0 ? (
    {row.reassessmentTeachers.map((teacher, idx) => (
  • {teacher}
  • ))}
) : ( "N/A" )}
{row.paperSettingTeachers && row.paperSettingTeachers.length > 0 ? (
    {row.paperSettingTeachers.map((teacher, idx) => (
  • {teacher}
  • ))}
) : ( "N/A" )}
{row.moderationTeachers && row.moderationTeachers.length > 0 ? (
    {row.moderationTeachers.map((teacher, idx) => (
  • {teacher}
  • ))}
) : ( "N/A" )}
{row.pwdPaperSettingTeachers && row.pwdPaperSettingTeachers.length > 0 ? (
    {row.pwdPaperSettingTeachers.map( (teacher, idx) => (
  • {teacher}
  • ) )}
) : ( "N/A" )}
)}
); })}
{/* Pagination controls */}
Page {currentPage} of {totalPages}
); }; export default CourseConsolidated;