Initial commit: Struktur aplikasi ilycats

This commit is contained in:
Dwi F Sukmana
2026-02-08 15:16:35 +07:00
commit 0921901aed
235 changed files with 29016 additions and 0 deletions
@@ -0,0 +1,80 @@
<x-app-layout>
<div class="max-w-3xl mx-auto space-y-6 pb-12">
{{-- Header Section --}}
<div class="flex items-center gap-4">
<a href="{{ route('admin.users.index') }}" class="p-3 bg-white border border-slate-200 rounded-2xl text-slate-400 hover:text-indigo-600 transition-all shadow-sm">
<i class="fas fa-arrow-left"></i>
</a>
<div>
<h2 class="text-2xl font-black text-slate-800 tracking-tight">Daftarkan Staf Baru</h2>
<p class="text-sm text-slate-500 font-medium italic">Tambahkan pengguna baru ke sistem earrin cats.</p>
</div>
</div>
{{-- Form Section --}}
<form action="{{ route('admin.users.store') }}" method="POST" class="bg-white border border-slate-200 rounded-[2.5rem] p-8 shadow-sm space-y-6">
@csrf
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
{{-- Nama Lengkap --}}
<div class="space-y-2">
<label class="text-[10px] font-black text-slate-400 uppercase tracking-widest ml-1">Nama Lengkap</label>
<input type="text" name="name" value="{{ old('name') }}" required placeholder="Contoh: Budi Santoso"
class="w-full px-4 py-3 bg-slate-50 border @error('name') border-red-500 @else border-slate-200 @enderror rounded-2xl text-sm font-bold text-slate-800 focus:ring-2 focus:ring-indigo-500 transition-all">
<x-input-error :messages="$errors->get('name')" class="mt-1" />
</div>
{{-- Alamat Email --}}
<div class="space-y-2">
<label class="text-[10px] font-black text-slate-400 uppercase tracking-widest ml-1">Alamat Email</label>
<input type="email" name="email" value="{{ old('email') }}" required placeholder="email@earrincats.com"
class="w-full px-4 py-3 bg-slate-50 border @error('email') border-red-500 @else border-slate-200 @enderror rounded-2xl text-sm font-bold text-slate-800 focus:ring-2 focus:ring-indigo-500 transition-all">
<x-input-error :messages="$errors->get('email')" class="mt-1" />
</div>
{{-- Nomor WhatsApp --}}
<div class="space-y-2">
<label class="text-[10px] font-black text-slate-400 uppercase tracking-widest ml-1">Nomor WhatsApp</label>
<input type="text" name="phone" value="{{ old('phone') }}" placeholder="0812..."
class="w-full px-4 py-3 bg-slate-50 border @error('phone') border-red-500 @else border-slate-200 @enderror rounded-2xl text-sm font-bold text-slate-800 focus:ring-2 focus:ring-indigo-500 transition-all">
<x-input-error :messages="$errors->get('phone')" class="mt-1" />
</div>
{{-- Otoritas (Role) - SEKARANG DINAMIS --}}
<div class="space-y-2">
<label class="text-[10px] font-black text-slate-400 uppercase tracking-widest ml-1">Otoritas (Role)</label>
<select name="role_id" required class="w-full px-4 py-3 bg-slate-50 border @error('role_id') border-red-500 @else border-slate-200 @enderror rounded-2xl text-sm font-black text-indigo-600 uppercase focus:ring-2 focus:ring-indigo-500 transition-all cursor-pointer">
<option value="" disabled selected>Pilih Otoritas</option>
@foreach($roles as $role)
<option value="{{ $role->id }}" {{ old('role_id') == $role->id ? 'selected' : '' }}>
{{ strtoupper($role->name) }}
</option>
@endforeach
</select>
<x-input-error :messages="$errors->get('role_id')" class="mt-1" />
</div>
{{-- Password --}}
<div class="space-y-2">
<label class="text-[10px] font-black text-slate-400 uppercase tracking-widest ml-1">Password</label>
<input type="password" name="password" required
class="w-full px-4 py-3 bg-slate-50 border @error('password') border-red-500 @else border-slate-200 @enderror rounded-2xl text-sm font-bold focus:ring-2 focus:ring-indigo-500 transition-all">
<x-input-error :messages="$errors->get('password')" class="mt-1" />
</div>
{{-- Konfirmasi Password --}}
<div class="space-y-2">
<label class="text-[10px] font-black text-slate-400 uppercase tracking-widest ml-1">Konfirmasi Password</label>
<input type="password" name="password_confirmation" required
class="w-full px-4 py-3 bg-slate-50 border border-slate-200 rounded-2xl text-sm font-bold focus:ring-2 focus:ring-indigo-500 transition-all">
</div>
</div>
<div class="pt-4">
<button type="submit" class="w-full py-5 bg-slate-900 text-white text-xs font-black rounded-3xl shadow-xl hover:bg-black transition-all active:scale-[0.98] flex items-center justify-center gap-2 uppercase tracking-widest">
<i class="fas fa-user-plus"></i> Daftarkan Pengguna
</button>
</div>
</form>
</div>
</x-app-layout>
@@ -0,0 +1,74 @@
<x-app-layout>
<div class="max-w-3xl mx-auto space-y-6 pb-12">
{{-- Header Section --}}
<div class="flex items-center gap-4">
<a href="{{ route('admin.users.index') }}" class="p-3 bg-white border border-slate-200 rounded-2xl text-slate-400 hover:text-indigo-600 transition-all shadow-sm">
<i class="fas fa-arrow-left"></i>
</a>
<div>
<h2 class="text-2xl font-black text-slate-800 tracking-tight">Edit Profil User</h2>
<p class="text-sm text-slate-500 font-medium italic">Perbarui informasi otoritas dan profil anggota tim.</p>
</div>
</div>
{{-- Form Section --}}
<form action="{{ route('admin.users.update', $user->id) }}" method="POST" class="bg-white border border-slate-200 rounded-[2.5rem] p-8 shadow-sm space-y-6">
@csrf
@method('PATCH')
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
{{-- Nama Lengkap --}}
<div class="space-y-2">
<label class="text-[10px] font-black text-slate-400 uppercase tracking-widest ml-1">Nama Lengkap</label>
<input type="text" name="name" value="{{ old('name', $user->name) }}" required
class="w-full px-4 py-3 bg-slate-50 border @error('name') border-red-500 @else border-slate-200 @enderror rounded-2xl text-sm font-bold text-slate-800 focus:ring-2 focus:ring-indigo-500 transition-all">
<x-input-error :messages="$errors->get('name')" class="mt-1" />
</div>
{{-- Email --}}
<div class="space-y-2">
<label class="text-[10px] font-black text-slate-400 uppercase tracking-widest ml-1">Email</label>
<input type="email" name="email" value="{{ old('email', $user->email) }}" required
class="w-full px-4 py-3 bg-slate-50 border @error('email') border-red-500 @else border-slate-200 @enderror rounded-2xl text-sm font-bold text-slate-800 focus:ring-2 focus:ring-indigo-500 transition-all">
<x-input-error :messages="$errors->get('email')" class="mt-1" />
</div>
{{-- Nomor WhatsApp --}}
<div class="space-y-2">
<label class="text-[10px] font-black text-slate-400 uppercase tracking-widest ml-1">Nomor WhatsApp</label>
<input type="text" name="phone" value="{{ old('phone', $user->phone) }}" placeholder="Contoh: 081234..."
class="w-full px-4 py-3 bg-slate-50 border @error('phone') border-red-500 @else border-slate-200 @enderror rounded-2xl text-sm font-bold text-slate-800 focus:ring-2 focus:ring-indigo-500 transition-all">
<x-input-error :messages="$errors->get('phone')" class="mt-1" />
</div>
{{-- Otoritas Akses (Role) - Dinamis dari Database --}}
<div class="space-y-2">
<label class="text-[10px] font-black text-slate-400 uppercase tracking-widest ml-1">Otoritas Akses (Role)</label>
<select name="role_id" required
class="w-full px-4 py-3 bg-slate-50 border @error('role_id') border-red-500 @else border-slate-200 @enderror rounded-2xl text-sm font-black text-indigo-600 uppercase focus:ring-2 focus:ring-indigo-500 transition-all cursor-pointer">
@foreach($roles as $role)
<option value="{{ $role->id }}" {{ old('role_id', $user->role_id) == $role->id ? 'selected' : '' }}>
{{ strtoupper($role->name) }}
</option>
@endforeach
</select>
<x-input-error :messages="$errors->get('role_id')" class="mt-1" />
</div>
</div>
{{-- Info Password --}}
<div class="p-4 bg-indigo-50 rounded-2xl border border-indigo-100 flex gap-3 items-start">
<i class="fas fa-info-circle text-indigo-500 mt-1"></i>
<p class="text-[11px] text-indigo-700 leading-relaxed font-medium">
Kata sandi tidak ditampilkan di sini demi alasan keamanan. User dapat merubah kata sandi secara mandiri melalui menu <strong>Profil</strong> atau Anda dapat menggunakan fitur <em>Reset Password</em> jika diperlukan.
</p>
</div>
<div class="pt-4">
<button type="submit" class="w-full py-5 bg-slate-900 text-white text-xs font-black rounded-3xl shadow-xl hover:bg-black transition-all active:scale-[0.98] uppercase tracking-widest flex items-center justify-center gap-2">
<i class="fas fa-save"></i> Perbarui Data User
</button>
</div>
</form>
</div>
</x-app-layout>
@@ -0,0 +1,85 @@
<x-app-layout>
<div class="space-y-6 pb-8">
{{-- SECTION 1: HEADER & TAMBAH USER --}}
<div class="flex items-center justify-between">
<div>
<h2 class="text-2xl font-black text-slate-800 tracking-tight">Manajemen User</h2>
<p class="text-sm text-slate-500 font-medium italic">Kelola otoritas akses staf cattery.</p>
</div>
{{-- PROTEKSI CREATE: Mengikuti matriks izin modul users --}}
@can('check-access', ['users', 'create'])
<a href="{{ route('admin.users.create') }}" class="inline-flex items-center px-5 py-3 bg-indigo-600 text-white text-[10px] font-black rounded-xl shadow-lg shadow-indigo-100 hover:bg-indigo-700 transition-all active:scale-95">
<i class="fas fa-plus mr-2"></i> TAMBAH USER
</a>
@endcan
</div>
{{-- SECTION 2: TABEL USER --}}
<div class="bg-white border border-slate-200 rounded-[2.5rem] overflow-hidden shadow-sm">
<table class="w-full text-left">
<thead class="bg-slate-50 text-[10px] font-black text-slate-400 uppercase tracking-widest border-b">
<tr>
<th class="px-6 py-4">Nama & Email</th>
<th class="px-6 py-4">WhatsApp</th>
<th class="px-6 py-4 text-center">Role</th>
<th class="px-6 py-4 text-right">Aksi</th>
</tr>
</thead>
<tbody class="divide-y divide-slate-100 font-medium text-slate-700">
@foreach($users as $user)
<tr class="hover:bg-slate-50/50 transition-all">
{{-- Identitas --}}
<td class="px-6 py-4">
<div class="font-black text-slate-800">{{ $user->name }}</div>
<div class="text-[10px] text-slate-400 font-bold uppercase">{{ $user->email }}</div>
</td>
{{-- Kontak --}}
<td class="px-6 py-4">
<span class="text-xs font-bold text-slate-500">{{ $user->phone ?? '-' }}</span>
</td>
{{-- Badge Role --}}
<td class="px-6 py-4 text-center">
<span class="px-3 py-1 rounded-xl text-[10px] font-black uppercase {{ $user->role == 'admin' ? 'bg-indigo-50 text-indigo-600 border border-indigo-100' : 'bg-slate-50 text-slate-500 border border-slate-200' }}">
{{ $user->role->name ?? $user->role }}
</span>
</td>
{{-- Aksi Berbasis Izin --}}
<td class="px-6 py-4 text-right">
<div class="flex justify-end gap-2">
{{-- PROTEKSI EDIT: Mengikuti matriks izin modul users --}}
@can('check-access', ['users', 'update'])
<a href="{{ route('admin.users.edit', $user->id) }}" class="p-2 text-slate-400 hover:text-amber-600 hover:bg-amber-50 rounded-xl transition-all" title="Edit Profile">
<i class="fas fa-edit text-xs"></i>
</a>
@endcan
{{-- PROTEKSI DELETE: Pengecekan manual 'admin' dihapus agar permission matriks berlaku sepenuhnya --}}
@can('check-access', ['users', 'delete'])
<form action="{{ route('admin.users.destroy', $user->id) }}" method="POST" onsubmit="return confirm('Hapus user ini? Staf ini tidak akan bisa login lagi.')" class="inline">
@csrf @method('DELETE')
<button type="submit" class="p-2 text-slate-400 hover:text-rose-600 hover:bg-rose-50 rounded-xl transition-all" title="Hapus User">
<i class="fas fa-trash-alt text-xs"></i>
</button>
</form>
@endcan
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
{{-- PAGINATION --}}
<div class="mt-4">
{{ $users->links() }}
</div>
</div>
</x-app-layout>