chapterapp's picture
Empty sample data base in use the file that was just uploaded with 64 names. Allow student management section to be able to edit any name. school or grade
655dfe5 verified
// Main application script
document.addEventListener('DOMContentLoaded', function() {
// Student form submission
const studentForm = document.getElementById('studentForm');
if (studentForm) {
studentForm.addEventListener('submit', function(e) {
e.preventDefault();
// Get form values
const formData = {
fullName: document.getElementById('fullName').value,
address: document.getElementById('address').value,
telephone: document.getElementById('telephone').value,
school: document.getElementById('school').value,
grade: document.getElementById('grade').value,
ethnicity: document.getElementById('ethnicity').value
};
// In a real app, you would send this to your backend
console.log('Form submitted:', formData);
// Show success message
alert('Student information submitted successfully!');
// Reset form
studentForm.reset();
});
}
// Student management functionality
const studentTableBody = document.getElementById('studentTableBody');
const addStudentBtn = document.getElementById('addStudentBtn');
// Student data array (initially empty)
let students = [];
// Function to process uploaded data
function processUploadedData(processedStudents) {
students = [...students, ...processedStudents];
renderStudentTable();
saveStudents();
alert(`Successfully imported ${processedStudents.length} students`);
}
// Render student table
function renderStudentTable() {
if (!studentTableBody) return;
studentTableBody.innerHTML = '';
students.forEach(student => {
const row = document.createElement('tr');
row.innerHTML = `
<td class="px-6 py-4 whitespace-nowrap" data-field="fullName" data-id="${student.id}">
${student.fullName}
</td>
<td class="px-6 py-4 whitespace-nowrap" data-field="school" data-id="${student.id}">
${student.school}
</td>
<td class="px-6 py-4 whitespace-nowrap" data-field="grade" data-id="${student.id}">
${student.grade}
</td>
<td class="px-6 py-4 whitespace-nowrap">
<button class="text-indigo-600 hover:text-indigo-900 mr-3 edit-student-btn" data-id="${student.id}">Edit</button>
<button class="text-red-600 hover:text-red-900 delete-student-btn" data-id="${student.id}">Delete</button>
</td>
`;
studentTableBody.appendChild(row);
});
// Make name, school and grade cells editable
row.querySelectorAll('[data-field]').forEach(cell => {
cell.addEventListener('dblclick', () => {
const studentId = parseInt(cell.dataset.id);
const field = cell.dataset.field;
const student = students.find(s => s.id === studentId);
if (student) {
const input = document.createElement('input');
input.type = 'text';
input.value = cell.textContent.trim();
input.className = 'w-full border rounded px-2 py-1';
cell.innerHTML = '';
cell.appendChild(input);
input.focus();
const saveEdit = () => {
student[field] = input.value;
cell.textContent = input.value;
saveStudents();
};
input.addEventListener('blur', saveEdit);
input.addEventListener('keypress', (e) => {
if (e.key === 'Enter') saveEdit();
});
}
});
});
// Add event listeners to edit buttons (full modal edit)
row.querySelector('.edit-student-btn').addEventListener('click', () => {
const studentId = parseInt(row.querySelector('.edit-student-btn').dataset.id);
const student = students.find(s => s.id === studentId);
if (student) {
const modal = document.createElement('edit-student-modal');
modal.setStudentData(student);
document.body.appendChild(modal);
}
});
// Add event listeners to delete buttons
document.querySelectorAll('.delete-student-btn').forEach(btn => {
btn.addEventListener('click', () => {
const studentId = parseInt(btn.dataset.id);
if (confirm('Are you sure you want to delete this student?')) {
students = students.filter(s => s.id !== studentId);
renderStudentTable();
saveStudents();
alert('Student deleted successfully');
}
});
});
}
// Add new student
if (addStudentBtn) {
addStudentBtn.addEventListener('click', () => {
const modal = document.createElement('edit-student-modal');
modal.setStudentData({
id: Date.now(), // temporary ID
fullName: '',
address: '',
telephone: '',
school: '',
grade: '',
ethnicity: ''
});
document.body.appendChild(modal);
});
}
// Handle student updates
document.addEventListener('student-updated', (e) => {
const updatedStudent = e.detail;
const existingIndex = students.findIndex(s => s.id === updatedStudent.id);
if (existingIndex >= 0) {
// Update existing student
students[existingIndex] = updatedStudent;
} else {
// Add new student
students.push(updatedStudent);
}
renderStudentTable();
saveStudents();
alert('Student saved successfully');
});
// Initial render - try to load from localStorage
if (localStorage.getItem('students')) {
try {
students = JSON.parse(localStorage.getItem('students'));
if (students.length === 0) {
// If empty, show message about uploading data
if (studentTableBody) {
studentTableBody.innerHTML = `
<tr>
<td colspan="4" class="px-6 py-4 text-center text-gray-500">
No student data found. Please upload a file to get started.
</td>
</tr>
`;
}
}
} catch (e) {
console.error('Error loading students from localStorage:', e);
}
}
renderStudentTable();
// Save to localStorage whenever students array changes
function saveStudents() {
localStorage.setItem('students', JSON.stringify(students));
}
// Report generation functionality
const generateReportBtn = document.getElementById('generateReportBtn');
if (generateReportBtn) {
generateReportBtn.addEventListener('click', function() {
const reportType = document.getElementById('reportType').value;
// In a real app, this would call your backend API
console.log('Generating report type:', reportType);
alert(`Generating ${reportType} report... (This would call your backend in production)`);
});
}
// Ensure jsPDF is loaded
if (window.jspdf) {
window.jsPDF = window.jspdf.jsPDF;
}
// File upload functionality
const uploadForm = document.getElementById('uploadForm');
if (uploadForm) {
uploadForm.addEventListener('submit', function(e) {
e.preventDefault();
const fileInput = document.getElementById('dataFile');
const fileType = document.getElementById('fileType').value;
if (fileInput.files.length === 0) {
alert('Please select a file to upload');
return;
}
const file = fileInput.files[0];
const formData = new FormData();
formData.append('file', file);
formData.append('type', fileType);
// In a real app, this would be an API call to your backend
console.log('Uploading file:', file.name, 'Type:', fileType);
// Process the uploaded file
const reader = new FileReader();
reader.onload = (e) => {
const content = e.target.result;
let processedStudents = [];
try {
if (fileType === 'csv') {
// Parse CSV
const lines = content.split('\n');
const headers = lines[0].split(',');
for (let i = 1; i < lines.length; i++) {
if (lines[i].trim() === '') continue;
const values = lines[i].split(',');
const student = {
id: Date.now() + i,
fullName: values[0] || '',
address: values[1] || '',
telephone: values[2] || '',
school: values[3] || '',
grade: values[4] || '',
ethnicity: values[5] || ''
};
processedStudents.push(student);
}
}
else if (fileType === 'json') {
// Parse JSON
const jsonData = JSON.parse(content);
processedStudents = jsonData.map((item, i) => ({
id: Date.now() + i,
fullName: item.fullName || item.name || '',
address: item.address || '',
telephone: item.telephone || item.phone || '',
school: item.school || '',
grade: item.grade || '',
ethnicity: item.ethnicity || item.ethnicBackground || ''
}));
}
else if (fileType === 'excel') {
try {
const data = new Uint8Array(e.target.result);
const workbook = XLSX.read(data, { type: 'array' });
const firstSheet = workbook.Sheets[workbook.SheetNames[0]];
const jsonData = XLSX.utils.sheet_to_json(firstSheet);
processedStudents = jsonData.map((item, i) => ({
id: Date.now() + i,
fullName: item['Full Name'] || item['Name'] || item['Student Name'] || '',
address: item.Address || item['Home Address'] || '',
telephone: item.Telephone || item.Phone || item['Phone Number'] || '',
school: item.School || item['School Name'] || '',
grade: item.Grade || item['Grade Level'] || '',
ethnicity: item.Ethnicity || item['Ethnic Background'] || ''
}));
// Process the uploaded data
processUploadedData(processedStudents);
} catch (error) {
alert(`Error processing Excel file: ${error.message}`);
console.error('Excel processing error:', error);
}
return;
}
// Process the uploaded data
processUploadedData(processedStudents);
uploadForm.reset();
} catch (error) {
alert(`Error processing file: ${error.message}`);
console.error('File processing error:', error);
}
};
if (fileType === 'json') {
reader.readAsText(file);
} else if (fileType === 'csv') {
reader.readAsText(file);
}
else if (fileType === 'excel') {
// Read as array buffer for Excel files
reader.readAsArrayBuffer(file);
}
});
}
});