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();
+16
View File
@@ -256,6 +256,22 @@ table.data .num { text-align: right; font-variant-numeric: tabular-nums; }
.match-tile.match-strong .sim-bar > div { background: var(--green); }
.match-tile.match-strong .sim-num { color: var(--green); }
/* ---------- Matrikel/Lektor Vorschläge ---------- */
.uid-field { position: relative; }
.suggest {
display: none; position: absolute; top: 100%; left: 0; right: 0; z-index: 60;
background: #fff; border: 1px solid var(--line); border-radius: 8px;
box-shadow: 0 8px 24px rgba(0,0,0,.14); margin-top: 4px; overflow: hidden;
}
.suggest.show { display: block; }
.suggest a {
display: flex; align-items: center; gap: 8px; padding: 9px 12px; font-size: 13.5px;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.suggest a:hover { background: var(--blue-light); text-decoration: none; }
.suggest a .mono { margin-left: auto; font-size: 12px; }
.muted { color: var(--muted); }
.footer { border-top: 1px solid var(--line); padding: 16px 0; color: var(--muted); font-size: 13px; background: #fff; }
@media (max-width: 720px) {