Fristen laufen mit — entlassen wird ausschließlich durch einen Beamten.
${d.rechte.einweisen
? `` : ""}
${reiterLeiste()}
${abgelaufen > 0 ? `
⏰${abgelaufen} Haftzeit${abgelaufen === 1 ? "" : "en"} abgelaufen.
Die Person${abgelaufen === 1 ? " bleibt" : "en bleiben"} im Gewahrsam, bis ein Beamter
über die Entlassung entscheidet.
Das System erinnert an ablaufende Fristen — es entlässt niemanden.
Auch eine längst abgelaufene Haftzeit bleibt offen stehen, bis jemand entscheidet.
`;
verdrahteAktuell(behaelter);
starteTicker(behaelter);
}
function verdrahteAktuell(behaelter) {
const neu = $("gw-neu");
if (neu) neu.addEventListener("click", () => einweisenDialog(behaelter));
behaelter.querySelectorAll("[data-entlassen]").forEach((b) =>
b.addEventListener("click", () => entlassenDialog(behaelter, +b.dataset.entlassen)));
behaelter.querySelectorAll("[data-frist]").forEach((b) =>
b.addEventListener("click", () => fristDialog(behaelter, +b.dataset.frist)));
behaelter.querySelectorAll("[data-zelle]").forEach((b) =>
b.addEventListener("click", () => zelleDialog(behaelter, +b.dataset.zelle)));
}
/** Lässt die Restzeiten sekündlich weiterlaufen, ohne neu zu laden */
function starteTicker(behaelter) {
clearInterval(ticker);
ticker = setInterval(() => {
const felder = behaelter.querySelectorAll("[data-rest]");
if (!felder.length) { clearInterval(ticker); return; }
felder.forEach((el) => {
let rest = +el.dataset.rest - 1;
el.dataset.rest = rest;
el.textContent = restText(rest);
if (rest <= 0) el.classList.add("abgelaufen");
});
}, 1000);
}
/* ---- Einweisen ---------------------------------------------------- */
function einweisenDialog(behaelter) {
const freieZellen = z.daten.zellen.filter((c) => c.frei);
let gewaehlt = null; // { id, name }
const f = fenster({
titel: "In Gewahrsam nehmen",
inhalt: `
Noch niemand ausgewählt.
ℹ
Die Haftdauer legst du fest. Ein Katalogvorschlag aus einer Anzeige
ist nur eine Empfehlung und wird hier nicht automatisch übernommen.
${z.daten.verbringen
? "
Die Person wird in die gewählte Zelle verbracht."
: "
Die Person wird nicht automatisch verbracht — das geschieht im Rollenspiel."}
`,
knoepfe: [
{ text: "Abbrechen", klick: (_, zu) => zu() },
{ text: "In Gewahrsam nehmen", klick: async (el, zu) => {
if (!gewaehlt) { meldung("Bitte eine Person auswählen.", "fehler"); return; }
try {
await aufruf("gewahrsam", "einweisen", {
charakterId: gewaehlt.id,
dauer: +el.querySelector("#gw-dauer").value,
zelle: el.querySelector("#gw-zelle").value || null,
grund: el.querySelector("#gw-grund").value.trim(),
});
zu(); meldung("In Gewahrsam genommen.", "gut"); rendern(behaelter);
} catch (fehler) { meldung(fehler.message, "fehler"); }
}},
],
nachOeffnen: (el) => {
const suchen = async () => {
const begriff = el.querySelector("#gw-person").value.trim();
if (begriff.length < 2) { meldung("Bitte mindestens zwei Zeichen.", "fehler"); return; }
try {
const d = await aufruf("mdt", "personSuchen", { begriff });
const treffer = d.treffer || [];
if (!treffer.length) { meldung("Keine Treffer."); return; }
// Ergebnisse direkt unter dem Feld anbieten
const anzeige = el.querySelector("#gw-gewaehlt");
anzeige.innerHTML = `