JIT
Add a button to view assignment respondents in the teacher dashboard
Create a button that says Assignment Respondents. Then you will see who submitted the assignment. You should see the names of the students. on this code: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Teacher Dashboard</title> <link rel="stylesheet" href="teacher.css"> </head> <body> <div class="navbar"> <h1>Teacher Dashboard</h1> </div> <div class="container"> <div class="button-container"> <button class="btn" id="createLessonBtn">Create Lesson</button> <button class="btn" id="createQuizBtn">Make Quiz</button> <button class="btn" id="manageScoresBtn">Manage Scores & Grades</button> <button class="btn" id="deleteLessonBtn">Delete Lesson</button> <button class="btn" id="deleteQuizBtn">Delete Quiz</button> <!-- Delete Quiz Button Re-added --> <button class="btn" id="createAssignmentBtn">Create Assignment</button> <button class="btn" id="deleteAssignmentBtn">Delete Assignment</button> </div> <h3>Created Lessons</h3> <div id="createdLessons"></div> <h3>Created Quizzes</h3> <div id="createdQuizzes"></div> <h3>Created Assignments</h3> <div id="createdAssignments"></div> </div> <!-- Lesson Modal (Create/Edit) --> <div id="lessonModal" class="modal"> <div class="modal-content"> <span class="close" data-modal-id="lessonModal">&times;</span> <h2 id="lessonModalTitle">Create Lesson</h2> <form id="lessonForm"> <input type="hidden" id="editLessonIndex" value="-1"> <label for="lessonTitle">Lesson Title:</label> <input type="text" id="lessonTitle" name="lessonTitle" required><br><br> <label for="lessonContent">Lesson Content:</label> <textarea id="lessonContent" name="lessonContent" rows="4" required></textarea><br><br> <label for="lessonFile">Upload File (Optional):</label> <input type="file" id="lessonFile" name="lessonFile"><br> <small id="currentFileName" style="display: none; margin-bottom: 15px; color: #555;">Current file: <span></span></small> <br> <button type="submit" id="lessonSubmitBtn" class="btn">Create Lesson</button> </form> </div> </div> <!-- Quiz Modal (Create/Edit) --> <div id="quizModal" class="modal"> <div class="modal-content large"> <span class="close" data-modal-id="quizModal">&times;</span> <h2 id="quizModalTitle">Create Quiz</h2> <form id="quizForm"> <input type="hidden" id="editQuizIndex" value="-1"> <label for="quizType">Quiz Type:</label> <select id="quizType" name="quizType" required> <option value="multiple-choice">Multiple Choice</option> <option value="identification">Identification</option> </select><br><br> <label for="quizTitle">Quiz Title:</label> <input type="text" id="quizTitle" name="quizTitle" required><br><br> <div id="questionsContainer"></div> <button type="button" class="btn" id="addQuestionBtn">Add Question</button><br><br> <button type="submit" id="quizSubmitBtn" class="btn">Create Quiz</button> </form> </div> </div> <!-- Delete Modal (Handles both Lessons and Quizzes) --> <div id="deleteModal" class="modal"> <div class="modal-content"> <span class="close" data-modal-id="deleteModal">&times;</span> <h2>Delete Item</h2> <label for="deleteType">Item Type:</label> <select id="deleteType"> <option value="lesson">Lesson</option> <option value="quiz">Quiz</option> <option value="assignment">Assignment</option> <!-- Added Assignment Option --> </select><br><br> <label for="deleteChoice">Select Item to Delete:</label> <select id="deleteChoice"></select><br><br> <button id="deleteBtn" class="btn delete">Delete</button> </div> </div> <!-- Manage Scores Modal --> <div id="manageScoresModal" class="modal"> <div class="modal-content large"> <span class="close" data-modal-id="manageScoresModal">&times;</span> <h2>Manage Scores and Grades</h2> <div class="manage-scores-container"> <label for="quizSelectForScores">Select Quiz:</label> <select id="quizSelectForScores"> <option value="">-- Select a Quiz --</option> <!-- Options populated by JS --> </select> <div id="studentScoresDisplay" class="scores-display-area"> <p class="no-scores-message">Select a quiz to view student scores.</p> <!-- Table will be inserted here by JS --> </div> </div> </div> </div> <!-- Performance Analytics Button --> <button id="analyticsBtn" class="analytics-btn">View Performance & Analytics</button> <!-- Performance Analytics Fullscreen Modal --> <div id="analyticsModal" class="modal fullscreen"> <div class="modal-content"> <h2>Teacher Performance & Analytics</h2> <div class="analytics-section"> <h3>Overview</h3> <p><strong>Lessons Created:</strong> <span id="lessonCount">0</span></p> <p><strong>Quizzes Created:</strong> <span id="quizCount">0</span></p> </div> <div class="analytics-section"> <h3>Class Performance</h3> <p>Average Quiz Score (across all students/quizzes): <span id="averageQuizScore">N/A</span></p> <!-- More detailed class performance could go here --> </div> <div class="modal-navigation"> <button id="modalDashboardBtn" class="modal-nav-btn dashboard">Back to Dashboard</button> <button id="modalHomeBtn" class="modal-nav-btn home">Homepage</button> <button id="modalLogoutBtn" class="modal-nav-btn logout">Logout</button> </div> </div> </div> <!-- Assignment Modal --> <div id="assignmentModal" class="modal"> <div class="modal-content"> <span class="close" data-modal-id="assignmentModal">&times;</span> <h2 id="assignmentModalTitle">Create Assignment</h2> <form id="assignmentForm"> <input type="hidden" id="editAssignmentIndex" value="-1"> <label for="assignmentTitle">Assignment Title:</label> <input type="text" id="assignmentTitle" name="assignmentTitle" required><br><br> <label for="assignmentDescription">Description:</label> <textarea id="assignmentDescription" name="assignmentDescription" rows="4" required></textarea><br><br> <label for="assignmentDueDate">Due Date:</label> <input type="date" id="assignmentDueDate" name="assignmentDueDate" required><br><br> <label for="assignmentFile">Upload File (Optional):</label> <input type="file" id="assignmentFile" name="assignmentFile"><br> <small id="currentAssignmentFileName" style="display: none; margin-bottom: 15px; color: #555;">Current file: <span></span></small> <br> <button type="submit" id="assignmentSubmitBtn" class="btn">Create Assignment</button> </form> </div> </div> <script src="login.js"></script> <!-- Include for getUsers --> <script src="teacher.js"></script> </body> </html> document.addEventListener('DOMContentLoaded', () => { // --- Login Check --- const loggedInUsername = sessionStorage.getItem('loggedInUsername'); const loggedInRole = sessionStorage.getItem('loggedInRole'); if (!loggedInUsername || !loggedInRole || loggedInRole !== 'teacher') { alert('Access denied. Please log in as a teacher.'); window.location.href = 'login.html'; // Redirect to login if not a teacher return; } // --- End Login Check --- // Add notification icon to navbar const navbar = document.createElement('div'); navbar.className = 'teacher-navbar'; navbar.innerHTML = ` <h1>Teacher Dashboard</h1> `; document.body.insertBefore(navbar, document.body.firstChild); // Modify functions to add notifications when creating content // In handleLessonFormSubmit function, after saving the lesson: const notifyStudents = (type, details) => { const users = getUsers(); const studentUsernames = Object.keys(users).filter(u => users[u].role === 'student'); studentUsernames.forEach(student => { let message = ''; switch(type) { case 'lesson': message = `New lesson available: ${details.title}`; break; case 'quiz': message = `New quiz available: ${details.quizTitle}`; break; case 'assignment': message = `New assignment: ${details.title} - Due: ${details.dueDate}`; break; } NotificationSystem.addNotification( student, message, type, details.title || details.quizTitle ); }); }; // --- DOM Elements --- const lessonModal = document.getElementById('lessonModal'); const quizModal = document.getElementById('quizModal'); const deleteModal = document.getElementById('deleteModal'); const manageScoresModal = document.getElementById('manageScoresModal'); const analyticsModal = document.getElementById('analyticsModal'); const assignmentModal = document.getElementById('assignmentModal'); const createLessonBtn = document.getElementById('createLessonBtn'); const createQuizBtn = document.getElementById('createQuizBtn'); const deleteLessonBtn = document.getElementById('deleteLessonBtn'); const deleteQuizBtn = document.getElementById('deleteQuizBtn'); const manageScoresBtn = document.getElementById('manageScoresBtn'); const analyticsBtn = document.getElementById('analyticsBtn'); const createAssignmentBtn = document.getElementById('createAssignmentBtn'); const deleteAssignmentBtn = document.getElementById('deleteAssignmentBtn'); const deleteTypeSelect = document.getElementById('deleteType'); const deleteChoiceSelect = document.getElementById('deleteChoice'); const deleteBtn = document.getElementById('deleteBtn'); const createdAssignmentsDiv = document.getElementById('createdAssignments'); const closeButtons = document.querySelectorAll('.close'); // Lesson Form Elements const lessonForm = document.getElementById('lessonForm'); const lessonModalTitle = document.getElementById('lessonModalTitle'); const editLessonIndexInput = document.getElementById('editLessonIndex'); const lessonTitleInput = document.getElementById('lessonTitle'); const lessonContentInput = document.getElementById('lessonContent'); const lessonFileInput = document.getElementById('lessonFile'); const currentFileNameSpan = document.getElementById('currentFileName').querySelector('span'); const currentFileNameDisplay = document.getElementById('currentFileName'); const lessonSubmitBtn = document.getElementById('lessonSubmitBtn'); // Quiz Form Elements const quizForm = document.getElementById('quizForm'); const quizModalTitle = document.getElementById('quizModalTitle'); const editQuizIndexInput = document.getElementById('editQuizIndex'); const quizTypeSelect = document.getElementById('quizType'); const quizTitleInput = document.getElementById('quizTitle'); const questionsContainer = document.getElementById('questionsContainer'); const addQuestionBtn = document.getElementById('addQuestionBtn'); const quizSubmitBtn = document.getElementById('quizSubmitBtn'); // Manage Scores Modal Elements const quizSelectForScores = document.getElementById('quizSelectForScores'); const studentScoresDisplay = document.getElementById('studentScoresDisplay'); // Analytics Modal Elements const lessonCountSpan = document.getElementById('lessonCount'); const quizCountSpan = document.getElementById('quizCount'); const averageQuizScoreSpan = document.getElementById('averageQuizScore'); const modalDashboardBtn = document.getElementById('modalDashboardBtn'); const modalHomeBtn = document.getElementById('modalHomeBtn'); const modalLogoutBtn = document.getElementById('modalLogoutBtn'); // Assignment Form Elements const assignmentForm = document.getElementById('assignmentForm'); const assignmentModalTitle = document.getElementById('assignmentModalTitle'); const editAssignmentIndexInput = document.getElementById('editAssignmentIndex'); const assignmentTitleInput = document.getElementById('assignmentTitle'); const assignmentDescriptionInput = document.getElementById('assignmentDescription'); const assignmentDueDateInput = document.getElementById('assignmentDueDate'); const assignmentFileInput = document.getElementById('assignmentFile'); const currentAssignmentFileNameSpan = document.getElementById('currentAssignmentFileName').querySelector('span'); const currentAssignmentFileNameDisplay = document.getElementById('currentAssignmentFileName'); const assignmentSubmitBtn = document.getElementById('assignmentSubmitBtn'); // Display Areas const createdLessonsDiv = document.getElementById('createdLessons'); const createdQuizzesDiv = document.getElementById('createdQuizzes'); let questionCount = 0; const storageKeys = { lessons: 'createdLessons', quizzes: 'createdQuizzes', assignments: 'createdAssignments', users: 'registeredUsers' }; // --- Utility Functions --- const openModal = (modal) => { modal.style.display = "block"; if (modal.classList.contains('fullscreen')) { document.body.classList.add('modal-open'); } }; const closeModal = (modal) => { modal.style.display = "none"; if (modal.classList.contains('fullscreen')) { document.body.classList.remove('modal-open'); } if (modal.id === 'lessonModal') resetLessonForm(); if (modal.id === 'quizModal') resetQuizForm(); if (modal.id === 'assignmentModal') resetAssignmentForm(); if (modal.id === 'manageScoresModal') { studentScoresDisplay.innerHTML = '<p class="no-scores-message">Select a quiz to view student scores.</p>'; quizSelectForScores.value = ""; } if (modal.id === 'deleteModal') { deleteTypeSelect.value = 'lesson'; deleteChoiceSelect.innerHTML = '<option value="">-- Select --</option>'; } }; const getData = (key) => { const data = localStorage.getItem(key); if (data && data.startsWith('[')) { try { return JSON.parse(data); } catch (e) { console.error("Error parsing JSON array from localStorage for key:", key, e); return []; } } return []; }; if (typeof getUsers !== 'function') { console.error("Error: getUsers function not found. Make sure login.js is included before teacher.js"); alert("A critical error occurred. Please try refreshing the page or logging in again."); return; } const setData = (key, data) => { try { localStorage.setItem(key, JSON.stringify(data)); } catch (e) { console.error("Error setting data to localStorage for key:", key, e); if (e.name === 'QuotaExceededError') { alert('Error: Could not save data. Local storage quota exceeded. This might be due to a large file upload.'); } else { alert('An error occurred while saving data.'); } } }; // --- Assignment Functions --- const resetAssignmentForm = () => { assignmentForm.reset(); editAssignmentIndexInput.value = "-1"; assignmentModalTitle.textContent = "Create Assignment"; assignmentSubmitBtn.textContent = "Create Assignment"; currentAssignmentFileNameDisplay.style.display = 'none'; currentAssignmentFileNameSpan.textContent = ''; }; const updateCreatedAssignments = () => { const assignments = getData(storageKeys.assignments); createdAssignmentsDiv.innerHTML = ''; assignments.forEach((assignment, index) => { const assignmentDiv = document.createElement('div'); const contentDiv = document.createElement('div'); let fileInfo = ''; if (assignment.fileName) { fileInfo = `<p><small><em>Attachment: ${assignment.fileName}</em></small></p>`; } contentDiv.innerHTML = ` <p><strong>${assignment.title}</strong></p> <p>${assignment.description.substring(0, 100)}${assignment.description.length > 100 ? '...' : ''}</p> <p><small>Due: ${assignment.dueDate}</small></p> ${fileInfo} `; assignmentDiv.appendChild(contentDiv); const editBtn = document.createElement('button'); editBtn.textContent = 'Edit'; editBtn.classList.add('btn', 'edit'); editBtn.dataset.index = index; editBtn.addEventListener('click', () => editAssignment(index)); assignmentDiv.appendChild(editBtn); createdAssignmentsDiv.appendChild(assignmentDiv); }); }; const editAssignment = (index) => { const assignments = getData(storageKeys.assignments); if (index >= 0 && index < assignments.length) { const assignment = assignments[index]; resetAssignmentForm(); editAssignmentIndexInput.value = index; assignmentTitleInput.value = assignment.title; assignmentDescriptionInput.value = assignment.description; assignmentDueDateInput.value = assignment.dueDate; if (assignment.fileName) { currentAssignmentFileNameSpan.textContent = assignment.fileName; currentAssignmentFileNameDisplay.style.display = 'block'; } else { currentAssignmentFileNameDisplay.style.display = 'none'; } assignmentModalTitle.textContent = "Edit Assignment"; assignmentSubmitBtn.textContent = "Save Changes"; openModal(assignmentModal); } }; const handleAssignmentFormSubmit = (event) => { event.preventDefault(); const file = assignmentFileInput.files[0]; const editIndex = parseInt(editAssignmentIndexInput.value, 10); let assignments = getData(storageKeys.assignments); let existingAssignmentData = (editIndex > -1 && editIndex < assignments.length) ? assignments[editIndex] : {}; const assignmentData = { title: assignmentTitleInput.value, description: assignmentDescriptionInput.value, dueDate: assignmentDueDateInput.value, fileName: existingAssignmentData.fileName || null, fileDataUrl : existingAssignmentData.fileDataUrl || null, createdAt: new Date().toISOString() }; const saveData = () => { if (editIndex > -1 && editIndex < assignments.length) { assignments[editIndex] = assignmentData; alert('Assignment Updated!'); } else { assignments.push(assignmentData); alert('Assignment Created!'); } setData(storageKeys.assignments, assignments); closeModal(assignmentModal); updateCreatedAssignments(); notifyStudents('assignment', assignmentData); }; if (file) { const maxSizeMB = 2; if (file.size > maxSizeMB * 1024 * 1024) { alert(`File is too large. Maximum size is ${maxSizeMB}MB.`); assignmentFileInput.value = ''; return; } const reader = new FileReader(); reader.onloadend = function() { assignmentData.fileName = file.name; assignmentData.fileDataUrl = reader.result; saveData(); } reader.onerror = function() { alert('Error reading file.'); console.error("File reading error:", reader.error); } reader.readAsDataURL(file); } else { if (editIndex > -1 && !existingAssignmentData.fileName) { assignmentData.fileName = null; assignmentData.fileDataUrl = null; } saveData(); } }; // --- Lesson Functions --- const resetLessonForm = () => { lessonForm.reset(); editLessonIndexInput.value = "-1"; lessonModalTitle.textContent = "Create Lesson"; lessonSubmitBtn.textContent = "Create Lesson"; currentFileNameDisplay.style.display = 'none'; currentFileNameSpan.textContent = ''; }; const updateCreatedLessons = () => { const lessons = getData(storageKeys.lessons); createdLessonsDiv.innerHTML = ''; lessons.forEach((lesson, index) => { const lessonDiv = document.createElement('div'); const contentDiv = document.createElement('div'); let fileInfo = ''; if (lesson.fileName) { fileInfo = `<p><small><em>Attachment: ${lesson.fileName}</em></small></p>`; } contentDiv.innerHTML = `<p><strong>${lesson.title}</strong></p><p>${lesson.content.substring(0, 100)}${lesson.content.length > 100 ? '...' : ''}</p>${fileInfo}`; lessonDiv.appendChild(contentDiv); const editBtn = document.createElement('button'); editBtn.textContent = 'Edit'; editBtn.classList.add('btn', 'edit'); editBtn.dataset.index = index; editBtn.addEventListener('click', () => editLesson(index)); lessonDiv.appendChild(editBtn); createdLessonsDiv.appendChild(lessonDiv); }); updateDeleteChoices(); }; const editLesson = (index) => { const lessons = getData(storageKeys.lessons); if (index >= 0 && index < lessons.length) { const lesson = lessons[index]; resetLessonForm(); editLessonIndexInput.value = index; lessonTitleInput.value = lesson.title; lessonContentInput.value = lesson.content; if (lesson.fileName) { currentFileNameSpan.textContent = lesson.fileName; currentFileNameDisplay.style.display = 'block'; } else { currentFileNameDisplay.style.display = 'none'; } lessonModalTitle.textContent = "Edit Lesson"; lessonSubmitBtn.textContent = "Save Changes"; openModal(lessonModal); } }; const handleLessonFormSubmit = (event) => { event.preventDefault(); const file = lessonFileInput.files[0]; const editIndex = parseInt(editLessonIndexInput.value, 10); let lessons = getData(storageKeys.lessons); let existingLessonData = (editIndex > -1 && editIndex < lessons.length) ? lessons[editIndex] : {}; const lessonData = { title: lessonTitleInput.value, content: lessonContentInput.value, fileName: existingLessonData.fileName || null, fileDataUrl: existingLessonData.fileDataUrl || null, createdAt: new Date().toISOString() }; const saveData = () => { if (editIndex > -1 && editIndex < lessons.length) { lessons[editIndex] = lessonData; alert('Lesson Updated!'); } else { lessons.push(lessonData); alert('Lesson Created!'); } setData(storageKeys.lessons, lessons); closeModal(lessonModal); updateCreatedLessons(); notifyStudents('lesson', lessonData); }; if (file) { const maxSizeMB = 2; if (file.size > maxSizeMB * 1024 * 1024) { alert(`File is too large. Maximum size is ${maxSizeMB}MB.`); lessonFileInput.value = ''; return; } const reader = new FileReader(); reader.onloadend = function() { lessonData.fileName = file.name; lessonData.fileDataUrl = reader.result; saveData(); } reader.onerror = function() { alert('Error reading file.'); console.error("File reading error:", reader.error); } reader.readAsDataURL(file); } else { if (editIndex > -1 && !existingLessonData.fileName) { lessonData.fileName = null; lessonData.fileDataUrl = null; } saveData(); } }; // --- Quiz Functions --- const resetQuizForm = () => { quizForm.reset(); editQuizIndexInput.value = "-1"; questionsContainer.innerHTML = ''; questionCount = 0; quizModalTitle.textContent = "Create Quiz"; quizSubmitBtn.textContent = "Create Quiz"; quizTypeSelect.disabled = false; toggleMultipleChoiceFields(); }; const toggleMultipleChoiceFields = () => { const selectedType = quizTypeSelect.value; const allQuestionContainers = questionsContainer.querySelectorAll('.question-container'); allQuestionContainers.forEach(qContainer => { const mcContainer = qContainer.querySelector('.multiple-choice-container'); const choiceInputs = mcContainer ? mcContainer.querySelectorAll('input[type="text"]') : []; const answerInput = qContainer.querySelector('input[name$="-correct-answer"]'); const answerLabel = answerInput ? answerInput.previousElementSibling : null; if (mcContainer) { mcContainer.style.display = selectedType === 'multiple-choice' ? 'block' : 'none'; choiceInputs.forEach(input => input.required = (selectedType === 'multiple-choice')); } if (answerLabel && answerLabel.tagName === 'LABEL') { answerLabel.textContent = selectedType === 'identification' ? 'Correct Answer:' : 'Correct Answer (must match one choice):'; } }); }; const addQuestion = (questionData = null) => { const currentQIndex = questionData ? questionData.qIndex : ++questionCount; const questionDiv = document.createElement('div'); questionDiv.classList.add('question-container'); questionDiv.dataset.qIndex = currentQIndex; const qText = questionData ? questionData.questionText : ''; const qAnswer = questionData ? questionData.correctAnswer : ''; const qChoices = questionData ? questionData.choices : ['', '', '', '']; questionDiv.innerHTML = ` <h4>Question ${currentQIndex}</h4> <label for="question-${currentQIndex}">Question Text:</label> <input type="text" id="question-${currentQIndex}" name="question-${currentQIndex}" value="${qText}" required><br> <div class="multiple-choice-container" style="display: ${quizTypeSelect.value === 'multiple-choice' ? 'block' : 'none'};"> <label>Choices:</label><br> <input type="text" name="question-${currentQIndex}-choice-1" placeholder="Choice 1" value="${qChoices[0] || ''}" ${quizTypeSelect.value === 'multiple-choice' ? 'required' : ''}><br> <input type="text" name="question-${currentQIndex}-choice-2" placeholder="Choice 2" value="${qChoices[1] || ''}" ${quizTypeSelect.value === 'multiple-choice' ? 'required' : ''}><br> <input type="text" name="question-${currentQIndex}-choice-3" placeholder="Choice 3" value="${qChoices[2] || ''}" ${quizTypeSelect.value === 'multiple-choice' ? 'required' : ''}><br> <input type="text" name="question-${currentQIndex}-choice-4" placeholder="Choice 4" value="${qChoices[3] || ''}" ${quizTypeSelect.value === 'multiple-choice' ? 'required' : ''}><br> </div> <label for="question-${currentQIndex}-correct-answer">${quizTypeSelect.value === 'identification' ? 'Correct Answer:' : 'Correct Answer (must match one choice):'}</label> <input type="text" name="question-${currentQIndex}-correct-answer", value="${qAnswer}" required><br> `; questionsContainer.appendChild(questionDiv); if (!questionData) questionCount = currentQIndex; }; const updateCreatedQuizzes = () => { const quizzes = getData(storageKeys.quizzes); createdQuizzesDiv.innerHTML = ''; quizzes.forEach((quiz, index) => { const quizDiv = document.createElement('div'); const contentDiv = document.createElement('div'); const title = quiz.quizTitle || 'Untitled Quiz'; const type = quiz.quizType || 'N/A'; const numQuestions = Array.isArray(quiz.questions) ? quiz.questions.length : 0; contentDiv.innerHTML = `<p><strong>${title}</strong></p><p>(Type: ${type}, Questions: ${numQuestions})</p>`; quizDiv.appendChild(contentDiv); createdQuizzesDiv.appendChild(quizDiv); }); updateDeleteChoices(); populateQuizSelectForScores(); }; const editQuiz = (index) => { const quizzes = getData(storageKeys.quizzes); if (index >= 0 && index < quizzes.length) { const quiz = quizzes[index]; resetQuizForm(); editQuizIndexInput.value = index; quizTitleInput.value = quiz.quizTitle; quizTypeSelect.value = quiz.quizType; quizTypeSelect.disabled = true; questionCount = 0; quiz.questions.forEach((q, qIndex) => { addQuestion({ ...q, qIndex: qIndex + 1 }); }); quizModalTitle.textContent = "Edit Quiz"; quizSubmitBtn.textContent = "Save Changes"; openModal(quizModal); toggleMultipleChoiceFields(); } }; const handleQuizFormSubmit = (event) => { event.preventDefault(); const editIndex = parseInt(editQuizIndexInput.value, 10); const quizType = quizTypeSelect.value; const quizTitle = quizTitleInput.value; const questions = []; const questionElements = questionsContainer.querySelectorAll('.question-container'); const currentQuestionCount = questionElements.length; for (let i = 0; i < currentQuestionCount; i++) { const qContainer = questionElements[i]; const qIndex = qContainer.dataset.qIndex; const questionText = qContainer.querySelector(`[name='question-${qIndex}']`)?.value.trim(); const correctAnswer = qContainer.querySelector(`[name='question-${qIndex}-correct-answer']`)?.value.trim(); const choices = []; if (!questionText || correctAnswer === undefined || correctAnswer === null || correctAnswer === "") { alert(`Please fill out question text and correct answer for Question ${qIndex}.`); return; } if (quizType === 'multiple-choice') { const choiceInputs = qContainer.querySelectorAll(`.multiple-choice-container input[type="text"]`); let choicesComplete = true; choiceInputs.forEach(input => { const choiceValue = input.value.trim(); if (!choiceValue) choicesComplete = false; choices.push(choiceValue); }); if (!choicesComplete) { alert(`Please fill out all choices for Question ${qIndex}.`); return; } if (!choices.includes(correctAnswer)) { alert(`The correct answer for Question ${qIndex} ("${correctAnswer}") must exactly match one of the provided choices.`); return; } } questions.push({ questionText, choices: quizType === 'multiple-choice' ? choices : [], correctAnswer }); } if (questions.length === 0) { alert('Please add at least one question to the quiz.'); return; } const quizData = { quizType, quizTitle, questions, createdAt: new Date().toISOString() }; let quizzes = getData(storageKeys.quizzes); if (editIndex > -1 && editIndex < quizzes.length) { quizzes[editIndex] = quizData; alert('Quiz Updated!'); } else { quizzes.push(quizData); alert('Quiz Created!'); } setData(storageKeys.quizzes, quizzes); closeModal(quizModal); updateCreatedQuizzes(); notifyStudents('quiz', quizData); }; // --- Delete Functions --- const updateDeleteChoices = () => { const deleteType = deleteTypeSelect.value; deleteChoiceSelect.innerHTML = '<option value="">-- Select --</option>'; const items = getData( deleteType === "lesson" ? storageKeys.lessons : deleteType === "quiz" ? storageKeys.quizzes : storageKeys.assignments ); items.forEach((item, index) => { const option = document.createElement('option'); option.value = index; option.textContent = item.title || item.quizTitle || `${deleteType.charAt(0).toUpperCase() + deleteType.slice(1)} ${index + 1}`; deleteChoiceSelect.appendChild(option); }); deleteBtn.disabled = items.length === 0; }; const handleDelete = () => { const selectedIndex = deleteChoiceSelect.value; const deleteType = deleteTypeSelect.value; if (selectedIndex === "") { alert('Please select an item to delete.'); return; } const storageKey = deleteType === 'lesson' ? storageKeys.lessons : deleteType === 'quiz' ? storageKeys.quizzes : storageKeys.assignments; let items = getData(storageKey); const itemToDelete = items[selectedIndex]; const itemName = itemToDelete?.title || itemToDelete?.quizTitle || `${deleteType} ${parseInt(selectedIndex)+1}`; if (confirm(`Are you sure you want to delete ${deleteType} "${itemName}"? This cannot be undone.`)) { items.splice(selectedIndex, 1); setData(storageKey, items); alert(`${deleteType.charAt(0).toUpperCase() + deleteType.slice(1)} Deleted!`); if (deleteType === 'lesson') { updateCreatedLessons(); } else if (deleteType === 'quiz') { updateCreatedQuizzes(); } else { updateCreatedAssignments(); } closeModal(deleteModal); } }; // --- Manage Scores Functions --- const populateQuizSelectForScores = () => { const quizzes = getData(storageKeys.quizzes); quizSelectForScores.innerHTML = '<option value="">-- Select a Quiz --</option>'; quizzes.forEach((quiz, index) => { const option = document.createElement('option'); option.value = index; option.textContent = quiz.quizTitle || `Quiz ${index + 1}`; quizSelectForScores.appendChild(option); }); }; const displayStudentScores = () => { const selectedQuizIndex = quizSelectForScores.value; studentScoresDisplay.innerHTML = ''; console.log(`[DEBUG] displayStudentScores called. Selected Quiz Index: '${selectedQuizIndex}'`); if (selectedQuizIndex === "") { studentScoresDisplay.innerHTML = '<p class="no-scores-message">Select a quiz to view student scores.</p>'; console.log("[DEBUG] No quiz selected. Aborting."); return; } const quizzes = getData(storageKeys.quizzes); const selectedQuiz = quizzes[selectedQuizIndex]; if (!selectedQuiz || !selectedQuiz.quizTitle) { console.error(`[DEBUG] Error: Could not find valid quiz data or title for index ${selectedQuizIndex}`); studentScoresDisplay.innerHTML = '<p class="no-scores-message">Error: Could not find selected quiz data.</p>'; return; } const selectedQuizTitle = selectedQuiz.quizTitle; console.log("[DEBUG] Selected Quiz Data:", selectedQuiz); const registeredUsers = getUsers(); console.log("[DEBUG] Raw Registered Users Data from getUsers():", registeredUsers); if (Object.keys(registeredUsers).length === 0) { console.warn("[DEBUG] No registered users found."); studentScoresDisplay.innerHTML = '<p class="no-scores-message">No registered users found.</p>'; return; } const studentUsernames = Object.keys(registeredUsers).filter(username => { const user = registeredUsers[username]; const isStudent = user && user.role === 'student'; if (!isStudent) { console.log(`[DEBUG] Filtering out user '${username}'. Role is not 'student' or user data is malformed. User data:`, user); } return isStudent; }); console.log("[DEBUG] Filtered Student Usernames:", studentUsernames); if (studentUsernames.length === 0) { console.warn("[DEBUG] No users with role 'student' found after filtering."); studentScoresDisplay.innerHTML = '<p class="no-scores-message">No registered students found.</p>'; return; } let tableHTML = ` <h4>Scores for: ${selectedQuizTitle}</h4> <table> <thead> <tr> <th>Student</th> <th>Score (%)</th> <th>Date Taken</th> </tr> </thead> <tbody> `; let scoresFound = false; studentUsernames.forEach(username => { const studentData = registeredUsers[username]; console.log(`[DEBUG] Checking results for student: '${username}'`); if (studentData && Array.isArray(studentData.quizScores)) { const result = studentData.quizScores.find(score => score.quizName === selectedQuizTitle); console.log(`[DEBUG] Result for quiz title '${selectedQuizTitle}' for student '${username}':`, result); if (result && typeof result.score === 'number') { scoresFound = true; const scorePercentage = result.score; const dateTaken = result.timestamp ? new Date(result.timestamp).toLocaleString() : 'N/A'; console.log(`[DEBUG] Adding row for '${username}': Score=${scorePercentage}%, Date=${dateTaken}`); tableHTML += ` <tr> <td>${username}</td> <td>${scorePercentage}%</td> <td>${dateTaken}</td> </tr> `; } else { console.log(`[DEBUG] No valid result found for quiz title '${selectedQuizTitle}' for student '${username}' or result format is incorrect.`); } } else { console.log(`[DEBUG] No quizScores array found for student '${username}'. Skipping.`); } }); if (!scoresFound) { console.warn("[DEBUG] No scores found for any student for this specific quiz title:", selectedQuizTitle); tableHTML += '<tr><td colspan="3" class="no-scores-message">No students have taken this quiz yet or results are missing.</td></tr>'; } tableHTML += '</tbody></table>'; studentScoresDisplay.innerHTML = tableHTML; console.log("[DEBUG] displayStudentScores finished."); }; // --- Analytics Modal Functions --- const openAnalyticsModal = () => { populateTeacherAnalytics(); openModal(analyticsModal); }; const closeAnalyticsModal = () => { closeModal(analyticsModal); }; const populateTeacherAnalytics = () => { const lessons = getData(storageKeys.lessons); const quizzes = getData(storageKeys.quizzes); lessonCountSpan.textContent = lessons.length; quizCountSpan.textContent = quizzes.length; let totalPercentageSum = 0; let totalQuizzesTakenCount = 0; const registeredUsers = getUsers(); const studentUsernames = Object.keys(registeredUsers).filter(username => registeredUsers[username]?.role === 'student'); studentUsernames.forEach(username => { const studentData = registeredUsers[username]; if (studentData && Array.isArray(studentData.quizScores)) { studentData.quizScores.forEach(result => { if (result && typeof result.score === 'number') { totalPercentageSum += result.score; totalQuizzesTakenCount++; } }); } }); if (totalQuizzesTakenCount > 0) { averageQuizScoreSpan.textContent = (totalPercentageSum / totalQuizzesTakenCount).toFixed(1) + '%'; } else { averageQuizScoreSpan.textContent = 'N/A'; } }; // --- Navigation Logic --- function goToHomepage() { window.location.href = 'homepage.html'; } function logout() { sessionStorage.removeItem('loggedInUsername'); sessionStorage.removeItem('loggedInRole'); alert('You have been logged out.'); window.location.href = 'login.html'; } // --- Event Listeners --- createLessonBtn.addEventListener('click', () => { resetLessonForm(); openModal(lessonModal); }); createQuizBtn.addEventListener('click', () => { resetQuizForm(); addQuestion(); openModal(quizModal); }); createAssignmentBtn.addEventListener('click', () => { resetAssignmentForm(); openModal(assignmentModal); }); deleteLessonBtn.addEventListener('click', () => { deleteTypeSelect.value = "lesson"; updateDeleteChoices(); openModal(deleteModal); }); deleteQuizBtn.addEventListener('click', () => { deleteTypeSelect.value = "quiz"; updateDeleteChoices(); openModal(deleteModal); }); deleteAssignmentBtn.addEventListener('click', () => { deleteTypeSelect.value = "assignments"; updateDeleteChoices(); openModal(deleteModal); }); manageScoresBtn.addEventListener('click', () => { populateQuizSelectForScores(); studentScoresDisplay.innerHTML='<p class="no-scores-message">Select a quiz to view student scores.</p>'; openModal(manageScoresModal); }); closeButtons.forEach(button => { button.addEventListener('click', () => { const modalId = button.getAttribute('data-modal-id'); if (modalId) { const modalToClose = document.getElementById(modalId); if (modalToClose) closeModal(modalToClose); } }); }); window.addEventListener('click', (event) => { if (event.target.classList.contains('modal') && !event.target.classList.contains('fullscreen')) { closeModal(event.target); } }); lessonForm.addEventListener('submit', handleLessonFormSubmit); quizForm.addEventListener('submit', handleQuizFormSubmit); assignmentForm.addEventListener('submit', handleAssignmentFormSubmit); addQuestionBtn.addEventListener('click', () => addQuestion()); quizTypeSelect.addEventListener('change', toggleMultipleChoiceFields); deleteTypeSelect.addEventListener('change', updateDeleteChoices); deleteBtn.addEventListener('click', handleDelete); quizSelectForScores.addEventListener('change', displayStudentScores); analyticsBtn.addEventListener('click', openAnalyticsModal); modalDashboardBtn.addEventListener('click', closeAnalyticsModal); modalHomeBtn.addEventListener('click', goToHomepage); modalLogoutBtn.addEventListener('click', logout); const notifyUsers = (role, message) => { const key = role === 'teacher' ? 'teacherNotifications' : 'studentNotifications'; const notifications = JSON.parse(localStorage.getItem(key) || '[]'); notifications.unshift(message); // Add to the top localStorage.setItem(key, JSON.stringify(notifications)); }; // Notify students about a new lesson notifyUsers('student', 'A new lesson has been added.'); // --- Initial Load --- updateCreatedLessons(); updateCreatedQuizzes(); updateCreatedAssignments(); });

I'll help you add the functionality to track assignment submissions and display student names. Here's the updated code:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Teacher Dashboard</title>
    <link rel="stylesheet" href="teacher.css">
</head>
<body>
    <div class="navbar">
        <h1>Teacher Dashboard</h1>
    </div>

    <div class="container">
        <div class="button-container">
            <button class="btn" id="createLessonBtn">Create Lesson</button>
            <button class="btn" id="createQuizBtn">Make Quiz</button>
            <button class="btn" id="manageScoresBtn">Manage Scores & Grade</button>
            <button class="btn" id="deleteLessonBtn">Delete Lesson</button>
            <button class="btn" id="deleteQuizBtn">Delete Quiz</button>
            <button class="btn" id="createAssignmentBtn">Create Assignment</button>
            <button class="btn" id="deleteAssignmentBtn">Delete Assignment</button>
            <button class="btn" id="viewSubmissionsBtn">View Submissions</button>
        </div>

        <div id="submissionsSection" style="display: none;">
            <h3>Assignment Submissions</h3>
            <div id="submissionsList">
                <p>No submissions yet.</p>
            </div>
        </div>

        <!-- Previous content remains the same -->
    </div>

    <!-- Submissions Modal -->
    <div id="submissionsModal" class="modal">
        <div class="modal-content">
            <span class="close" data-modal-id="submissionsModal">&times;</span>
            <h2>Assignment Submissions</h2>
            <div id="submissionDetails">
                <table>
                    <thead>
                        <tr>
                            <th>Student</th>
                            <th>Submission Date</th>
                            <th>Status</th>
                            <th>Action</th>
                        </tr>
                    </thead>
                    <tbody id="submissionTableBody">
                        <!-- Submission data will be added here -->
                    </tbody>
                </table>
            </div>
        </div>
    </div>

    <!-- Previous modal content remains the same -->

    <script>
        document.addEventListener('DOMContentLoaded', function() {
            // Previous code remains the same until the event listeners section

            // Add new event listener for view submissions button
            document.getElementById('viewSubmissionsBtn').addEventListener('click', function() {
                displaySubmissions();
                document.getElementById('submissionsSection').style.display = 'block';
                openModal(document.getElementById('submissionsModal'));
            });

            // New function to display submissions
            function displaySubmissions() {
                const submissions = JSON.parse(localStorage.getItem('assignmentSubmissions') || '[]');
                const submissionTableBody = document.getElementById('submissionTableBody');
                submissionTableBody.innerHTML = '';

                if (submissions.length === 0) {
                    submissionTableBody.innerHTML = '<tr><td colspan="4">No submissions yet</td></tr>';
                    return;
                }

                submissions.forEach(submission => {
                    const row = document.createElement('tr');
                    row.innerHTML = `
                        <td>${submission.studentName}</td>
                        <td>${new Date(submission.submissionDate).toLocaleString()}</td>
                        <td>${submission.status || 'Submitted'}</td>
                        <td>
                            <button class="btn" onclick="viewSubmissionDetails('${submission.id}')">View</button>
                            <button class="btn" onclick="gradeSubmission('${submission.id}')">Grade</button>
                        </td>
                    `;
                    submissionTableBody.appendChild(row);
                });
            }

            // New function to view submission details
            window.viewSubmissionDetails = function(submissionId) {
                const submissions = JSON.parse(localStorage.getItem('assignmentSubmissions') || '[]');
                const submission = submissions.find(s => s.id === submissionId);
                
                if (submission) {
                    alert(`Submission Details:\nStudent: ${submission.studentName}\
i need a code

Here's the complete implementation for the assignment submission tracking feature:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Teacher Dashboard</title>
    <link rel="stylesheet" href="teacher.css">
</head>
<body>
    <div class="navbar">
        <h1>Teacher Dashboard</h1>
    </div>

    <div class="container">
        <div class="button-container">
            <button class="btn" id="createLessonBtn">Create Lesson</button>
            <button class="btn" id="createQuizBtn">Make Quiz</button>
            <button class="btn" id="manageScoresBtn">Manage Scores & Grades</button>
            <button class="btn" id="deleteLessonBtn">Delete Lesson</button>
            <button class="btn" id="deleteQuizBtn">Delete Quiz</button>
            <button class="btn" id="createAssignmentBtn">Create Assignment</button>
            <button class="btn" id="deleteAssignmentBtn">Delete Assignment</button>
            <button class="btn" id="viewSubmissionsBtn">Assignment Respondents</button>
        </div>

        <h3>Created Lessons</h3>
        <div id="createdLessons"></div>

        <h3>Created Quizzes</h3>
        <div id="createdQuizzes"></div>
    
        <h3>Created Assignments</h3>
        <div id="createdAssignments"></div>
    </div>

    <!-- Submissions Modal -->
    <div id="submissionsModal" class="modal">
        <div class="modal-content large">
            <span class="close" data-modal-id="submissionsModal">&times;</span>
            <h2>Assignment Respondents</h2>
            <div class="submission-controls">
                <label for="assignmentSelect">Select Assignment:</label>
                <select id="assignmentSelect">
                    <option value="">-- Select Assignment --</option>
                </select>
            </div>
            <div id="submissionDetails">
                <table class="submission-table">
                    <thead>
                        <tr>
                            <th>Student Name</th>
                            <th>Submission Date</th>
                            <th>Status</th>
                        </tr>
                    </thead>
                    <tbody id="submissionTableBody">
                        <tr>
                            <td colspan="3">Select an assignment to view submissions</td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>

    <!-- Previous modals remain unchanged -->
    <script src="login.js"></script>
    <script src="teacher.js"></script>
</body>
</html>

And here's the JavaScript code to add to teacher.js:

// Add this to the existing teacher.js code, typically near the other modal setup code

// DOM Elements for submissions
const viewSubmissionsBtn = document.getElementById('viewSubmissionsBtn');
const submissionsModal = document.getElementById('submissionsModal');
const assignmentSelect = document.getElementById('assignmentSelect');
const submissionTableBody = document.getElementById('submissionTableBody');

// Event Listeners
viewSubmissionsBtn.addEventListener('click', () => {
    populateAssignmentSelect();
    openModal(submissionsModal);
});

assignmentSelect.addEventListener('change', displayAssignmentSubmissions);

// Function to populate assignment dropdown
function populateAssignmentSelect() {
    const assignments = getData(storageKeys.assignments);
    assignmentSelect.innerHTML = '<option value="">-- Select Assignment --</option>';
    
    assignments.forEach((assignment, index) => {
        const option = document.createElement('option');
        option.value = index;
        option.textContent = assignment.title;
        assignmentSelect.appendChild(option);
    });
}

// Function to display submissions for selected assignment
function displayAssignmentSubmissions() {
    const selectedIndex = assignmentSelect.value;
    if (selectedIndex === "") {
        submissionTableBody.innerHTML = '<tr><td colspan="3">Select an assignment to view submissions</td></tr>';
        return;
    }

    const assignments = getData(storageKeys.assignments);
    const selectedAssignment = assignments[selectedIndex];
    const submissions = getData('assignmentSubmissions') || [];
    
    // Filter submissions for this assignment
    const assignmentSubmissions = submissions.filter(
        sub => sub.assignmentId === selectedAssignment.title
    );

    if (assignmentSubmissions.length === 0) {
        submissionTableBody.innerHTML = '<tr><td colspan="3">No submissions for this assignment yet</td></tr>';
        return;
    }

    submissionTableBody.innerHTML = '';
    assignmentSubmissions.forEach(submission => {
        const row = document.createElement('tr');
        row.innerHTML = `
            <td>${submission.studentName}</td>
            <td>${new Date(submission.submissionDate).toLocaleString()}</td>
            <td>${submission.status || 'Submitted'}</td>
        `;
        submissionTableBody.appendChild(row);
    });
}

// Add this to the existing storageKeys object
storageKeys.submissions = 'assignmentSubmissions';

// Add this CSS to teacher.css (or create it if it doesn't exist)
/*
.submission-table {
    width: 100%;
    border-collapse: collapse;
    margin-top: 20px;
}

.submission-table th, .submission-table td {
    padding: 10px;
    border: 1px solid #ddd;
    text-align: left;
}

.submission-table th {
    background-color: #f2f2f2;
}

.submission-controls {
    margin-bottom: 20px;
}

.submission-controls select {
    padding: 8px;
    margin-left: 10px;
    min-width: 200px;
}
*/

This implementation:

  1. Adds a new "Assignment Respondents" button to the dashboard
  2. Creates a modal that shows all students who submitted each assignment
  3. Includes a dropdown to select which assignment to view submissions for
  4. Displays the student names, submission dates, and status in a table format
  5. Stores submission data in localStorage under 'assignmentSubmissions'

The code assumes that when students submit assignments, their submissions are recorded in localStorage with the following structure:

{
    assignmentId: "Assignment Title",
    studentName: "Student Name",
    submissionDate: "ISO Date String",
    status: "Submitted" // or "Graded", etc.
}
Preview not available