mirror of
https://github.com/BetterSEQTA/BetterSEQTA-Plus.git
synced 2026-06-06 03:34:40 +00:00
feat: improve apis + add animated background and assessment average plugins
This commit is contained in:
+1
-182
@@ -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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user