Merge pull request 'fix: restore fallback verification button and error handling for North checkout' (#7) from feature/tablar-theme into master

Reviewed-on: #7
This commit was merged in pull request #7.
This commit is contained in:
2026-05-03 07:06:20 -04:00
5 changed files with 110 additions and 25 deletions
+3
View File
@@ -58,6 +58,7 @@ The Laravel framework is open-sourced software licensed under the [MIT license](
- **Searchable Dropdowns:** Integrated `TomSelect` across various forms (Checkout, Reprint Receipt, etc.) for enhanced usability.
- **Self-Checkout Flow:** Added a prominent self-checkout link for bidders, integrated with North Embedded Checkout.
- **Pickup Instructions:** Added clear instructions for bidders on the checkout completion page to proceed to the Item Pickup Table.
- **North Checkout Fallback:** Restored the manual "Verify Payment Status" button and enhanced error reporting for digital wallet payments (Google Pay).
#### Fixed
- **Logo Integration:** Corrected logo sizing issues using inline styles to override theme constraints.
@@ -66,6 +67,8 @@ The Laravel framework is open-sourced software licensed under the [MIT license](
- **Data Restoration:** Re-added bidder information and itemized winning lists to the checkout completion views.
#### Changed
- **Expanded Reports:** Standardized `bidderlist`, `showcarlist`, and `checkout_complete_list` to show full contact details (Address, City, State, Zip, Phone, Email).
- **Reporting Enhancements:** Added Year, Make, and Model to the `showcarlist` and included item numbers in the `checkout_complete_list` for improved tracking.
- **UI Cleanup:** Disabled default Tablar footers and notifications across all layout templates to maintain a focused auction interface.
- **Theme Consistency:** Updated various partials to ensure a seamless transition from the previous custom theme to Tablar.
+14 -6
View File
@@ -17,24 +17,32 @@
<div class="col-12">
<div class="card">
<div class="table-responsive">
<table class="table table-vcenter card-table">
<table class="table table-vcenter card-table text-nowrap">
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Last Name</th>
<th>First Name</th>
<th>Address</th>
<th>City</th>
<th>State</th>
<th>Zip</th>
<th>Phone</th>
<th>Email</th>
<th>Address</th>
</tr>
</thead>
<tbody>
@foreach($bidderlist_results as $bidder)
<tr>
<td>{{ $bidder->bidder_assigned_number }}</td>
<td>{{ $bidder->bidder_fname }} {{ $bidder->bidder_lname }}</td>
<td>{{ $bidder->bidder_phone }}</td>
<td>{{ $bidder->bidder_lname }}</td>
<td>{{ $bidder->bidder_fname }}</td>
<td>{{ $bidder->bidder_addr }}</td>
<td>{{ $bidder->bidder_city }}</td>
<td>{{ $bidder->bidder_state }}</td>
<td>{{ $bidder->bidder_zip }}</td>
<td>{{ \App\Helpers\PhoneHelper::format($bidder->bidder_phone) }}</td>
<td>{{ $bidder->bidder_email }}</td>
<td>{{ $bidder->bidder_addr }}, {{ $bidder->bidder_city }}</td>
</tr>
@endforeach
</tbody>
@@ -16,28 +16,47 @@
<div class="col-12">
<div class="card">
<div class="table-responsive">
<table class="table table-vcenter card-table">
<table class="table table-vcenter card-table text-nowrap">
<thead>
<tr>
<th>Bidder #</th>
<th>Name</th>
<th>Items Won</th>
<th>#</th>
<th>Last Name</th>
<th>First Name</th>
<th>Address</th>
<th>City</th>
<th>State</th>
<th>Zip</th>
<th>Phone</th>
<th>Email</th>
<th>Total</th>
<th>Payment</th>
<th>Payment Method</th>
<th>Items Won</th>
</tr>
</thead>
<tbody>
@foreach($checkout_complete_results as $c)
<tr>
<td>{{ $c->bidder_assigned_number }}</td>
<td>{{ $c->bidder_fname }} {{ $c->bidder_lname }}</td>
<td>{{ $c->bidder_lname }}</td>
<td>{{ $c->bidder_fname }}</td>
<td>{{ $c->bidder_addr }}</td>
<td>{{ $c->bidder_city }}</td>
<td>{{ $c->bidder_state }}</td>
<td>{{ $c->bidder_zip }}</td>
<td>{{ \App\Helpers\PhoneHelper::format($c->bidder_phone) }}</td>
<td>{{ $c->bidder_email }}</td>
<td>${{ number_format($c->winnertotal, 2) }}</td>
<td>
@if($c->payment_method == 1) Cash
@elseif($c->payment_method == 2) Check ({{ $c->check_number }})
@else Credit ({{ $c->cc_transaction }})
@endif
</td>
<td>
@foreach(\App\Models\WinningBids::with('items')->where('winning_bidder_num', $c->bidder_num)->get() as $bid)
{{ $bid->items->item_desc ?? 'N/A' }}<br>
<strong>#{{ $bid->items->item_assigned_num ?? '?' }}</strong> - {{ $bid->items->item_desc ?? 'N/A' }}<br>
@endforeach
</td>
<td>${{ number_format($c->winnertotal, 2) }}</td>
<td>{{ $c->payment_method == 1 ? 'Cash' : ($c->payment_method == 2 ? 'Check' : 'Credit') }}</td>
</tr>
@endforeach
</tbody>
+43 -2
View File
@@ -26,6 +26,7 @@
<div class="page-body">
<div class="container-xl">
<div class="card">
<div id="payment-error-container"></div>
<div class="card-body">
<div id="checkout-container">
<div class="text-center">
@@ -33,6 +34,13 @@
<div class="spinner-border" role="status"></div>
</div>
</div>
<div id="fallback-container" class="mt-4 text-center" style="display: none;">
<div class="hr-text">Still here?</div>
<p class="text-muted">If you have already completed your payment but the page hasn't redirected, please click the button below.</p>
<a id="verify-button" href="#" class="btn btn-info">
<i class="ti ti-shield-check me-2"></i>Verify Payment Status
</a>
</div>
</div>
</div>
</div>
@@ -67,19 +75,52 @@
return;
}
// Set up fallback button
const verifyUrl = `/north/verify/${bidderId}?sessionToken=${sessionToken}`;
const verifyButton = document.getElementById('verify-button');
const fallbackContainer = document.getElementById('fallback-container');
verifyButton.href = verifyUrl;
// Show fallback after 5 seconds to give user a manual way out if auto-redirect fails
setTimeout(() => {
fallbackContainer.style.display = 'block';
}, 5000);
await checkout.mount(sessionToken, 'checkout-container');
const handleCompletion = (result) => {
window.location.href = `/north/verify/${bidderId}?sessionToken=${sessionToken}`;
console.log('Payment complete event received:', result);
window.location.href = verifyUrl;
};
// Register standard completion events
checkout.onPaymentComplete(handleCompletion);
if (typeof checkout.onPaymentSuccess === 'function') {
checkout.onPaymentSuccess(handleCompletion);
}
// Handle errors
if (typeof checkout.onPaymentError === 'function') {
checkout.onPaymentError((error) => {
console.error('Payment Error:', error);
const errorDiv = document.createElement('div');
errorDiv.className = 'alert alert-danger alert-dismissible';
errorDiv.innerHTML = `
<div class="d-flex">
<div><i class="ti ti-alert-triangle me-2"></i></div>
<div>
<strong>Payment Error:</strong> ${error.message || 'An error occurred during payment.'}
</div>
</div>
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
`;
document.getElementById('payment-error-container').prepend(errorDiv);
});
}
} catch (error) {
console.error('Checkout Error:', error);
document.getElementById('checkout-container').innerHTML = '<div class="alert alert-danger">An error occurred. Please try again.</div>';
document.getElementById('checkout-container').innerHTML = '<div class="alert alert-danger">An error occurred while initializing checkout. Please try again.</div>';
}
});
</script>
+22 -8
View File
@@ -14,24 +14,38 @@
<div class="container-xl">
<div class="card">
<div class="table-responsive">
<table class="table table-vcenter card-table" id="showcars-table">
<table class="table table-vcenter card-table text-nowrap" id="showcars-table">
<thead>
<tr>
<th class="sort" data-sort="bidder-num">Bidder #</th>
<th class="sort" data-sort="bidder-num">#</th>
<th class="sort" data-sort="lname">Last Name</th>
<th class="sort" data-sort="fname">First Name</th>
<th>Address</th>
<th>City</th>
<th>State</th>
<th>Zip</th>
<th>Phone</th>
<th>Email</th>
<th class="sort" data-sort="year">Year</th>
<th class="sort" data-sort="make">Make</th>
<th class="sort" data-sort="model">Model</th>
<th class="sort" data-sort="year">Year</th>
<th class="sort" data-sort="owner">Owner</th>
</tr>
</thead>
<tbody class="list">
@foreach($showcarlist_results as $vehicle)
<tr>
<td class="bidder-num">{{ $vehicle->bidder_assigned_number ?? 'N/A' }}</td>
<td class="bidder-num">{{ $vehicle->bidder_assigned_number }}</td>
<td class="lname">{{ $vehicle->bidder_lname }}</td>
<td class="fname">{{ $vehicle->bidder_fname }}</td>
<td>{{ $vehicle->bidder_addr }}</td>
<td>{{ $vehicle->bidder_city }}</td>
<td>{{ $vehicle->bidder_state }}</td>
<td>{{ $vehicle->bidder_zip }}</td>
<td>{{ \App\Helpers\PhoneHelper::format($vehicle->bidder_phone) }}</td>
<td>{{ $vehicle->bidder_email }}</td>
<td class="year">{{ $vehicle->year }}</td>
<td class="make">{{ $vehicle->make }}</td>
<td class="model">{{ $vehicle->model }}</td>
<td class="year">{{ $vehicle->year }}</td>
<td class="owner">{{ $vehicle->bidder_fname }} {{ $vehicle->bidder_lname }}</td>
</tr>
@endforeach
</tbody>
@@ -46,7 +60,7 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/list.js/2.3.1/list.min.js"></script>
<script>
new List('showcars-table', {
valueNames: ['bidder-num', 'make', 'model', 'year', 'owner']
valueNames: ['bidder-num', 'lname', 'fname', 'year', 'make', 'model']
});
</script>
@endsection