OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

dashboard.php

8 KB
<?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('&Uuml;berf&auml;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&auml;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&auml;ndiges Audit-Log') ?></a>
            </div>
            <?php else: ?>
            <div class="card-body">
                <p class="text-muted mb-0"><?= $this->te('Keine Aktivit&auml;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&auml;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('&Uuml;berf&auml;llig seit {datum}', ['datum' => date('d.m.Y', strtotime($review['next_review_date']))]) ?>
                                    </span>
                                    &bull; <?= $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&auml;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>