switch to a new logviewer and upgraded php libraries

This commit is contained in:
Codex Agent
2025-12-08 18:45:34 +01:00
parent 4784c23e70
commit bc960dc22b
18 changed files with 860 additions and 842 deletions

View File

@@ -1,63 +0,0 @@
<x-filament::page>
@php($selectedMeta = collect($logFiles)->firstWhere('name', $selectedFile))
<div class="space-y-4">
<div class="grid gap-3 md:grid-cols-3">
<div class="space-y-2">
<label class="text-xs font-semibold uppercase text-slate-500">Logdatei</label>
<select wire:model="selectedFile" class="w-full rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm focus:border-rose-300 focus:ring-1 focus:ring-rose-200">
@foreach($logFiles as $file)
<option value="{{ $file['name'] }}">
{{ $file['name'] }} ({{ number_format($file['size'] / 1024, 1) }} KB)
</option>
@endforeach
</select>
<p class="text-xs text-slate-500">Zuletzt aktualisiert: {{ $selectedMeta ? \Carbon\Carbon::createFromTimestamp($selectedMeta['modified'])->diffForHumans() : '—' }}</p>
</div>
<div class="space-y-2">
<label class="text-xs font-semibold uppercase text-slate-500">Filter (Level/Text)</label>
<input type="text" wire:model.debounce.400ms="filter" placeholder="error|warning|payment" class="w-full rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm focus:border-rose-300 focus:ring-1 focus:ring-rose-200" />
<p class="text-xs text-slate-500">Einfache Teilstring-Suche. Kein Regex.</p>
</div>
<div class="space-y-2">
<label class="text-xs font-semibold uppercase text-slate-500">Zeilenlimit</label>
<input type="number" min="50" max="1000" step="50" wire:model.lazy="limit" class="w-full rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm focus:border-rose-300 focus:ring-1 focus:ring-rose-200" />
<p class="text-xs text-slate-500">Letzte Zeilen (nach Filter).</p>
</div>
</div>
<div class="rounded-xl border border-slate-200 bg-white shadow-sm dark:border-slate-800 dark:bg-slate-900">
<div class="flex items-center justify-between border-b border-slate-200 px-4 py-2 text-xs uppercase tracking-wide text-slate-500 dark:border-slate-800 dark:text-slate-400">
<span>{{ $selectedFile ?: 'Keine Datei' }}</span>
<span>{{ $filter ? 'Gefiltert' : 'Ungefiltert' }} · {{ count($entries) }} Zeilen</span>
</div>
<div class="max-h-[70vh] overflow-y-auto">
<ul class="divide-y divide-slate-100 text-xs dark:divide-slate-800">
@forelse($entries as $entry)
<li class="px-4 py-2">
<div class="flex items-start gap-3">
<span @class([
'inline-flex min-w-[64px] items-center justify-center rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide',
'bg-red-100 text-red-800 dark:bg-red-500/20 dark:text-red-200' => $entry['level'] === 'error' || $entry['level'] === 'critical',
'bg-amber-100 text-amber-900 dark:bg-amber-500/20 dark:text-amber-100' => $entry['level'] === 'warning',
'bg-blue-100 text-blue-800 dark:bg-blue-500/20 dark:text-blue-100' => $entry['level'] === 'info',
'bg-slate-200 text-slate-800 dark:bg-slate-700 dark:text-slate-200' => ! in_array($entry['level'], ['error','critical','warning','info']),
])>
{{ strtoupper($entry['level']) }}
</span>
<div class="flex-1 space-y-1">
@if($entry['timestamp'])
<p class="text-[11px] text-slate-500 dark:text-slate-400">{{ $entry['timestamp'] }}</p>
@endif
<p class="whitespace-pre-wrap leading-relaxed text-slate-800 dark:text-slate-100">{{ $entry['text'] }}</p>
</div>
</div>
</li>
@empty
<li class="px-4 py-3 text-slate-500 dark:text-slate-400">Keine Logeinträge gefunden.</li>
@endforelse
</ul>
</div>
</div>
</div>
</x-filament::page>