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 @@ + + + + + + + + Super Admin Dashboard + + + + + + + + + +
+ + + + +
+ +
+
+ +
+
+ +
+ Profile + Logout +
+
+
+
+
+ + +
+ @yield('content') +
+
+
+ + + \ No newline at end of file diff --git a/resources/views/superadmin/admin/create.blade.php b/resources/views/superadmin/admin/create.blade.php new file mode 100644 index 0000000..0ac5719 --- /dev/null +++ b/resources/views/superadmin/admin/create.blade.php @@ -0,0 +1,101 @@ +@extends('layouts.super-admin') + +@section('content') +
+

Tambah Admin

+

Tambahkan akun admin baru untuk venue

+
+ +
+
+ @csrf + +
+ +
+ + + @error('name') +

{{ $message }}

+ @enderror +
+ + +
+ + + @error('email') +

{{ $message }}

+ @enderror +
+ + +
+ + + @error('password') +

{{ $message }}

+ @enderror +
+ + +
+ + +
+ + +
+ + + @error('venue_id') +

{{ $message }}

+ @enderror +
+ + +
+ + + @error('role') +

{{ $message }}

+ @enderror +
+
+ +
+ + Batal + + +
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/superadmin/admin/edit.blade.php b/resources/views/superadmin/admin/edit.blade.php new file mode 100644 index 0000000..7519967 --- /dev/null +++ b/resources/views/superadmin/admin/edit.blade.php @@ -0,0 +1,100 @@ +@extends('layouts.super-admin') + +@section('content') +
+

Edit Admin

+

Ubah data dan role admin

+
+ +
+
+ @csrf + @method('PUT') + +
+ +
+ + + @error('name') +

{{ $message }}

+ @enderror +
+ + +
+ + + @error('email') +

{{ $message }}

+ @enderror +
+ + +
+ + +

Kosongkan jika tidak ingin mengubah password

+ @error('password') +

{{ $message }}

+ @enderror +
+ + +
+ + +
+ + +
+ + + @error('venue_id') +

{{ $message }}

+ @enderror +
+ + +
+ + + @error('role') +

{{ $message }}

+ @enderror +
+
+ +
+ + Batal + + +
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/superadmin/admin/index.blade.php b/resources/views/superadmin/admin/index.blade.php new file mode 100644 index 0000000..e07e19d --- /dev/null +++ b/resources/views/superadmin/admin/index.blade.php @@ -0,0 +1,222 @@ +@extends('layouts.super-admin') + +@section('content') +
+
+

Manajemen Admin

+

Kelola admin untuk setiap venue

+
+ + + Tambah Admin + +
+ + @if(session('success')) + + @endif + + +
+
+
+
+ +
+
+ +
+ +
+
+
+ + +
+
+ + + Reset Filter + +
+
+
+
+ + +
+
+ + + + + + + + + + + + + @forelse($admins as $admin) + + + + + + + + + @empty + + + + @endforelse + +
+ 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 +
+
+ + +
+ {{ $admins->links() }} +
+
+ + + + + +@endsection \ No newline at end of file diff --git a/resources/views/superadmin/dashboard.blade.php b/resources/views/superadmin/dashboard.blade.php new file mode 100644 index 0000000..d80acfd --- /dev/null +++ b/resources/views/superadmin/dashboard.blade.php @@ -0,0 +1,120 @@ +@extends('layouts.super-admin') + +@section('content') +
+

Dashboard Super Admin

+

Selamat datang di panel kontrol Super Admin

+
+ +
+
+
+

+ Admin +

+ + Total: {{ $adminCount ?? 0 }} + +
+

Kelola semua admin venue dalam sistem

+ + Lihat Detail + + +
+ +
+
+

+ Venue +

+ + Total: {{ $venueCount ?? 0 }} + +
+

Kelola semua venue dalam sistem

+ + Lihat Detail + + +
+
+ + +
+
+

Aktivitas Terbaru

+
+
+
+ +
+
+ +
+
+

Admin baru ditambahkan

+

2 jam yang lalu

+
+
+
+
+ +
+
+

Venue baru ditambahkan

+

1 hari yang lalu

+
+
+
+
+ +
+
+

Venue diperbarui

+

2 hari yang lalu

+
+
+
+
+
+ + +
+
+
+
+ +
+
+

Total Pengguna

+

{{ $userCount ?? 0 }}

+
+
+
+
+
+
+ +
+
+

Venue Aktif

+

{{ $activeVenueCount ?? 0 }}

+
+
+
+
+
+
+ +
+
+

Total Meja

+

{{ $tableCount ?? 0 }}

+
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/superadmin/venue/create.blade.php b/resources/views/superadmin/venue/create.blade.php new file mode 100644 index 0000000..e0e3d56 --- /dev/null +++ b/resources/views/superadmin/venue/create.blade.php @@ -0,0 +1,142 @@ +@extends('layouts.super-admin') + +@section('content') +
+
+
+
+
{{ __('Tambah Venue Baru') }}
+ +
+ @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ @csrf + +
+ +
+ + @error('name') + + {{ $message }} + + @enderror +
+
+ +
+ +
+ + @error('address') + + {{ $message }} + + @enderror +
+
+ +
+ +
+ + @error('phone') + + {{ $message }} + + @enderror +
+
+ +
+ +
+ + @error('description') + + {{ $message }} + + @enderror +
+
+ +
+ +
+ + @error('open_time') + + {{ $message }} + + @enderror +
+
+ +
+ +
+ + @error('close_time') + + {{ $message }} + + @enderror +
+
+ +
+ +
+ + Format: JPG, PNG, GIF. Ukuran maksimal: 2MB + @error('image') + + {{ $message }} + + @enderror +
+
+ +
+
+ + + {{ __('Batal') }} + +
+
+
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/superadmin/venue/edit.blade.php b/resources/views/superadmin/venue/edit.blade.php new file mode 100644 index 0000000..d5a385f --- /dev/null +++ b/resources/views/superadmin/venue/edit.blade.php @@ -0,0 +1,168 @@ +@extends('layouts.super-admin') + +@section('content') +
+
+
+
+
{{ __('Edit Venue') }}
+ +
+ @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ @csrf + @method('PUT') + +
+ +
+ + @error('name') + + {{ $message }} + + @enderror +
+
+ +
+ +
+ + @error('address') + + {{ $message }} + + @enderror +
+
+ +
+ +
+ + @error('phone') + + {{ $message }} + + @enderror +
+
+ +
+ +
+ + @error('description') + + {{ $message }} + + @enderror +
+
+ +
+ +
+ + @error('open_time') + + {{ $message }} + + @enderror +
+
+ +
+ +
+ + @error('close_time') + + {{ $message }} + + @enderror +
+
+ +
+ +
+ @if($venue->image) +
+ {{ $venue->name }} +
+ @endif + + Format: JPG, PNG, GIF. Ukuran maksimal: 2MB. Biarkan + kosong jika tidak ingin mengubah gambar. + @error('image') + + {{ $message }} + + @enderror +
+
+ +
+ +
+ + @error('status') + + {{ $message }} + + @enderror +
+
+ +
+
+ + + {{ __('Batal') }} + +
+
+
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/superadmin/venue/index.blade.php b/resources/views/superadmin/venue/index.blade.php new file mode 100644 index 0000000..6ff0e08 --- /dev/null +++ b/resources/views/superadmin/venue/index.blade.php @@ -0,0 +1,202 @@ +@extends('layouts.super-admin') + +@section('content') +
+
+

Manajemen Venue

+

Kelola semua venue dalam sistem

+
+ + + Tambah Venue + +
+ + + @if(session('success')) + + @endif + + @if(session('error')) + + @endif + + +
+
+
+
+ +
+
+ +
+ +
+
+
+ + +
+
+ + + Reset + +
+
+
+
+ + +
+ @forelse($venues as $venue) +
+
+ {{ $venue->name }} +
+ + + + +
+
+
+

{{ $venue->name }}

+
+ + {{ $venue->address }} +
+
+ + {{ $venue->phone }} +
+
+ + {{ $venue->status == 'active' ? 'Aktif' : 'Tidak Aktif' }} +
+
+
+
+ {{ $venue->created_at->format('d M Y') }} +
+ + Detail + + +
+
+
+
+ @empty +
+ +

Belum ada venue

+

Mulai tambahkan venue baru untuk mengelola bisnis Anda

+ + + Tambah Venue + +
+ @endforelse +
+ + + @if($venues->hasPages()) +
+ {{ $venues->links() }} +
+ @endif + + + + + + +@endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index bfa162e..4b9744c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -9,6 +9,9 @@ use App\Http\Controllers\admin\TableController; use App\Http\Controllers\admin\AdminController; use App\Http\Controllers\Auth\VerificationController; +use App\Http\Controllers\superadmin\SuperAdminController; +use App\Http\Controllers\superadmin\AdminManagementController; +use App\Http\Controllers\superadmin\VenueManagementController; use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Auth; @@ -74,4 +77,25 @@ Route::get('/tables/{id}/edit', [TableController::class, 'edit'])->name('admin.tables.edit'); Route::put('/tables/{id}', [TableController::class, 'update'])->name('admin.tables.update'); Route::delete('/tables/{id}', [TableController::class, 'destroy'])->name('admin.tables.destroy'); -}); \ No newline at end of file +}); + +// Superadmin routes +Route::middleware(['auth', 'verified', 'is_superadmin'])->prefix('superadmin')->group(function () { + Route::get('/', [App\Http\Controllers\superadmin\SuperAdminController::class, 'index'])->name('superadmin.dashboard'); + + // Tambahkan route untuk manajemen Admin + Route::get('/admin', [AdminManagementController::class, 'index'])->name('superadmin.admin.index'); + Route::get('/admin/create', [AdminManagementController::class, 'create'])->name('superadmin.admin.create'); + Route::post('/admin', [AdminManagementController::class, 'store'])->name('superadmin.admin.store'); + Route::get('/admin/{id}/edit', [AdminManagementController::class, 'edit'])->name('superadmin.admin.edit'); + Route::put('/admin/{id}', [AdminManagementController::class, 'update'])->name('superadmin.admin.update'); + Route::delete('/admin/{id}', [AdminManagementController::class, 'destroy'])->name('superadmin.admin.destroy'); + + // Tambahkan route untuk manajemen Venue + Route::get('/venue', [VenueManagementController::class, 'index'])->name('superadmin.venue.index'); + Route::get('/venue/create', [VenueManagementController::class, 'create'])->name('superadmin.venue.create'); + Route::post('/venue', [VenueManagementController::class, 'store'])->name('superadmin.venue.store'); + Route::get('/venue/{id}/edit', [VenueManagementController::class, 'edit'])->name('superadmin.venue.edit'); + Route::put('/venue/{id}', [VenueManagementController::class, 'update'])->name('superadmin.venue.update'); + Route::delete('/venue/{id}', [VenueManagementController::class, 'destroy'])->name('superadmin.venue.destroy'); +});