diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 2f7bdbc..e60fc28 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -63,7 +63,9 @@ protected function authenticated(Request $request, $user) } session()->flash('success', 'Login berhasil!'); - if ($user->role === 'admin') { + if ($user->role === 'superadmin') { + return redirect('/superadmin'); + } elseif ($user->role === 'admin') { return redirect('/admin'); } return redirect()->intended($this->redirectTo); diff --git a/app/Http/Controllers/superadmin/AdminManagementController.php b/app/Http/Controllers/superadmin/AdminManagementController.php new file mode 100644 index 0000000..1d22357 --- /dev/null +++ b/app/Http/Controllers/superadmin/AdminManagementController.php @@ -0,0 +1,80 @@ +filled('search')) { + $search = $request->search; + $query->where(function($q) use ($search) { + $q->where('name', 'like', "%{$search}%") + ->orWhere('email', 'like', "%{$search}%"); + }); + } + + // Filter by venue + if ($request->filled('venue_id')) { + $query->where('venue_id', $request->venue_id); + } + + $admins = $query->paginate(10)->withQueryString(); + $venues = Venue::orderBy('name')->get(); + + return view('superadmin.admin.index', compact('admins', 'venues')); + } + + /** + * Show the form for creating a new admin. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + $venues = Venue::orderBy('id')->get(); + return view('superadmin.admin.create', compact('venues')); + } + + /** + * Store a newly created admin in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'email' => 'required|string|email|max:255|unique:users', + 'password' => 'required|string|min:8|confirmed', + 'venue_id' => 'required|exists:venues,id', + 'role' => 'required|in:admin,user', + ]); + + $admin = new User(); + $admin->name = $request->name; + $admin->email = $request->email; + $admin->password = bcrypt($request->password); + $admin->role = $request->role; + $admin->venue_id = $request->venue_id; + $admin->email_verified_at = now(); // Admin langsung terverifikasi + $admin->save(); + + return redirect()->route('superadmin.admin.index') + ->with('success', 'Admin berhasil ditambahkan!'); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/superadmin/SuperAdminController.php b/app/Http/Controllers/superadmin/SuperAdminController.php new file mode 100644 index 0000000..a232157 --- /dev/null +++ b/app/Http/Controllers/superadmin/SuperAdminController.php @@ -0,0 +1,35 @@ +count(); + $venueCount = Venue::count(); + $userCount = User::where('role', 'user')->count(); + // $activeVenueCount = Venue::where('status', 'active')->count(); + $tableCount = Table::count(); + + return view('superadmin.dashboard', compact( + 'adminCount', + 'venueCount', + 'userCount', + // 'activeVenueCount', + 'tableCount' + )); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/superadmin/VenueManagementController.php b/app/Http/Controllers/superadmin/VenueManagementController.php new file mode 100644 index 0000000..bc9c627 --- /dev/null +++ b/app/Http/Controllers/superadmin/VenueManagementController.php @@ -0,0 +1,166 @@ +validate([ + 'name' => 'required|string|max:255', + 'address' => 'required|string', + 'description' => 'required|string', + 'phone' => 'required|string|max:20', + 'open_time' => 'required|date_format:H:i', + 'close_time' => 'required|date_format:H:i', + 'image' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048', + // 'status' => 'required|in:active,inactive', + ]); + + // Handle file upload + $imagePath = null; + if ($request->hasFile('image')) { + // Get the file extension + $extension = $request->file('image')->getClientOriginalExtension(); + + // Generate a unique filename + $imageName = time() . '_' . uniqid() . '.' . $extension; + + // Store the file in the public disk under venues directory + $imagePath = $request->file('image')->storeAs('venues', $imageName, 'public'); + } + + $venue = new Venue(); + $venue->name = $request->name; + $venue->address = $request->address; + $venue->description = $request->description; + $venue->phone = $request->phone; + $venue->open_time = $request->open_time; + $venue->close_time = $request->close_time; + $venue->image = $imagePath; + // $venue->status = $request->status; + $venue->save(); + + return redirect()->route('superadmin.venue.index') + ->with('success', 'Venue berhasil ditambahkan!'); + } + + /** + * Show the form for editing the specified venue. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + $venue = Venue::findOrFail($id); + return view('superadmin.venue.edit', compact('venue')); + } + + /** + * Update the specified venue in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'address' => 'required|string', + 'description' => 'required|string', + 'phone' => 'required|string|max:20', + 'open_time' => 'required|date_format:H:i', + 'close_time' => 'required|date_format:H:i', + 'image' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048', + // 'status' => 'required|in:active,inactive', + ]); + + $venue = Venue::findOrFail($id); + + // Handle file upload if a new image is provided + if ($request->hasFile('image')) { + // Delete old image if exists + if ($venue->image && Storage::disk('public')->exists($venue->image)) { + Storage::disk('public')->delete($venue->image); + } + + // Get the file extension + $extension = $request->file('image')->getClientOriginalExtension(); + + // Generate a unique filename + $imageName = time() . '_' . uniqid() . '.' . $extension; + + // Store the file in the public disk under venues directory + $imagePath = $request->file('image')->storeAs('venues', $imageName, 'public'); + + $venue->image = $imagePath; + } + + $venue->name = $request->name; + $venue->address = $request->address; + $venue->description = $request->description; + $venue->phone = $request->phone; + $venue->open_time = $request->open_time; + $venue->close_time = $request->close_time; + // $venue->status = $request->status; + $venue->save(); + + return redirect()->route('superadmin.venue.index') + ->with('success', 'Venue berhasil diperbarui!'); + } + + /** + * Remove the specified venue from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $venue = Venue::findOrFail($id); + + // Delete the venue image if exists + if ($venue->image && Storage::disk('public')->exists($venue->image)) { + Storage::disk('public')->delete($venue->image); + } + + $venue->delete(); + + return redirect()->route('superadmin.venue.index') + ->with('success', 'Venue berhasil dihapus!'); + } +} \ No newline at end of file diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index c2660c2..fc025fc 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -65,5 +65,6 @@ class Kernel extends HttpKernel 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'is_admin' => \App\Http\Middleware\IsAdmin::class, + 'is_superadmin' => \App\Http\Middleware\IsSuperAdmin::class, ]; } \ No newline at end of file diff --git a/app/Http/Middleware/IsSuperAdmin.php b/app/Http/Middleware/IsSuperAdmin.php new file mode 100644 index 0000000..640483c --- /dev/null +++ b/app/Http/Middleware/IsSuperAdmin.php @@ -0,0 +1,26 @@ +role === 'superadmin') { + return $next($request); + } + + abort(403, 'Unauthorized action.'); + } +} \ No newline at end of file diff --git a/app/Models/User.php b/app/Models/User.php index 5ef0a20..17931a2 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -21,6 +21,8 @@ class User extends Authenticatable implements MustVerifyEmail 'name', 'email', 'password', + 'role', + 'venue_id', ]; /** @@ -52,4 +54,12 @@ public function isAdmin() { return $this->role === 'admin'; } + + /** + * Get the venue that the admin belongs to. + */ + public function venue() + { + return $this->belongsTo(Venue::class); + } } \ No newline at end of file diff --git a/resources/views/layouts/super-admin.blade.php b/resources/views/layouts/super-admin.blade.php new file mode 100644 index 0000000..e66773f --- /dev/null +++ b/resources/views/layouts/super-admin.blade.php @@ -0,0 +1,113 @@ + + + +
+ + + +Tambahkan akun admin baru untuk venue
+Ubah data dan role admin
+Kelola admin untuk setiap venue
+{{ session('success') }}
++ Nama + | ++ Email + | ++ Venue + | ++ Status + | ++ Terdaftar + | ++ Aksi + | +
---|---|---|---|---|---|
+
+
+
+
+
+
+
+ {{ $admin->name }}
+ |
+
+ {{ $admin->email }}
+ |
+
+
+ @if($admin->venue)
+ {{ $admin->venue->name }}
+ @else
+ Tidak ada venue
+ @endif
+
+ |
+ + + {{ $admin->email_verified_at ? 'Terverifikasi' : 'Belum Verifikasi' }} + + | ++ {{ $admin->created_at->format('d M Y') }} + | ++ + + + + | +
+ Tidak ada data admin ditemukan + | +
Selamat datang di panel kontrol Super Admin
+Kelola semua admin venue dalam sistem
+ + Lihat Detail + + +Kelola semua venue dalam sistem
+ + Lihat Detail + + +Admin baru ditambahkan
+2 jam yang lalu
+Venue baru ditambahkan
+1 hari yang lalu
+Venue diperbarui
+2 hari yang lalu
+{{ $userCount ?? 0 }}
+{{ $activeVenueCount ?? 0 }}
+{{ $tableCount ?? 0 }}
+Kelola semua venue dalam sistem
+{{ session('success') }}
+{{ session('error') }}
+