319 lines
16 KiB
PHP
319 lines
16 KiB
PHP
{{-- resources/views/santri/pelanggaran/index.blade.php --}}
|
||
@extends('layouts.app')
|
||
|
||
@section('title', 'Riwayat Pelanggaran')
|
||
|
||
@section('content')
|
||
<div class="page-header">
|
||
<h2><i class="fas fa-exclamation-circle"></i> Riwayat Pelanggaran Saya</h2>
|
||
</div>
|
||
|
||
{{-- ===== ALERT PERINGATAN ===== --}}
|
||
@php
|
||
$tingkatPoin = '';
|
||
$warnaPoin = '';
|
||
if ($totalPoin >= 50) {
|
||
$tingkatPoin = 'Berat';
|
||
$warnaPoin = 'var(--danger-color)';
|
||
} elseif ($totalPoin >= 20) {
|
||
$tingkatPoin = 'Sedang';
|
||
$warnaPoin = '#e67e22';
|
||
} elseif ($totalPoin > 0) {
|
||
$tingkatPoin = 'Ringan';
|
||
$warnaPoin = 'var(--warning-color)';
|
||
}
|
||
@endphp
|
||
|
||
@if($totalPoin >= 50)
|
||
<div style="background: linear-gradient(135deg, #dc3545 0%, #a71d2a 100%); color: white; padding: 16px 20px; border-radius: var(--border-radius); margin-bottom: 18px; display: flex; align-items: center; gap: 14px; box-shadow: 0 4px 15px rgba(220,53,69,0.3);">
|
||
<i class="fas fa-exclamation-triangle" style="font-size: 2em; opacity: 0.9;"></i>
|
||
<div>
|
||
<strong style="font-size: 1.05em;">⚠️ Perhatian! Akumulasi poin Anda sudah tinggi ({{ $totalPoin }} poin)</strong><br>
|
||
<span style="opacity: 0.9; font-size: 0.9em;">Harap segera hubungi pengurus pondok untuk konsultasi dan penyelesaian kafaroh yang ada.</span>
|
||
</div>
|
||
</div>
|
||
@elseif($totalPoin >= 20)
|
||
<div style="background: linear-gradient(135deg, #e67e22 0%, #ca6f1e 100%); color: white; padding: 16px 20px; border-radius: var(--border-radius); margin-bottom: 18px; display: flex; align-items: center; gap: 14px; box-shadow: 0 4px 15px rgba(230,126,34,0.3);">
|
||
<i class="fas fa-exclamation-circle" style="font-size: 2em; opacity: 0.9;"></i>
|
||
<div>
|
||
<strong style="font-size: 1.05em;">Catatan: Poin pelanggaran Anda mulai bertambah ({{ $totalPoin }} poin)</strong><br>
|
||
<span style="opacity: 0.9; font-size: 0.9em;">Jaga perilaku dan taati peraturan pondok agar poin tidak terus bertambah.</span>
|
||
</div>
|
||
</div>
|
||
@endif
|
||
|
||
{{-- ===== STATISTIK CARDS ===== --}}
|
||
<div class="row-cards">
|
||
<div class="card card-danger">
|
||
<h3>Total Pelanggaran</h3>
|
||
<div class="card-value">{{ $totalPelanggaran }}</div>
|
||
<p style="margin: 4px 0 0; color: var(--text-light); font-size: 0.85em;">Sepanjang waktu</p>
|
||
<i class="fas fa-clipboard-list card-icon"></i>
|
||
</div>
|
||
|
||
<div class="card card-warning">
|
||
<h3>Total Poin</h3>
|
||
<div class="card-value">{{ $totalPoin }}</div>
|
||
<p style="margin: 4px 0 0; color: var(--text-light); font-size: 0.85em;">
|
||
@if($tingkatPoin)
|
||
Tingkat: <strong>{{ $tingkatPoin }}</strong>
|
||
@else
|
||
Belum ada poin
|
||
@endif
|
||
</p>
|
||
<i class="fas fa-star card-icon"></i>
|
||
</div>
|
||
|
||
<div class="card card-info">
|
||
<h3>Bulan Ini</h3>
|
||
<div class="card-value">{{ $pelanggaranBulanIni }}</div>
|
||
<p style="margin: 4px 0 0; color: var(--text-light); font-size: 0.85em;">{{ \Carbon\Carbon::now()->isoFormat('MMMM YYYY') }}</p>
|
||
<i class="fas fa-calendar-alt card-icon"></i>
|
||
</div>
|
||
</div>
|
||
|
||
{{-- ===== VISUALISASI POIN ===== --}}
|
||
@if($totalPoin > 0)
|
||
<div class="content-box" style="margin-bottom: 18px;">
|
||
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px;">
|
||
<h4 style="margin: 0; color: var(--primary-color);">
|
||
<i class="fas fa-chart-bar"></i> Akumulasi Poin Pelanggaran
|
||
</h4>
|
||
<span style="font-size: 0.85em; color: var(--text-light);">Batas perhatian: 20 poin | Batas berat: 50 poin</span>
|
||
</div>
|
||
|
||
{{-- Progress Bar Poin --}}
|
||
@php
|
||
$maxPoin = max(50, $totalPoin); // skala dinamis
|
||
$persenBar = min(100, round(($totalPoin / $maxPoin) * 100));
|
||
if ($totalPoin < 20) {
|
||
$colorBar = 'var(--success-color)';
|
||
} elseif ($totalPoin < 50) {
|
||
$colorBar = '#e67e22';
|
||
} else {
|
||
$colorBar = 'var(--danger-color)';
|
||
}
|
||
@endphp
|
||
|
||
<div style="background: #f0f0f0; border-radius: 50px; height: 22px; overflow: hidden; position: relative; margin-bottom: 8px;">
|
||
{{-- Marker 20 poin --}}
|
||
<div style="position: absolute; left: {{ round((20 / $maxPoin) * 100) }}%; top: 0; bottom: 0; width: 2px; background: rgba(0,0,0,0.2); z-index: 1;"></div>
|
||
{{-- Marker 50 poin --}}
|
||
@if($maxPoin >= 50)
|
||
<div style="position: absolute; left: {{ round((50 / $maxPoin) * 100) }}%; top: 0; bottom: 0; width: 2px; background: rgba(0,0,0,0.2); z-index: 1;"></div>
|
||
@endif
|
||
<div style="height: 100%; width: {{ $persenBar }}%; background: {{ $colorBar }}; border-radius: 50px; transition: width 0.8s ease; display: flex; align-items: center; justify-content: flex-end; padding-right: 10px;">
|
||
<span style="color: white; font-size: 0.78em; font-weight: 700; white-space: nowrap;">{{ $totalPoin }} poin</span>
|
||
</div>
|
||
</div>
|
||
|
||
<div style="display: flex; justify-content: space-between; font-size: 0.78em; color: var(--text-light);">
|
||
<span>0</span>
|
||
<span style="margin-left: {{ round((20/$maxPoin)*100) }}%">20</span>
|
||
@if($maxPoin >= 50)<span>50+</span>@endif
|
||
</div>
|
||
</div>
|
||
@endif
|
||
|
||
{{-- ===== FILTER ===== --}}
|
||
<div class="content-box" style="margin-bottom: 14px;">
|
||
<div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 11px;">
|
||
<form method="GET" action="{{ route('santri.pelanggaran.index') }}" style="display: flex; gap: 10px; flex-wrap: wrap; align-items: flex-end;">
|
||
<div>
|
||
<label style="font-size: 0.82em; color: var(--text-light); display: block; margin-bottom: 4px;">
|
||
<i class="fas fa-calendar-day"></i> Tanggal Mulai
|
||
</label>
|
||
<input type="date" name="tanggal_mulai" class="form-control" style="width: auto;"
|
||
value="{{ request('tanggal_mulai') }}">
|
||
</div>
|
||
<div>
|
||
<label style="font-size: 0.82em; color: var(--text-light); display: block; margin-bottom: 4px;">
|
||
<i class="fas fa-calendar-check"></i> Tanggal Selesai
|
||
</label>
|
||
<input type="date" name="tanggal_selesai" class="form-control" style="width: auto;"
|
||
value="{{ request('tanggal_selesai') }}">
|
||
</div>
|
||
<div style="display: flex; gap: 8px; padding-top: 2px;">
|
||
<button type="submit" class="btn btn-primary btn-sm">
|
||
<i class="fas fa-filter"></i> Filter
|
||
</button>
|
||
<a href="{{ route('santri.pelanggaran.index') }}" class="btn btn-secondary btn-sm">
|
||
<i class="fas fa-redo"></i> Reset
|
||
</a>
|
||
<a href="{{ route('santri.pelanggaran.index', ['bulan_ini' => 1]) }}"
|
||
class="btn btn-sm {{ request('bulan_ini') ? 'btn-info' : 'btn-secondary' }}"
|
||
style="{{ request('bulan_ini') ? '' : 'border: 1px solid var(--primary-color); color: var(--primary-color); background: transparent;' }}">
|
||
<i class="fas fa-calendar-check"></i> Bulan Ini
|
||
</a>
|
||
</div>
|
||
</form>
|
||
|
||
<div style="display: flex; gap: 8px; flex-wrap: wrap;">
|
||
<a href="{{ route('santri.pelanggaran.kategori') }}" class="btn btn-warning btn-sm">
|
||
<i class="fas fa-list-ul"></i> Kategori & Poin
|
||
</a>
|
||
<a href="{{ route('santri.pembinaan.index') }}" class="btn btn-sm"
|
||
style="background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-dark, #1a4980) 100%);
|
||
color: white; border: none;">
|
||
<i class="fas fa-book-open"></i> Pembinaan & Sanksi
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{{-- ===== TABEL RIWAYAT ===== --}}
|
||
<div class="content-box">
|
||
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 14px;">
|
||
<h3 style="margin: 0; color: var(--primary-color);">
|
||
<i class="fas fa-history"></i> Daftar Riwayat Pelanggaran
|
||
</h3>
|
||
@if(request()->hasAny(['tanggal_mulai', 'tanggal_selesai', 'bulan_ini']))
|
||
<span class="badge badge-info" style="font-size: 0.85em;">
|
||
<i class="fas fa-filter"></i> Filter aktif — {{ $riwayat->total() }} data
|
||
</span>
|
||
@endif
|
||
</div>
|
||
|
||
@if($riwayat->count() > 0)
|
||
<div style="overflow-x: auto;">
|
||
<table class="data-table">
|
||
<thead>
|
||
<tr>
|
||
<th style="width: 5%;">No</th>
|
||
<th style="width: 10%;">ID</th>
|
||
<th style="width: 13%;">Tanggal</th>
|
||
<th style="width: 28%;">Jenis Pelanggaran</th>
|
||
<th style="width: 9%; text-align: center;">Poin</th>
|
||
<th style="width: 25%;">Keterangan</th>
|
||
<th style="width: 10%; text-align: center;">Aksi</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
@foreach($riwayat as $index => $item)
|
||
<tr style="transition: background 0.2s;">
|
||
<td>{{ $riwayat->firstItem() + $index }}</td>
|
||
<td>
|
||
<span class="badge badge-secondary" style="font-size: 0.8em;">
|
||
{{ $item->id_riwayat }}
|
||
</span>
|
||
</td>
|
||
<td>
|
||
<div style="white-space: nowrap;">
|
||
<i class="fas fa-calendar-day" style="color: var(--text-light); font-size: 0.85em;"></i>
|
||
<span style="font-size: 0.9em;">{{ \Carbon\Carbon::parse($item->tanggal)->isoFormat('D MMM YYYY') }}</span>
|
||
</div>
|
||
</td>
|
||
<td>
|
||
<strong>{{ $item->kategori->nama_pelanggaran ?? '-' }}</strong>
|
||
@if($item->kategori && $item->kategori->id_kategori)
|
||
<br><small style="color: var(--text-light);">
|
||
<i class="fas fa-tag"></i> {{ $item->kategori->id_kategori }}
|
||
</small>
|
||
@endif
|
||
</td>
|
||
<td style="text-align: center;">
|
||
@php $poin = $item->poin; @endphp
|
||
<span class="badge badge-danger"
|
||
style="font-size: 0.9em; padding: 5px 10px;
|
||
{{ $poin >= 20 ? 'background: linear-gradient(135deg, #dc3545, #a71d2a);' : '' }}">
|
||
<i class="fas fa-fire"></i> {{ $poin }}
|
||
</span>
|
||
</td>
|
||
<td>
|
||
@if($item->keterangan)
|
||
<div style="max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
||
font-size: 0.88em; color: var(--text-color);"
|
||
title="{{ $item->keterangan }}">
|
||
{{ $item->keterangan }}
|
||
</div>
|
||
@else
|
||
<span style="color: var(--text-light); font-size: 0.85em; font-style: italic;">Tidak ada keterangan</span>
|
||
@endif
|
||
</td>
|
||
<td style="text-align: center;">
|
||
<a href="{{ route('santri.pelanggaran.show', $item->id) }}"
|
||
class="btn btn-info btn-sm"
|
||
title="Lihat Detail">
|
||
<i class="fas fa-eye"></i> Detail
|
||
</a>
|
||
</td>
|
||
</tr>
|
||
@endforeach
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
{{-- Pagination --}}
|
||
<div style="margin-top: 14px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px;">
|
||
<p style="margin: 0; color: var(--text-light); font-size: 0.88em;">
|
||
Menampilkan {{ $riwayat->firstItem() }}–{{ $riwayat->lastItem() }} dari {{ $riwayat->total() }} data
|
||
</p>
|
||
{{ $riwayat->links() }}
|
||
</div>
|
||
@else
|
||
<div class="empty-state">
|
||
<i class="fas fa-check-circle" style="color: var(--success-color);"></i>
|
||
<h3>Tidak Ada Riwayat Pelanggaran</h3>
|
||
@if(request()->hasAny(['tanggal_mulai', 'tanggal_selesai', 'bulan_ini']))
|
||
<p>Tidak ditemukan data dengan filter yang dipilih.</p>
|
||
<a href="{{ route('santri.pelanggaran.index') }}" class="btn btn-secondary">
|
||
<i class="fas fa-redo"></i> Hapus Filter
|
||
</a>
|
||
@else
|
||
<p>Alhamdulillah, Anda belum memiliki catatan pelanggaran. Pertahankan!</p>
|
||
@endif
|
||
</div>
|
||
@endif
|
||
</div>
|
||
|
||
{{-- ===== INFO ANALISIS JIKA ADA DATA ===== --}}
|
||
@if($totalPelanggaran > 0)
|
||
<div class="content-box" style="margin-top: 18px;">
|
||
<h3 style="margin-bottom: 18px; color: var(--primary-color);">
|
||
<i class="fas fa-chart-pie"></i> Ringkasan Analisis
|
||
</h3>
|
||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px;">
|
||
|
||
<div style="background: var(--primary-light); padding: 16px; border-radius: var(--border-radius-sm); text-align: center;">
|
||
<i class="fas fa-calculator" style="font-size: 1.8em; color: var(--primary-color); margin-bottom: 8px;"></i>
|
||
<div style="font-size: 1.6em; font-weight: 700; color: var(--primary-dark);">
|
||
{{ $totalPelanggaran > 0 ? number_format($totalPoin / $totalPelanggaran, 1) : 0 }}
|
||
</div>
|
||
<p style="margin: 4px 0 0; color: var(--text-light); font-size: 0.85em;">Rata-rata Poin/Pelanggaran</p>
|
||
</div>
|
||
|
||
<div style="background: {{ $totalPoin >= 50 ? 'var(--danger-color)' : ($totalPoin >= 20 ? '#fdebd0' : '#eafaf1') }};
|
||
padding: 16px; border-radius: var(--border-radius-sm); text-align: center;">
|
||
<i class="fas fa-signal" style="font-size: 1.8em; color: {{ $totalPoin >= 50 ? 'white' : ($totalPoin >= 20 ? '#ca6f1e' : 'var(--success-color)') }}; margin-bottom: 8px;"></i>
|
||
<div style="font-size: 1.4em; font-weight: 700; color: {{ $totalPoin >= 50 ? 'white' : ($totalPoin >= 20 ? '#ca6f1e' : 'var(--success-color)') }};">
|
||
@if($totalPoin >= 50) Berat
|
||
@elseif($totalPoin >= 20) Sedang
|
||
@else Ringan
|
||
@endif
|
||
</div>
|
||
<p style="margin: 4px 0 0; color: {{ $totalPoin >= 50 ? 'rgba(255,255,255,0.8)' : 'var(--text-light)' }}; font-size: 0.85em;">Tingkat Pelanggaran</p>
|
||
</div>
|
||
|
||
<div style="background: #f8f9fa; padding: 16px; border-radius: var(--border-radius-sm); text-align: center;">
|
||
<i class="fas fa-calendar-day" style="font-size: 1.8em; color: var(--primary-color); margin-bottom: 8px;"></i>
|
||
<div style="font-size: 1em; font-weight: 600; color: var(--text-color);">
|
||
@if($riwayat->first())
|
||
{{ \Carbon\Carbon::parse($riwayat->first()->tanggal)->isoFormat('D MMM YYYY') }}
|
||
@else
|
||
—
|
||
@endif
|
||
</div>
|
||
<p style="margin: 4px 0 0; color: var(--text-light); font-size: 0.85em;">Pelanggaran Terakhir</p>
|
||
</div>
|
||
|
||
<div style="background: #fff3cd; padding: 16px; border-radius: var(--border-radius-sm); text-align: center;">
|
||
<i class="fas fa-calendar-check" style="font-size: 1.8em; color: #856404; margin-bottom: 8px;"></i>
|
||
<div style="font-size: 1.6em; font-weight: 700; color: #856404;">
|
||
{{ $pelanggaranBulanIni }}
|
||
</div>
|
||
<p style="margin: 4px 0 0; color: #856404; font-size: 0.85em;">Pelanggaran Bulan Ini</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
@endif
|
||
@endsection |