From 033d9246b82944cea99d592f927bf60f8b3115df Mon Sep 17 00:00:00 2001 From: Faisal N Date: Sun, 11 Jan 2026 14:32:02 -0500 Subject: [PATCH 1/9] Bug fixes --- src/checker/checker.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/checker/checker.js b/src/checker/checker.js index b27cb94..cbe907b 100644 --- a/src/checker/checker.js +++ b/src/checker/checker.js @@ -7,7 +7,7 @@ import Element from "/src/modules/element.js"; import extendedSchedule from "/src/periods/extendedSchedule.json"; import * as themes from "/src/themes/themes.js"; -import { autocomplete, uniqueSymbols, insertFromIndex } from "/src/symbols/symbols.js"; +import { autocomplete, uniqueSymbols } from "/src/symbols/symbols.js"; import { unixToString, unixToTimeString } from "/src/modules/time.js"; import { getExtendedPeriodRange } from "/src/periods/periods"; import { convertLatexToAsciiMath, convertLatexToMarkup, renderMathInElement } from "mathlive"; @@ -1433,14 +1433,15 @@ try { newSetInput.setAttribute('type', 'text'); newSetInput.setAttribute('autocomplete', 'off'); newSetInput.setAttribute('data-set-input', Number(highestDataElement.getAttribute('data-set-input')) + 1); - const buttonGrid = document.querySelectorAll('[data-answer-mode="set"] .button-grid')[1]; + const buttonGrid = document.querySelector('[data-answer-mode="set"] .button-grid:has([id="set-input"])'); + if (!buttonGrid) return; const insertBeforePosition = buttonGrid.children.length - 2; if (insertBeforePosition > 0) { buttonGrid.insertBefore(newSetInput, buttonGrid.children[insertBeforePosition]); } else { buttonGrid.appendChild(newSetInput); } - document.querySelectorAll('[data-answer-mode="set"] .button-grid')[1].style.flexWrap = (setInputs.length > 9) ? 'wrap' : 'nowrap'; + buttonGrid.style.flexWrap = (setInputs.length > 9) ? 'wrap' : 'nowrap'; newSetInput.focus(); document.querySelector("[data-remove-set-input]").disabled = false; } From 08bf0af81cf3a6263880c34f8d671cd6987fa911 Mon Sep 17 00:00:00 2001 From: Faisal N Date: Sun, 11 Jan 2026 15:18:13 -0500 Subject: [PATCH 2/9] Course mastery status clickable segment Fixes #490 --- src/checker/checker.js | 4 ++++ src/design.css | 1 + 2 files changed, 5 insertions(+) diff --git a/src/checker/checker.js b/src/checker/checker.js index cbe907b..3e97ce5 100644 --- a/src/checker/checker.js +++ b/src/checker/checker.js @@ -789,6 +789,10 @@ try { li.classList.add(statusLabel.replace(/\s+/g, '-').toLowerCase()); 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}%)`; document.getElementById("segments-completed").querySelector('ul').append(li); + li.addEventListener('click', () => { + segments.value = segment.id; + updateSegment(); + }); }); if (anyQuestionsInCourse && (masterySegments.length > 0) && masterySegments.every(Boolean)) { document.getElementById("segments-completed").classList.add('mastery'); diff --git a/src/design.css b/src/design.css index 774b582..46dbf4c 100644 --- a/src/design.css +++ b/src/design.css @@ -1543,6 +1543,7 @@ hidden, overflow: hidden; width: -webkit-fill-available; max-width: max-content; + cursor: pointer; } #segment-completed li p, From 4b983a72f53b4813f874f0ff2b4760db1c71d832 Mon Sep 17 00:00:00 2001 From: Faisal N Date: Sun, 11 Jan 2026 15:59:37 -0500 Subject: [PATCH 3/9] Color-coded course mastery status segments Fixes #491 --- index.html | 22 ++++++++++++++++++++++ src/checker/checker.js | 1 + src/design.css | 6 +++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 322b048..af1f8d0 100644 --- a/index.html +++ b/index.html @@ -117,6 +117,28 @@

Course Completed

Course Completed, Mastery Achieved

You have answered all questions in all segments in this course correctly.

+
+
+ + Mastery +
+
+ + Completed +
+
+ + Incomplete, Overdue +
+
+ + Not Started, Overdue +
+
+ + Not Due +
+
    - - -

    -
    - -
    - - - - -
    -
    Virtual Checker Banner diff --git a/admin/users.html b/admin/users.html index 6eff790..0d94dbc 100644 --- a/admin/users.html +++ b/admin/users.html @@ -79,40 +79,11 @@

    Users

    - -
    - - -

    -
    - -
    - - - - -
    -
    Virtual Checker Banner diff --git a/ta/index.html b/ta/index.html index fd261db..bdb707e 100644 --- a/ta/index.html +++ b/ta/index.html @@ -222,40 +222,11 @@

    Marked Responses

    - -
    - - -

    -
    - -
    - - - - -
    -
    Virtual Checker Banner diff --git a/ta/questions.html b/ta/questions.html index b4b12ac..175ed84 100644 --- a/ta/questions.html +++ b/ta/questions.html @@ -155,40 +155,11 @@

    Questions

    - -
    - - -

    -
    - -
    - - - - -
    -
    Virtual Checker Banner From 622fb28e13f8aecf560fb154aac25b95749d4169 Mon Sep 17 00:00:00 2001 From: Faisal N Date: Sun, 11 Jan 2026 23:07:54 -0500 Subject: [PATCH 7/9] Student Question Review Reporting Fixes #477 --- src/checker/admin.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/checker/admin.js b/src/checker/admin.js index b062a98..502cb04 100644 --- a/src/checker/admin.js +++ b/src/checker/admin.js @@ -852,6 +852,7 @@ try { } document.querySelector('.segment-reports').innerHTML += `
    Segment ${segment.number} (${JSON.parse(segment.question_ids).length} Question${JSON.parse(segment.question_ids).length != 1 ? 's' : ''}) +

    ${segmentResponses.filter(r => r.review_later).length}

    ${(segmentResponses.filter(r => r.status === 'Correct').length != 0) ? `
    ${segmentResponses.filter(r => r.status === 'Correct').length}
    ` : ''} ${((segmentResponses.filter(r => ((r.status !== 'Correct') && (r.status !== 'Incorrect') && !r.status.includes('Recorded'))).length + unansweredStudentsCount) != 0) ? `
    ${segmentResponses.filter(r => ((r.status !== 'Correct') && (r.status !== 'Incorrect') && !r.status.includes('Recorded'))).length + unansweredStudentsCount}
    ` : ''} From d4a0e13955a9142538e640674fdc14ffca430bbb Mon Sep 17 00:00:00 2001 From: Faisal N Date: Sun, 11 Jan 2026 23:08:03 -0500 Subject: [PATCH 8/9] Minor improvements --- src/checker/admin.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/checker/admin.js b/src/checker/admin.js index 502cb04..5ab779b 100644 --- a/src/checker/admin.js +++ b/src/checker/admin.js @@ -860,9 +860,7 @@ try { ${(segmentResponses.filter(r => r.status === 'Incorrect').length != 0) ? `
    ${segmentResponses.filter(r => r.status === 'Incorrect').length}
    ` : ''}
    - ${(JSON.parse(segment.question_ids).length != 0) ? `
    - ${'Rendering...'} -
    ` : ''}`; + ${(JSON.parse(segment.question_ids).length != 0) ? `
    Rendering...
    ` : ''}`; } }); } @@ -2388,9 +2386,7 @@ try { var seatCodeDetailedReport = document.createElement('div'); seatCodeDetailedReport.classList = 'seat-code-report'; seatCodeDetailedReport.setAttribute('report', `seat-code-${seatCode.code}`); - seatCodeDetailedReport.innerHTML = `
    - ${'Rendering...'} -
    `; + seatCodeDetailedReport.innerHTML = `
    Rendering...
    `; document.querySelector('.seat-code-reports').appendChild(seatCodeDetailedReport); }); } @@ -3550,9 +3546,7 @@ try { ${(questionResponses.filter(r => r.status === 'Incorrect').length != 0) ? `
    ${questionResponses.filter(r => r.status === 'Incorrect').length}
    ` : ''} - ${(questionResponses.length != 0) ? `
    - ${'Rendering...'} -
    ` : ''}`; + ${(questionResponses.length != 0) ? `
    Rendering...
    ` : ''}`; }); expandedReports.forEach(er => { if (document.getElementById(er)) { From a3b511388d41930628e7283136a2770eaf4fb4d8 Mon Sep 17 00:00:00 2001 From: Faisal N Date: Sun, 11 Jan 2026 23:19:47 -0500 Subject: [PATCH 9/9] Expandable Reports sections --- admin/reports.html | 18 +++++++++--------- src/modules/ui.css | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/admin/reports.html b/admin/reports.html index 411deb5..d59cbe8 100644 --- a/admin/reports.html +++ b/admin/reports.html @@ -114,8 +114,8 @@

    Sort & Filter

    -
    -

    Seat Codes

    +
    + Seat Codes
    @@ -135,15 +135,15 @@

    Seat Codes

    -
    -
    -

    Segments

    + +
    + Segments
    -
    -
    -

    Questions

    + +
    + Questions
    -
    +
    diff --git a/src/modules/ui.css b/src/modules/ui.css index f62ea7f..1e19292 100644 --- a/src/modules/ui.css +++ b/src/modules/ui.css @@ -1200,3 +1200,38 @@ body:has(.topbar) #checker.horizontal .column:last-child { [data-manual-reset-cache] { margin-top: 10px; } + +details.section { + align-items: stretch; +} + +summary { + display: block; + font-size: 1.75rem; + font-weight: bold; + cursor: pointer; +} + +summary::after { + display: inline-block; + font-family: bootstrap-icons !important; + font-size: 1rem; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -0.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: "\F10E"; + transition: transform 0.25s ease-in-out; + margin-left: 10px; + transform: scale(-1, 1); +} + +.segment-marked-for-review-count { + display: flex; + gap: 5px; + margin-left: auto; +}