330 lines
18 KiB
PHP
330 lines
18 KiB
PHP
@extends('layouts.app')
|
|
@section('title', 'Profile User')
|
|
@section('content')
|
|
@php
|
|
$memberStyles = [
|
|
'tanpa_member' => 'bg-gray-50 text-gray-700 border-gray-200',
|
|
'bronze' => 'bg-amber-50 text-amber-700 border-amber-200',
|
|
'silver' => 'bg-slate-50 text-slate-700 border-slate-200',
|
|
'gold' => 'bg-yellow-50 text-yellow-700 border-yellow-200',
|
|
];
|
|
$memberLabels = [
|
|
'tanpa_member' => 'Tanpa Member',
|
|
'bronze' => 'Bronze',
|
|
'silver' => 'Silver',
|
|
'gold' => 'Gold',
|
|
];
|
|
$statusStyles = [
|
|
'menunggu' => 'bg-amber-50 text-amber-700',
|
|
'disetujui' => 'bg-[#e6f5ee] text-[#edc039]',
|
|
'ditolak' => 'bg-red-50 text-red-700',
|
|
'dikembalikan' => 'bg-slate-100 text-slate-700',
|
|
];
|
|
$memberStyle = $memberStyles[$user->member_level] ?? 'bg-[#fff3c0] text-[#c79f23] border-[#ebd487]';
|
|
$memberLabel = $memberLabels[$user->member_level] ?? \Illuminate\Support\Str::of($user->member_level)->replace('_', ' ')->title();
|
|
@endphp
|
|
|
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 space-y-8">
|
|
@if(session('error'))
|
|
<div class="rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-700">
|
|
{{ session('error') }}
|
|
</div>
|
|
@endif
|
|
|
|
@if(session('status'))
|
|
<div class="rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-700">
|
|
{{ session('status') }}
|
|
</div>
|
|
@endif
|
|
|
|
<section class="surface-card rounded-4xl p-5 md:p-8">
|
|
<div class="flex flex-col lg:flex-row lg:items-center lg:justify-between gap-6">
|
|
<div>
|
|
<div class="inline-flex items-center gap-2 rounded-full soft-gradient-bg px-4 py-2 text-xs font-semibold uppercase tracking-[0.18em] text-[#edc039]">
|
|
<i class="bi bi-person-vcard"></i>
|
|
User Profile
|
|
</div>
|
|
<h1 class="text-2xl md:text-3xl font-bold mt-3 text-gray-900">{{ $user->name }}</h1>
|
|
<p class="text-gray-600 mt-2">{{ $user->email }} · {{ '@'.$user->username }}</p>
|
|
<div class="mt-4 inline-flex items-center gap-2 rounded-full border px-4 py-2 text-sm font-semibold {{ $memberStyle }}">
|
|
<i class="bi bi-award"></i>
|
|
{{ $memberLabel }}
|
|
</div>
|
|
</div>
|
|
<div class="grid grid-cols-1 gap-3 text-center sm:grid-cols-3">
|
|
<div class="rounded-[1.3rem] border border-[#f2df9c] bg-[#fffcf0] px-4 py-4">
|
|
<p class="text-xs text-gray-500">Total Sewa</p>
|
|
<p class="text-2xl font-semibold text-gray-900">{{ $totalPenyewaan }}</p>
|
|
</div>
|
|
<div class="rounded-[1.3rem] border border-[#f2df9c] bg-[#fffcf0] px-4 py-4">
|
|
<p class="text-xs text-gray-500">Sewa Aktif</p>
|
|
<p class="text-2xl font-semibold text-gray-900">{{ $penyewaanAktif }}</p>
|
|
</div>
|
|
<div class="rounded-[1.3rem] border border-[#f2df9c] bg-[#fffcf0] px-4 py-4">
|
|
<p class="text-xs text-gray-500">Riwayat Login</p>
|
|
<p class="text-2xl font-semibold text-gray-900">{{ $totalLogin }}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="grid gap-6 lg:grid-cols-3">
|
|
<div class="surface-card rounded-[1.8rem] p-5 md:p-6">
|
|
<h2 class="font-semibold text-gray-900 flex items-center gap-2">
|
|
<i class="bi bi-person-badge text-[#edc039]"></i>
|
|
Data Akun
|
|
</h2>
|
|
<form method="POST" action="{{ route('profile.update') }}" class="mt-4 space-y-4 text-sm text-gray-600">
|
|
@csrf
|
|
@method('PATCH')
|
|
<div>
|
|
<label class="text-xs uppercase tracking-wide text-gray-400">Nama</label>
|
|
<input
|
|
type="text"
|
|
name="name"
|
|
value="{{ old('name', $user->name) }}"
|
|
required
|
|
class="mt-1 w-full rounded-lg border-gray-300 focus:border-[#edc039] focus:ring-[#edc039]"
|
|
>
|
|
@error('name')
|
|
<p class="mt-1 text-xs text-red-600">{{ $message }}</p>
|
|
@enderror
|
|
</div>
|
|
<div>
|
|
<label class="text-xs uppercase tracking-wide text-gray-400">Username</label>
|
|
<input
|
|
type="text"
|
|
name="username"
|
|
value="{{ old('username', $user->username) }}"
|
|
required
|
|
class="mt-1 w-full rounded-lg border-gray-300 focus:border-[#edc039] focus:ring-[#edc039]"
|
|
>
|
|
@error('username')
|
|
<p class="mt-1 text-xs text-red-600">{{ $message }}</p>
|
|
@enderror
|
|
</div>
|
|
<div>
|
|
<label class="text-xs uppercase tracking-wide text-gray-400">Email</label>
|
|
<input
|
|
type="email"
|
|
value="{{ $user->email }}"
|
|
readonly
|
|
disabled
|
|
class="mt-1 w-full rounded-lg border-gray-200 bg-gray-100 text-gray-500"
|
|
>
|
|
<p class="mt-1 text-xs text-gray-500">Email tidak dapat diubah.</p>
|
|
</div>
|
|
<div>
|
|
<p class="text-xs uppercase tracking-wide text-gray-400">Role</p>
|
|
<p class="font-medium text-gray-800 capitalize">{{ $user->role }}</p>
|
|
</div>
|
|
<div>
|
|
<p class="text-xs uppercase tracking-wide text-gray-400">Bergabung</p>
|
|
<p class="font-medium text-gray-800">{{ $user->created_at?->format('d M Y H:i') }}</p>
|
|
</div>
|
|
<button type="submit" class="btn-dark w-full py-3 text-sm font-semibold">
|
|
Simpan Perubahan Profil
|
|
</button>
|
|
</form>
|
|
</div>
|
|
|
|
<div class="lg:col-span-2 surface-card rounded-[1.8rem] p-5 md:p-6">
|
|
<h2 class="font-semibold text-gray-900 flex items-center gap-2">
|
|
<i class="bi bi-stars text-[#edc039]"></i>
|
|
Benefit Member
|
|
</h2>
|
|
<div class="mt-4 grid gap-4 text-sm md:grid-cols-2 xl:grid-cols-4">
|
|
<div class="rounded-[1.2rem] border border-[#f2df9c] bg-[#fffcf0] p-4">
|
|
<p class="font-semibold text-gray-700">Tanpa Member</p>
|
|
<p class="text-gray-600 mt-1">Akun user standar tanpa diskon sewa. Cocok untuk pengguna baru.</p>
|
|
<p class="text-xs text-gray-500 mt-3">Naik ke Bronze otomatis setelah mencapai 10 transaksi yang sudah upload bukti pembayaran.</p>
|
|
</div>
|
|
<div class="rounded-[1.2rem] border border-[#f2df9c] bg-[#fffcf0] p-4">
|
|
<p class="font-semibold text-amber-700">Bronze</p>
|
|
<p class="text-gray-600 mt-1">Diskon sewa 5% untuk akun yang sudah mencapai level Bronze.</p>
|
|
<p class="text-xs text-gray-500 mt-3">Naik ke Silver otomatis saat total transaksi berbayar pada akun mencapai 20 transaksi.</p>
|
|
</div>
|
|
<div class="rounded-[1.2rem] border border-[#f2df9c] bg-[#fffcf0] p-4">
|
|
<p class="font-semibold text-slate-700">Silver</p>
|
|
<p class="text-gray-600 mt-1">Diskon sewa 10% untuk akun yang sudah mencapai level Silver.</p>
|
|
<p class="text-xs text-gray-500 mt-3">Naik ke Gold otomatis saat total transaksi berbayar pada akun mencapai 30 transaksi.</p>
|
|
</div>
|
|
<div class="rounded-[1.2rem] border border-[#f2df9c] bg-[#fffcf0] p-4">
|
|
<p class="font-semibold text-yellow-700">Gold</p>
|
|
<p class="text-gray-600 mt-1">Diskon sewa 15% dan status member tertinggi untuk akun user.</p>
|
|
<p class="text-xs text-gray-500 mt-3">Gold adalah level tertinggi dan tidak memiliki upgrade lanjutan.</p>
|
|
</div>
|
|
</div>
|
|
<div class="mt-5 rounded-[1.2rem] border border-[#dceceb] bg-white p-4">
|
|
<div class="flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between">
|
|
<div>
|
|
<p class="text-sm font-semibold text-gray-800">Progress Transaksi Payment</p>
|
|
<p class="mt-1 text-sm text-gray-500">
|
|
Transaksi payment Anda saat ini berjumlah <span class="font-semibold text-gray-700">{{ $paidTransactions }}</span>.
|
|
@if($nextMemberLevel && $nextUpgradeTarget)
|
|
Sisa {{ $remainingTransactions }} transaksi payment lagi menuju
|
|
{{ $memberLabels[$nextMemberLevel] ?? \Illuminate\Support\Str::of($nextMemberLevel)->replace('_', ' ')->title() }}.
|
|
@else
|
|
Anda sudah berada di level member tertinggi.
|
|
@endif
|
|
</p>
|
|
</div>
|
|
<span class="inline-flex w-fit items-center rounded-full bg-[#fff3c0] px-3 py-1 text-xs font-semibold text-[#c79f23]">
|
|
{{ $upgradeProgressPercent }}%
|
|
</span>
|
|
</div>
|
|
<div class="mt-4">
|
|
<div class="h-3 overflow-hidden rounded-full bg-gray-100">
|
|
<div
|
|
class="h-full rounded-full bg-linear-to-r from-[#edc039] via-[#edc039] to-[#edc039] transition-all duration-500"
|
|
style="width: {{ $upgradeProgressPercent }}%;"
|
|
></div>
|
|
</div>
|
|
<div class="mt-2 flex items-center justify-between text-xs text-gray-500">
|
|
<span>{{ $progressStart }} transaksi</span>
|
|
@if($nextUpgradeTarget)
|
|
<span>Target {{ $nextUpgradeTarget }} transaksi</span>
|
|
@else
|
|
<span>Level maksimum tercapai</span>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="surface-card rounded-[1.8rem] p-5 md:p-6">
|
|
<div class="flex items-center justify-between gap-3 flex-wrap">
|
|
<h2 class="font-semibold text-gray-900 flex items-center gap-2">
|
|
<i class="bi bi-bell text-[#edc039]"></i>
|
|
Notifikasi Admin
|
|
</h2>
|
|
<span class="inline-flex items-center rounded-full bg-[#fff3c0] px-3 py-1 text-xs font-semibold text-[#c79f23]">
|
|
{{ $adminNotifications->count() }} pesan
|
|
@if($unreadAdminNotificationCount > 0)
|
|
· {{ $unreadAdminNotificationCount }} baru
|
|
@endif
|
|
</span>
|
|
</div>
|
|
<div class="mt-4 space-y-3">
|
|
@forelse($adminNotifications as $notification)
|
|
<div class="rounded-[1.2rem] border border-amber-200 bg-amber-50 p-4">
|
|
<div class="flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between">
|
|
<div>
|
|
<p class="font-semibold text-gray-900">
|
|
{{ $notification->jenis_sewa === 'paket' ? 'Paket Kamera + Lensa' : ucfirst($notification->jenis_sewa) }}
|
|
</p>
|
|
<p class="mt-1 text-sm text-gray-600">
|
|
{{ $notification->kamera->nama ?? '-' }}{{ ($notification->kamera && $notification->lensa) ? ' + ' : '' }}{{ $notification->lensa->nama ?? '' }}
|
|
</p>
|
|
<p class="mt-1 text-xs text-gray-500">Catatan diperbarui {{ $notification->updated_at?->format('d M Y H:i') }}</p>
|
|
</div>
|
|
<span class="inline-flex w-fit rounded-full bg-white px-3 py-1 text-xs font-semibold text-amber-700">
|
|
{{ ucfirst($notification->status) }}
|
|
</span>
|
|
</div>
|
|
<p class="mt-3 whitespace-pre-line text-sm text-amber-900">{{ $notification->admin_catatan }}</p>
|
|
</div>
|
|
@empty
|
|
<div class="rounded-[1.2rem] border border-gray-200 bg-gray-50 p-4 text-sm text-gray-500">
|
|
Belum ada notifikasi dari admin pada pengajuan sewa Anda.
|
|
</div>
|
|
@endforelse
|
|
</div>
|
|
</section>
|
|
|
|
<section class="surface-card rounded-[1.8rem] p-5 md:p-6">
|
|
<div class="flex items-center justify-between gap-3 flex-wrap">
|
|
<h2 class="font-semibold text-gray-900 flex items-center gap-2">
|
|
<i class="bi bi-bag-check text-[#edc039]"></i>
|
|
Riwayat Sewa
|
|
</h2>
|
|
<a href="{{ route('sewa.kamera.index') }}" class="text-sm text-[#edc039] hover:underline">Ajukan sewa baru</a>
|
|
</div>
|
|
<div class="responsive-table mt-4">
|
|
<table class="min-w-full text-sm">
|
|
<thead class="bg-gray-50 text-gray-600">
|
|
<tr>
|
|
<th class="px-4 py-3 text-left font-medium">Tanggal</th>
|
|
<th class="px-4 py-3 text-left font-medium">Item</th>
|
|
<th class="px-4 py-3 text-left font-medium">Member</th>
|
|
<th class="px-4 py-3 text-left font-medium">Jaminan</th>
|
|
<th class="px-4 py-3 text-left font-medium">Catatan Admin</th>
|
|
<th class="px-4 py-3 text-left font-medium">Jadwal</th>
|
|
<th class="px-4 py-3 text-left font-medium">Total</th>
|
|
<th class="px-4 py-3 text-left font-medium">Status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="divide-y divide-gray-100">
|
|
@forelse($penyewaans as $penyewaan)
|
|
<tr class="hover:bg-gray-50 transition-colors">
|
|
<td class="px-4 py-3 text-gray-600">{{ $penyewaan->created_at?->format('d M Y H:i') }}</td>
|
|
<td class="px-4 py-3 text-gray-800">
|
|
<p class="font-medium">
|
|
{{ $penyewaan->jenis_sewa === 'paket' ? 'Paket Kamera + Lensa' : ucfirst($penyewaan->jenis_sewa) }}
|
|
</p>
|
|
<p class="text-xs text-gray-500">
|
|
{{ $penyewaan->kamera->nama ?? '-' }}{{ ($penyewaan->kamera && $penyewaan->lensa) ? ' + ' : '' }}{{ $penyewaan->lensa->nama ?? '' }}
|
|
</p>
|
|
</td>
|
|
<td class="px-4 py-3 text-gray-700">{{ $memberLabels[$penyewaan->member_level] ?? \Illuminate\Support\Str::of($penyewaan->member_level)->replace('_', ' ')->title() }}</td>
|
|
<td class="px-4 py-3 text-gray-600">{{ $penyewaan->jaminan ?? '-' }}</td>
|
|
<td class="px-4 py-3 text-gray-600">
|
|
{{ $penyewaan->admin_catatan ? \Illuminate\Support\Str::limit($penyewaan->admin_catatan, 90) : '-' }}
|
|
</td>
|
|
<td class="px-4 py-3 text-gray-600">
|
|
<p>{{ $penyewaan->tanggal_mulai }} {{ substr($penyewaan->jam_sewa, 0, 5) }}</p>
|
|
<p class="text-xs text-gray-500">s/d {{ $penyewaan->tanggal_selesai }} {{ substr($penyewaan->jam_kembali, 0, 5) }}</p>
|
|
</td>
|
|
<td class="px-4 py-3 text-gray-800 font-medium">Rp {{ number_format($penyewaan->total_harga, 0, ',', '.') }}</td>
|
|
<td class="px-4 py-3">
|
|
<span class="rounded-full px-2 py-1 text-xs {{ $statusStyles[$penyewaan->status] ?? 'bg-gray-100 text-gray-700' }}">
|
|
{{ \Illuminate\Support\Str::of($penyewaan->status)->replace('_', ' ')->title() }}
|
|
</span>
|
|
</td>
|
|
</tr>
|
|
@empty
|
|
<tr>
|
|
<td colspan="8" class="px-4 py-6 text-center text-gray-500">Belum ada riwayat sewa pada akun ini.</td>
|
|
</tr>
|
|
@endforelse
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="surface-card rounded-[1.8rem] p-5 md:p-6">
|
|
<h2 class="font-semibold text-gray-900 flex items-center gap-2">
|
|
<i class="bi bi-clock-history text-[#edc039]"></i>
|
|
Riwayat Login
|
|
</h2>
|
|
<div class="responsive-table mt-4">
|
|
<table class="min-w-full text-sm">
|
|
<thead class="bg-gray-50 text-gray-600">
|
|
<tr>
|
|
<th class="px-4 py-3 text-left font-medium">Waktu</th>
|
|
<th class="px-4 py-3 text-left font-medium">Login Dengan</th>
|
|
<th class="px-4 py-3 text-left font-medium">IP</th>
|
|
<th class="px-4 py-3 text-left font-medium">User Agent</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="divide-y divide-gray-100">
|
|
@forelse($loginHistories as $history)
|
|
<tr class="hover:bg-gray-50 transition-colors">
|
|
<td class="px-4 py-3 text-gray-600">{{ $history->login_at?->format('d M Y H:i') }}</td>
|
|
<td class="px-4 py-3 text-gray-800">{{ $history->login_identifier }}</td>
|
|
<td class="px-4 py-3 text-gray-600">{{ $history->ip_address ?? '-' }}</td>
|
|
<td class="px-4 py-3 text-gray-500">{{ \Illuminate\Support\Str::limit($history->user_agent, 80) ?: '-' }}</td>
|
|
</tr>
|
|
@empty
|
|
<tr>
|
|
<td colspan="4" class="px-4 py-6 text-center text-gray-500">Belum ada riwayat login tercatat.</td>
|
|
</tr>
|
|
@endforelse
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
@endsection
|