From 4de8cac35249f9a50ff8c83545c8068e5e9361bc Mon Sep 17 00:00:00 2001 From: Stephen Gesityan Date: Thu, 8 May 2025 02:11:39 +0700 Subject: [PATCH] Disable Option --- app/Http/Controllers/Auth/LoginController.php | 4 +-- .../Controllers/Auth/RegisterController.php | 2 +- .../Controllers/pages/BookingController.php | 34 +++++++++++++++---- resources/views/pages/venue.blade.php | 32 ++++++++++++++--- routes/web.php | 3 +- 5 files changed, 59 insertions(+), 16 deletions(-) diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 44800fd..bf0064a 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -27,7 +27,7 @@ class LoginController extends Controller * * @var string */ - protected $redirectTo = '/home'; + protected $redirectTo = '/'; /** * Create a new controller instance. @@ -48,7 +48,7 @@ public function logout(Request $request) $request->session()->regenerateToken(); session()->flash('error', 'Berhasil logout!'); - return redirect('/home'); + return redirect('/'); } protected function authenticated(Request $request, $user) diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 961ea36..ab7ef63 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -28,7 +28,7 @@ class RegisterController extends Controller * * @var string */ - protected $redirectTo = '/home'; + protected $redirectTo = '/'; /** * Create a new controller instance. diff --git a/app/Http/Controllers/pages/BookingController.php b/app/Http/Controllers/pages/BookingController.php index 7d22fea..f973fec 100644 --- a/app/Http/Controllers/pages/BookingController.php +++ b/app/Http/Controllers/pages/BookingController.php @@ -22,14 +22,13 @@ public function store(Request $request) { $conflict = Booking::where('table_id', $request->table_id) ->where(function($query) use ($request) { $query->whereBetween('start_time', [$request->start_time, $request->end_time]) - ->orWhereBetween('end_time', [$request->start_time, $request->end_time]) ->orWhere(function($query) use ($request) { - $query->where('start_time', '<', $request->start_time) - ->where('end_time', '>', $request->end_time); - }); - }) - ->where('status', '!=', 'cancelled') // skip booking yang dibatalkan - ->exists(); + $query->where('start_time', '<', $request->start_time) + ->where('end_time', '>', $request->start_time); + }); + }) + ->where('status', '!=', 'cancelled') // skip booking yang dibatalkan + ->exists(); if ($conflict) { return response()->json(['message' => 'Meja sudah dibooking di jam tersebut'], 409); @@ -45,4 +44,25 @@ public function store(Request $request) { return response()->json(['message' => 'Booking berhasil']); } + + public function getBookedSchedules(Request $request) { + $request->validate([ + 'table_id' => 'required|exists:tables,id', + 'date' => 'required|date', + ]); + + $bookings = Booking::where('table_id', $request->table_id) + ->whereDate('start_time', $request->date) + ->where('status', '!=', 'cancelled') + ->select('start_time', 'end_time') + ->get() + ->map(function ($booking) { + return [ + 'start' => Carbon::parse($booking->start_time)->format('H:i'), + 'end' => Carbon::parse($booking->end_time)->format('H:i') + ]; + }); + + return response()->json($bookings); + } } diff --git a/resources/views/pages/venue.blade.php b/resources/views/pages/venue.blade.php index 2d3442d..720f6ff 100644 --- a/resources/views/pages/venue.blade.php +++ b/resources/views/pages/venue.blade.php @@ -26,8 +26,8 @@ class="flex items-center bg-[url('/public/images/map.jpg')] bg-cover bg-center p @foreach ($venue['tables'] as $table) -
-
+
+
@@ -50,7 +50,10 @@ class="flex items-center bg-[url('/public/images/map.jpg')] bg-cover bg-center p @@ -88,21 +91,40 @@ function updateClock() { updateClock(); document.addEventListener('alpine:init', () => { - Alpine.data('booking', (isLoggedIn) => ({ + Alpine.data('booking', (isLoggedIn, tableId) => ({ isLoggedIn, + tableId, open: false, selectedTime: '', selectedDuration: '', isLoading: false, + bookedSchedules: [], getHoursInRange(startHour, endHour) { let hours = []; for (let i = startHour; i <= endHour; i++) { - hours.push(i); + hours.push(i.toString().padStart(2, '0')); } return hours; }, + isTimeBooked(time) { + const timeFormatted = time.padStart(5, '0'); + return this.bookedSchedules.some(schedule => { + return timeFormatted >= schedule.start && timeFormatted < schedule.end; + }); + }, + + async checkBookedSchedules() { + const today = new Date().toISOString().split('T')[0]; + try { + const response = await fetch(`/booking/schedules?table_id=${this.tableId}&date=${today}`); + this.bookedSchedules = await response.json(); + } catch (error) { + console.error('Error checking booked schedules:', error); + } + }, + submitBooking(tableId, tableName) { if (!this.isLoggedIn) { alert('Silahkan login terlebih dahulu untuk melakukan booking.'); diff --git a/routes/web.php b/routes/web.php index 6f152bc..e19d8be 100644 --- a/routes/web.php +++ b/routes/web.php @@ -10,9 +10,10 @@ use Illuminate\Support\Facades\Auth; Auth::routes(); -Route::get('/home', [HomeController::class, "index"])->name('index'); +Route::get('/', [HomeController::class, "index"])->name('index'); Route::get('/venue/{venueName}', [VenueController::class, "venue"])->name('venue'); Route::post('/booking', [BookingController::class, 'store'])->name('booking.store'); +Route::get('/booking/schedules', [BookingController::class, 'getBookedSchedules'])->name('booking.schedules'); Route::middleware(['auth', 'is_admin'])->prefix('admin')->group(function () { Route::get('/', [AdminController::class, 'index'])->name('admin.dashboard'); Route::get('/bookings', [BookingsController::class, 'index'])->name('admin.bookings.index');