From 8bf94a45879d4e5fc84922ad8e4272d0eaae02e9 Mon Sep 17 00:00:00 2001 From: Faisal N Date: Thu, 1 Jan 2026 20:37:41 -0500 Subject: [PATCH 1/5] Segment Editor remember course dropdown Fixes #446 --- src/checker/admin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/checker/admin.js b/src/checker/admin.js index e173250..e98438e 100644 --- a/src/checker/admin.js +++ b/src/checker/admin.js @@ -333,7 +333,7 @@ try { await updateQuestions(); if (params?.question) toggleQuestion(null, params.question); } - if (document.getElementById("course-period-input") && !loadedSegmentEditor && !loadedSegmentCreator && !noReloadCourse) { + if (document.getElementById("course-period-input") && !loadedSegmentEditor && !noReloadCourse) { document.getElementById("course-period-input").value = (storage.get('period') && courses.find(c => String(c.id) === String(storage.get('period')))) ? storage.get('period') : (((ui.defaultCourse !== null) && courses.find(c => String(c.id) === String(ui.defaultCourse))) ? ui.defaultCourse : courses.find(c => responses.some(r => JSON.parse(c.periods).includes(Number(String(r.seatCode)[0])))) ? courses.find(c => responses.some(r => JSON.parse(c.periods).includes(Number(String(r.seatCode)[0])))).id : courses.sort((a, b) => a.id - b.id)[0]?.id); if (document.getElementById("export-report-course")) document.getElementById("export-report-course").value = (storage.get('period') && courses.find(c => String(c.id) === String(storage.get('period')))) ? storage.get('period') : (((ui.defaultCourse !== null) && courses.find(c => String(c.id) === String(ui.defaultCourse))) ? ui.defaultCourse : courses.find(c => responses.some(r => JSON.parse(c.periods).includes(Number(String(r.seatCode)[0])))) ? courses.find(c => responses.some(r => JSON.parse(c.periods).includes(Number(String(r.seatCode)[0])))).id : courses.sort((a, b) => a.id - b.id)[0]?.id); } From 93335fccad31e514f262caf77871a7eea4b63495 Mon Sep 17 00:00:00 2001 From: Faisal N Date: Thu, 1 Jan 2026 21:42:40 -0500 Subject: [PATCH 2/5] Fix auth.bulkLoad --- src/modules/auth.js | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/src/modules/auth.js b/src/modules/auth.js index 94cceb3..a2bf4f3 100644 --- a/src/modules/auth.js +++ b/src/modules/auth.js @@ -745,24 +745,31 @@ export async function loadAdminSettings(courses) { export async function bulkLoad(fields = [], usr = null, pwd = null, isAdmin = false, isTA = false, ifAccessDenied = () => { }) { const startTime = Date.now(); await storage.idbReady; - const bulkLoadResponse = await fetch(`${domain}/bulk_load${isTA ? '?ta=true' : ''}`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - usr, - pwd, - fields, - lastFetched: storage.get((isAdmin || isTA) ? "lastAdminBulkLoad" : "lastBulkLoad") || null, - syncDeleted: (async () => { - var cacheIds = {}; - var cache = (await storage.idbGet((isAdmin || isTA) ? "adminCache" : "cache")) || storage.get((isAdmin || isTA) ? "adminCache" : "cache") || {}; - for (const table in cache) { - if (Array.isArray(cache[table] || [])) cacheIds[table] = (cache[table] || []).map(data => String(data.id || data.seatCode || data.period || data.key || data.username || 0)); - } - return cacheIds; - })(), - }), - }); + var bulkLoadResponse; + try { + bulkLoadResponse = await fetch(`${domain}/bulk_load${isTA ? '?ta=true' : ''}`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + usr, + pwd, + fields, + lastFetched: storage.get((isAdmin || isTA) ? "lastAdminBulkLoad" : "lastBulkLoad") || null, + syncDeleted: (async () => { + var cacheIds = {}; + var cache = (await storage.idbGet((isAdmin || isTA) ? "adminCache" : "cache")) || storage.get((isAdmin || isTA) ? "adminCache" : "cache") || {}; + for (const table in cache) { + if (Array.isArray(cache[table] || [])) cacheIds[table] = (cache[table] || []).map(data => String(data.id || data.seatCode || data.period || data.key || data.username || 0)); + } + return cacheIds; + })(), + }), + }); + } catch (e) { + console.error(e); + if (!e.message || (e.message && !e.message.includes("."))) ui.view("api-fail"); + return false; + } var fetchedBulkLoad = await bulkLoadResponse.json(); if (!bulkLoadResponse.ok) { if (!fetchedBulkLoad.message || (fetchedBulkLoad.message && !fetchedBulkLoad.message.includes("."))) ui.view("api-fail"); From 31f5b11b11e5e63c721b3b31df09c31a16b86a2a Mon Sep 17 00:00:00 2001 From: Faisal N Date: Thu, 1 Jan 2026 22:06:27 -0500 Subject: [PATCH 3/5] Set maintenance mode --- admin/logs.html | 18 ++++++++++++------ src/checker/admin.js | 6 ++++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/admin/logs.html b/admin/logs.html index 84d1ad2..a604294 100644 --- a/admin/logs.html +++ b/admin/logs.html @@ -94,12 +94,10 @@

Sort & Filter

-

Logs

-
-

No actions reported.

-
- - +

Maintenance Mode

+

AI Configuration

@@ -122,6 +120,14 @@

AI Configuration

placeholder="Enter your prompt here..." rows="1" disabled>
+
+

Logs

+
+

No actions reported.

+
+ + +
diff --git a/src/checker/admin.js b/src/checker/admin.js index e98438e..45db45e 100644 --- a/src/checker/admin.js +++ b/src/checker/admin.js @@ -1223,8 +1223,9 @@ try { generator_enabled: document.getElementById('generate-answers').checked, checker_enabled: document.getElementById('check-responses').checked, generate_answers_prompt: document.getElementById('generate-answers-prompt').value, - check_responses_prompt: document.getElementById('check-responses-prompt').value - } + check_responses_prompt: document.getElementById('check-responses-prompt').value, + maintenance_enabled: document.getElementById('maintenance-mode').checked + }, }; } for (const key in updatedInfo) { @@ -6200,6 +6201,7 @@ try { document.getElementById('check-responses-prompt').value = aiInfo.check_responses_prompt; document.getElementById('check-responses-prompt-ending').placeholder = aiInfo.check_responses_prompt_ending; document.getElementById('check-responses-prompt-ending').value = aiInfo.check_responses_prompt_ending; + document.getElementById('maintenance-mode').checked = Number(settings['maintenance-mode'] || 0); } async function clearAnnouncement(platform) { From f62d28f492a82ac914d8a03205ffc4a74f87665e Mon Sep 17 00:00:00 2001 From: Faisal N Date: Thu, 1 Jan 2026 22:44:27 -0500 Subject: [PATCH 4/5] Student-side maintenance mode modal #458 --- admin/archive.html | 5 +++++ admin/backups.html | 5 +++++ admin/courses.html | 5 +++++ admin/editor.html | 5 +++++ admin/index.html | 5 +++++ admin/logs.html | 5 +++++ admin/passwords.html | 5 +++++ admin/questions.html | 5 +++++ admin/reports.html | 5 +++++ admin/responses.html | 5 +++++ admin/users.html | 5 +++++ index.html | 5 +++++ src/modules/auth.js | 5 +++++ src/modules/ui.js | 2 +- ta/index.html | 5 +++++ 15 files changed, 71 insertions(+), 1 deletion(-) diff --git a/admin/archive.html b/admin/archive.html index e5cd330..86210b8 100644 --- a/admin/archive.html +++ b/admin/archive.html @@ -383,6 +383,11 @@

000

+ +

+ The Virtual Checker is undergoing maintenance. Please try again later. +

+
+ +

+ The Virtual Checker is undergoing maintenance. Please try again later. +

+
+ +

+ The Virtual Checker is undergoing maintenance. Please try again later. +

+
+ +

+ The Virtual Checker is undergoing maintenance. Please try again later. +

+
+ +

+ The Virtual Checker is undergoing maintenance. Please try again later. +

+
+ +

+ The Virtual Checker is undergoing maintenance. Please try again later. +

+
+ +

+ The Virtual Checker is undergoing maintenance. Please try again later. +

+
+ +

+ The Virtual Checker is undergoing maintenance. Please try again later. +

+
+ +

+ The Virtual Checker is undergoing maintenance. Please try again later. +

+
+ +

+ The Virtual Checker is undergoing maintenance. Please try again later. +

+
+ +

+ The Virtual Checker is undergoing maintenance. Please try again later. +

+
+ +

+ The Virtual Checker is undergoing maintenance. Please try again later. +

+
+ +

+ The Virtual Checker is undergoing maintenance. Please try again later. +

+