Sprint 14: Multi-Fix-Batch — SW by-v428, APP_VER 407

KI/Symptom-Check: JSON-Code-Fence stripping in ki.py, Dringlichkeit-Map mit Phosphor-Icons
Gewicht-Sync: health.js aktualisiert appState.activeDog.gewicht_kg auch bei Bearbeitung
Giftköder: icon:'check-circle' → UI.icon('check-circle') in emptyState-Call
Forum-Pills: overflow:hidden + text-overflow:ellipsis auf Desktop und Mobile
Moderation: Admins für Moderatoren unsichtbar, keine Aktions-Buttons auf Admins
Notizblock: Filter-Chips wrap 2-zeilig auf Desktop (min-width:1024px)
Tagebuch: Datenschutz-Hinweis "nur du kannst sie sehen", Sitter sieht keine bestehenden Einträge
diary.py: Sitter-Zugriff gibt leere Liste zurück (GET), Erstellen bleibt erlaubt
This commit is contained in:
rene 2026-04-26 11:06:59 +02:00
parent 02120bb532
commit 016eb52d83
12 changed files with 111 additions and 33 deletions

View file

@ -267,7 +267,14 @@ window.Page_moderation = (() => {
}
function _renderUserList(el, users, total, parentEl) {
if (!users.length) {
// Moderatoren (non-admins) sehen keine Admin-User — serverseitig bereits
// gefiltert, aber zur Sicherheit auch clientseitig nochmal ausfiltern.
const isAdmin = _appState?.user?.rolle === 'admin';
const visible = isAdmin
? users
: users.filter(u => u.rolle !== 'admin' && !u.is_admin);
if (!visible.length) {
el.innerHTML = _emptyState('users', 'Keine Nutzer gefunden', '');
return;
}
@ -275,7 +282,10 @@ window.Page_moderation = (() => {
<div style="margin-bottom:var(--space-2);font-size:var(--text-xs);
color:var(--c-text-muted)">${total} Nutzer gefunden</div>
<div style="display:flex;flex-direction:column;gap:var(--space-2)">
${users.map(u => `
${visible.map(u => {
const isAdminUser = u.rolle === 'admin' || u.is_admin;
const canAction = isAdmin && !isAdminUser;
return `
<div class="card" style="padding:var(--space-3) var(--space-4);
${u.is_banned ? 'opacity:0.6;border-left:3px solid var(--c-danger)' : ''}">
<div style="display:flex;align-items:center;gap:var(--space-3)">
@ -304,22 +314,24 @@ window.Page_moderation = (() => {
</div>
</div>
<div style="flex-shrink:0">
${u.is_banned
? `<button class="btn btn-sm btn-ghost mod-unban"
data-uid="${u.id}" data-name="${_esc(u.name)}"
title="Sperre aufheben" style="color:var(--c-success)">
${UI.icon('lock-open')}
</button>`
: `<button class="btn btn-sm btn-ghost mod-ban"
data-uid="${u.id}" data-name="${_esc(u.name)}"
title="Sperren" style="color:var(--c-danger)">
${UI.icon('lock')}
</button>`
${canAction
? (u.is_banned
? `<button class="btn btn-sm btn-ghost mod-unban"
data-uid="${u.id}" data-name="${_esc(u.name)}"
title="Sperre aufheben" style="color:var(--c-success)">
${UI.icon('lock-open')}
</button>`
: `<button class="btn btn-sm btn-ghost mod-ban"
data-uid="${u.id}" data-name="${_esc(u.name)}"
title="Sperren" style="color:var(--c-danger)">
${UI.icon('lock')}
</button>`)
: ''
}
</div>
</div>
</div>
`).join('')}
`}).join('')}
</div>
`;