Lektoren app-weit: Plan/Details/iCal mit type=lektor, Namenssuche (Autocomplete) für Studierende und Lektoren, Lektor-Karte mit Profil-Link

This commit is contained in:
Nicolas Gruber
2026-10-19 16:01:41 +02:00
parent 6763faf9c1
commit 139b3677b5
5 changed files with 127 additions and 23 deletions
+44 -4
View File
@@ -272,16 +272,19 @@ async function openEvent(ev) {
const body = $("#detail-body");
body.innerHTML = `<p style="color:var(--muted)">Lade Details vom CIS...</p>`;
const stunde = stundeOf({ s: parseISO(ev.start) });
const detailKind = plan.kind === "student"
? (plan.ptype === "lektor" ? "lektor" : "student")
: plan.kind;
const params = new URLSearchParams({
kind: plan.kind, datum: ev.datum, stunde, ort: ev.ort,
kind: detailKind, datum: ev.datum, stunde, ort: ev.ort,
});
if (plan.kind === "student") {
params.set("uid", plan.uid);
} else {
if (plan.kind === "stg") {
params.set("kz", plan.kz);
params.set("sem", plan.sem);
params.set("ver", plan.ver);
params.set("grp", plan.grp);
} else {
params.set("uid", plan.uid);
}
try {
const r = await fetch("/api/detail?" + params.toString());
@@ -477,11 +480,48 @@ function initSearchJob() {
poll();
}
/* ================= Matrikel/Lektor Vorschläge ================= */
function initUidSuggest() {
const inp = $("#uid-input");
if (!inp) return;
const box = $("#uid-suggest");
let timer = null;
inp.addEventListener("input", () => {
clearTimeout(timer);
const q = inp.value.trim();
if (q.length < 2) { box.classList.remove("show"); return; }
timer = setTimeout(async () => {
try {
const r = await fetch("/api/benutzer?q=" + encodeURIComponent(q));
const arr = await r.json();
if (!arr.length) { box.classList.remove("show"); return; }
box.innerHTML = arr.map(p =>
`<a href="#" data-uid="${esc(p.uid)}">${esc(p.name)}
<span class="mono muted">${esc(p.uid)}</span>
${p.kind === "lektor" ? '<span class="badge badge-muted">Lektor</span>' : ""}</a>`
).join("");
box.classList.add("show");
} catch (e) { box.classList.remove("show"); }
}, 250);
});
box.addEventListener("click", (e) => {
const a = e.target.closest("a[data-uid]");
if (!a) return;
e.preventDefault();
inp.value = a.dataset.uid;
box.classList.remove("show");
});
document.addEventListener("click", (e) => {
if (!e.target.closest(".uid-field")) box.classList.remove("show");
});
}
/* ================= boot ================= */
document.addEventListener("DOMContentLoaded", () => {
if (window.__PLAN_DATA__) initPlan();
if (window.__STGS__) decodeMat();
if (window.__SEARCH_JOB__) initSearchJob();
initUidSuggest();
});
document.addEventListener("keydown", (e) => {
if (e.key === "Escape") closeDetail();