v1.5.0
Co nowego: - Podgląd logów w panelu admina (Admin > Logi) — pliki storage/logs/*.log bez potrzeby dostępu do kontenera, z filtrami poziomu/tekstu/liczby wpisów i auto-odświeżaniem. - Filtr „Bez kategorii” w kolejce operatora — izoluje zgłoszenia bez przypisanej kategorii/podkategorii. - Narzędzie importu z Heska: już nie tworzy automatycznie kont klientów dla nieznanych e-maili (pomija takie zgłoszenia zamiast zakładać konto), łączy odpowiedzi/właścicieli zgłoszeń z realnymi kontami operatorów po e-mailu, nowe flagi --assign-operators i --fix-closed-dates do donaprawiania wcześniejszych importów, dedykowany log storage/logs/hesk-import.log. - Poprawka: pulpit statystyk operatora (rozkład wg kategorii/podkategorii i filtr kategorii) pomijał zgłoszenia przypisane do samej kategorii bez podkategorii (np. z poczty IMAP) — teraz liczone poprawnie. - Poprawka: błąd JS i zawieszone w tle liczniki przy nawigacji z widoku z aktywnym licznikiem (najbardziej odczuwalne w liczniku czasu pracy operatora). - Porządki w bazie: usunięte niewykorzystywane kolumny (users.remember_token, users.email_verified_at, email_templates.trigger_label); wartości pól dodatkowych, stan triage/podsumowania AI i powiązany sprzęt Snipe-IT przeniesione z tabeli tickets do osobnych tabel (ticket_field_values, ticket_ai_summaries, ticket_snipeit_assets) — bez zmiany zachowania, ale pola dodatkowe są teraz efektywnie przeszukiwalne; dodane brakujące indeksy na 4 tabelach pivot; tickets.source/ticket_messages.source walidowane względem znanego zestawu wartości. Zaktualizowana dokumentacja: README, CLAUDE.md, ARCHITECTURE.md, CHANGELOG.md, wiki/admin, wiki/operator. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
69
src/resources/views/livewire/admin/logs.blade.php
Normal file
69
src/resources/views/livewire/admin/logs.blade.php
Normal file
@@ -0,0 +1,69 @@
|
||||
<div>
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:6px">
|
||||
<h3 style="margin:0">Logi</h3>
|
||||
<label style="display:flex;align-items:center;gap:6px;font-size:12.5px;font-weight:400;color:var(--color-text)">
|
||||
<input type="checkbox" wire:model.live="autoRefresh" style="position:static;opacity:1;width:auto;height:auto">
|
||||
Odświeżaj automatycznie (5 s)
|
||||
</label>
|
||||
</div>
|
||||
<p class="text-muted" style="font-size:12.5px;margin:0 0 14px">
|
||||
Podgląd plików z <code>storage/logs/</code> — co robi aplikacja i zaplanowane integracje (IMAP, automatyzacje, SLA). Widok tylko do odczytu, pokazuje ostatni fragment pliku.
|
||||
</p>
|
||||
|
||||
@if ($autoRefresh)
|
||||
<div wire:poll.5s="$refresh" style="display:none"></div>
|
||||
@endif
|
||||
|
||||
@if ($this->files->isEmpty())
|
||||
<p class="text-muted" style="font-size:13px">Brak plików logów w <code>storage/logs/</code>.</p>
|
||||
@else
|
||||
<div style="display:flex;flex-wrap:wrap;gap:6px;margin-bottom:14px">
|
||||
@foreach ($this->files as $file)
|
||||
<button type="button" wire:click="selectFile('{{ $file['name'] }}')"
|
||||
style="display:flex;flex-direction:column;align-items:flex-start;gap:2px;padding:6px 12px;border-radius:8px;cursor:pointer;font-size:12.5px;text-align:left;border:1px solid {{ $selectedFile === $file['name'] ? 'var(--color-accent)' : 'var(--color-divider)' }};background:{{ $selectedFile === $file['name'] ? 'color-mix(in srgb, var(--color-accent) 14%, transparent)' : 'transparent' }};color:{{ $selectedFile === $file['name'] ? 'var(--color-accent)' : 'var(--color-text)' }}">
|
||||
<span style="font-weight:500">{{ $file['name'] }}</span>
|
||||
<span class="text-muted" style="font-size:11px">{{ $this->formatBytes($file['size']) }} · {{ $file['modified']->diffForHumans() }}</span>
|
||||
</button>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div style="display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:12px">
|
||||
<select class="input" wire:model.live="levelFilter" style="width:auto">
|
||||
<option value="">Wszystkie poziomy</option>
|
||||
@foreach (\App\Livewire\Admin\Logs::availableLevels() as $level)
|
||||
<option value="{{ $level }}">{{ $level }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
|
||||
<input class="input" type="search" wire:model.live.debounce.400ms="search" placeholder="Szukaj w treści..." style="width:220px">
|
||||
|
||||
<select class="input" wire:model.live="limit" style="width:auto">
|
||||
<option value="100">ostatnie 100</option>
|
||||
<option value="300">ostatnie 300</option>
|
||||
<option value="1000">ostatnie 1000</option>
|
||||
<option value="3000">ostatnie 3000</option>
|
||||
</select>
|
||||
|
||||
<button type="button" class="btn btn-ghost" wire:click="$refresh">
|
||||
<span class="material-symbols-outlined" style="font-size:16px;vertical-align:-3px">refresh</span>
|
||||
Odśwież
|
||||
</button>
|
||||
|
||||
<span class="text-muted" style="font-size:12px;margin-left:auto">{{ $this->entries->count() }} wpisów</span>
|
||||
</div>
|
||||
|
||||
<div wire:key="log-box-{{ $selectedFile }}-{{ $levelFilter }}-{{ $search }}-{{ $limit }}"
|
||||
x-data x-init="$el.scrollTop = $el.scrollHeight"
|
||||
style="height:65vh;overflow:auto;border:1px solid var(--color-divider);border-radius:8px;background:color-mix(in srgb, var(--color-text) 4%, var(--color-bg));padding:10px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.5">
|
||||
@forelse ($this->entries as $entry)
|
||||
@php $badge = \App\Livewire\Admin\Logs::levelBadge($entry['level']); @endphp
|
||||
<div style="display:flex;gap:8px;align-items:flex-start;padding:3px 0;border-bottom:1px solid color-mix(in srgb, var(--color-text) 6%, transparent)">
|
||||
<span class="{{ $badge['class'] }}" style="flex:none;font-size:10px;padding:1px 6px;margin-top:2px;{{ $badge['style'] }}">{{ $entry['level'] ?? '?' }}</span>
|
||||
<span style="white-space:pre-wrap;word-break:break-word;flex:1">{{ $entry['text'] }}</span>
|
||||
</div>
|
||||
@empty
|
||||
<p class="text-muted" style="margin:0">Brak wpisów spełniających kryteria.</p>
|
||||
@endforelse
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
Reference in New Issue
Block a user