Skip to content

Commit 1254bf3

Browse files
committed
Bug fixes
1 parent 8c4bdb1 commit 1254bf3

File tree

4 files changed

+121
-140
lines changed

4 files changed

+121
-140
lines changed

src/checker/admin.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,10 @@ try {
9898
}
9999
}
100100

101-
await auth.bulkLoad(getAdminFields(), storage.get("usr"), storage.get("pwd"), true)
102-
.catch((e) => {
103-
console.error(e);
104-
if (!e.message || (e.message && !e.message.includes("."))) ui.view("api-fail");
105-
if ((e.error === "Access denied.") || (e.message === "Access denied.")) return auth.admin(init);
106-
pollingOff();
107-
});
101+
if (!(await auth.bulkLoad(getAdminFields(), storage.get("usr"), storage.get("pwd"), true, false, () => {
102+
auth.admin(init);
103+
pollingOff();
104+
}))) return;
108105
await storage.idbReady;
109106
const bulkLoad = (await storage.idbGet('adminCache')) || storage.get("adminCache") || {};
110107
courses = bulkLoad.courses || [];

src/checker/checker.js

Lines changed: 105 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ try {
106106
return;
107107
}
108108
await auth.sync(false, updateCode);
109-
ui.stopLoader();
110109
};
111110

112111
init();
@@ -438,123 +437,121 @@ try {
438437
});
439438
document.title = `Virtual Checker (${storage.get("code")})`;
440439
const periodRange = getExtendedPeriodRange(null, Number(code.slice(0, 1)));
441-
try {
442-
await auth.bulkLoad(["courses", "segments", "questions", "responses"], storage.get("code"), storage.get("password"));
443-
await storage.idbReady;
444-
const bulkLoad = (await storage.idbGet('cache')) || storage.get("cache") || {};
445-
courses = bulkLoad.courses;
446-
segmentsArray = bulkLoad.segments;
447-
questionsArray = bulkLoad.questions;
448-
const course = courses.find(c => JSON.parse(c.periods).includes(Number(code.slice(0, 1))));
449-
if (course) {
450-
ui.view();
440+
if (!(await auth.bulkLoad(["courses", "segments", "questions", "responses"], storage.get("code"), storage.get("password"), false, false, () => {
441+
ui.view("api-fail");
442+
}))) return;
443+
await storage.idbReady;
444+
const bulkLoad = (await storage.idbGet('cache')) || storage.get("cache") || {};
445+
courses = bulkLoad.courses;
446+
segmentsArray = bulkLoad.segments;
447+
questionsArray = bulkLoad.questions;
448+
const course = courses.find(c => JSON.parse(c.periods).includes(Number(code.slice(0, 1))));
449+
if (course) {
450+
ui.view();
451+
} else {
452+
ui.startLoader();
453+
return ui.view("no-course");
454+
}
455+
if (document.getElementById("course-input")) document.getElementById("course-input").value = course.name || "Unknown Course";
456+
if (document.querySelector('[data-syllabus-download]')) {
457+
if (course.syllabus) {
458+
document.querySelector('[data-syllabus-download]').removeAttribute('hidden');
459+
document.querySelector('[data-syllabus-download]').addEventListener('click', () => {
460+
window.open(course.syllabus, '_blank');
461+
});
451462
} else {
452-
ui.startLoader();
453-
return ui.view("no-course");
463+
document.querySelector('[data-syllabus-download]').setAttribute('hidden', '');
454464
}
455-
if (document.getElementById("course-input")) document.getElementById("course-input").value = course.name || "Unknown Course";
456-
if (document.querySelector('[data-syllabus-download]')) {
457-
if (course.syllabus) {
458-
document.querySelector('[data-syllabus-download]').removeAttribute('hidden');
459-
document.querySelector('[data-syllabus-download]').addEventListener('click', () => {
460-
window.open(course.syllabus, '_blank');
465+
}
466+
if (document.querySelector('.alert')) {
467+
var checker_announcement = JSON.parse(course.checker_announcement || '{}');
468+
if ((checker_announcement.image || checker_announcement.title || checker_announcement.content || checker_announcement.link) && (checker_announcement.expires ? new Date(`${checker_announcement.expires}T${extendedSchedule[Number(code.slice(0, 1))][1]}:00`) > new Date() : true)) {
469+
document.querySelector('.alert').removeAttribute('hidden');
470+
document.querySelector('.alert').classList = `alert ${checker_announcement.layout || ''}`;
471+
if (checker_announcement.image) {
472+
document.querySelector('.alert img').removeAttribute('hidden');
473+
document.querySelector('.alert img').src = checker_announcement.image;
474+
mediumZoom(document.querySelector('.alert img'), {
475+
background: "transparent"
461476
});
462477
} else {
463-
document.querySelector('[data-syllabus-download]').setAttribute('hidden', '');
478+
document.querySelector('.alert img').setAttribute('hidden', '');
464479
}
465-
}
466-
if (document.querySelector('.alert')) {
467-
var checker_announcement = JSON.parse(course.checker_announcement || '{}');
468-
if ((checker_announcement.image || checker_announcement.title || checker_announcement.content || checker_announcement.link) && (checker_announcement.expires ? new Date(`${checker_announcement.expires}T${extendedSchedule[Number(code.slice(0, 1))][1]}:00`) > new Date() : true)) {
469-
document.querySelector('.alert').removeAttribute('hidden');
470-
document.querySelector('.alert').classList = `alert ${checker_announcement.layout || ''}`;
471-
if (checker_announcement.image) {
472-
document.querySelector('.alert img').removeAttribute('hidden');
473-
document.querySelector('.alert img').src = checker_announcement.image;
474-
mediumZoom(document.querySelector('.alert img'), {
475-
background: "transparent"
476-
});
477-
} else {
478-
document.querySelector('.alert img').setAttribute('hidden', '');
479-
}
480-
document.querySelector('.alert h3').innerText = checker_announcement.title || 'Announcement';
481-
if (checker_announcement.content) {
482-
document.querySelector('.alert p').removeAttribute('hidden');
483-
document.querySelector('.alert p').innerText = checker_announcement.content;
484-
} else {
485-
document.querySelector('.alert p').setAttribute('hidden', '');
486-
}
487-
if (checker_announcement.link) {
488-
document.querySelector('.alert button').removeAttribute('hidden');
489-
document.querySelector('.alert button').innerHTML = `${checker_announcement.linkTitle || 'Go'} <i class="bi bi-arrow-right-short"></i>`;
490-
document.querySelector('.alert button').addEventListener('click', () => {
491-
window.open(checker_announcement.link, '_blank');
492-
});
493-
} else {
494-
document.querySelector('.alert button').setAttribute('hidden', '');
495-
document.querySelector('.alert button').removeEventListener('click', () => { });
496-
}
480+
document.querySelector('.alert h3').innerText = checker_announcement.title || 'Announcement';
481+
if (checker_announcement.content) {
482+
document.querySelector('.alert p').removeAttribute('hidden');
483+
document.querySelector('.alert p').innerText = checker_announcement.content;
484+
} else {
485+
document.querySelector('.alert p').setAttribute('hidden', '');
486+
}
487+
if (checker_announcement.link) {
488+
document.querySelector('.alert button').removeAttribute('hidden');
489+
document.querySelector('.alert button').innerHTML = `${checker_announcement.linkTitle || 'Go'} <i class="bi bi-arrow-right-short"></i>`;
490+
document.querySelector('.alert button').addEventListener('click', () => {
491+
window.open(checker_announcement.link, '_blank');
492+
});
497493
} else {
498-
document.querySelector('.alert').setAttribute('hidden', '');
494+
document.querySelector('.alert button').setAttribute('hidden', '');
495+
document.querySelector('.alert button').removeEventListener('click', () => { });
499496
}
497+
} else {
498+
document.querySelector('.alert').setAttribute('hidden', '');
500499
}
501-
segmentsArray = segmentsArray.filter(s => String(s.course) === String(course.id));
502-
segments.innerHTML = '';
503-
segmentsArray.sort((a, b) => a.order - b.order).forEach(segment => {
504-
const option = document.createElement('option');
505-
option.value = segment.id;
506-
var questionStatuses = [];
507-
JSON.parse(segment.question_ids).forEach(questionId => {
508-
const question = questionsArray.find(q => String(q.id) === String(questionId.id));
509-
if (question) {
510-
var highestStatus = "";
511-
var questionResponses = history.filter(r => String(r.question_id) === String(questionId.id));
512-
if (questionResponses.find(r => r.status === 'Correct')) {
513-
highestStatus = 'Correct';
514-
} else if (questionResponses.find(r => r.status.includes('Unknown'))) {
515-
highestStatus = 'Awaiting Scoring';
516-
} else if (questionResponses.find(r => r.status === 'Incorrect')) {
517-
highestStatus = 'In Progress';
518-
}
519-
questionStatuses.push({ "segment": segment.id, "question": questionId.id, "status": highestStatus, "nonscored": question.nonscored });
500+
}
501+
segmentsArray = segmentsArray.filter(s => String(s.course) === String(course.id));
502+
segments.innerHTML = '';
503+
segmentsArray.sort((a, b) => a.order - b.order).forEach(segment => {
504+
const option = document.createElement('option');
505+
option.value = segment.id;
506+
var questionStatuses = [];
507+
JSON.parse(segment.question_ids).forEach(questionId => {
508+
const question = questionsArray.find(q => String(q.id) === String(questionId.id));
509+
if (question) {
510+
var highestStatus = "";
511+
var questionResponses = history.filter(r => String(r.question_id) === String(questionId.id));
512+
if (questionResponses.find(r => r.status === 'Correct')) {
513+
highestStatus = 'Correct';
514+
} else if (questionResponses.find(r => r.status.includes('Unknown'))) {
515+
highestStatus = 'Awaiting Scoring';
516+
} else if (questionResponses.find(r => r.status === 'Incorrect')) {
517+
highestStatus = 'In Progress';
520518
}
521-
});
522-
const allQuestionsCorrect = (JSON.parse(segment.question_ids).length > 0) && questionStatuses.every(question => (question.status === 'Correct') || question.nonscored);
523-
option.innerHTML = `${segment.number} - ${segment.name}${segment.due ? ` (Due ${new Date(`${segment.due}T00:00:00`).toLocaleDateString('en-US', { weekday: 'short', year: 'numeric', month: 'short', day: 'numeric' })})` : ''}${allQuestionsCorrect ? ' [MASTERY]' : ''}`;
524-
option.setAttribute('due', segment.due || '');
525-
segments.append(option);
519+
questionStatuses.push({ "segment": segment.id, "question": questionId.id, "status": highestStatus, "nonscored": question.nonscored });
520+
}
526521
});
527-
segments.value = segmentsArray.find(s => {
528-
if (!s.due) return false;
529-
return (new Date(`${s.due}T00:00:00`).toLocaleDateString('en-US', { weekday: 'short', year: 'numeric', month: 'short', day: 'numeric' }) === new Date().toLocaleDateString('en-US', { weekday: 'short', year: 'numeric', month: 'short', day: 'numeric', }) && new Date().getTime() <= periodRange[1]);
530-
})?.id || segmentsArray.find(s => {
531-
if (!s.due) return false;
532-
return (new Date(`${s.due}T00:00:00`).getTime() > periodRange[1] && new Date(`${s.due}T00:00:00`).getTime() <= periodRange[0] + 86400000);
533-
})?.id || segmentsArray.find(s => !s.due)?.id || segmentsArray[0]?.id;
534-
segments.removeEventListener("change", updateSegment);
535-
segments.addEventListener("change", updateSegment);
536-
// Update history feed
537-
await storage.idbReady;
538-
history = ((await storage.idbGet('cache')) || storage.get("cache") || {}).responses || [];
539-
await updateHistory();
540-
await updateSegment();
541-
// Show clear data fix guide
542-
// if (storage.get("created")) {
543-
// document.querySelector(`[data-modal-view="clear-data-fix"]`).remove();
544-
// } else {
545-
// storage.set("created", Date.now());
546-
// }
547-
// Focus segment input
548-
if (segmentInput) segmentInput.focus();
549-
// Set default answer mode
550-
answerMode("input");
551-
// Focus answer input
552-
document.getElementById("answer-suggestion").addEventListener("click", () => answerInput.focus());
553-
document.querySelector("[data-sync]").addEventListener("click", () => auth.syncManual());
554-
ui.reloadUnsavedInputs();
555-
} catch (error) {
556-
ui.view("api-fail");
557-
}
522+
const allQuestionsCorrect = (JSON.parse(segment.question_ids).length > 0) && questionStatuses.every(question => (question.status === 'Correct') || question.nonscored);
523+
option.innerHTML = `${segment.number} - ${segment.name}${segment.due ? ` (Due ${new Date(`${segment.due}T00:00:00`).toLocaleDateString('en-US', { weekday: 'short', year: 'numeric', month: 'short', day: 'numeric' })})` : ''}${allQuestionsCorrect ? ' [MASTERY]' : ''}`;
524+
option.setAttribute('due', segment.due || '');
525+
segments.append(option);
526+
});
527+
segments.value = segmentsArray.find(s => {
528+
if (!s.due) return false;
529+
return (new Date(`${s.due}T00:00:00`).toLocaleDateString('en-US', { weekday: 'short', year: 'numeric', month: 'short', day: 'numeric' }) === new Date().toLocaleDateString('en-US', { weekday: 'short', year: 'numeric', month: 'short', day: 'numeric', }) && new Date().getTime() <= periodRange[1]);
530+
})?.id || segmentsArray.find(s => {
531+
if (!s.due) return false;
532+
return (new Date(`${s.due}T00:00:00`).getTime() > periodRange[1] && new Date(`${s.due}T00:00:00`).getTime() <= periodRange[0] + 86400000);
533+
})?.id || segmentsArray.find(s => !s.due)?.id || segmentsArray[0]?.id;
534+
segments.removeEventListener("change", updateSegment);
535+
segments.addEventListener("change", updateSegment);
536+
// Update history feed
537+
await storage.idbReady;
538+
history = ((await storage.idbGet('cache')) || storage.get("cache") || {}).responses || [];
539+
await updateHistory();
540+
await updateSegment();
541+
// Show clear data fix guide
542+
// if (storage.get("created")) {
543+
// document.querySelector(`[data-modal-view="clear-data-fix"]`).remove();
544+
// } else {
545+
// storage.set("created", Date.now());
546+
// }
547+
// Focus segment input
548+
if (segmentInput) segmentInput.focus();
549+
// Set default answer mode
550+
answerMode("input");
551+
// Focus answer input
552+
document.getElementById("answer-suggestion").addEventListener("click", () => answerInput.focus());
553+
document.querySelector("[data-sync]").addEventListener("click", () => auth.syncManual());
554+
ui.reloadUnsavedInputs();
558555
ui.reloadUnsavedInputs();
559556
}
560557

src/checker/ta.js

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -72,37 +72,16 @@ try {
7272
// storage.set("created", Date.now());
7373
// }
7474

75-
await auth.bulkLoad(["courses", "segments", "questions", "answers", "responses"], storage.get("code"), storage.get("pwd"), false, true)
76-
.catch((e) => {
77-
console.error(e);
78-
if (!e.message || (e.message && !e.message.includes("."))) ui.view("api-fail");
79-
if ((e.error === "Access denied.") || (e.message === "Access denied.")) return auth.admin(init);
80-
});
75+
if (!(await auth.bulkLoad(["courses", "segments", "questions", "answers", "responses"], storage.get("code"), storage.get("pwd"), false, true, () => {
76+
auth.ta(init);
77+
}))) return;
8178
await storage.idbReady;
8279
const bulkLoad = (await storage.idbGet('adminCache')) || storage.get("adminCache") || {};
8380
courses = bulkLoad.courses;
8481
segments = bulkLoad.segments;
8582
questions = bulkLoad.questions;
8683
answers = bulkLoad.answers;
8784
responses = bulkLoad.responses;
88-
if (courses.length === 0) return ui.modal({
89-
title: 'Enter Password',
90-
body: `<p>Enter the assigned password for TA seat code <code>${storage.get("code")}</code>.</p>`,
91-
input: {
92-
type: 'password'
93-
},
94-
buttons: [
95-
{
96-
text: 'Verify',
97-
class: 'submit-button',
98-
onclick: (inputValue) => {
99-
storage.set("pwd", inputValue);
100-
init();
101-
},
102-
close: true,
103-
},
104-
],
105-
});
10685
await auth.loadAdminSettings(courses);
10786
if (!noReloadCourse) {
10887
document.getElementById("course-period-input").innerHTML = "";

src/modules/auth.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ export async function sync(hideWelcome = true, returnFunction = null) {
207207
return await r.json();
208208
})
209209
.then(async r => {
210+
ui.stopLoader();
210211
var password = storage.get("password");
211212
if (!hideWelcome) ui.toast("Welcome back!", 3000, "success", "bi bi-key");
212213
ui.setNotifications(r.notifications);
@@ -328,6 +329,7 @@ export async function sync(hideWelcome = true, returnFunction = null) {
328329
return await r.json();
329330
})
330331
.then(async r => {
332+
ui.stopLoader();
331333
ui.toast(r.message, 3000, "success", "bi bi-key");
332334
ui.setUnsavedChanges(false);
333335
await ui.launchWelcome(returnFunction);
@@ -740,7 +742,7 @@ export async function loadAdminSettings(courses) {
740742
});
741743
}
742744

743-
export async function bulkLoad(fields = [], usr = null, pwd = null, isAdmin = false, isTA = false) {
745+
export async function bulkLoad(fields = [], usr = null, pwd = null, isAdmin = false, isTA = false, ifAccessDenied = () => { }) {
744746
const startTime = Date.now();
745747
await storage.idbReady;
746748
const bulkLoadResponse = await fetch(`${domain}/bulk_load${isTA ? '?ta=true' : ''}`, {
@@ -762,6 +764,11 @@ export async function bulkLoad(fields = [], usr = null, pwd = null, isAdmin = fa
762764
}),
763765
});
764766
var fetchedBulkLoad = await bulkLoadResponse.json();
767+
if (!bulkLoadResponse.ok) {
768+
if (!fetchedBulkLoad.message || (fetchedBulkLoad.message && !fetchedBulkLoad.message.includes("."))) ui.view("api-fail");
769+
if ((fetchedBulkLoad.error === "Access denied.") || (fetchedBulkLoad.message === "Access denied.")) ifAccessDenied();
770+
return false;
771+
}
765772
var updatedBulkLoad = {};
766773
for (const table in fetchedBulkLoad) {
767774
if (table === 'asOf' || table === 'syncDeleted') continue;
@@ -799,4 +806,5 @@ export async function bulkLoad(fields = [], usr = null, pwd = null, isAdmin = fa
799806
}
800807
const loadTime = ((Date.now() - startTime) / 1000).toFixed(2);
801808
console.log(`${(loadTime < 1) ? '🟢' : ((loadTime > 5) ? '🔴' : '🟡')} Bulk load fetched in ${loadTime}s`);
809+
return true;
802810
}

0 commit comments

Comments
 (0)