/bewerbung: Tabs Unterlagen/E-Mail + Admin-Nutzerdetailseite

- Bewerbungsdetail: Toggle zwischen Bewerbungsunterlagen und E-Mail-Korrespondenz
  (hash-basiert), weniger Scroll auf der Seite.
- Admin: Klick auf einen Nutzer öffnet neue Verwaltungsseite
  /admin/users/:id (Passwort, Anmelden als, Jobsuche, Admin-Status, Löschen).
- Admin-Tabelle: Löschen und Jobsuche aus den Aktionen entfernt
  (jetzt auf der Nutzerdetailseite).

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-07-20 08:37:54 +02:00
co-authored by Claude
parent ada69eb482
commit fa07dbf90a
4 changed files with 296 additions and 20 deletions
+52 -3
View File
@@ -496,10 +496,30 @@
</div>
<div class="space-y-8">
<!-- Bewerbungsunterlagen (KI-generiert) -->
<% const genStatus = application.generierung_status; %>
<% if (genStatus || (anhaenge && anhaenge.length) || (application.stellenbeschreibung && application.stellenbeschreibung.trim())) { %>
<section id="unterlagen" class="bg-white dark:bg-gray-800 rounded-lg shadow-md p-6 mb-8"
<% const zeigeUnterlagen = genStatus || (anhaenge && anhaenge.length) || (application.stellenbeschreibung && application.stellenbeschreibung.trim()); %>
<% if (zeigeUnterlagen) { %>
<!-- Umschalter Unterlagen <-> E-Mail-Korrespondenz -->
<style>
.bw-tab{display:inline-flex;align-items:center;gap:.45rem;padding:.5rem 1rem;border-radius:.625rem;font-size:.875rem;font-weight:500;color:rgb(75 85 99);background:transparent;border:1px solid transparent;cursor:pointer;transition:background-color .15s,color .15s,border-color .15s}
.dark .bw-tab{color:rgb(209 213 219)}
.bw-tab:hover{background:rgb(243 244 246)}
.dark .bw-tab:hover{background:rgb(55 65 81)}
.bw-tab.active{background:rgb(37 99 235);color:#fff}
.bw-tab.active:hover{background:rgb(29 78 216)}
</style>
<div class="flex items-center gap-2" id="rechtsTabs">
<button type="button" data-tab="unterlagen" class="bw-tab active">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path></svg>
Unterlagen
</button>
<button type="button" data-tab="korrespondenz" class="bw-tab">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path></svg>
E-Mail
</button>
</div>
<!-- Bewerbungsunterlagen (KI-generiert) -->
<section id="unterlagen" class="bg-white dark:bg-gray-800 rounded-lg shadow-md p-6"
data-status="<%= genStatus || '' %>">
<div class="flex flex-wrap items-center justify-between gap-3 mb-4">
<h2 class="text-lg font-semibold text-gray-800 dark:text-white">Bewerbungsunterlagen</h2>
@@ -1074,6 +1094,35 @@
} catch (e) { /* keep polling */ }
}, 4000);
}
// --- Umschalter Unterlagen <-> E-Mail-Korrespondenz (rechte Spalte) ---
(function () {
var unterlagen = document.getElementById('unterlagen');
var korrespondenz = document.getElementById('korrespondenz');
if (!unterlagen || !korrespondenz) return; // kein Toggle nötig
var tabs = Array.prototype.slice.call(document.querySelectorAll('#rechtsTabs [data-tab]'));
function setActive(name) {
unterlagen.classList.toggle('hidden', name !== 'unterlagen');
korrespondenz.classList.toggle('hidden', name !== 'korrespondenz');
tabs.forEach(function (t) { t.classList.toggle('active', t.getAttribute('data-tab') === name); });
// E-Mail-iframes nachmessen, falls sie beim Laden versteckt waren.
if (name === 'korrespondenz') {
korrespondenz.querySelectorAll('.email-html-frame').forEach(fitFrame);
}
}
function fromHash() {
var h = (location.hash || '').replace(/^#/, '');
return (h === 'unterlagen' || h === 'korrespondenz') ? h : 'unterlagen';
}
setActive(fromHash());
window.addEventListener('hashchange', function () { setActive(fromHash()); });
tabs.forEach(function (t) {
t.addEventListener('click', function () {
history.replaceState(null, '', '#' + t.getAttribute('data-tab'));
setActive(t.getAttribute('data-tab'));
});
});
})();
})();
// Generation form: require at least one document, and keep the