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:
+44
-4
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user