Quelltext des aktuellen Standes
<?php $this->layout('layouts/admin', [
'page_title' => 'Admin-Dashboard',
'current_admin_page' => 'dashboard'
]); ?>
<!-- KPI Small Boxes -->
<div class="kpi-row">
<div class="kpi-col">
<div class="small-box bg-info">
<div class="inner">
<h3><?= number_format($user_count ?? 0) ?></h3>
<p><?= $this->te('Aktive Benutzer') ?></p>
</div>
<div class="icon"><i class="fas fa-users"></i></div>
<a href="/admin/users" class="small-box-footer">
<?= $this->te('Verwalten') ?> <i class="fas fa-arrow-circle-right"></i>
</a>
</div>
</div>
<div class="kpi-col">
<div class="small-box bg-success">
<div class="inner">
<h3><?= number_format($topic_count ?? 0) ?></h3>
<p><?= $this->te('Themengebiete') ?></p>
</div>
<div class="icon"><i class="fas fa-folder"></i></div>
<a href="/topics" class="small-box-footer">
<?= $this->te('Anzeigen') ?> <i class="fas fa-arrow-circle-right"></i>
</a>
</div>
</div>
<div class="kpi-col">
<div class="small-box bg-primary">
<div class="inner">
<h3><?= number_format($page_count ?? 0) ?></h3>
<p><?= $this->te('Seiten') ?></p>
</div>
<div class="icon"><i class="fas fa-file-alt"></i></div>
</div>
</div>
<div class="kpi-col">
<div class="small-box <?= count($overdue_reviews ?? []) > 0 ? 'bg-danger' : 'bg-secondary' ?>">
<div class="inner">
<h3><?= count($overdue_reviews ?? []) ?></h3>
<p><?= $this->te('Überfällige Reviews') ?></p>
</div>
<div class="icon"><i class="fas fa-calendar-alt"></i></div>
</div>
</div>
</div>
<!-- Dashboard-Sektionen -->
<div class="row">
<!-- Letzte Aktivitäten -->
<div class="col-lg-6">
<div class="card">
<div class="card-header">
<h3 class="card-title"><i class="fas fa-history"></i> <?= $this->te('Letzte Aktivitäten') ?></h3>
</div>
<?php if (!empty($recent_audit)): ?>
<div class="card-body p-0">
<ul class="activity-feed">
<?php foreach ($recent_audit as $entry):
$cat = htmlspecialchars($entry['action_category'] ?? 'system');
$label = ucwords(str_replace('_', ' ', $entry['action_type'] ?? ''));
$user = htmlspecialchars($entry['display_name'] ?? 'System');
$initial = strtoupper(substr($entry['display_name'] ?? 'S', 0, 1));
?>
<li class="activity-item">
<div class="user-avatar"><?= $initial ?></div>
<div class="activity-body">
<div class="activity-text">
<strong><?= $user ?></strong>
<span class="action-badge category-<?= $cat ?>"><?= $label ?></span>
</div>
<div class="activity-time">
<i class="fas fa-clock"></i>
<?= $this->relativeTime($entry['event_timestamp']) ?>
</div>
</div>
</li>
<?php endforeach; ?>
</ul>
</div>
<div class="card-footer text-right">
<a href="/admin/audit"><i class="fas fa-arrow-right"></i> <?= $this->te('Vollständiges Audit-Log') ?></a>
</div>
<?php else: ?>
<div class="card-body">
<p class="text-muted mb-0"><?= $this->te('Keine Aktivitäten vorhanden.') ?></p>
</div>
<?php endif; ?>
</div>
</div>
<!-- Letzte Logins -->
<div class="col-lg-6">
<div class="card">
<div class="card-header">
<h3 class="card-title"><i class="fas fa-sign-in-alt"></i> <?= $this->te('Letzte Logins') ?></h3>
</div>
<?php if (!empty($recent_logins)): ?>
<div class="card-body p-0">
<ul class="user-list">
<?php foreach ($recent_logins as $user): ?>
<li class="user-item" style="padding:0.625rem 1.25rem;">
<div class="user-avatar">
<?= strtoupper(substr($user['display_name'] ?? 'U', 0, 1)) ?>
</div>
<div class="user-info">
<a href="/admin/users/<?= $user['id'] ?>" class="user-name">
<?= $this->e($user['display_name']) ?>
</a>
<span class="user-email"><?= $this->e($user['email']) ?></span>
</div>
<span class="user-date"><?= $this->relativeTime($user['last_login']) ?></span>
</li>
<?php endforeach; ?>
</ul>
</div>
<div class="card-footer text-right">
<a href="/admin/users"><i class="fas fa-arrow-right"></i> <?= $this->te('Alle Benutzer') ?></a>
</div>
<?php else: ?>
<div class="card-body">
<p class="text-muted mb-0"><?= $this->te('Keine Logins vorhanden.') ?></p>
</div>
<?php endif; ?>
</div>
</div>
<!-- Fällige Reviews -->
<div class="col-lg-6">
<div class="card <?= !empty($overdue_reviews) ? 'card-outline card-danger' : '' ?>">
<div class="card-header">
<h3 class="card-title"><i class="fas fa-clock"></i> <?= $this->te('Fällige Reviews') ?></h3>
</div>
<?php if (!empty($overdue_reviews)): ?>
<div class="card-body p-0">
<ul class="review-list">
<?php foreach ($overdue_reviews as $review): ?>
<li class="review-item overdue">
<a href="/pages/<?= $review['id'] ?>" class="review-link">
<span class="review-title"><?= $this->e($review['title']) ?></span>
<span class="review-meta">
<span class="text-danger">
<i class="fas fa-exclamation-circle"></i>
<?= $this->te('Überfällig seit {datum}', ['datum' => date('d.m.Y', strtotime($review['next_review_date']))]) ?>
</span>
• <?= $this->e($review['topic_name']) ?>
</span>
</a>
</li>
<?php endforeach; ?>
</ul>
</div>
<?php else: ?>
<div class="card-body">
<p class="text-success mb-0">
<i class="fas fa-check-circle"></i> <?= $this->te('Keine fälligen Reviews. Alles aktuell!') ?>
</p>
</div>
<?php endif; ?>
</div>
</div>
<!-- System-Status -->
<div class="col-lg-6">
<div class="card">
<div class="card-header">
<h3 class="card-title"><i class="fas fa-server"></i> <?= $this->te('System-Status') ?></h3>
</div>
<div class="card-body">
<div class="status-list">
<div class="status-item status-ok">
<span class="status-icon success"><i class="fas fa-check"></i></span>
<span class="status-label"><?= $this->te('Datenbank') ?></span>
<span class="status-value"><?= $this->te('Verbunden') ?></span>
</div>
<div class="status-item status-ok">
<span class="status-icon success"><i class="fas fa-check"></i></span>
<span class="status-label"><?= $this->te('Benutzer gesamt') ?></span>
<span class="status-value"><?= number_format($total_users ?? 0) ?></span>
</div>
</div>
</div>
</div>
</div>
</div>