diff options
Diffstat (limited to 'cockpit/js/student-common.js')
| -rw-r--r-- | cockpit/js/student-common.js | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/cockpit/js/student-common.js b/cockpit/js/student-common.js new file mode 100644 index 0000000..74cc845 --- /dev/null +++ b/cockpit/js/student-common.js @@ -0,0 +1,56 @@ +import { getUserIconUrl, getCourseParticipantsUrl } from "./config.js"; +/** + * Class to represent Students. + */ +class Student { + constructor(id, name, group) { + this.id = id; + this.name = name; + this.group = group; + } + + getIconUrl() { + return getUserIconUrl(this.id); + } +} + +async function fetchStudent(nameFilter, groupFilter) { + return await fetchStudents(nameFilter, groupFilter)[0]; +} + +const idRegex = /id=(\d+)/; +async function fetchStudents(nameFilter, groupFilter) { + const res = await fetch(getCourseParticipantsUrl()); + const doc = new DOMParser().parseFromString(await res.text(), "text/html"); + const table = doc.querySelector("tbody"); + let students = []; + table.querySelectorAll("tr").forEach(row => { + if (row.classList.contains("emptyrow")) + return; + + const roleCell = row.querySelector(".c4"); + // TODO(muhq): Is this locale dependent? + if (roleCell.innerHTML.includes("Lehrer")) { + return; + } + + const nameCell = row.querySelector(".c1"); + const name = nameCell.firstChild.firstChild.title; + const profileUrl = nameCell.querySelector("a.aabtn").href; + const match = idRegex.exec(profileUrl); + const id = match[1]; + + const groupCell = row.querySelector(".c5"); + const groupsText = groupCell.querySelector("a.quickeditlink").textContent; + const group = groupsText.trim(); + + if ((!nameFilter || name.includes(nameFilter)) && + (!groupFilter || groupFilter === group)) + { + students.push(new Student(id, name, group)); + } + }); + return students; +} + +export { Student, fetchStudents, fetchStudent }; |
