import React, { useState, useEffect } from "react"; import axios from "axios"; import * as XLSX from "xlsx-js-style"; import { sendEmail } from "../api"; const ConsolidatedTable = () => { const [data, setData] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const fetchData = async () => { try { const response = await axios.get( "http://localhost:8080/api/table/consolidated-table" ); setData(response.data); setLoading(false); } catch (error) { console.error("Error fetching table data:", error); setLoading(false); } }; fetchData(); }, []); if (loading) { return
Loading...
; } // Extract unique faculty names const uniqueTeachers = [...new Set(data.map((row) => row.Name))]; const createExcelFile = (teacherData, teacherName) => { const workbook = XLSX.utils.book_new(); // Define header information const headerInfo = [ ["Somaiya Vidyavihar University"], ["K. J. SOMAIYA COLLEGE OF ENGINEERING"], [ "Appointment of Internal Examiners for Paper Setting / OR/PR/Assessment/Reassessment", ], ["Class: B Tech/M Tech/Honour/Minor"], ["Department - Computer Engineering"], [], ]; const tableHeaders = [ [ "Sr No", "Semester", "Course Code", "Course Name", "Exam Type", "Year", "Marks", "Surname", "First Name", "Middle Name", "Affiliation/College", "Highest Qualification", "Career Experience", "Oral/Practical", "Assessment", "Reassessment", "Paper Setting", "Moderation", "PwD Paper Setting", ], ]; const dataRows = teacherData.map((row, index) => [ index + 1, row.semester, row.courseCode, row.courseName, row.examType, row.year, row.marks, row.surname, row.firstName, row.middleName, row.affiliation, row.qualification, row.experience, row.oralPractical, row.assessment, row.reassessment, row.paperSetting, row.moderation, row.pwdPaperSetting, ]); const sheetData = [...headerInfo, ...tableHeaders, ...dataRows]; const worksheet = XLSX.utils.aoa_to_sheet(sheetData); // Add merged cells worksheet["!merges"] = [ { s: { r: 0, c: 0 }, e: { r: 0, c: 18 } }, { s: { r: 1, c: 0 }, e: { r: 1, c: 18 } }, { s: { r: 2, c: 0 }, e: { r: 2, c: 18 } }, { s: { r: 3, c: 0 }, e: { r: 3, c: 18 } }, { s: { r: 4, c: 0 }, e: { r: 4, c: 18 } }, ]; // Define styles const boldStyle = { font: { bold: true, name: "Times New Roman", sz: 14 }, alignment: { horizontal: "center", vertical: "center" }, }; const redStyle = { font: { bold: true, color: { rgb: "FF0000" }, name: "Times New Roman", sz: 14 }, alignment: { horizontal: "center", vertical: "center" }, }; const normalStyle = { font: { name: "Times New Roman", sz: 12 }, }; // Apply styles to headers const headerRanges = [ { row: 0, style: boldStyle }, { row: 1, style: boldStyle }, { row: 2, style: boldStyle }, { row: 3, style: boldStyle }, { row: 4, style: redStyle }, ]; headerRanges.forEach(({ row, style }) => { for (let col = 0; col <= 18; col++) { const cellAddress = XLSX.utils.encode_cell({ r: row, c: col }); if (!worksheet[cellAddress]) continue; // Skip empty cells worksheet[cellAddress].s = style; } }); // Set column widths for better readability worksheet["!cols"] = [ { wch: 10 }, // Sr No { wch: 12 }, // Semester { wch: 15 }, // Course Code { wch: 25 }, // Course Name { wch: 15 }, // Exam Type { wch: 10 }, // Year { wch: 10 }, // Marks { wch: 15 }, // Surname { wch: 15 }, // First Name { wch: 15 }, // Middle Name { wch: 20 }, // Affiliation { wch: 20 }, // Qualification { wch: 15 }, // Career Experience { wch: 15 }, // Oral/Practical { wch: 15 }, // Assessment { wch: 15 }, // Reassessment { wch: 15 }, // Paper Setting { wch: 15 }, // Moderation { wch: 15 }, // PwD Paper Setting ]; // Apply normal font style to all cells Object.keys(worksheet).forEach((key) => { if (worksheet[key] && key[0] !== "!") { worksheet[key].s = worksheet[key].s || normalStyle; } }); // Add worksheet to workbook and save file XLSX.utils.book_append_sheet(workbook, worksheet, teacherName); XLSX.writeFile(workbook, `${teacherName.replace(/\s+/g, "_")}_Table.xlsx`); }; const bulkDownload = () => { uniqueTeachers.forEach((teacher) => { const teacherData = data.filter((row) => row.Name === teacher); createExcelFile(teacherData, teacher); }); }; const handleSendEmail = async (teacher, teacherData) => { const workbook = XLSX.utils.book_new(); const headerInfo = [ ["Somaiya Vidyavihar University"], ["K. J. SOMAIYA COLLEGE OF ENGINEERING"], [ "Appointment of Internal Examiners for Paper Setting / OR/PR/Assessment/Reassessment", ], ["Class: B Tech/M Tech/Honour/Minor"], ["Department - Computer Engineering"], [], ]; const tableHeaders = [ [ "Sr No", "Semester", "Course Code", "Course Name", "Exam Type", "Year", "Marks", "Surname", "First Name", "Middle Name", "Affiliation/College", "Highest Qualification", "Career Experience", "Oral/Practical", "Assessment", "Reassessment", "Paper Setting", "Moderation", "PwD Paper Setting", ], ]; const dataRows = teacherData.map((row, index) => [ index + 1, row.semester, row.courseCode, row.courseName, row.examType, row.year, row.marks, row.surname, row.firstName, row.middleName, row.affiliation, row.qualification, row.experience, row.oralPractical, row.assessment, row.reassessment, row.paperSetting, row.moderation, row.pwdPaperSetting, ]); const sheetData = [...headerInfo, ...tableHeaders, ...dataRows]; const worksheet = XLSX.utils.aoa_to_sheet(sheetData); XLSX.utils.book_append_sheet(workbook, worksheet, teacher); const fileName = `${teacher.replace(/\s+/g, "_")}_table.xlsx`; const excelBlob = XLSX.write(workbook, { bookType: "xlsx", type: "array", }); const file = new File([excelBlob], fileName, { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", }); const formData = new FormData(); formData.append("teacher", teacher); formData.append("fileName", fileName); const recipientEmail = prompt(`Enter recipient email for ${teacher}:`); formData.append("recipientEmail", recipientEmail); formData.append("file", file); try { const response = await sendEmail(formData); alert(`Email sent successfully to ${recipientEmail}`); console.log("Response from server:", response); } catch (error) { console.error("Error sending email:", error); alert("Failed to send email."); } }; return (

Faculty Tables with Download Options

{uniqueTeachers.map((teacher, index) => { const teacherData = data.filter((row) => row.Name === teacher); return (

{teacher}'s Table

{teacherData.map((row, idx) => ( ))}
Semester Course Code Course Name Exam Type Year Marks Name Affiliation/College Highest Qualification Career Experience Oral/Practical Assessment Reassessment Paper Setting Moderation PwD Paper Setting
{row.semester} {row.courseCode} {row.courseName} {row.examType} {row.year} {row.marks} {row.Name} {row.affiliation} {row.qualification} {row.experience} {row.oralPractical} {row.assessment} {row.reassessment} {row.paperSetting} {row.moderation} {row.pwdPaperSetting}
{/* Send Email Button */}
); })}
); }; export default ConsolidatedTable;