From fc28fd37dd4a5dbc7512ec5f22d90795b75a4bc5 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Tue, 4 Aug 2026 10:24:10 +0200 Subject: fix errors detected by eslint --- eslint.config.js | 10 ++++++++ src/cockpit.js | 16 ++++++------- src/group.js | 2 +- src/mass-graduation.js | 27 +++++++++++----------- src/mock.js | 6 ++--- src/selection.js | 62 ++------------------------------------------------ 6 files changed, 37 insertions(+), 86 deletions(-) create mode 100644 eslint.config.js diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..84e53fb --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,10 @@ +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + { + rules: { + semi: "error", + "prefer-const": "error", + }, + }, +]); \ No newline at end of file diff --git a/src/cockpit.js b/src/cockpit.js index bd4c860..9dea658 100644 --- a/src/cockpit.js +++ b/src/cockpit.js @@ -51,15 +51,15 @@ function pointClickHandler(color) { // TODO(muhq): Prefill the textarea with common reasons switch (color) { case "green": - textarea.style.background = "rgb(from green r g b / 20%)" + textarea.style.background = "rgb(from green r g b / 20%)"; textarea.value = ""; break; case "orange": - textarea.style.background = "rgb(from orange r g b / 20%)" + textarea.style.background = "rgb(from orange r g b / 20%)"; textarea.value = ""; break; case "red": - textarea.style.background = "rgb(from red r g b / 20%)" + textarea.style.background = "rgb(from red r g b / 20%)"; textarea.value = ""; break; } @@ -68,7 +68,7 @@ function pointClickHandler(color) { const coach = name; - let submit = function() { + const submit = function() { let change; switch (color) { case "green": @@ -88,7 +88,7 @@ function pointClickHandler(color) { textareaDiv.style.display = "none"; updateStudentInfo(); student.fetchGraduation().then(() => updateStudentGraduation() ); - } + }; // Use onEVENT to override any previous handler textarea.onkeydown = function(e) { if (e.shiftKey && e.key === "Enter") { @@ -327,9 +327,9 @@ async function updateStudentGraduation() { const successTd = document.createElement("td"); if (period.success) { - successTd.innerHTML = "Graduierung erfolgreich" + successTd.innerHTML = "Graduierung erfolgreich"; } else { - successTd.innerHTML = "Graduierung nicht erfolgreich" + successTd.innerHTML = "Graduierung nicht erfolgreich"; } tr.appendChild(successTd); @@ -363,4 +363,4 @@ window.onload = function() { DEFAULT_STUDENT_ICON = document.getElementById("student-info-icon").src; name = getName(); initCockpit(); -} +}; diff --git a/src/group.js b/src/group.js index ba5e1a0..d52707b 100644 --- a/src/group.js +++ b/src/group.js @@ -25,7 +25,7 @@ class Group { } } -let groups = new Map(); +const groups = new Map(); function buildGroups(students) { for (const student of students) { diff --git a/src/mass-graduation.js b/src/mass-graduation.js index 3cbf32a..0a69cd1 100644 --- a/src/mass-graduation.js +++ b/src/mass-graduation.js @@ -113,7 +113,7 @@ function observationClickHandler(li) { async function loadGroup(selected) { group = selected; const students = await group.getStudents(); - let graduationPromises = []; + const graduationPromises = []; document.getElementById("group-content").style.display = "block"; const ul = document.getElementById("group-members"); @@ -124,30 +124,30 @@ async function loadGroup(selected) { const graduationPromise = student.getGraduation(); const li = document.createElement("li"); - li.classList.add("group-member") + li.classList.add("group-member"); // Remember the student of the entry li.student = student; const i = document.createElement("img"); - i.classList.add("group-member-icon") + i.classList.add("group-member-icon"); graduationPromise.then((graduation) => { i.src = graduation.getIcon(); }); li.appendChild(i); const n = document.createElement("span"); - n.classList.add("group-member-name") + n.classList.add("group-member-name"); n.innerHTML = `${student.name}`; li.appendChild(n); const ob = document.createElement("button"); - ob.classList.add("group-member-observation-icon") + ob.classList.add("group-member-observation-icon"); graduationPromise.then((graduation) => { if (!graduation.isObserved()) { return; } - ob.innerHTML = "👁" + ob.innerHTML = "👁"; ob.addEventListener("click", () => observationClickHandler(li) ); }); graduationPromises.push(graduationPromise); @@ -156,7 +156,7 @@ async function loadGroup(selected) { for (const col of ["green", "orange", "red"]) { const b = document.createElement("button"); - b.classList.add(`group-member-${col}`) + b.classList.add(`group-member-${col}`); b.innerHTML = "o"; b.addEventListener("click", () => toggle(b) ); li.appendChild(b); @@ -167,7 +167,7 @@ async function loadGroup(selected) { li.appendChild(textarea); const p = document.createElement("button"); - p.classList.add("group-member-print") + p.classList.add("group-member-print"); p.innerHTML = "🖶"; p.addEventListener("click", () => printNote(li) ); li.appendChild(p); @@ -176,7 +176,7 @@ async function loadGroup(selected) { } const graduations = await Promise.all(graduationPromises); - let observations = graduations.filter( + const observations = graduations.filter( (g) => g.observationRequested || (g.observation && !g.observation.end) ); @@ -192,9 +192,8 @@ async function loadGroup(selected) { const observationReuqestsNode = document.getElementById("observation-requests"); observationReuqestsNode.innerHTML = ""; observations.sort((g1, g2) => { - let g1D, g2D; - g1D = g1.observationRequested ? g1.observationRequested : g1.observation.start; - g2D = g2.observationRequested ? g2.observationRequested : g2.observation.start; + const g1D = g1.observationRequested ? g1.observationRequested : g1.observation.start; + const g2D = g2.observationRequested ? g2.observationRequested : g2.observation.start; return g1D - g2D; }); @@ -256,7 +255,7 @@ function submitMassGraduation() { // TODO(muhq): await graduation promises - let promises = []; + const promises = []; for(const li of document.querySelectorAll("li.group-member")) { const reason = li.querySelector(".group-member-point-reason").value; const student = li.student; @@ -270,7 +269,7 @@ function submitMassGraduation() { promises.push(submitGraduationChange(student, GraduationChange.newRedPointChange(reason, name))); } if (li.observationDiv) { - let status = []; + const status = []; for (const row of li.observationDiv.querySelectorAll("tbody > tr")) { if (row.querySelector('td[data-yes="true"]').innerHTML === "X") status.push("yes"); diff --git a/src/mock.js b/src/mock.js index 91b1525..33d1a1a 100644 --- a/src/mock.js +++ b/src/mock.js @@ -83,13 +83,13 @@ function fetchPublicGraduationMock(s) { } function submitGraduationChangeMock(s, c) { - console.assert(s.graduation, "no graduation") + console.assert(s.graduation, "no graduation"); s.graduation.addChange(c); } function submitObservationMock(s, o) { - console.assert(s.graduation, "no graduation") - console.assert(s.graduation.observation, "no observation period") + console.assert(s.graduation, "no graduation"); + console.assert(s.graduation.observation, "no observation period"); s.graduation.observation.addObservation(o); } diff --git a/src/selection.js b/src/selection.js index eda20ae..bfaebc0 100644 --- a/src/selection.js +++ b/src/selection.js @@ -22,7 +22,7 @@ async function initSelection(idPrefix, fetchCandidates, fmtCandidate, onSelectio const candidates = await fetchCandidates(); loader.style.display = "none"; - let items = []; + const items = []; let currentFocus = -1; let visibleItems = []; @@ -34,7 +34,7 @@ async function initSelection(idPrefix, fetchCandidates, fmtCandidate, onSelectio } for (const candidate of candidates) { - let item = document.createElement("li"); + const item = document.createElement("li"); item.candidate = candidate; item.innerHTML = fmtCandidate(candidate); item.style.display = 'none'; @@ -109,62 +109,4 @@ async function initSelection(idPrefix, fetchCandidates, fmtCandidate, onSelectio }); } -function pointClickHandler(color) { - const textareaDiv = document.getElementById("student-info-point-reason-container"); - const textarea = document.getElementById("student-info-point-reason"); - const submitBtn = document.getElementById("student-info-point-reason-submit"); - - // TODO(muhq): Prefill the textarea with common reasons - switch (color) { - case "green": - textarea.style.background = "rgb(from green r g b / 20%)" - textarea.value = ""; - break; - case "orange": - textarea.style.background = "rgb(from orange r g b / 20%)" - textarea.value = ""; - break; - case "red": - textarea.style.background = "rgb(from red r g b / 20%)" - textarea.value = ""; - break; - } - textareaDiv.style.display = "block"; - textarea.focus(); - - // Can not use string interpolation because of Moodle's firstname filter. - const coach = firstname + " " + lastname; - - let submit = function() { - let change; - switch (color) { - case "green": - change = GraduationChange.newGreenPointChange(student, textarea.value, coach); - break; - case "orange": - change = GraduationChange.newOrangePointChange(student, textarea.value, coach); - break; - case "red": - change = GraduationChange.newRedPointChange(student, textarea.value, coach); - break; - default: - alert("Invalid color"); - break; - } - submitGraduationChange(student, change); - textareaDiv.style.display = "none"; - updateStudentInfo(); - } - // Use onEVENT to override any previous handler - textarea.onkeydown = function(e) { - if (e.shiftKey && e.key === "Enter") { - submit(); - } - if (e.key === "Escape") { - textareaDiv.style.display = "none"; - } - }; - submitBtn.onclick = submit; -} - export { initSelection }; -- cgit v1.2.3