diff --git a/app/Http/Controllers/Web/Konfigurasi/UserController.php b/app/Http/Controllers/Web/Konfigurasi/UserController.php index 967453d..52f14c8 100644 --- a/app/Http/Controllers/Web/Konfigurasi/UserController.php +++ b/app/Http/Controllers/Web/Konfigurasi/UserController.php @@ -5,6 +5,9 @@ namespace App\Http\Controllers\Web\Konfigurasi; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Models\User; +use App\Models\Profile; +use App\Enums\Role; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; @@ -14,47 +17,112 @@ class UserController extends Controller { $query = User::orderBy('created_at', 'desc'); - if ($request->search) { - $query->where('name', 'like', '%' . $request->search . '%') - ->orWhere('email', 'like', '%' . $request->search . '%'); + $tab = $request->get('tab', 'active'); + if ($tab === 'pending') { + $query->whereNull('email_verified_at'); + } else { + $query->whereNotNull('email_verified_at'); + } + + if ($request->filled('search')) { + $search = $request->search; + $query->where(function($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%') + ->orWhere('email', 'like', '%' . $search . '%'); + }); + } + + if ($request->filled('role')) { + $query->where('role', $request->role); } $users = $query->paginate($request->per_page ?? 10); + + $totalUsers = User::count(); + $activeUsers = User::whereNotNull('email_verified_at')->count(); + $pendingUsers = User::whereNull('email_verified_at')->count(); - return view('master.users.index', compact('users')); + $roles = Role::cases(); + + return view('konfigurasi.user.index', compact('users', 'totalUsers', 'activeUsers', 'pendingUsers', 'roles', 'tab')); + } + + public function verify($id) + { + try { + $user = User::findOrFail($id); + $user->email_verified_at = now(); + $user->save(); + + return response()->json([ + 'status' => 'success', + 'message' => 'User berhasil diverifikasi dan diaktifkan.' + ]); + + } catch (\Exception $e) { + return response()->json([ + 'status' => 'error', + 'message' => 'Gagal verifikasi user.' + ], 500); + } } public function store(Request $request) { $validator = Validator::make($request->all(), [ - 'name' => 'required|string|max:255', - 'email' => 'required|email|unique:users,email|max:255', - 'password' => 'required|min:6', - 'role' => 'required|string|max:255', + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], + 'password' => ['required', 'string', 'min:8', 'confirmed'], + 'role' => ['required', 'string'], + ], [ + 'password.confirmed' => 'Konfirmasi password tidak cocok!', + 'password.min' => 'Password minimal 8 karakter!', + 'email.unique' => 'Email sudah terdaftar.', + 'required' => 'Kolom :attribute wajib diisi.' ]); if ($validator->fails()) { return response()->json(['status' => 'error', 'errors' => $validator->errors()], 422); } - User::create([ - 'name' => $request->name, - 'email' => $request->email, - 'password' => Hash::make($request->password), // Enkripsi password - 'role' => $request->role, - ]); + try { + DB::transaction(function () use ($request) { + + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'password' => Hash::make($request->password), + 'role' => $request->role, + 'created_by' => auth()->id(), + ]); - return response()->json(['status' => 'success', 'message' => 'User berhasil ditambahkan']); + Profile::create([ + 'user_id' => $user->id, + 'role' => $request->role, + 'nama' => $request->name, + 'email' => $request->email, + 'created_by' => auth()->id(), + ]); + }); + + return response()->json([ + 'status' => 'success', + 'message' => 'User baru berhasil ditambahkan.' + ]); + + } catch (\Exception $e) { + return response()->json([ + 'status' => 'error', + 'message' => 'Gagal menyimpan data: ' . $e->getMessage() + ], 500); + } } public function show($id) { - try { - $user = User::findOrFail($id); - return response()->json(['status' => 'success', 'data' => $user]); - } catch (\Exception $e) { - return response()->json(['status' => 'error', 'message' => 'User tidak ditemukan'], 404); - } + $user = User::findOrFail($id); + + return response()->json(['status' => 'success', 'data' => $user]); } public function update(Request $request, $id) @@ -62,9 +130,6 @@ class UserController extends Controller $user = User::findOrFail($id); $validator = Validator::make($request->all(), [ - 'name' => 'required|string|max:255', - 'email' => 'required|email|max:255|unique:users,email,' . $id, // Pengecualian email unik untuk ID ini - 'role' => 'required|string|max:255', 'password' => 'nullable|min:6', ]); @@ -72,15 +137,7 @@ class UserController extends Controller return response()->json(['status' => 'error', 'errors' => $validator->errors()], 422); } - $user->name = $request->name; - $user->email = $request->email; - $user->role = $request->role; - - // Update password HANYA JIKA diisi - if ($request->filled('password')) { - $user->password = Hash::make($request->password); - } - + $user->password = Hash::make($request->password); $user->save(); return response()->json(['status' => 'success', 'message' => 'User berhasil diupdate']); diff --git a/app/Models/User.php b/app/Models/User.php index 61a6389..a35ec1f 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -5,6 +5,7 @@ namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; +use App\Enums\Role; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\HasOne; @@ -32,7 +33,7 @@ class User extends Authenticatable return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', - 'role' => \App\Enums\Role::class, + 'role' => Role::class, ]; } diff --git a/resources/views/konfigurasi/user/add.blade.php b/resources/views/konfigurasi/user/add.blade.php new file mode 100644 index 0000000..d11d1cc --- /dev/null +++ b/resources/views/konfigurasi/user/add.blade.php @@ -0,0 +1,52 @@ +
+
+
Tambah User Baru
+ +
+
+
+ @csrf +
+ + +
+
+ + +
+
+ + +
+
+ +
+ + + + +
+
+ +
+ +
+ + + + +
+
+ +
+ + +
+
+
+
\ No newline at end of file diff --git a/resources/views/konfigurasi/user/edit.blade.php b/resources/views/konfigurasi/user/edit.blade.php new file mode 100644 index 0000000..885aa3c --- /dev/null +++ b/resources/views/konfigurasi/user/edit.blade.php @@ -0,0 +1,53 @@ +
+
+
Ubah Password User
+ +
+
+
+ @csrf + @method('PUT') + + + +
+ +
+ + + + +
+
+ +
+ +
+ + + + +
+
+ +
+ + +
+
+
+
\ No newline at end of file diff --git a/resources/views/konfigurasi/user/index.blade.php b/resources/views/konfigurasi/user/index.blade.php new file mode 100644 index 0000000..5b0e8c5 --- /dev/null +++ b/resources/views/konfigurasi/user/index.blade.php @@ -0,0 +1,445 @@ +@extends('layout.main') + +@section('content') +
+ +
+
+
+
+
+
+ Total Users +
+

{{ number_format($totalUsers ?? 0) }}

+
+ All registered accounts +
+
+ + + +
+
+
+
+
+
+
+
+
+
+ Active Users +
+

{{ number_format($activeUsers ?? 0) }}

+
+ Verified Emails +
+
+ + + +
+
+
+
+
+
+
+
+
+
+ Pending Users +
+

{{ number_format($pendingUsers ?? 0) }}

+
+ Unverified Emails +
+
+ + + +
+
+
+
+
+
+ + + +
+
+
Daftar Pengguna
+ +
+ +
+ +
+
+
+
+ + + +
+
+ +
+ +
+ +
+
+ + + @if(request()->anyFilled(['search', 'role'])) + + @endif +
+
+
+
+
+ +
+ + + + + + + + + + + + @forelse($users as $index => $user) + + + + + + + + @empty + + @endforelse + +
NoUserRoleStatusActions
{{ $users->firstItem() + $index }} +
+
+
+ {{ strtoupper(substr($user->name, 0, 2)) }} +
+
+
+ {{ $user->name }} + {{ $user->email }} +
+
+
+ @php + $roleKey = ($user->role instanceof \App\Enums\Role) ? $user->role->value : $user->role; + $roleColors = [ + 'super_admin' => 'bg-label-danger', + 'admin' => 'bg-label-warning', + 'fasilitator' => 'bg-label-info', + 'petani' => 'bg-label-success', + ]; + $color = $roleColors[$roleKey] ?? 'bg-label-secondary'; + @endphp + + {{ ucfirst(str_replace('_', ' ', $roleKey)) }} + + + @if($user->email_verified_at) + Verified + @else + Pending +
+ @csrf + @method('PATCH') + +
+ + @endif +
+
+ + +
+
No users found.
+
+ + +
+ @include('konfigurasi.user.add') + @include('konfigurasi.user.edit') +
+@endsection + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 551c764..1640d75 100644 --- a/routes/web.php +++ b/routes/web.php @@ -6,7 +6,6 @@ use Illuminate\Support\Facades\Route; Route::get('/login', [App\Http\Controllers\Web\Konfigurasi\AuthController::class, 'login'])->name('login'); Route::get('/register', [App\Http\Controllers\Web\Konfigurasi\AuthController::class, 'register'])->name('register'); Route::post('/create-account', [App\Http\Controllers\Web\Konfigurasi\AuthController::class, 'createAccount'])->name('auth.createAccount'); -Route::patch('/users/{user}/verify', [App\Http\Controllers\Web\Konfigurasi\AuthController::class, 'verify'])->name('users.verify'); Route::post('/authenticate', [App\Http\Controllers\Web\Konfigurasi\AuthController::class, 'authenticate'])->name('auth.authenticate'); Route::post('/logout', [App\Http\Controllers\Web\Konfigurasi\AuthController::class, 'logout'])->name('logout'); @@ -21,9 +20,8 @@ Route::middleware('auth') Route::get('/akselerasi', [App\Http\Controllers\Web\Dashboard\AkselerasiController::class, 'index'])->name('dashboard.akselerasi'); // User - Route::get('/users', [App\Http\Controllers\Web\Konfigurasi\UserController::class, 'index'])->name('users.index'); - Route::get('/api/users-list', [App\Http\Controllers\Web\Konfigurasi\UserController::class, 'getUsers'])->name('api.users.list'); - // }); + Route::resource('users', App\Http\Controllers\Web\Konfigurasi\UserController::class); + Route::patch('/users/{user}/verify', [App\Http\Controllers\Web\Konfigurasi\UserController::class, 'verify'])->name('users.verify'); // Provinsi Route::get('/provinsi', [App\Http\Controllers\Web\Master\ProvinsiController::class, 'index'])->name('provinsi.index');