MIF_E31221353/resources/views/admin/users/show.blade.php

386 lines
12 KiB
PHP

@extends('layouts.app')
@section('title', 'Detail Pengguna - ' . $user->name)
@push('head')
<style>
.profile-shell {
position: relative;
max-width: 980px;
margin: 0 auto;
padding: 32px 36px;
border-radius: 28px;
background: linear-gradient(150deg, rgba(12, 24, 52, 0.96), rgba(7, 15, 36, 0.9));
border: 1px solid rgba(148, 163, 184, 0.22);
box-shadow: 0 40px 80px rgba(3, 7, 18, 0.55);
overflow: hidden;
}
.profile-shell::before,
.profile-shell::after {
content: "";
position: absolute;
inset: 0;
pointer-events: none;
}
.profile-shell::before {
background:
radial-gradient(circle at 12% 16%, rgba(99, 102, 241, 0.32), transparent 55%),
radial-gradient(circle at 86% -6%, rgba(56, 189, 248, 0.28), transparent 60%);
opacity: 0.9;
}
.profile-shell::after {
background: linear-gradient(135deg, transparent 40%, rgba(59, 130, 246, 0.14));
opacity: 0.8;
}
.profile-shell > * { position: relative; z-index: 1; }
.profile-hero {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 24px;
flex-wrap: wrap;
}
.profile-hero__info {
display: flex;
flex-direction: column;
gap: 12px;
max-width: 560px;
}
.profile-hero__tagline {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 6px 14px;
border-radius: 999px;
background: rgba(129, 140, 248, 0.18);
border: 1px solid rgba(129, 140, 248, 0.38);
color: #e0e7ff;
font-size: 12px;
letter-spacing: 0.08em;
text-transform: uppercase;
font-weight: 600;
}
.profile-hero__info h2 {
margin: 0;
font-size: 32px;
font-weight: 700;
letter-spacing: -0.02em;
color: #f8fafc;
}
.profile-hero__info p {
margin: 0;
color: rgba(226, 232, 240, 0.78);
font-size: 15px;
line-height: 1.6;
}
.profile-hero__actions {
display: flex;
flex-wrap: wrap;
gap: 12px;
align-items: center;
}
.profile-hero__actions .btn {
border-radius: 14px;
padding: 10px 18px;
border: none;
cursor: pointer;
font-weight: 700;
letter-spacing: 0.04em;
transition: transform 0.18s ease, box-shadow 0.18s ease;
}
.btn-primary {
background: linear-gradient(135deg, #2563eb, #1d4ed8);
color: #f8fafc;
}
.btn-success {
background: linear-gradient(135deg, #16a34a, #22c55e);
color: #f8fafc;
}
.btn-warning {
background: linear-gradient(135deg, #f59e0b, #d97706);
color: #f8fafc;
}
.btn:hover {
transform: translateY(-1px);
box-shadow: 0 18px 32px rgba(14, 165, 233, 0.22);
}
.profile-summary {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 18px;
margin-top: 32px;
}
.profile-card {
padding: 24px;
border-radius: 24px;
background: rgba(8, 16, 34, 0.82);
border: 1px solid rgba(148, 163, 184, 0.18);
box-shadow: inset 0 1px 0 rgba(148, 163, 184, 0.12);
}
.profile-card h3 {
margin: 0 0 18px;
color: #f8fafc;
font-size: 1.05rem;
font-weight: 700;
}
.profile-field {
display: grid;
gap: 10px;
margin-bottom: 18px;
}
.profile-label {
font-size: 12px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: rgba(203, 213, 225, 0.72);
font-weight: 700;
}
.profile-value {
color: #e2e8f0;
font-size: 0.95rem;
font-weight: 600;
background: rgba(7, 15, 34, 0.9);
border: 1px solid rgba(148, 163, 184, 0.16);
border-radius: 14px;
padding: 14px 16px;
}
.status-pill {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 10px 16px;
border-radius: 999px;
font-size: 12px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.status-success {
background: rgba(34, 197, 94, 0.18);
color: #bbf7d0;
border: 1px solid rgba(34, 197, 94, 0.3);
}
.status-warning {
background: rgba(245, 158, 11, 0.18);
color: #fde68a;
border: 1px solid rgba(245, 158, 11, 0.3);
}
.status-danger {
background: rgba(248, 113, 113, 0.18);
color: #fecaca;
border: 1px solid rgba(248, 113, 113, 0.3);
}
.profile-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 24px;
margin-top: 32px;
}
.profile-grid-2 {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 18px;
margin-top: 18px;
}
.summary-card {
padding: 18px 20px;
border-radius: 20px;
background: linear-gradient(145deg, rgba(12, 21, 44, 0.9), rgba(19, 35, 70, 0.84));
border: 1px solid rgba(148, 163, 184, 0.18);
}
.summary-card__label {
display: block;
font-size: 12px;
color: rgba(203, 213, 225, 0.72);
margin-bottom: 10px;
letter-spacing: 0.08em;
text-transform: uppercase;
font-weight: 700;
}
.summary-card__value {
font-size: 1.75rem;
font-weight: 700;
color: #f8fafc;
}
.summary-card__meta {
color: rgba(203, 213, 225, 0.72);
margin-top: 10px;
font-size: 12px;
}
@media (max-width: 768px) {
.profile-hero,
.profile-grid,
.profile-grid-2 {
grid-template-columns: 1fr;
}
.profile-hero {
align-items: stretch;
}
}
</style>
@endpush
@section('content')
@php
$createdAt = $user->created_at?->timezone(config('app.timezone'));
$updatedAt = $user->updated_at?->timezone(config('app.timezone'));
@endphp
<div class="profile-shell">
<div class="profile-hero">
<div class="profile-hero__info">
<span class="profile-hero__tagline">Detail Pengguna</span>
<h2>{{ $user->name }}</h2>
<p>Informasi akun pegawai ditampilkan dengan tampilan konsisten seperti profil user. Gunakan halaman ini untuk melihat detail serta menyetujui akun.</p>
</div>
<div class="profile-hero__actions">
<a href="{{ route('admin.users.index') }}" class="btn btn-primary">Kembali</a>
<form method="POST" action="{{ route('admin.users.approval-toggle', $user->id) }}" style="margin:0;">
@csrf
@method('PATCH')
<input type="hidden" name="is_approved" value="{{ $user->is_approved ? 0 : 1 }}">
<button type="submit" class="btn {{ $user->is_approved ? 'btn-warning' : 'btn-success' }}">
{{ $user->is_approved ? 'Batalkan Persetujuan' : 'Setujui Akun' }}
</button>
</form>
</div>
</div>
<div class="profile-grid">
<div class="profile-card">
<h3>Informasi Utama</h3>
<div class="profile-field">
<label>Nama</label>
<div class="profile-value">{{ $user->name }}</div>
</div>
<div class="profile-field">
<label>Username</label>
<div class="profile-value">{{ $user->username ?? '-' }}</div>
</div>
<div class="profile-field">
<label>Email</label>
<div class="profile-value">{{ $user->email }}</div>
</div>
<div class="profile-field">
<label>NIK</label>
<div class="profile-value">{{ $user->nik ?? '-' }}</div>
</div>
<div class="profile-field">
<label>Role</label>
<div class="profile-value">{{ $user->role ? ucfirst($user->role) : '-' }}</div>
</div>
</div>
<div class="profile-card">
<h3>Status & Persetujuan</h3>
<div class="profile-field">
<label>Status Verifikasi Email</label>
<div class="profile-value">
<span class="status-pill {{ $user->email_verified_at ? 'status-success' : 'status-warning' }}">
{{ $user->email_verified_at ? 'Terverifikasi' : 'Belum Verifikasi' }}
</span>
</div>
</div>
<div class="profile-field">
<label>Status Persetujuan</label>
<div class="profile-value">
<span class="status-pill {{ $user->is_approved ? 'status-success' : 'status-danger' }}">
{{ $user->is_approved ? 'Disetujui Admin' : 'Menunggu Persetujuan' }}
</span>
</div>
</div>
<div class="profile-field">
<label>Status Absensi</label>
<div class="profile-value">{{ $user->attendance_enabled ? 'Aktif' : 'Nonaktif' }}</div>
</div>
<div class="profile-field">
<label>Terakhir Login</label>
<div class="profile-value">{{ $user->last_login_at?->timezone(config('app.timezone'))->format('d M Y H:i') ?? '-' }}</div>
</div>
</div>
</div>
<div class="profile-grid-2">
<div class="profile-card">
<h3>Kontak</h3>
<div class="profile-field">
<label>No. HP</label>
<div class="profile-value">{{ $user->phone ?? '-' }}</div>
</div>
<div class="profile-field">
<label>Alamat</label>
<div class="profile-value">{{ $user->address ?? '-' }}</div>
</div>
</div>
<div class="profile-card">
<h3>Ringkasan Akun</h3>
<div class="profile-field">
<label>Terdaftar</label>
<div class="profile-value">{{ $createdAt?->format('d/m/Y H:i') ?? '-' }}</div>
</div>
<div class="profile-field">
<label>Update Terakhir</label>
<div class="profile-value">{{ $updatedAt?->format('d/m/Y H:i') ?? '-' }}</div>
</div>
</div>
</div>
<div class="profile-summary">
<div class="summary-card">
<span class="summary-card__label">Hadir</span>
<span class="summary-card__value">{{ $attendanceRecords->where('status', 'hadir')->count() }}</span>
<span class="summary-card__meta">Jumlah kehadiran</span>
</div>
<div class="summary-card">
<span class="summary-card__label">Tidak Hadir</span>
<span class="summary-card__value">{{ $attendanceRecords->where('status', '!=', 'hadir')->count() }}</span>
<span class="summary-card__meta">Absen, izin, sakit, tidak valid</span>
</div>
<div class="summary-card">
<span class="summary-card__label">Izin / Sakit</span>
<span class="summary-card__value">{{ $attendanceRecords->whereIn('status', ['izin', 'sakit'])->count() }}</span>
<span class="summary-card__meta">Permintaan izin</span>
</div>
<div class="summary-card">
<span class="summary-card__label">Total Data</span>
<span class="summary-card__value">{{ $attendanceRecords->count() }}</span>
<span class="summary-card__meta">Riwayat kehadiran</span>
</div>
</div>
</div>
@endsection