Update graduation workflow, promotions, and admin module improvements
This commit is contained in:
@@ -1,13 +1,24 @@
|
||||
<div class="grid grid-cols-1 gap-5 md:grid-cols-2">
|
||||
<x-form-input name="name" label="Nama Lengkap" :value="$user->name ?? ''" required />
|
||||
<x-form-input name="email" label="Email" type="email" :value="$user->email ?? ''" required />
|
||||
<x-form-select name="role" label="Role" :options="$roleOptions" :value="$user->role ?? 'staff'" placeholder="-- Pilih role --" required />
|
||||
|
||||
<div>
|
||||
<x-form-select name="role" label="Role" :options="$roleOptions" :value="$user->role ?? 'staff'" placeholder="-- Pilih role --" required />
|
||||
<p class="mt-2 text-xs text-slate-500">Administrator punya akses penuh ke pengaturan sistem, staff hanya untuk operasional harian.</p>
|
||||
</div>
|
||||
|
||||
<div class="rounded-3xl border border-slate-200 bg-slate-50 p-5 md:col-span-2">
|
||||
<div class="mb-4 flex items-start gap-3 rounded-2xl border border-indigo-100 bg-indigo-50 px-4 py-3 text-sm text-indigo-700">
|
||||
<i class="fa-solid fa-shield-halved mt-0.5"></i>
|
||||
<div>
|
||||
<div class="font-semibold">Keamanan akun</div>
|
||||
<div class="mt-1 text-xs text-indigo-700/80">Gunakan password minimal 8 karakter. Untuk akun yang sedang diedit, password boleh dikosongkan jika tidak ingin diubah.</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 gap-5 md:grid-cols-2">
|
||||
<x-form-input name="password" label="Password {{ isset($user) ? '(opsional jika tidak diubah)' : '' }}" type="password" />
|
||||
<x-form-input name="password_confirmation" label="Konfirmasi Password" type="password" />
|
||||
</div>
|
||||
<p class="mt-3 text-xs text-slate-500">Password minimal 8 karakter.</p>
|
||||
<p class="mt-3 text-xs text-slate-500">Tips: kombinasikan huruf besar, huruf kecil, angka, dan simbol untuk password yang lebih kuat.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,10 +1,34 @@
|
||||
<x-master-page title="Manajemen Pengguna" description="Kelola akun administrator dan staff yang dapat mengakses panel Database Kesiswaan." action-label="Tambah Pengguna" :action-url="route('settings.users.create')">
|
||||
<div class="mb-6 grid grid-cols-1 gap-4 md:grid-cols-3">
|
||||
<div class="rounded-3xl border border-slate-200 bg-slate-50 px-5 py-4">
|
||||
<div class="text-xs font-semibold uppercase tracking-[0.18em] text-slate-500">Total Pengguna</div>
|
||||
<div class="mt-2 text-3xl font-bold text-slate-800">{{ $stats['total'] }}</div>
|
||||
</div>
|
||||
<div class="rounded-3xl border border-indigo-200 bg-indigo-50 px-5 py-4">
|
||||
<div class="text-xs font-semibold uppercase tracking-[0.18em] text-indigo-600">Administrator</div>
|
||||
<div class="mt-2 text-3xl font-bold text-indigo-700">{{ $stats['admins'] }}</div>
|
||||
</div>
|
||||
<div class="rounded-3xl border border-slate-200 bg-white px-5 py-4">
|
||||
<div class="text-xs font-semibold uppercase tracking-[0.18em] text-slate-500">Staff</div>
|
||||
<div class="mt-2 text-3xl font-bold text-slate-700">{{ $stats['staff'] }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<x-master-card title="Daftar Pengguna" subtitle="Gunakan halaman ini untuk menambah, mengubah, dan menghapus akun admin internal.">
|
||||
<form method="GET" class="mb-5">
|
||||
<div class="grid grid-cols-1 gap-3 md:grid-cols-[1fr_auto]">
|
||||
<x-form-input name="search" label="Cari Pengguna" :value="$search" placeholder="Cari nama atau email..." />
|
||||
<div class="flex items-end">
|
||||
<button type="submit" class="inline-flex h-12 items-center justify-center rounded-2xl bg-indigo-600 px-5 text-sm font-semibold text-white shadow-lg shadow-indigo-200 transition hover:bg-indigo-700">Cari</button>
|
||||
<div class="rounded-3xl border border-slate-200 bg-slate-50/80 p-4">
|
||||
<div class="grid grid-cols-1 gap-3 md:grid-cols-[minmax(0,1fr)_auto] md:items-end">
|
||||
<x-form-input name="search" label="Cari Pengguna" :value="$search" placeholder="Cari nama atau email..." />
|
||||
<div class="flex flex-col gap-2 sm:flex-row md:justify-end">
|
||||
<button type="submit" class="inline-flex h-12 items-center justify-center rounded-2xl bg-indigo-600 px-5 text-sm font-semibold text-white shadow-lg shadow-indigo-200 transition hover:bg-indigo-700">
|
||||
<i class="fa-solid fa-magnifying-glass mr-2 text-xs"></i>
|
||||
Cari
|
||||
</button>
|
||||
<a href="{{ route('settings.users.index') }}" class="inline-flex h-12 items-center justify-center rounded-2xl border border-slate-200 bg-white px-5 text-sm font-semibold text-slate-700 transition hover:bg-slate-100">
|
||||
<i class="fa-solid fa-rotate-left mr-2 text-xs"></i>
|
||||
Reset
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@@ -23,22 +47,39 @@
|
||||
<tbody class="divide-y divide-slate-100 bg-white">
|
||||
@forelse ($users as $user)
|
||||
<tr>
|
||||
<td class="px-4 py-4 font-medium text-slate-800">{{ $user->name }}</td>
|
||||
<td class="px-4 py-4">
|
||||
<div class="font-medium text-slate-800">{{ $user->name }}</div>
|
||||
@if (auth()->id() === $user->id)
|
||||
<div class="mt-1 text-xs font-semibold text-emerald-600">Akun yang sedang dipakai</div>
|
||||
@endif
|
||||
</td>
|
||||
<td class="px-4 py-4 text-slate-600">{{ $user->email }}</td>
|
||||
<td class="px-4 py-4">
|
||||
<span class="rounded-full px-3 py-1 text-xs font-semibold {{ $user->role === 'admin' ? 'bg-indigo-100 text-indigo-700' : 'bg-slate-100 text-slate-700' }}">
|
||||
{{ $roleOptions[$user->role] ?? ucfirst($user->role) }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="px-4 py-4 text-slate-500">{{ auth()->id() === $user->id ? 'Sedang dipakai login' : 'Aktif' }}</td>
|
||||
<td class="px-4 py-4">
|
||||
@if (auth()->id() === $user->id)
|
||||
<span class="rounded-full bg-emerald-100 px-3 py-1 text-xs font-semibold text-emerald-700">Login saat ini</span>
|
||||
@else
|
||||
<span class="rounded-full bg-slate-100 px-3 py-1 text-xs font-semibold text-slate-600">Aktif</span>
|
||||
@endif
|
||||
</td>
|
||||
<td class="px-4 py-4">
|
||||
<div class="flex justify-end gap-2">
|
||||
<a href="{{ route('settings.users.edit', $user) }}" class="inline-flex items-center rounded-xl border border-slate-200 px-3 py-2 text-xs font-semibold text-slate-700 transition hover:bg-slate-50">Edit</a>
|
||||
<form method="POST" action="{{ route('settings.users.destroy', $user) }}" onsubmit="return confirm('Hapus akun ini?')">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="inline-flex items-center rounded-xl border border-rose-200 px-3 py-2 text-xs font-semibold text-rose-600 transition hover:bg-rose-50">Hapus</button>
|
||||
</form>
|
||||
@php($isCurrentUser = auth()->id() === $user->id)
|
||||
@php($isLastAdmin = $user->role === 'admin' && ($stats['admins'] ?? 0) <= 1)
|
||||
@if ($isCurrentUser || $isLastAdmin)
|
||||
<button type="button" disabled class="cursor-not-allowed rounded-xl border border-slate-200 bg-slate-100 px-3 py-2 text-xs font-semibold text-slate-400" title="{{ $isCurrentUser ? 'Akun yang sedang dipakai login tidak bisa dihapus' : 'Minimal harus ada satu akun admin aktif' }}">Hapus</button>
|
||||
@else
|
||||
<form method="POST" action="{{ route('settings.users.destroy', $user) }}" class="delete-form" data-entity="akun pengguna {{ $user->name }}" data-confirm-title="Hapus akun pengguna?" data-confirm-text="Akun {{ $user->name }} akan dihapus dari sistem. Tindakan ini tidak bisa dibatalkan.">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="inline-flex items-center rounded-xl border border-rose-200 px-3 py-2 text-xs font-semibold text-rose-600 transition hover:bg-rose-50">Hapus</button>
|
||||
</form>
|
||||
@endif
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
Reference in New Issue
Block a user