diff --git a/app/Http/Controllers/Admin/UserManagementController.php b/app/Http/Controllers/Admin/UserManagementController.php new file mode 100644 index 0000000..6f0b5cd --- /dev/null +++ b/app/Http/Controllers/Admin/UserManagementController.php @@ -0,0 +1,130 @@ +filled('search')) { + $search = $request->search; + $query->where(function ($q) use ($search) { + $q->where('name', 'like', "%{$search}%") + ->orWhere('email', 'like', "%{$search}%"); + }); + } + + // Filter by role + if ($request->filled('role')) { + $query->whereHas('roles', function ($q) use ($request) { + $q->where('slug', $request->role); + }); + } + + $users = $query->latest()->paginate(20); + $roles = Role::all(); + + return view('admin.users.index', compact('users', 'roles')); + } + + /** + * Show the form for editing a user. + */ + public function edit(User $user) + { + $roles = Role::all(); + return view('admin.users.edit', compact('user', 'roles')); + } + + /** + * Update the specified user. + */ + public function update(Request $request, User $user) + { + $validated = $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users')->ignore($user->id)], + 'password' => ['nullable', 'string', 'min:8', 'confirmed'], + 'roles' => ['required', 'array', 'min:1'], + 'roles.*' => ['exists:roles,id'], + 'bio' => ['nullable', 'string', 'max:500'], + 'website' => ['nullable', 'url', 'max:255'], + 'twitter' => ['nullable', 'string', 'max:255'], + 'github' => ['nullable', 'string', 'max:255'], + 'linkedin' => ['nullable', 'string', 'max:255'], + ]); + + // Update user data + $user->name = $validated['name']; + $user->email = $validated['email']; + $user->bio = $validated['bio'] ?? null; + $user->website = $validated['website'] ?? null; + $user->twitter = $validated['twitter'] ?? null; + $user->github = $validated['github'] ?? null; + $user->linkedin = $validated['linkedin'] ?? null; + + // Update password if provided + if ($request->filled('password')) { + $user->password = Hash::make($validated['password']); + } + + $user->save(); + + // Sync roles + $user->roles()->sync($validated['roles']); + + return redirect()->route('admin.users.index') + ->with('success', 'User updated successfully.'); + } + + /** + * Remove the specified user. + */ + public function destroy(User $user) + { + // Prevent self-deletion + if ($user->id === auth()->id()) { + return redirect()->route('admin.users.index') + ->with('error', 'You cannot delete your own account.'); + } + + // Delete user's related data or handle as needed + $user->delete(); + + return redirect()->route('admin.users.index') + ->with('success', 'User deleted successfully.'); + } + + /** + * Toggle user's role. + */ + public function toggleRole(User $user, Role $role) + { + if ($user->roles->contains($role)) { + // Check if removing the last role + if ($user->roles->count() === 1) { + return back()->with('error', 'User must have at least one role.'); + } + $user->roles()->detach($role->id); + $message = "Role '{$role->name}' removed from user."; + } else { + $user->roles()->attach($role->id); + $message = "Role '{$role->name}' added to user."; + } + + return back()->with('success', $message); + } +} diff --git a/resources/views/admin/users/edit.blade.php b/resources/views/admin/users/edit.blade.php new file mode 100644 index 0000000..8a22100 --- /dev/null +++ b/resources/views/admin/users/edit.blade.php @@ -0,0 +1,268 @@ +@extends('layouts.app') + +@section('content') +
Update user information and roles
+Manage all users and their roles
+| + User + | ++ Roles + | ++ Joined + | ++ Actions + | +
|---|---|---|---|
|
+
+
+
+ @if($user->avatar_url)
+
+
+ {{ strtoupper(substr($user->name, 0, 1)) }}
+
+ @endif
+
+
+
+ {{ $user->name }}
+
+
+ {{ $user->email }}
+
+ |
+
+
+ @forelse($user->roles as $role)
+
+ {{ $role->name }}
+
+ @empty
+ No roles
+ @endforelse
+
+ |
+ + {{ $user->created_at->format('M d, Y') }} + | +
+
+
+ Edit
+
+ @if($user->id !== auth()->id())
+
+ @endif
+
+ |
+
| + No users found + | +|||