add logic in manajemen admin controller and kelola admin view

This commit is contained in:
LailaWulandarii 2025-12-27 11:46:37 +07:00
parent e07d270b7f
commit 42c6961eb2
6 changed files with 319 additions and 134 deletions

View File

@ -3,63 +3,149 @@
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator; // <--- WAJIB ADA INI
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Routing\Controllers\Middleware;
class ManajemenAdminController extends Controller
{
public static function middleware(): array
{
return [
new Middleware(function ($request, $next) {
if (Auth::user()->role !== 'pemilik') {
abort(403);
}
return $next($request);
}),
];
}
/**
* Display a listing of the resource.
*/
public function index()
{
return view('admin.kelola-admin');
$admin = User::where('role', '!=', 'pemilik')
->latest()
->get();
// 2. Kirim data ($buket) ke view
return view('admin.kelola-admin.index', compact('admin'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
// --- Bagian STORE ---
public function store(Request $request)
{
//
$validator = Validator::make($request->all(), [
'nama' => 'required|string|min:5|max:100',
'username' => 'required|string|alpha_dash|max:50|unique:users,username',
'email' => 'required|email:dns|max:255|unique:users,email,',
'no_wa' => 'required|numeric|digits_between:10,15',
'role' => 'required|in:admin_foto,admin_buket',
'alamat' => 'required|string|max:255',
], [
// Detail Pesan Menggunakan :attribute
'required' => 'Kolom :attribute wajib diisi.',
'unique' => ':attribute sudah terdaftar di sistem, gunakan yang lain.',
'min' => ':attribute minimal harus berisi :min karakter.',
'max' => ':attribute maksimal hanya boleh :max karakter.',
'numeric' => ':attribute harus berupa angka.',
'digits_between' => ':attribute harus berjumlah antara :min sampai :max digit.',
'email' => 'Format :attribute tidak valid.',
'alpha_dash' => ':attribute hanya boleh berisi huruf, angka, serta simbol - dan _',
'in' => ':attribute yang dipilih tidak sesuai dengan pilihan yang tersedia.',
], [
// Alias untuk :attribute agar pesan lebih rapi dibaca
'nama' => 'nama lengkap',
'username' => 'username',
'email' => 'alamat email',
'no_wa' => 'nomor WA',
'role' => 'peran admin',
'alamat' => 'alamat lengkap',
]);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput()
->with('error_modal', 'create');
}
User::create([
'nama' => $request->nama,
'username' => $request->username,
'email' => $request->email,
'no_wa' => $request->no_wa,
'role' => $request->role,
'alamat' => $request->alamat,
'password' => Hash::make($request->username),
]);
return redirect()->back()->with('success', 'Admin berhasil ditambahkan!');
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
// --- Bagian UPDATE ---
public function update(Request $request, string $id)
{
//
$admin = User::findOrFail($id);
$validator = Validator::make($request->all(), [
'nama' => 'required|string|min:5|max:100',
'username' => 'required|string|alpha_dash|max:50|unique:users,username,' . $id . ',id_user',
'email' => 'required|email:dns|max:255|unique:users,email,' . $id . ',id_user',
'no_wa' => 'required|numeric|digits_between:10,15',
'role' => 'required|in:admin_foto,admin_buket',
'alamat' => 'required|string|max:255',
], [
// Detail Pesan Menggunakan :attribute
'required' => 'Kolom :attribute wajib diisi.',
'unique' => ':attribute sudah terdaftar di sistem, gunakan yang lain.',
'min' => ':attribute minimal harus berisi :min karakter.',
'max' => ':attribute maksimal hanya boleh :max karakter.',
'numeric' => ':attribute harus berupa angka.',
'digits_between' => ':attribute harus berjumlah antara :min sampai :max digit.',
'email' => 'Format :attribute tidak valid.',
'alpha_dash' => ':attribute hanya boleh berisi huruf, angka, serta simbol - dan _',
'in' => ':attribute yang dipilih tidak sesuai dengan pilihan yang tersedia.',
], [
// Alias untuk :attribute agar pesan lebih rapi dibaca
'nama' => 'nama lengkap',
'username' => 'username',
'email' => 'alamat email',
'no_wa' => 'nomor WA',
'role' => 'peran admin',
'alamat' => 'alamat lengkap',
]);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput()
->with('error_id', $id);
}
// Menggunakan update hanya pada kolom yang diizinkan (mencegah injeksi role owner)
$admin->update($request->only(['nama', 'username', 'email', 'no_wa', 'role', 'alamat']));
return redirect()->back()->with('success', 'Data berhasil diperbarui!');
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
// 1. Cari data admin berdasarkan ID
$admin = User::findOrFail($id);
// 2. Keamanan tambahan: Jangan biarkan admin menghapus dirinya sendiri (opsional)
if (Auth::id() == $admin->id_user) {
return redirect()->back()->with('error', 'Anda tidak bisa menghapus akun sendiri!');
}
// 3. Eksekusi hapus
$admin->delete();
// 4. Kembali dengan pesan sukses
return redirect()->route('admin.kelola-admin.index')
->with('success', 'Admin berhasil dihapus secara permanen.');
}
}

View File

@ -15,38 +15,57 @@
<table class="table table-striped" id="table1">
<thead>
<tr>
<th>No.</th>
<th>Nama Lengkap</th>
<th>Nomor WA</th>
<th>Email</th>
<th>Peran</th>
<th class="text-center">Aksi</th>
<th style="width: 5%" class="text-center">No.</th>
<th style="width: 25%">Nama Lengkap</th>
<th style="width: 15%">Nomor WA</th>
<th style="width: 25%">Email</th>
<th style="width: 15%" class="text-center">Peran</th>
<th style="width: 15%" class="text-center">Aksi</th>
</tr>
</thead>
<tbody>
<tr>
<td>Graiden</td>
<td>076 4820 8838</td>
<td>Offenburg</td>
<td>Offenburg</td>
<td>
<span class="badge bg-success-subtle rounded-pill px-3 py-2">Selesai</span>
</td>
<td class="col-auto text-center">
<a href="#" class="btn icon btn-primary btn-action" data-bs-toggle="modal"
data-bs-target="#show">
<i class="bi bi-eye"></i>
</a>
<a href="#" class="btn icon btn-warning btn-action" data-bs-toggle="modal"
data-bs-target="#edit">
<i class="bi bi-pencil"></i>
</a>
<a href="#" class="btn icon btn-danger btn-action" data-bs-toggle="modal"
data-bs-target="#delete">
<i class="bi bi-trash"></i>
</a>
</td>
</tr>
@forelse ($admin as $a)
<tr>
<td style="width: 5%" class="text-center">{{ $loop->iteration }}</td>
<td style="width: 25%">{{ $a->nama }}</td>
<td style="width: 15%">{{ $a->no_wa }}</td>
<td style="width: 25%">{{ $a->email }}</td>
<td style="width:15%" class="text-center">
<span
class="badge rounded-pill px-3 py-2
{{ $a->role == 'admin_buket' ? 'bg-success-subtle' : 'bg-warning-subtle' }}">
{{ str_replace('_', ' ', $a->role) }}
</span>
</td>
<td class="col-auto text-center" style="width: 15%">
<a href="#" class="btn icon btn-primary btn-action" data-bs-toggle="modal"
data-bs-target="#show{{ $a->id_user }}">
<i class="bi bi-eye"></i>
</a>
<a href="#" class="btn icon btn-warning btn-action" data-bs-toggle="modal"
data-bs-target="#edit{{ $a->id_user }}">
<i class="bi bi-pencil"></i>
</a>
<a href="#" class="btn icon btn-danger btn-action" data-bs-toggle="modal"
data-bs-target="#delete{{ $a->id_user }}">
<i class="bi bi-trash"></i>
</a>
</td>
</tr>
@include('admin.kelola-admin.partials.modal-show')
@include('admin.kelola-admin.partials.modal-edit')
@include('admin.kelola-admin.partials.modal-delete')
@empty
<tr>
<td colspan="6" class="text-center p-4">
<div class="alert alert-light-secondary color-secondary">
<i class="bi bi-exclamation-circle"></i> Belum ada data paket foto.
</div>
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
@ -54,7 +73,5 @@
</section>
@include('admin.kelola-admin.partials.modal-create')
@include('admin.kelola-admin.partials.modal-show')
@include('admin.kelola-admin.partials.modal-edit')
@include('admin.kelola-admin.partials.modal-delete')
@endsection

View File

@ -3,71 +3,113 @@
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Tambah Admin</h5> <button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
<h5 class="modal-title">Tambah Admin</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form action="#" method="POST" enctype="multipart/form-data">
<form action="{{ route('admin.kelola-admin.store') }}" method="POST">
@csrf
<div class="modal-body">
<div class="row">
<div class="col-12">
<div class="row gx-1">
<div class="row gx-2">
{{-- Nama Lengkap --}}
<div class="col-12 col-md-6">
<div class="mb-2">
<label class="form-label">Nama Lengkap</label>
<input type="text" class="form-control"
style="font-size: 13px;"placeholder="Masukkan Nama Lengkap">
<input type="text" name="nama"
class="form-control @error('nama') is-invalid @enderror"
style="font-size: 14px;" placeholder="Masukkan Nama Lengkap"
value="{{ old('nama') }}">
@error('nama')
<div class="invalid-feedback" style="font-size: 12px;">{{ $message }}</div>
@enderror
</div>
</div>
{{-- Username --}}
<div class="col-12 col-md-6">
<div class="mb-2">
<label class="form-label">Username</label>
<input type="text" class="form-control"
style="font-size: 13px;"placeholder="Masukkan Username">
<input type="text" name="username"
class="form-control @error('username') is-invalid @enderror"
style="font-size: 14px;" placeholder="Masukkan Username"
value="{{ old('username') }}">
@error('username')
<div class="invalid-feedback" style="font-size: 12px;">{{ $message }}</div>
@enderror
</div>
</div>
</div>
<div class="row gx-1">
<div class="row gx-2">
{{-- Nomor WA --}}
<div class="col-12 col-md-4">
<div class="mb-2">
<label class="form-label">Nomor WA</label>
<input type="number" class="form-control"
style="font-size: 13px;"placeholder="Masukkan Nomor WA">
<input type="number" name="no_wa"
class="form-control @error('no_wa') is-invalid @enderror"
style="font-size: 14px;" placeholder="Masukkan Nomor WA"
value="{{ old('no_wa') }}">
@error('no_wa')
<div class="invalid-feedback" style="font-size: 12px;">{{ $message }}</div>
@enderror
</div>
</div>
{{-- Email --}}
<div class="col-12 col-md-4">
<div class="mb-2">
<label class="form-label">Email</label>
<input type="email" class="form-control"
style="font-size: 13px;"placeholder="Masukkan Email">
<input type="email" name="email"
class="form-control @error('email') is-invalid @enderror"
style="font-size: 14px;" placeholder="Masukkan Email"
value="{{ old('email') }}">
@error('email')
<div class="invalid-feedback" style="font-size: 12px;">{{ $message }}</div>
@enderror
</div>
</div>
{{-- Peran --}}
<div class="col-12 col-md-4">
<div class="mb-2">
<label class="form-label">Peran</label>
<fieldset class="form-group">
<select class="form-select" id="basicSelect" style="font-size: 13px">
<option>Admin Foto</option>
<option>Admin Buket</option>
<select class="form-select @error('role') is-invalid @enderror"
name="role" style="font-size: 14px">
<option value="" selected disabled>Pilih Peran</option>
<option value="admin_foto"
{{ old('role') == 'admin_foto' ? 'selected' : '' }}>Admin Foto
</option>
<option value="admin_buket"
{{ old('role') == 'admin_buket' ? 'selected' : '' }}>Admin Buket
</option>
</select>
@error('role')
<div class="invalid-feedback d-block" style="font-size: 14px;">
{{ $message }}</div>
@enderror
</fieldset>
</div>
</div>
</div>
{{-- Alamat --}}
<div class="mb-2">
<label class="form-label">Alamat</label>
<input type="text" class="form-control"style="font-size: 13px;"
placeholder="Masukkan Alamat Lengkap">
<input type="text" name="alamat"
class="form-control @error('alamat') is-invalid @enderror" style="font-size: 14px;"
placeholder="Masukkan Alamat Lengkap" value="{{ old('alamat') }}">
@error('alamat')
<div class="invalid-feedback" style="font-size: 12px;">{{ $message }}</div>
@enderror
</div>
</div>
</div>
</div>
<div class="modal-footer justify-content-end border-top-0 pt-0">
<button type="submit" class="btn btn-primary rounded-pill terima px-3 py-2">
<button type="submit" class="btn btn-primary rounded-pill px-3 py-2">
Simpan
</button>
</div>

View File

@ -1,15 +1,17 @@
<div class="modal fade" id="delete" tabindex="-1" aria-hidden="true">
<div class="modal fade"id="delete{{ $a->id_user }}" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered ">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Hapus Admin</h5> <button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
<h5 class="modal-title">Hapus {{ $a->nama }}</h5> <button type="button" class="btn-close"
data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form action="#" method="POST" enctype="multipart/form-data">
<form action="{{ route('admin.kelola-admin.destroy', $a->id_user) }}" method="POST">
@csrf
@method('DELETE')
<div class="modal-body">
<p>Apakah anda yakin ingin menghapus nama admin?</p>
<p>Apakah anda yakin ingin menghapus {{ $a->nama }}?</p>
</div>
<div class="modal-footer justify-content-end border-top-0 pt-0">
<button type="submit" class="btn btn-danger rounded-pill tolak px-3 py-2">

View File

@ -1,13 +1,15 @@
<div class="modal fade" id="edit" tabindex="-1" aria-hidden="true">
<div class="modal fade" id="edit{{ $a->id_user }}" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Edit Admin</h5> <button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
<h5 class="modal-title">Edit Admin {{ $a->nama }}</h5> <button type="button" class="btn-close"
data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form action="#" method="POST" enctype="multipart/form-data">
<form action="{{ route('admin.kelola-admin.update', $a->id_user) }}" method="POST">
@csrf
@method('PUT')
<div class="modal-body">
<div class="row gx-3">
@ -16,16 +18,24 @@
<div class="col-12 col-md-6">
<div class="mb-2">
<label class="form-label">Nama Lengkap</label>
<input type="text" class="form-control"
style="font-size: 13px;"placeholder="Masukkan Nama Lengkap">
<input type="text" name="nama"
style="font-size: 14px;"class="form-control @error('nama') is-invalid @enderror"
value="{{ old('nama', $a->nama) }}">
@error('nama')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
</div>
<div class="col-12 col-md-6">
<div class="mb-2">
<label class="form-label">Username</label>
<input type="text" class="form-control"
style="font-size: 13px;"placeholder="Masukkan Username">
<input type="text" name="username"
style="font-size: 14px;"class="form-control @error('username') is-invalid @enderror"
value="{{ old('username', $a->username) }}">
@error('username')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
</div>
</div>
@ -33,15 +43,23 @@
<div class="col-12 col-md-4">
<div class="mb-2">
<label class="form-label">Nomor WA</label>
<input type="number" class="form-control"
style="font-size: 13px;"placeholder="Masukkan Nomor WA">
<input type="text" name="no_wa"
style="font-size: 14px;"class="form-control @error('no_wa') is-invalid @enderror"
value="{{ old('no_wa', $a->no_wa) }}">
@error('no_wa')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
</div>
<div class="col-12 col-md-4">
<div class="mb-2">
<label class="form-label">Email</label>
<input type="email" class="form-control"
style="font-size: 13px;"placeholder="Masukkan Email">
<input type="text" name="email"
style="font-size: 14px;"class="form-control @error('email') is-invalid @enderror"
value="{{ old('email', $a->email) }}">
@error('email')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
</div>
@ -50,18 +68,34 @@
<label class="form-label">Peran</label>
<fieldset class="form-group">
<select class="form-select" id="basicSelect" style="font-size: 13px">
<option>Admin Foto</option>
<option>Admin Buket</option>
<select class="form-select @error('role') is-invalid @enderror"
id="basicSelect" style="font-size: 13px" name="role">
<option value="admin_foto"
{{ old('role', $a->role) == 'admin_foto' ? 'selected' : '' }}>
Admin Foto
</option>
<option value="admin_buket"
{{ old('role', $a->role) == 'admin_buket' ? 'selected' : '' }}>
Admin Buket
</option>
</select>
{{-- Pesan Error Khusus Select --}}
@error('role')
<div class="invalid-feedback d-block">{{ $message }}</div>
@enderror
</fieldset>
</div>
</div>
</div>
<div class="mb-2">
<label class="form-label">Alamat</label>
<input type="text" class="form-control"style="font-size: 13px;"
placeholder="Masukkan Alamat Lengkap">
<input type="text" name="alamat"
style="font-size: 14px;"class="form-control @error('alamat') is-invalid @enderror"
value="{{ old('alamat', $a->alamat) }}">
@error('alamat')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
</div>
</div>

View File

@ -1,10 +1,10 @@
<div class="modal fade" id="show" tabindex="-1" aria-hidden="true">
<div class="modal fade" id="show{{ $a->id_user }}" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Detail Admin</h5> <button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
<h5 class="modal-title">Detail {{ $a->nama }}</h5> <button type="button" class="btn-close"
data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form action="#" method="POST" enctype="multipart/form-data">
@ -12,36 +12,36 @@
<div class="row gx-3">
<div class="col-12">
<div class="row gx-1">
<div class="row gx-2">
<div class="col-12 col-md-6">
<div class="mb-2">
<label class="form-label">Nama Lengkap</label>
<input type="text" class="form-control"
style="font-size: 13px;"placeholder="Masukkan Nama Lengkap" disabled>
<input type="text" class="form-control" style="font-size: 14px;"
value="{{ $a->nama }}" disabled>
</div>
</div>
<div class="col-12 col-md-6">
<div class="mb-2">
<label class="form-label">Username</label>
<input type="text" class="form-control"
style="font-size: 13px;"placeholder="Masukkan Username" disabled>
<input type="text" class="form-control" style="font-size: 14px;"
value="{{ $a->username }}" disabled>
</div>
</div>
</div>
<div class="row gx-1">
<div class="row gx-2">
<div class="col-12 col-md-4">
<div class="mb-2">
<label class="form-label">Nomor WA</label>
<input type="number" class="form-control"
style="font-size: 13px;"placeholder="Masukkan Nomor WA" disabled>
<input type="number" class="form-control" style="font-size: 14px;"
value="{{ $a->no_wa }}" disabled>
</div>
</div>
<div class="col-12 col-md-4">
<div class="mb-2">
<label class="form-label">Email</label>
<input type="email" class="form-control"
style="font-size: 13px;"placeholder="Masukkan Email" disabled>
<input type="email" class="form-control" style="font-size: 14px;"
value="{{ $a->email }}" disabled>
</div>
</div>
@ -52,8 +52,17 @@
<fieldset class="form-group">
<select class="form-select" id="basicSelect" style="font-size: 13px"
disabled>
<option>Admin Foto</option>
<option>Admin Buket</option>
{{-- Cek jika role adalah admin_foto --}}
<option value="admin_foto"
{{ $a->role == 'admin_foto' ? 'selected' : '' }}>
Admin Foto
</option>
{{-- Cek jika role adalah admin_buket --}}
<option value="admin_buket"
{{ $a->role == 'admin_buket' ? 'selected' : '' }}>
Admin Buket
</option>
</select>
</fieldset>
</div>
@ -61,17 +70,12 @@
</div>
<div class="mb-2">
<label class="form-label">Alamat</label>
<input type="text" class="form-control"style="font-size: 13px;"
placeholder="Masukkan Alamat Lengkap" disabled>
<input type="text" class="form-control"style="font-size: 14px;"
value="{{ $a->alamat }}" disabled>
</div>
</div>
</div>
</div>
<div class="modal-footer justify-content-end border-top-0 pt-0">
<button type="submit" class="btn btn-primary rounded-pill terima px-3 py-2">
Simpan
</button>
</div>
</form>
</div>