index.php
- Pfad:
src/View/protokoll/index.php - Namespace: -
- Zeilen: 114 | Größe: 4,778 Bytes
- Geändert: 2025-12-20 14:48:52 | Gescannt: 2025-12-31 10:22:15
Code Hygiene Score: 100
- Dependencies: 100 (25%)
- LOC: 100 (20%)
- Methods: 100 (20%)
- Secrets: 100 (15%)
- Classes: 100 (10%)
- Magic Numbers: 100 (10%)
Keine Issues gefunden.
Code
<?php ob_start(); ?>
<h1>KI-Protokoll</h1>
<div class="stats-grid">
<div class="stat-card">
<span class="stat-card__value"><?= number_format($stats['total'] ?? 0) ?></span>
<span class="stat-card__label">Einträge</span>
</div>
<div class="stat-card stat-card--success">
<span class="stat-card__value"><?= number_format($stats['completed'] ?? 0) ?></span>
<span class="stat-card__label">Erfolgreich</span>
</div>
<div class="stat-card stat-card--danger">
<span class="stat-card__value"><?= number_format($stats['errors'] ?? 0) ?></span>
<span class="stat-card__label">Fehler</span>
</div>
<div class="stat-card stat-card--info">
<span class="stat-card__value"><?= number_format($stats['tokens_total'] ?? 0) ?></span>
<span class="stat-card__label">Tokens gesamt</span>
</div>
</div>
<h2>Protokoll-Einträge</h2>
<div class="filters">
<input type="search" id="protokoll-search" class="form-input" placeholder="Durchsuchen..." value="<?= htmlspecialchars($currentSearch) ?>">
<select id="filter-status" class="form-select--inline">
<option value="">Alle Status</option>
<option value="completed"<?= $currentStatus === 'completed' ? ' selected' : '' ?>>Completed</option>
<option value="error"<?= $currentStatus === 'error' ? ' selected' : '' ?>>Error</option>
<option value="pending"<?= $currentStatus === 'pending' ? ' selected' : '' ?>>Pending</option>
</select>
<select id="filter-model" class="form-select--inline">
<option value="">Alle Modelle</option>
<?php foreach ($models as $model): ?>
<option value="<?= htmlspecialchars($model) ?>"<?= $currentModel === $model ? ' selected' : '' ?>><?= htmlspecialchars($model) ?></option>
<?php endforeach; ?>
</select>
</div>
<table id="protokoll-table" data-sortable>
<thead>
<tr>
<th data-sort="id">ID</th>
<th data-sort="timestamp">Zeit</th>
<th data-sort="client">Client</th>
<th data-sort="model">Modell</th>
<th data-sort="status">Status</th>
<th data-sort="tokens">Tokens</th>
<th data-sort="duration">Dauer</th>
</tr>
</thead>
<tbody>
<?php if (!empty($entries)): ?>
<?php foreach ($entries as $entry): ?>
<tr>
<td><a href="/protokoll/<?= $entry['id'] ?>">#<?= $entry['id'] ?></a></td>
<td><?= substr($entry['timestamp'], 0, 19) ?></td>
<td><?= htmlspecialchars($entry['client_name']) ?></td>
<td><?= htmlspecialchars($entry['model_name'] ?? '-') ?></td>
<td><span class="badge badge--<?= $entry['status'] === 'completed' ? 'completed' : ($entry['status'] === 'error' ? 'failed' : 'pending') ?>"><?= $entry['status'] ?></span></td>
<td><?= number_format($entry['tokens_total'] ?? 0) ?></td>
<td><?= $entry['duration_ms'] ? $entry['duration_ms'] . 'ms' : '-' ?></td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr><td colspan="7" class="empty-state empty-state--small">Keine Protokoll-Einträge vorhanden</td></tr>
<?php endif; ?>
</tbody>
</table>
<?php if ($totalPages > 1): ?>
<nav class="pagination">
<?php if ($currentPage > 1): ?>
<a href="?page=<?= $currentPage - 1 ?>&search=<?= urlencode($currentSearch) ?>&status=<?= urlencode($currentStatus) ?>&model=<?= urlencode($currentModel) ?>" class="btn btn--small">« Zurück</a>
<?php endif; ?>
<span class="pagination__info">Seite <?= $currentPage ?> von <?= $totalPages ?> (<?= number_format($totalCount) ?> Einträge)</span>
<?php if ($currentPage < $totalPages): ?>
<a href="?page=<?= $currentPage + 1 ?>&search=<?= urlencode($currentSearch) ?>&status=<?= urlencode($currentStatus) ?>&model=<?= urlencode($currentModel) ?>" class="btn btn--small">Weiter »</a>
<?php endif; ?>
</nav>
<?php endif; ?>
<p class="links-bar">
<a href="/docs/modul/ki-protokoll">Dokumentation</a>
</p>
<script type="module">
import { init } from '/js/components/data-table.js';
const dataTable = init({
clock: { now_epoch_ms_utc: () => Date.now() },
logger: console,
ui: {
showMessage: (msg) => { console.log(msg.type + ': ' + msg.text); },
disableFeature: (key) => { console.warn('Feature disabled: ' + key); },
offerRetry: () => Promise.resolve(false)
},
runId: crypto.randomUUID()
});
dataTable.create('protokoll-table', {
searchInput: 'protokoll-search',
pageSize: 50,
filters: {
'filter-status': 4,
'filter-model': 3
}
});
</script>
<?php $content = ob_get_clean(); ?>
<?php require VIEW_PATH . '/layout.php'; ?>