Update Log aktivitas

This commit is contained in:
2026-11-05 16:34:33 +07:00
parent a3ec431d49
commit 7a279ad5d2
84 changed files with 725 additions and 67 deletions
@@ -0,0 +1,161 @@
@extends('layout.main')
@use('App\Services\Konfigurasi\FormatLogAktivitas', 'Format')
@use('App\Models\Pertanian\Petani')
@use('Illuminate\Support\Str')
@section('content')
<div class="container-xxl flex-grow-1 container-p-y">
<div class="card">
<div class="card-header border-bottom">
<h5 class="card-title mb-1">Log Aktivitas</h5>
<small class="text-body-secondary">Jejak perubahan data, status petani, dan login pengguna.</small>
</div>
{{-- Filter --}}
<div class="card-body pt-4">
<form method="GET" action="{{ route('log-aktivitas.index') }}" class="row g-3 align-items-end">
<div class="col-md-2">
<label class="form-label" for="jenis">Jenis</label>
<select id="jenis" name="jenis" class="form-select form-select-sm">
<option value="">Semua</option>
@foreach ($jenis as $kunci => $j)
<option value="{{ $kunci }}" @selected(request('jenis') === $kunci)>{{ $j['label'] }}</option>
@endforeach
</select>
</div>
<div class="col-md-2">
<label class="form-label" for="dari">Dari Tanggal</label>
<input type="date" id="dari" name="dari" value="{{ request('dari') }}"
class="form-control form-control-sm @error('dari') is-invalid @enderror">
@error('dari')<div class="invalid-feedback">{{ $message }}</div>@enderror
</div>
<div class="col-md-2">
<label class="form-label" for="sampai">Sampai Tanggal</label>
<input type="date" id="sampai" name="sampai" value="{{ request('sampai') }}"
class="form-control form-control-sm @error('sampai') is-invalid @enderror">
@error('sampai')<div class="invalid-feedback">{{ $message }}</div>@enderror
</div>
<div class="col-md-1">
<label class="form-label" for="per_page">Tampil</label>
<select id="per_page" name="per_page" class="form-select form-select-sm">
@foreach ($perPage as $n)
<option value="{{ $n }}" @selected($aktivitas->perPage() == $n)>{{ $n }}</option>
@endforeach
</select>
</div>
<div class="col-md-5">
<label class="form-label" for="search">Cari</label>
<div class="input-group input-group-sm">
<input type="text" id="search" name="search" class="form-control" value="{{ request('search') }}"
placeholder="Aktivitas, nama pengguna, atau nama petani...">
<button type="submit" class="btn btn-primary"><i class="icon-base ti tabler-search"></i></button>
@if (request()->hasAny(['jenis', 'search', 'dari', 'sampai']))
<a href="{{ route('log-aktivitas.index') }}" class="btn btn-label-secondary">Reset</a>
@endif
</div>
</div>
</form>
</div>
{{-- Tabel log --}}
<div class="table-responsive">
<table class="table table-hover">
<thead class="border-top">
<tr>
<th class="text-nowrap">Waktu</th>
<th>Pengguna</th>
<th>Jenis</th>
<th>Aktivitas</th>
<th>Rincian</th>
</tr>
</thead>
<tbody>
@forelse ($aktivitas as $item)
@php
$j = $jenis[$item->log_name] ?? ['label' => $item->log_name ?? '-', 'warna' => 'secondary'];
$prop = $item->properties ?? collect();
$baru = $item->attribute_changes['attributes'] ?? [];
$lama = $item->attribute_changes['old'] ?? null;
$petaniId = $item->subject_type === Petani::class ? $item->subject_id : ($prop['petani_id'] ?? null);
$namaData = $item->subject?->nama ?? $item->subject?->name;
@endphp
<tr>
<td class="text-nowrap">
<span class="d-block">{{ $item->created_at->translatedFormat('d M Y') }}</span>
<small class="text-body-secondary">{{ $item->created_at->format('H:i:s') }}</small>
</td>
<td>
@if ($item->causer)
<span class="text-heading fw-medium d-block">{{ $item->causer->name }}</span>
<small class="text-body-secondary">{{ $item->causer->role?->label() }}</small>
@else
<span class="text-body-secondary">Sistem / tamu</span>
@endif
</td>
<td><span class="badge bg-label-{{ $j['warna'] }}">{{ $j['label'] }}</span></td>
<td>
<span class="d-block">{{ $item->description }}</span>
@if ($item->subject_type && $item->subject_type !== Petani::class)
<small class="text-body-secondary d-block">#{{ $item->subject_id }}{{ $namaData ? ' · ' . Str::limit($namaData, 40) : '' }}</small>
@endif
@if ($petaniId)
<small class="text-body-secondary d-block">
<i class="icon-base ti tabler-user icon-xs"></i>
{{ $namaPetani[$petaniId] ?? $namaData ?? 'Petani #' . $petaniId }}
</small>
@endif
</td>
<td class="small">
@if ($item->log_name === 'verifikasi')
<span class="badge bg-label-secondary">{{ Format::status($prop['dari'] ?? null) }}</span>
<i class="icon-base ti tabler-arrow-right icon-xs mx-1"></i>
<span class="badge bg-label-primary">{{ Format::status($prop['ke'] ?? null) }}</span>
@if (! empty($prop['catatan']))
<div class="mt-1 text-wrap" style="max-width: 360px;">Catatan: {{ $prop['catatan'] }}</div>
@endif
@elseif ($item->log_name === 'auth')
<span class="d-block">IP: {{ $prop['ip'] ?? '-' }}</span>
@if (! empty($prop['identitas']))
<span class="d-block">Login: {{ $prop['identitas'] }}</span>
@endif
@elseif ($baru)
@php
$isian = collect($baru)->when(! $lama, fn ($c) => $c->reject(fn ($v) => $v === null || $v === ''));
$batas = $lama ? $isian->count() : 5;
@endphp
<ul class="list-unstyled mb-0">
@foreach ($isian->take($batas) as $kolom => $nilai)
<li class="text-wrap" style="max-width: 420px;">
<span class="fw-medium">{{ Format::kolom($kolom) }}:</span>
@if ($lama)
<span class="text-body-secondary text-decoration-line-through">{{ Format::nilai($kolom, $lama[$kolom] ?? null) }}</span>
<i class="icon-base ti tabler-arrow-right icon-xs mx-1"></i>
@endif
{{ Format::nilai($kolom, $nilai) }}
</li>
@endforeach
@if ($isian->count() > $batas)
<li class="text-body-secondary">+{{ $isian->count() - $batas }} isian lainnya</li>
@endif
</ul>
@else
<span class="text-body-secondary">-</span>
@endif
</td>
</tr>
@empty
<tr>
<td colspan="5" class="text-center py-4">Belum ada aktivitas yang tercatat.</td>
</tr>
@endforelse
</tbody>
</table>
</div>
<div class="d-flex justify-content-center justify-content-md-end border-top p-4">
{{ $aktivitas->links('pagination::bootstrap-5') }}
</div>
</div>
</div>
@endsection