Interner Zugang auffindbar + Owner kann eigenen Code selbst aendern

- Footer hat jetzt einen eigenen Block "Intern" mit Links zum
  Bewerbungs-Postfach und zu Zugaenge & Rollen (vorher nur ein
  winziger Link ganz unten)
- Postfach-Login verlinkt auf die Zugaenge-Seite
- Neue Tabelle app_settings + Endpunkt /admin/owner/set-code:
  der Hauptadministrator kann seinen Code selbst aendern, mit
  Bestaetigung des aktuellen Codes; gespeichert wird nur der Hash
- Neuer Tab "Mein Zugang" in zugaenge.html (nur fuer den Owner)

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-07-31 02:19:36 +02:00
co-authored by Claude Opus 5
parent 0e1f2fbdc4
commit 597988a9a2
8 changed files with 140 additions and 5 deletions
+33
View File
@@ -70,6 +70,10 @@ function showApp(session) {
const canViewAudit = session.isOwner || sessionHasPermission(session, "SETTINGS_VIEW_ACTIVITY_LOG");
if (auditTabBtn) auditTabBtn.style.display = canViewAudit ? "" : "none";
// "Mein Zugang" (eigenen Owner-Code ändern) gibt es nur für Dogi selbst.
const myCodeTabBtn = document.querySelector('[data-tab="tab-mycode"]');
if (myCodeTabBtn) myCodeTabBtn.style.display = session.isOwner ? "" : "none";
loadRoles().then(loadUsers);
if (session.isOwner || sessionHasPermission(session, "SETTINGS_VIEW_ACTIVITY_LOG")) loadAudit();
}
@@ -501,6 +505,35 @@ document.addEventListener("DOMContentLoaded", () => {
showGate();
});
// Eigenen Hauptadministrator-Code ändern
$("owner-code-form").addEventListener("submit", async (e) => {
e.preventDefault();
const status = $("owner-code-status");
const currentCode = $("oc-current").value;
const newCode = $("oc-new").value;
const repeat = $("oc-new2").value;
const fail = (msg) => {
status.textContent = msg;
status.className = "form-status show error";
};
if (newCode !== repeat) return fail("Die beiden neuen Codes sind nicht gleich.");
if (newCode.length < 10) return fail("Der neue Code muss mindestens 10 Zeichen haben.");
status.textContent = "Wird geändert …";
status.className = "form-status show";
const res = await apiCall(API_BASE_URL, "/admin/owner/set-code", { currentCode, newCode });
if (res.ok) {
status.textContent = "Erledigt — ab sofort gilt dein neuer Code. Gut merken! 🩵";
status.className = "form-status show success";
$("owner-code-form").reset();
} else {
fail(res.error || "Hat nicht geklappt.");
}
});
// Modals per Klick auf Backdrop schließen
document.querySelectorAll(".modal-backdrop").forEach((m) => {
m.addEventListener("click", (e) => {