feat: improve apis + add animated background and assessment average plugins

This commit is contained in:
SethBurkart123
2025-03-30 13:17:19 +11:00
parent aeaf5d9e59
commit b8d8b108c3
11 changed files with 189 additions and 268 deletions
+1 -182
View File
@@ -256,17 +256,6 @@ async function LoadPageElements(): Promise<void> {
handleNotices,
)
if (settingsState.assessmentsAverage) {
eventManager.register(
"assessmentsAdded",
{
elementType: "div",
className: "assessmentsWrapper",
},
handleAssessments,
)
}
RegisterClickListeners()
await handleSublink(sublink)
@@ -665,174 +654,4 @@ export function AppendElementsToDisabledPage() {
}
`
document.head.append(settingsStyle)
}
/*async function CheckForMenuList() {
try {
await waitForElm("#menu > ul")
ObserveMenuItemPosition()
} catch (error) {
return
}
}*/
async function handleAssessments(node: Element): Promise<void> {
if (!(node instanceof HTMLElement)) return
// Wait for the assessments wrapper to be mounted
const assessmentsWrapper = await waitForElm(
"#main > .assessmentsWrapper .assessments .AssessmentItem__AssessmentItem___2EZ95",
true,
50,
)
if (!assessmentsWrapper) return
// Grade conversion map for letter grades
const letterGradeMap: Record<string, number> = {
"A+": 100,
A: 95,
"A-": 90,
"B+": 85,
B: 80,
"B-": 75,
"C+": 70,
C: 65,
"C-": 60,
"D+": 55,
D: 50,
"D-": 45,
"E+": 40,
E: 35,
"E-": 30,
F: 0,
}
// Function to parse grade text into a number
function parseGrade(gradeText: string): number {
// Remove any whitespace
const trimmedGrade = gradeText.trim().toUpperCase()
// Check if it is a non-percent grade
if (trimmedGrade.includes("/")) {
const grade = trimmedGrade.split("/")
var a = grade[1] as unknown as number
var b = grade[0] as unknown as number
return (b / a) * 100
}
// Check if it's a percentage
if (trimmedGrade.includes("%")) {
return parseFloat(trimmedGrade.replace("%", "")) || 0
}
// Check if it's a letter grade
if (Object.prototype.hasOwnProperty.call(letterGradeMap, trimmedGrade)) {
return letterGradeMap[trimmedGrade]
}
return 0
}
// Function to calculate average of grades
function calculateAverageGrade(): number {
const gradeElements = document.querySelectorAll(
".Thermoscore__text___1NdvB",
)
let total = 0
let count = 0
gradeElements.forEach((element) => {
const gradeText = element.textContent || ""
const grade = parseGrade(gradeText)
if (grade > 0) {
total += grade
count++
}
})
return count > 0 ? total / count : 0
}
// Function to add the average assessment item
function addAverageAssessment() {
const numaverage = calculateAverageGrade()
if (numaverage === 0) return
// Remove existing average section if it exists
const existingAverage = document.querySelector(
".AssessmentItem__AssessmentItem___2EZ95:first-child",
)
if (
existingAverage?.querySelector(".AssessmentItem__title___2bELn")
?.textContent === "Subject Average"
) {
existingAverage.remove()
}
const preaverage = numaverage.toFixed(0) as unknown as number
const prepaverage = Math.ceil(preaverage / 5) * 5
const NumberGradeMap: Record<number, string> = {
100: "A+",
95: "A",
90: "A-",
85: "B+",
80: "B",
75: "B-",
70: "C+",
65: "C",
60: "C-",
55: "D+",
50: "D",
45: "D-",
40: "E+",
35: "E",
30: "E-",
0: "F",
}
var letteraverage = "N/A"
const check = Object.prototype.hasOwnProperty.call(
NumberGradeMap,
prepaverage,
)
if (check) {
console.debug("[BetterSEQTA+ Debugger] Match found")
letteraverage = NumberGradeMap[prepaverage]
} else {
console.debug("[BetterSEQTA+ Debugger] No match found")
letteraverage = "N/A"
}
var average = "N/A"
if (settingsState.lettergrade) {
average = letteraverage
} else {
average = `${numaverage.toFixed(2)}%`
}
const averageElement = stringToHTML(/* html */ `
<div class="AssessmentItem__AssessmentItem___2EZ95">
<div class="AssessmentItem__metaContainer___dMKma">
<div class="AssessmentItem__meta___WNSiK">
<div class="AssessmentItem__simpleResult___iBCeC">
<div class="AssessmentItem__title___2bELn">Subject Average</div>
</div>
</div>
</div>
<div class="Thermoscore__Thermoscore___2tWMi">
<div class="Thermoscore__fill___35WjF" style="width: ${numaverage.toFixed(2)}%">
<div class="Thermoscore__text___1NdvB" title="${average};">${average}</div>
</div>
</div>
</div>
`)
// Insert at the beginning of the assessments list
const assessmentsList = document.querySelector(
".assessments .AssessmentList__items___3LcmQ",
)
if (assessmentsList && averageElement.firstChild) {
assessmentsList.insertBefore(
averageElement.firstChild,
assessmentsList.firstChild,
)
}
}
// Add the average assessment item
addAverageAssessment()
}
}