From 3daa151896e813c9cff7849611981c6dce69d441 Mon Sep 17 00:00:00 2001 From: Gaspard Jankowiak Date: Wed, 28 Oct 2026 12:26:31 +0100 Subject: [PATCH] import --- Makefile | 8 ++++ common.js | 39 +++++++++++++++++ content.css | 4 ++ content.js | 45 ++++++++++++++++++++ icons/icon-128-padded.png | Bin 0 -> 11655 bytes icons/icon.svg | 85 ++++++++++++++++++++++++++++++++++++++ manifest.json | 31 ++++++++++++++ 7 files changed, 212 insertions(+) create mode 100644 Makefile create mode 100644 common.js create mode 100644 content.css create mode 100644 content.js create mode 100644 icons/icon-128-padded.png create mode 100644 icons/icon.svg create mode 100644 manifest.json diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a9af754 --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +VERSION = $(shell sed -n '/"version"/s/.*\"\([0-9.]\+\)\",/\1/p' manifest.json) +SET_VERSION = $(eval CURRENT_VERSION=$(VERSION)) + +default: v2 + +v2: + $(SET_VERSION) + zip -r releases/kf-better-ugo-$(CURRENT_VERSION).xpi content.css content.js icons manifest.json common.js diff --git a/common.js b/common.js new file mode 100644 index 0000000..6d6cf13 --- /dev/null +++ b/common.js @@ -0,0 +1,39 @@ +const Common = {}; + +const HTTPP = document.location.protocol + "//" + document.location.host; + +var currentGroupName = ""; + +// helpers +const $C = (e, opts = {}) => { + const elem = document.createElement(e); + for (const key in opts) { + if (key == "classList") { + const cl = opts[key]; + if (typeof (cl) == "string") { + elem.classList.add(cl); + } else { + elem.classList.add(...cl); + } + continue; + } else if (key == "children") { + elem.append(...opts[key]); + continue; + } else if (key == "title") { + elem.setAttribute(key, opts[key]); + continue; + } + elem[key] = opts[key]; + } + return elem; +} + +const $G = (e) => document.getElementById(e); + +const $S = (s) => document.querySelector(s); + +Common.$G = $G; +Common.$C = $C; +Common.initializeModal = initializeModal; + +// vim: ts=2 sts=2 sw=2 diff --git a/content.css b/content.css new file mode 100644 index 0000000..0be3993 --- /dev/null +++ b/content.css @@ -0,0 +1,4 @@ +.kf-groups-quick-link { + margin-left: 0.2em; + font-size: 1.3em; +} diff --git a/content.js b/content.js new file mode 100644 index 0000000..d36e3af --- /dev/null +++ b/content.js @@ -0,0 +1,45 @@ +const UGOpp = {}; + +const __kf_course_id_regex = /[0-9]+$/; + +function _injectQuickLinks() { + const table = Common.$G("idLVOfferTab") + if (table?.querySelector(".kf-groups-quick-link")) return; + + const rows = table.querySelectorAll("tr.hi"); + + rows.forEach((row) => { + const tds = row.querySelectorAll("td") + const mainLink = tds[3].querySelector("a"); + const courseId = mainLink.href.match(__kf_course_id_regex)[0]; + const link = Common.$C("a", {classList: "kf-groups-quick-link", href:`https://online.uni-graz.at/kfu_online/sa.gruppen_einteilung?cLvNr=${courseId}`, children:["👥"]}) + tds[2].append(link) + }) +} + +function injectQuickLinks() { + const observerOptions = { + childList: true, + subtree: true, + }; + + const observer = new MutationObserver(logChanges) + observer.observe(document.body, observerOptions); +} + +function logChanges(records, observer) { + for (const record of records) { + for (const addedNode of record.addedNodes) { + if (addedNode.id == "actions") { + observer.disconnect(); + _injectQuickLinks(); + } + } + } +} + +UGOpp.injectQuickLinks = injectQuickLinks; + +injectQuickLinks(); + +// vim: ts=2 sts=2 sw=2 diff --git a/icons/icon-128-padded.png b/icons/icon-128-padded.png new file mode 100644 index 0000000000000000000000000000000000000000..a356d90b580e37f1530f1e8cfeb494b07ac50f47 GIT binary patch literal 11655 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 literal 0 HcmV?d00001 diff --git a/icons/icon.svg b/icons/icon.svg new file mode 100644 index 0000000..cd0721c --- /dev/null +++ b/icons/icon.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + UGO + + ++ + + + diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..7cfa430 --- /dev/null +++ b/manifest.json @@ -0,0 +1,31 @@ +{ + "manifest_version": 2, + "name": "KF-UGO++", + "version": "0.0.1", + "browser_specific_settings": { + "gecko": { + "id": "kf-ugopp@math.janko.fr", + "data_collection_permissions": { + "required": ["none"] + } + } + }, + "description": "Collection of small improvements for online.uni-graz.at", + "icons": { + "128": "icons/icon-128-padded.png" + }, + "content_scripts": [ + { + "matches": [ + "https://online.uni-graz.at/kfu_online/wblvangebot.wbshowlvoffer" + ], + "js": [ + "common.js", + "content.js" + ], + "css": [ + "content.css" + ] + } + ] +}