From 4b6c19f2371a1174584b6d9c4c25ed2a7b33ae0d Mon Sep 17 00:00:00 2001 From: Yamura4 <96625893+Yamura3@users.noreply.github.com> Date: Fri, 3 Apr 2026 08:51:10 +0200 Subject: [PATCH 1/3] Enhance UI and add esc handling to close --- BetterResults.js | 469 +++++++++++++++++++++++++++-------------------- 1 file changed, 274 insertions(+), 195 deletions(-) diff --git a/BetterResults.js b/BetterResults.js index 33e07e0..20a4393 100644 --- a/BetterResults.js +++ b/BetterResults.js @@ -2,7 +2,7 @@ const sidebar_selector = ".sidebar-results>:first-child"; let wideToolbarCallback = function (mutationsList, _) { for (let mutation of mutationsList) { - if (mutation.type == 'childList' && mutation.removedNodes.length != 0) { + if (mutation.type == "childList" && mutation.removedNodes.length != 0) { for (const node of mutation.removedNodes) { if (node.id == "show-grid") { console.log("Readding grid afther smartschool removed it"); @@ -16,16 +16,27 @@ let wideToolbarCallback = function (mutationsList, _) { let wideToolbarObserver = new MutationObserver(wideToolbarCallback); let smscMainCallback = function (mutationsList, observer) { - wideToolbarObserver.observe($(sidebar_selector)[0], { attributes: false, childList: true, subtree: false }); + wideToolbarObserver.observe($(sidebar_selector)[0], { + attributes: false, + childList: true, + subtree: false, + }); onLoad(); addButton(); }; let smscMainObserver = new MutationObserver(smscMainCallback); -smscMainObserver.observe($('#smscMain')[0], { attributes: false, childList: true, subtree: false }); +smscMainObserver.observe($("#smscMain")[0], { + attributes: false, + childList: true, + subtree: false, +}); function totalToStr(total_numerator, total_denominator) { - return (Math.round(total_numerator / total_denominator * 1000) / 10).toString() + '%'; + return ( + (Math.round((total_numerator / total_denominator) * 1000) / 10).toString() + + "%" + ); } function addButton() { @@ -41,161 +52,202 @@ function addButton() { .addClass("optionWrapper-IEDUX") .addClass("button-mJfIq") .append( - $("").addClass("icon-dus_u").attr("src", chrome.runtime.getURL("static/img/icon_128.png")).attr("width", 24).attr("height", 24).attr("id", "show-grid-icon") - ).append( - $("").addClass("label-dOebJ").text("Grid").attr("id", "show-grid-label") - ).click(openGrid) + $("") + .addClass("icon-dus_u") + .attr("src", chrome.runtime.getURL("static/img/icon_128.png")) + .attr("width", 24) + .attr("height", 24) + .attr("id", "show-grid-icon"), + ) + .append( + $("") + .addClass("label-dOebJ") + .text("Grid") + .attr("id", "show-grid-label"), + ) + .click(openGrid), ); console.log("Added button"); } function makeGrid() { let loading = $("

Loading!

"); - fetch('/results/api/v1/evaluations?itemsOnPage=500').then(r => r.json()).then(results => { - let data = {}; - let course_to_graphic = {}; - let latest_period = null; - for (const result of results) { - if (result["type"] != "normal") { - continue; - } - let period = result["period"]["name"]; - if (latest_period === null) { - latest_period = period; - } - if (!(period in data)) { - data[period] = {}; - } - - period = data[period]; - for (const course of result["courses"]) { - course_to_graphic[course["name"]] = course["graphic"]; - const course_name = course["name"]; - if (!(course_name in period)) { - period[course_name] = []; + fetch("/results/api/v1/evaluations?itemsOnPage=500") + .then((r) => r.json()) + .then((results) => { + let data = {}; + let course_to_graphic = {}; + let latest_period = null; + for (const result of results) { + if (result["type"] != "normal") { + continue; + } + let period = result["period"]["name"]; + if (latest_period === null) { + latest_period = period; + } + if (!(period in data)) { + data[period] = {}; } - period[course_name].push({ "date": result["date"], "name": result["name"], "graphic": result["graphic"] }); - } - } - - for (let period_name of Object.keys(data)) { - let period = data[period_name]; - - let grid = $("
").attr("id", "period").append($("

").text(period_name + ":")); - let table = $("").attr("id", "result-table"); - let longest = 0; - for (let [_, course] of Object.entries(period)) { - course.sort((a, b) => { return a["date"].localeCompare(b["date"]); }); - if (course.length > longest) { - longest = course.length; + period = data[period]; + for (const course of result["courses"]) { + course_to_graphic[course["name"]] = course["graphic"]; + const course_name = course["name"]; + if (!(course_name in period)) { + period[course_name] = []; + } + period[course_name].push({ + date: result["date"], + name: result["name"], + graphic: result["graphic"], + }); } } - // Add row for disclamer - let disc_row = $(""); - for (let i = 0; i < longest + 1; i++) { - disc_row.append($(""); - if (course_to_graphic[course_name].type == "icon") { - row.append($("
").addClass("hidden-cell")); - } - disc_row.append($("").attr("id", "disclamer").text("!")); - table.append(disc_row); - - let overallTotalNumerator = 0; - let overallTotalDenominator = 0; - - for (let [course_name, course] of Object.entries(period)) { - let row = $("
").append( - $("") - .addClass("icon-label icon-label--24 smsc-svg--" + course_to_graphic[course_name]["value"] + "--24") - .text(course_name) - )); - } else { - row.append($("").text(course_name)); - } - let total_numerator = 0; - let total_denominator = 0; + for (let period_name of Object.keys(data)) { + let period = data[period_name]; + + let grid = $("
") + .attr("id", "period") + .append($("

").text(period_name + ":")); + let table = $("").attr("id", "result-table"); + + let longest = 0; + for (let [_, course] of Object.entries(period)) { + course.sort((a, b) => { + return a["date"].localeCompare(b["date"]); + }); + if (course.length > longest) { + longest = course.length; + } + } + let overallTotalNumerator = 0; + let overallTotalDenominator = 0; + + for (let [course_name, course] of Object.entries(period)) { + let row = $(""); + if (course_to_graphic[course_name].type == "icon") { + row.append( + $(""); + overallTotalRow.append($(""); - overallTotalRow.append($("
").append( + $("") + .addClass( + "icon-label icon-label--24 smsc-svg--" + + course_to_graphic[course_name]["value"] + + "--24", + ) + .text(course_name), + ), + ); + } else { + row.append($("").text(course_name)); + } - for (const result of course) { - const desc = result["graphic"]["description"]; - const color = result["graphic"]["color"]; - const name = result["name"]; - let cellDesc = desc || "/"; // If desc is empty, use "-/-" + let total_numerator = 0; + let total_denominator = 0; + + for (const result of course) { + const desc = result["graphic"]["description"]; + const color = result["graphic"]["color"]; + const name = result["name"]; + let cellDesc = desc || "/"; // If desc is empty, use "-/-" + + row.append( + $("") + .addClass("c-" + color + "-combo--300") + .attr({ id: "details", content: name }) + .text(cellDesc), + ); + + let match = desc.match(/^([\d\,\.]+)\/([\d\,\.]+)$/); + if (match) { + total_numerator += parseFloat(match[1].replace(",", ".")); + total_denominator += parseFloat(match[2].replace(",", ".")); + } + } - row.append($("") - .addClass("c-" + color + "-combo--300") - .attr({ id: "details", content: name }) - .text(cellDesc)); + for (let i = 0; i < longest - course.length; i++) { + row.append($("")); + } - let match = desc.match(/^([\d\,\.]+)\/([\d\,\.]+)$/); - if (match) { - total_numerator += parseFloat(match[1].replace(',', '.')); - total_denominator += parseFloat(match[2].replace(',', '.')); + let last_cell = $("").addClass("total"); + if (total_denominator != 0) { + last_cell.text(totalToStr(total_numerator, total_denominator)); + if (total_numerator / total_denominator < 0.5) { + last_cell.addClass("is-low"); + } } - } + row.append(last_cell); + + overallTotalNumerator += total_numerator; + overallTotalDenominator += total_denominator; - for (let i = 0; i < longest - course.length; i++) { - row.append($("")); + table.append(row); } - let last_cell = $("").addClass("total"); - if (total_denominator != 0) { - last_cell.text(totalToStr(total_numerator, total_denominator)); - if (total_numerator / total_denominator < 0.5) { - last_cell.addClass('is-low'); + let overallTotalRow = $("
").text("Total")); + for (let i = 0; i < longest; i++) { + overallTotalRow.append($("")); + } + let overallTotalCell = $("").addClass("total"); + if (overallTotalDenominator != 0) { + overallTotalCell.text( + totalToStr(overallTotalNumerator, overallTotalDenominator), + ); + if (overallTotalNumerator / overallTotalDenominator < 0.5) { + overallTotalCell.addClass("is-low"); } } - row.append(last_cell); - - overallTotalNumerator += total_numerator; - overallTotalDenominator += total_denominator; - - table.append(row); + overallTotalRow.append(overallTotalCell); + table.append(overallTotalRow); + + grid.append($("
").attr("id", "table-container").append(table)); + grid.append( + $("
") + .addClass("disclaimer-text") + .text( + "Deze totalen kunnen afwijken van uw werkelijke resultaten doordat niet altijd alle gegevens gekend zijn.", + ), + ); + data[period_name] = grid; } - let overallTotalRow = $("
").text("Total")); - for (let i = 0; i < longest; i++) { - overallTotalRow.append($("")); - } - let overallTotalCell = $("").addClass("total"); - if (overallTotalDenominator != 0) { - overallTotalCell.text(totalToStr(overallTotalNumerator, overallTotalDenominator)); - if (overallTotalNumerator / overallTotalDenominator < 0.5) { - overallTotalCell.addClass('is-low'); + let modal = $("
").attr("id", "content-container"); + let period_buttons = $("
").addClass("period-selector"); + let main_grid = $("
").attr("id", "period-container"); + let isFirst = true; + for (let [period_name, grid] of Object.entries(data).reverse()) { + // We are using two lambda's sice otherwice they will all use the same scope. + let btn = $("