From 9a23e75f5b338d62bfadcb9f81461fc6b30e673c Mon Sep 17 00:00:00 2001 From: Bayu Lukman Yusuf Date: Mon, 26 Jan 2026 11:26:57 +0700 Subject: [PATCH] state cart null --- app/Http/Controllers/CartController.php | 14 + .../Member/Cart/MemberCartRepository.php | 8 + resources/views/checkout/v1-cart.blade.php | 944 +++++++++++------- .../views/components/layout/header.blade.php | 13 +- routes/web.php | 1 + 5 files changed, 630 insertions(+), 350 deletions(-) diff --git a/app/Http/Controllers/CartController.php b/app/Http/Controllers/CartController.php index 3fc803b..b2e0136 100644 --- a/app/Http/Controllers/CartController.php +++ b/app/Http/Controllers/CartController.php @@ -79,4 +79,18 @@ class CartController extends Controller return redirect()->route('cart.index'); } + + public function clear(MemberCartRepository $repository) + { + $repository->clearAll(); + + if (request()->expectsJson()) { + return response()->json([ + 'success' => true, + 'message' => 'Cart cleared successfully' + ]); + } + + return redirect()->route('cart.index'); + } } diff --git a/app/Repositories/Member/Cart/MemberCartRepository.php b/app/Repositories/Member/Cart/MemberCartRepository.php index d401c40..ad986d2 100644 --- a/app/Repositories/Member/Cart/MemberCartRepository.php +++ b/app/Repositories/Member/Cart/MemberCartRepository.php @@ -16,6 +16,14 @@ class MemberCartRepository ->sum('qty'); } + static public function clearAll($locationId = null) + { + $location = $locationId ?? session('location_id', 22); + return Cart::where('user_id', auth()->user()->id) + ->where('location_id', $location) + ->delete(); + } + public function getList($request) diff --git a/resources/views/checkout/v1-cart.blade.php b/resources/views/checkout/v1-cart.blade.php index 73e7951..8011e6f 100644 --- a/resources/views/checkout/v1-cart.blade.php +++ b/resources/views/checkout/v1-cart.blade.php @@ -56,29 +56,44 @@ - - @foreach ($carts as $key => $cart) - - -
- - {{ $cart->name ?? 'Product' }} + @if ($carts->count() == 0) + + +
+ +
Your cart is empty
+

Looks like you haven't added any items to your + cart yet.

+
+ Start Shopping - + + + @else + @foreach ($carts as $key => $cart) + + +
+ + {{ $cart->name ?? 'Product' }} + +
+
+ {{ $cart->itemVariant->display_name ?? ($cart->itemVariant->description ?? 'Product Name') }} +
+ {{--
  • Color: {{ $cart->color ?? 'N/A' }}
  • Model: ${{ number_format($cart->itemReference->display_price ?? 0, 2) }}
--}} -
- - - +
+ + + +
-
- - - - Rp {{ number_format($cart->itemVariant->display_price ?? 0, 0,",",".") }} - -
- - - -
- - Rp {{ number_format(($cart->display_price ?? 0) * ($cart->qty ?? 1), 0,",",".") }} - -
- @csrf - @method('DELETE') - -
- - - @endforeach + + + + Rp {{ number_format($cart->itemVariant->display_price ?? 0, 0, ',', '.') }} + + +
+ + + +
+ + Rp + {{ number_format(($cart->display_price ?? 0) * ($cart->qty ?? 1), 0, ',', '.') }} + + +
+ @csrf + @method('DELETE') + +
+ + + @endforeach + @endif @@ -728,249 +756,477 @@ + + + + + + @include('layouts.partials/footer') @endsection @section('scripts') - + // Add backdrop + const backdrop = document.createElement('div'); + backdrop.className = 'modal-backdrop fade show'; + backdrop.id = 'clearCartBackdrop'; + document.body.appendChild(backdrop); + + // Handle close buttons + const closeButtons = modalElement.querySelectorAll('[data-bs-dismiss="modal"]'); + closeButtons.forEach(button => { + button.onclick = hideModal; + }); + + // Handle backdrop click + backdrop.onclick = hideModal; + } + } + } + + // Function to hide the clear cart modal + function hideModal() { + const modalElement = document.getElementById('clearCartModal'); + const backdrop = document.getElementById('clearCartBackdrop'); + + if (modalElement) { + modalElement.style.display = 'none'; + modalElement.classList.remove('show'); + modalElement.removeAttribute('aria-modal'); + modalElement.removeAttribute('role'); + } + + if (backdrop) { + backdrop.remove(); + } + } + + // Function to actually clear the cart (called when confirm button is clicked) + async function executeClearCart() { + try { + const response = await fetch('cart/clear', { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute( + 'content'), + 'Accept': 'application/json' + } + }); + + if (response.ok) { + const result = await response.json(); + if (result.success) { + // Hide modal first + hideModal(); + + // Remove all cart rows from the table + const cartRows = document.querySelectorAll('tbody tr[data-cart-id]'); + cartRows.forEach(row => row.remove()); + + // Update cart count in header + updateCartCount(); + + // Recalculate totals (should be zero now) + calculateCartTotals(); + + // Optionally show a success message + console.log('Cart cleared successfully'); + } + } else { + console.error('Error clearing cart:', await response.json()); + } + } catch (error) { + console.error('Network error:', error); + } + } + @endsection diff --git a/resources/views/components/layout/header.blade.php b/resources/views/components/layout/header.blade.php index b3ec196..dea96e2 100644 --- a/resources/views/components/layout/header.blade.php +++ b/resources/views/components/layout/header.blade.php @@ -258,15 +258,16 @@ style="--cz-badge-padding-y: .25em; --cz-badge-padding-x: .42em">{{ auth()->check() ? \App\Repositories\Member\Cart\MemberCartRepository::getCount() : 0 }} --}} - - {{ auth()->check() ? \App\Repositories\Member\Cart\MemberCartRepository::getCount() : 0 }} + @if (auth()->check() && \App\Repositories\Member\Cart\MemberCartRepository::getCount() > 0) + {{ auth()->check() ? \App\Repositories\Member\Cart\MemberCartRepository::getCount() : 0 }} + @endif - +
diff --git a/routes/web.php b/routes/web.php index 05656e8..f04442e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -91,6 +91,7 @@ Route::middleware(['auth'])->prefix('/cart')->group(function () { Route::get('/', [CartController::class, 'index'])->name('cart.index'); Route::post('/', [CartController::class, 'add'])->name('cart.add'); Route::put('/{id}', [CartController::class, 'update'])->name('cart.update'); + Route::delete('/clear', [CartController::class, 'clear'])->name('cart.clear'); Route::delete('/{id}', [CartController::class, 'delete'])->name('cart.delete'); Route::get('/count', [CartController::class, 'count'])->name('cart.count'); }); \ No newline at end of file