replaced loading font

This commit is contained in:
StroepWafel
2026-02-03 15:07:58 +10:30
parent 89589fe3dc
commit 17c2685cae
2 changed files with 140 additions and 141 deletions
+1 -2
View File
@@ -1,6 +1,5 @@
@use "sass:meta"; @use "sass:meta";
// Removed Google Fonts import - Firefox blocks external resources @import url("https://fonts.googleapis.com/css?family=Rubik:300,400,500,600");
// Using system font stack instead: Rubik -> system-ui -> sans-serif
@include meta.load-css("injected/sidebar-animation.scss"); @include meta.load-css("injected/sidebar-animation.scss");
@include meta.load-css("injected/theme.scss"); @include meta.load-css("injected/theme.scss");
@@ -1,140 +1,140 @@
import type { IndexItem, Job } from "../types"; import type { IndexItem, Job } from "../types";
const fetchSubjects = async () => { const fetchSubjects = async () => {
const res = await fetch(`${location.origin}/seqta/student/load/subjects`, { const res = await fetch(`${location.origin}/seqta/student/load/subjects`, {
method: "POST", method: "POST",
credentials: "include", credentials: "include",
headers: { "Content-Type": "application/json; charset=utf-8" }, headers: { "Content-Type": "application/json; charset=utf-8" },
body: JSON.stringify({ mode: "list" }), body: JSON.stringify({ mode: "list" }),
}); });
const data = await res.json(); const data = await res.json();
return data; return data;
}; };
export const subjectsJob: Job = { export const subjectsJob: Job = {
id: "subjects", id: "subjects",
label: "Subjects", label: "Subjects",
renderComponentId: "subject", renderComponentId: "subject",
frequency: { frequency: {
type: "expiry", type: "expiry",
afterMs: 1000 * 60 * 60 * 24 * 30, afterMs: 1000 * 60 * 60 * 24 * 30,
}, },
boostCriteria: (item, searchTerm) => { boostCriteria: (item, searchTerm) => {
if (searchTerm == "") { if (searchTerm == "") {
return -100; return -100;
} }
let score = 0; let score = 0;
if (item.metadata.isActive) { if (item.metadata.isActive) {
score += 0.01; // Boost for active subjects score += 0.01; // Boost for active subjects
} else { } else {
score -= 50; // Penalty for inactive subjects score -= 50; // Penalty for inactive subjects
} }
return score; return score;
}, },
run: async (ctx) => { run: async (ctx) => {
const existingIds = new Set( const existingIds = new Set(
(await ctx.getStoredItems("subjects")).map((i) => i.id), (await ctx.getStoredItems("subjects")).map((i) => i.id),
); );
let list; let list;
try { try {
list = await fetchSubjects(); list = await fetchSubjects();
} catch (e) { } catch (e) {
console.error("[Subjects job] list fetch failed:", e); console.error("[Subjects job] list fetch failed:", e);
return []; return [];
} }
if (list.status !== "200") { if (list.status !== "200") {
console.error("[Subjects job] API returned non-200 status:", list.status); console.error("[Subjects job] API returned non-200 status:", list.status);
return []; return [];
} }
// Check if we have the expected data structure // Check if we have the expected data structure
if (!list.payload || !Array.isArray(list.payload)) { if (!list.payload || !Array.isArray(list.payload)) {
console.error("[Subjects job] Unexpected API response structure:", list); console.error("[Subjects job] Unexpected API response structure:", list);
return []; return [];
} }
const items: IndexItem[] = []; const items: IndexItem[] = [];
// Process each semester // Process each semester
for (const semester of list.payload) { for (const semester of list.payload) {
if (!semester.subjects || !Array.isArray(semester.subjects)) { if (!semester.subjects || !Array.isArray(semester.subjects)) {
console.warn("[Subjects job] Skipping invalid semester:", semester); console.warn("[Subjects job] Skipping invalid semester:", semester);
continue; continue;
} }
// Process each subject in the semester // Process each subject in the semester
for (const subject of semester.subjects) { for (const subject of semester.subjects) {
// Skip if subject doesn't have required fields // Skip if subject doesn't have required fields
if (!subject || !subject.code || !subject.title) { if (!subject || !subject.code || !subject.title) {
console.warn("[Subjects job] Skipping invalid subject:", subject); console.warn("[Subjects job] Skipping invalid subject:", subject);
continue; continue;
} }
const id = `${semester.code}-${subject.code}-${subject.metaclass}`; const id = `${semester.code}-${subject.code}-${subject.metaclass}`;
if (existingIds.has(id)) continue; if (existingIds.has(id)) continue;
const isActive = semester.active === 1; const isActive = semester.active === 1;
// Create two items for each subject - one for assessments and one for course // Create two items for each subject - one for assessments and one for course
const assessmentsItem = { const assessmentsItem = {
id: `${id}-assessments`, id: `${id}-assessments`,
text: `${subject.title} Assessments`, text: `${subject.title} Assessments`,
category: "subjects", category: "subjects",
content: `View assessments for ${subject.title} (${semester.description})`, content: `View assessments for ${subject.title} (${semester.description})`,
dateAdded: Date.now(), dateAdded: Date.now(),
metadata: { metadata: {
subjectId: subject.metaclass, subjectId: subject.metaclass,
subjectName: subject.title, subjectName: subject.title,
subjectCode: subject.code, subjectCode: subject.code,
programme: subject.programme, programme: subject.programme,
semesterCode: semester.code, semesterCode: semester.code,
semesterDescription: semester.description, semesterDescription: semester.description,
type: "assessments", type: "assessments",
isActive isActive
}, },
actionId: "subjectassessment", actionId: "subjectassessment",
renderComponentId: "subject", renderComponentId: "subject",
}; };
const courseItem = { const courseItem = {
id: `${id}-course`, id: `${id}-course`,
text: `${subject.title}`, text: `${subject.title}`,
category: "subjects", category: "subjects",
content: `View course content for ${subject.title} (${semester.description})`, content: `View course content for ${subject.title} (${semester.description})`,
dateAdded: Date.now(), dateAdded: Date.now(),
metadata: { metadata: {
subjectId: subject.metaclass, subjectId: subject.metaclass,
subjectName: subject.title, subjectName: subject.title,
subjectCode: subject.code, subjectCode: subject.code,
programme: subject.programme, programme: subject.programme,
semesterCode: semester.code, semesterCode: semester.code,
semesterDescription: semester.description, semesterDescription: semester.description,
type: "course", type: "course",
isActive isActive
}, },
actionId: "subjectcourse", actionId: "subjectcourse",
renderComponentId: "subject", renderComponentId: "subject",
}; };
items.push( items.push(
assessmentsItem, assessmentsItem,
courseItem courseItem
); );
} }
} }
console.debug(`[Subjects job] Indexed ${items.length} subject items`); console.debug(`[Subjects job] Indexed ${items.length} subject items`);
return items; return items;
}, },
purge: (items) => { purge: (items) => {
// Keep all subjects as they are relatively static // Keep all subjects as they are relatively static
return items; return items;
}, },
}; };