brands category

This commit is contained in:
Bayu Lukman Yusuf 2026-01-09 13:33:47 +07:00
parent 3b91c813da
commit 3a66f08579
2 changed files with 83 additions and 4 deletions

View File

@ -96,6 +96,7 @@ class ProductController extends Controller
'sort' => $sortBy, 'sort' => $sortBy,
'category_id' => $filter['category'] ?? null, 'category_id' => $filter['category'] ?? null,
'gender_id' => $filter['gender'] ?? null, 'gender_id' => $filter['gender'] ?? null,
'brand_id' => $filter['brand'] ?? null,
'search' => $search, 'search' => $search,
'location_id' => $location_id, 'location_id' => $location_id,
'is_consignment' => $is_consignment, 'is_consignment' => $is_consignment,
@ -142,6 +143,16 @@ class ProductController extends Controller
} }
} }
if (isset($filter['brand']) && $filter['brand']) {
$brand = \App\Models\Brand::find($filter['brand']);
if ($brand) {
$filter['brand'] = $brand->name;
} else {
unset($filter);
}
}
$filters = $filter; $filters = $filter;
return response()->json([ return response()->json([
@ -179,12 +190,17 @@ class ProductController extends Controller
$brandRepository = new \App\Repositories\Catalog\BrandRepository; $brandRepository = new \App\Repositories\Catalog\BrandRepository;
$brands = $brandRepository->getList([]); $brands = $brandRepository->getList([]);
// Render brand HTML // Render brand links HTML
$brandHtml = ''; $brandHtml = '';
$currentBrandId = $request->input('current_brand');
foreach ($brands as $brand) { foreach ($brands as $brand) {
$brandHtml .= '<a class="swiper-slide text-body" href="' . route('product.index', ['brand' => $brand->slug]) . '" aria-label="' . $brand->name . '">'; $isActive = $currentBrandId == $brand->id;
$brandHtml .= '<img src="' . $brand->image_url . '" alt="' . $brand->name . '" class="object-fit-contain">'; $brandHtml .= '<li class="nav-item mb-1">';
$brandHtml .= '</a>'; $brandHtml .= '<a class="nav-link d-block fw-normal p-0 ' . ($isActive ? 'active text-primary' : '') . '" ';
$brandHtml .= 'href="#" data-brand-id="' . $brand->id . '">';
$brandHtml .= $brand->name;
$brandHtml .= '</a></li>';
} }
return response()->json([ return response()->json([

View File

@ -75,6 +75,27 @@
</div> </div>
</div> </div>
<!-- Brands -->
<div class="accordion-item border-0 pb-1 pb-xl-2">
<h4 class="accordion-header" id="headingBrands">
<button type="button" class="accordion-button p-0 pb-3" data-bs-toggle="collapse"
data-bs-target="#brands" aria-expanded="true" aria-controls="brands">
Brands
</button>
</h4>
<div class="accordion-collapse collapse show" id="brands"
aria-labelledby="headingBrands">
<div class="accordion-body p-0 pb-4 mb-1 mb-xl-2">
<div style="height: 220px" data-simplebar data-simplebar-auto-hide="false">
<ul class="nav flex-column gap-2 pe-3" id="brands-list">
<!-- Brands will be loaded here via AJAX -->
</ul>
</div>
</div>
</div>
</div>
<!-- Price --> <!-- Price -->
<div class="accordion-item border-0 pb-1 pb-xl-2"> <div class="accordion-item border-0 pb-1 pb-xl-2">
<h4 class="accordion-header" id="headingPrice"> <h4 class="accordion-header" id="headingPrice">
@ -654,6 +675,7 @@
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
loadGenders(); loadGenders();
loadCategories(); loadCategories();
loadBrands();
loadProducts(); loadProducts();
// Handle sort change // Handle sort change
@ -827,6 +849,7 @@
loadGenders(); loadGenders();
loadCategories(); loadCategories();
loadBrands();
loadProducts(Object.fromEntries(urlParams.entries())); loadProducts(Object.fromEntries(urlParams.entries()));
} }
@ -856,6 +879,7 @@
loadGenders(); loadGenders();
loadCategories(); loadCategories();
loadBrands();
loadProducts(Object.fromEntries(urlParams.entries())); loadProducts(Object.fromEntries(urlParams.entries()));
} }
@ -939,6 +963,45 @@
}); });
} }
function loadBrands() {
const currentBrandId = new URLSearchParams(window.location.search).get('filter[brand]');
fetch(`{{ route('product.ajax.brands') }}?current_brand=${currentBrandId || ''}`, {
headers: {
'X-Requested-With': 'XMLHttpRequest',
'Accept': 'application/json'
}
})
.then(response => response.json())
.then(data => {
if (data.success) {
document.getElementById('brands-list').innerHTML = data.brands;
// Attach event listeners to newly loaded brand links
const brandLinks = document.querySelectorAll('#brands-list a[data-brand-id]');
brandLinks.forEach(link => {
link.addEventListener('click', function(e) {
e.preventDefault();
// Remove active class from all brand links
brandLinks.forEach(b => b.classList.remove('active', 'text-primary'));
// Add active class to clicked link
this.classList.add('active', 'text-primary');
const brandId = this.getAttribute('data-brand-id');
loadProducts({
'filter[brand]': brandId
});
});
});
}
})
.catch(error => {
console.error('Error loading brands:', error);
document.getElementById('brands-list').innerHTML =
'<li class="nav-item mb-1"><span class="text-danger">Error loading brands</span></li>';
});
}
function loadProducts(params = {}) { function loadProducts(params = {}) {
// Prevent multiple simultaneous calls // Prevent multiple simultaneous calls
if (isLoading) { if (isLoading) {