mirror of
https://github.com/BetterSEQTA/BetterSEQTA-Plus.git
synced 2026-06-05 19:24:39 +00:00
replaced loading font
This commit is contained in:
@@ -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;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user