From 19e59fcdef9ef09ab47d3de5139d9c72dd2b7179 Mon Sep 17 00:00:00 2001 From: Faisal N Date: Fri, 16 Jan 2026 15:13:43 -0500 Subject: [PATCH 1/3] Bug fix --- src/checker/admin.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/checker/admin.js b/src/checker/admin.js index a6c0d0e..6d8a3e2 100644 --- a/src/checker/admin.js +++ b/src/checker/admin.js @@ -3284,14 +3284,7 @@ try { async function toggleDetailedReport() { if (!active || !this.getAttribute('report') || !document.getElementById(this.getAttribute('report'))) return; document.getElementById(this.getAttribute('report')).classList.toggle('active'); - await renderDetailedReport(this.getAttribute('report')) - .catch(error => { - if (storage.get("developer")) { - alert(`Error @ admin.js: ${error.message}`); - } else { - ui.reportBugModal(null, String(error.stack)); - } - }); + await renderDetailedReport(this.getAttribute('report')); syncExpandAllReportsButton(); } From 50f1be1100a1537e8edeb91aa22c6701d4cec732 Mon Sep 17 00:00:00 2001 From: Faisal N Date: Fri, 16 Jan 2026 19:28:04 -0500 Subject: [PATCH 2/3] Bug fixes --- src/checker/checker.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/checker/checker.js b/src/checker/checker.js index 64c10c8..d94577c 100644 --- a/src/checker/checker.js +++ b/src/checker/checker.js @@ -1252,15 +1252,16 @@ try { const reviewLaterFeed = document.getElementById("review-later-feed"); reviewLaterFeed.innerHTML = ""; - if (filteredHistory.filter(r => r.review_later).length === 0) reviewLaterFeed.innerHTML = "

Checks marked to review later will show up here!

"; + if (history.filter(r => r.review_later).length === 0) reviewLaterFeed.innerHTML = "

Checks marked to review later will show up here!

"; - if ((filteredHistory.length === 0) && (filteredHistory.filter(r => r.review_later).length === 0)) { + if ((filteredHistory.length === 0) && (history.filter(r => r.review_later).length === 0)) { ui.reloadUnsavedInputs(); return filteredHistory; } - var sortedHistory = filteredHistory.sort((a, b) => a.timestamp - b.timestamp); - sortedHistory.forEach(r => { + var sortedHistory = history.sort((a, b) => a.timestamp - b.timestamp); + var sortedFilteredHistory = filteredHistory.sort((a, b) => a.timestamp - b.timestamp); + sortedHistory.filter(r => filteredHistory.find(r1 => r1.id === r.id) || r.review_later).forEach(r => { if (r.error) { console.log(r.error); return filteredHistory; @@ -1275,19 +1276,19 @@ try { var questionNumber = JSON.parse(segmentsArray.find(s => String(s.id) === String(r.segment))?.question_ids || '[]').find(q => String(q.id) === String(r.question_id))?.name || questionsArray.find(question => String(question.id) === String(r.question_id)).number; switch (r.mode) { case 'latex': - button.innerHTML = `${(String(r.seatCode) !== String(storage.get("code"))) ? `

${courses.find(c => JSON.parse(c.periods).includes(Number(String(r.seatCode).slice(0, 1))))?.name}

\n` : ''}

${segmentNumber ? `Segment ${segmentNumber}` : 'Deleted Segment'} Question #${questionNumber}. ${unixToTimeString(r.timestamp)} (${r.seatCode})

\n${convertLatexToMarkup(r.response)}\n

(Equation may not display properly)

\n

${response}`; + button.innerHTML = `${(String(r.seatCode) !== String(storage.get("code"))) ? `

${courses.find(c => JSON.parse(c.periods).includes(Number(String(r.seatCode).slice(0, 1))))?.name}

\n` : ''}

${segmentNumber ? `Segment ${segmentNumber}` : 'Deleted Segment'} Question #${questionNumber}. ${(new Date().toDateString() === new Date(r.timestamp).toDateString()) ? unixToTimeString(r.timestamp) : unixToString(r.timestamp)} (${r.seatCode})

\n${convertLatexToMarkup(r.response)}\n

(Equation may not display properly)

\n

${response}`; break; case 'array': - button.innerHTML = `${(String(r.seatCode) !== String(storage.get("code"))) ? `

${courses.find(c => JSON.parse(c.periods).includes(Number(String(r.seatCode).slice(0, 1))))?.name}

\n` : ''}

${segmentNumber ? `Segment ${segmentNumber}` : 'Deleted Segment'} Question #${questionNumber}. ${unixToTimeString(r.timestamp)} (${r.seatCode})

\n

${JSON.parse(`[${r.response.slice(1, -1).split(', ')}]`).join(', ')}

\n

${response}`; + button.innerHTML = `${(String(r.seatCode) !== String(storage.get("code"))) ? `

${courses.find(c => JSON.parse(c.periods).includes(Number(String(r.seatCode).slice(0, 1))))?.name}

\n` : ''}

${segmentNumber ? `Segment ${segmentNumber}` : 'Deleted Segment'} Question #${questionNumber}. ${(new Date().toDateString() === new Date(r.timestamp).toDateString()) ? unixToTimeString(r.timestamp) : unixToString(r.timestamp)} (${r.seatCode})

\n

${JSON.parse(`[${r.response.slice(1, -1).split(', ')}]`).join(', ')}

\n

${response}`; break; case 'matrix': - button.innerHTML = `${(String(r.seatCode) !== String(storage.get("code"))) ? `

${courses.find(c => JSON.parse(c.periods).includes(Number(String(r.seatCode).slice(0, 1))))?.name}

\n` : ''}

${segmentNumber ? `Segment ${segmentNumber}` : 'Deleted Segment'} Question #${questionNumber}. ${unixToTimeString(r.timestamp)} (${r.seatCode})

\n

${JSON.stringify(JSON.parse(r.response).map(innerArray => innerArray.map(numString => String(numString)))).replaceAll('["', '[').replaceAll('","', ', ').replaceAll('"]', ']')}

\n

${response}`; + button.innerHTML = `${(String(r.seatCode) !== String(storage.get("code"))) ? `

${courses.find(c => JSON.parse(c.periods).includes(Number(String(r.seatCode).slice(0, 1))))?.name}

\n` : ''}

${segmentNumber ? `Segment ${segmentNumber}` : 'Deleted Segment'} Question #${questionNumber}. ${(new Date().toDateString() === new Date(r.timestamp).toDateString()) ? unixToTimeString(r.timestamp) : unixToString(r.timestamp)} (${r.seatCode})

\n

${JSON.stringify(JSON.parse(r.response).map(innerArray => innerArray.map(numString => String(numString)))).replaceAll('["', '[').replaceAll('","', ', ').replaceAll('"]', ']')}

\n

${response}`; break; default: - button.innerHTML = `${(String(r.seatCode) !== String(storage.get("code"))) ? `

${courses.find(c => JSON.parse(c.periods).includes(Number(String(r.seatCode).slice(0, 1))))?.name}

\n` : ''}

${segmentNumber ? `Segment ${segmentNumber}` : 'Deleted Segment'} Question #${questionNumber}. ${unixToTimeString(r.timestamp)} (${r.seatCode})

\n

${escapeHTML(r.response)}

\n

${response}`; + button.innerHTML = `${(String(r.seatCode) !== String(storage.get("code"))) ? `

${courses.find(c => JSON.parse(c.periods).includes(Number(String(r.seatCode).slice(0, 1))))?.name}

\n` : ''}

${segmentNumber ? `Segment ${segmentNumber}` : 'Deleted Segment'} Question #${questionNumber}. ${(new Date().toDateString() === new Date(r.timestamp).toDateString()) ? unixToTimeString(r.timestamp) : unixToString(r.timestamp)} (${r.seatCode})

\n

${escapeHTML(r.response)}

\n

${response}`; break; } - feed.prepend(button); + if (filteredHistory.find(r1 => r1.id === r.id)) feed.prepend(button); const button2 = button.cloneNode(true); if (r.review_later) reviewLaterFeed.prepend(button2); renderMathInElement(button); @@ -1310,7 +1311,7 @@ try { }, 500); })); }); - if (sortedHistory.find(r => r.flagged)) { + if (sortedFilteredHistory.find(r => r.flagged)) { var p = document.createElement("p"); p.classList = "flagged-response-alert"; p.innerText = "You have flagged responses to review."; From 2b1f27828cb0eeb40f293cc8d881792bfa1e27ef Mon Sep 17 00:00:00 2001 From: Faisal N Date: Fri, 16 Jan 2026 19:55:48 -0500 Subject: [PATCH 3/3] Display course mastery correct questions count out of answered questions Fixes #504 --- src/checker/checker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/checker/checker.js b/src/checker/checker.js index d94577c..c11f90b 100644 --- a/src/checker/checker.js +++ b/src/checker/checker.js @@ -844,7 +844,7 @@ try { const li = document.createElement('li'); li.classList.add(statusLabel.replace(/\s+/g, '-').toLowerCase()); li.style.color = (correctCount === totalQuestions) ? 'mediumseagreen' : (attemptedCount === totalQuestions) ? 'royalblue' : ((segment.due && (new Date(`${segment.due}T00:00:00`).getTime() < new Date().setHours(0, 0, 0, 0))) ? ((attemptedCount === 0) ? 'indianred' : 'darkorange') : ''); - li.innerHTML = `${icon} ${segment.number} - ${segment.name.length > 50 ? segment.name.substring(0, 50 - 3).trim() + '...' : segment.name}:

${statusLabel}

${attemptedCount}/${totalQuestions} Answered • ${correctCount}/${totalQuestions} Correct (${(totalQuestions > 0) ? Math.round((correctCount / totalQuestions) * 100) : 0}%)`; + li.innerHTML = `${icon} ${segment.number} - ${segment.name.length > 50 ? segment.name.substring(0, 50 - 3).trim() + '...' : segment.name}:

${statusLabel}

${attemptedCount}/${totalQuestions} Answered • ${correctCount}/${attemptedCount} Correct (${(totalQuestions > 0) ? Math.round((correctCount / totalQuestions) * 100) : 0}%)`; document.getElementById("segments-completed").querySelector('ul').append(li); li.addEventListener('click', () => { segments.value = segment.id;