fix(pos): filtros de catalogo dinamicos por marca del inventario
- Chips de filtro se cargan desde API /catalog/brands - Muestran marcas reales (Bosch, KYB, NGK...) con conteo - Boton 'Todos' para quitar filtro - Filtrado por brand via API en vez de category_id Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -392,25 +392,52 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─── Filter chips ───
|
// ─── Filter chips (dynamic from inventory brands) ───
|
||||||
document.querySelectorAll('[data-chip]').forEach(function (chip) {
|
async function loadBrandChips() {
|
||||||
chip.addEventListener('click', function () {
|
var data = await apiFetch(API + '/catalog/brands');
|
||||||
var isActive = chip.classList.contains('is-active');
|
if (!data || !data.data) return;
|
||||||
// Deactivate all chips first for single-select behavior
|
var container = document.getElementById('brandChips');
|
||||||
document.querySelectorAll('[data-chip]').forEach(function (c) {
|
if (!container) return;
|
||||||
c.classList.remove('is-active');
|
container.innerHTML = '';
|
||||||
c.setAttribute('aria-pressed', 'false');
|
data.data.forEach(function(b) {
|
||||||
});
|
var btn = document.createElement('button');
|
||||||
if (!isActive) {
|
btn.className = 'chip';
|
||||||
chip.classList.add('is-active');
|
btn.setAttribute('data-chip', b.name);
|
||||||
chip.setAttribute('aria-pressed', 'true');
|
btn.setAttribute('aria-pressed', 'false');
|
||||||
currentFilters.category = chip.dataset.chip;
|
btn.textContent = b.name + ' (' + b.count + ')';
|
||||||
} else {
|
container.appendChild(btn);
|
||||||
delete currentFilters.category;
|
|
||||||
}
|
|
||||||
loadCatalog(1, currentFilters);
|
|
||||||
});
|
});
|
||||||
});
|
// Re-wire all chip clicks (including the "Todos" chip)
|
||||||
|
wireChipClicks();
|
||||||
|
}
|
||||||
|
|
||||||
|
function wireChipClicks() {
|
||||||
|
document.querySelectorAll('[data-chip]').forEach(function (chip) {
|
||||||
|
chip.addEventListener('click', function () {
|
||||||
|
var isActive = chip.classList.contains('is-active');
|
||||||
|
document.querySelectorAll('[data-chip]').forEach(function (c) {
|
||||||
|
c.classList.remove('is-active');
|
||||||
|
c.setAttribute('aria-pressed', 'false');
|
||||||
|
});
|
||||||
|
if (!isActive && chip.dataset.chip) {
|
||||||
|
chip.classList.add('is-active');
|
||||||
|
chip.setAttribute('aria-pressed', 'true');
|
||||||
|
currentFilters.brand = chip.dataset.chip;
|
||||||
|
delete currentFilters.chip;
|
||||||
|
} else {
|
||||||
|
// "Todos" or deselect
|
||||||
|
document.querySelector('[data-chip=""]').classList.add('is-active');
|
||||||
|
document.querySelector('[data-chip=""]').setAttribute('aria-pressed', 'true');
|
||||||
|
delete currentFilters.brand;
|
||||||
|
delete currentFilters.chip;
|
||||||
|
}
|
||||||
|
loadCatalog(1, currentFilters);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
loadBrandChips();
|
||||||
|
wireChipClicks();
|
||||||
|
|
||||||
// ─── Expose globals for inline onclick handlers ───
|
// ─── Expose globals for inline onclick handlers ───
|
||||||
window.CatalogApp = {
|
window.CatalogApp = {
|
||||||
|
|||||||
@@ -1857,14 +1857,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="filters-row">
|
<div class="filters-row">
|
||||||
<span class="filters-label">Filtrar:</span>
|
<span class="filters-label">Filtrar:</span>
|
||||||
<button class="chip is-active" data-chip="frenos" aria-pressed="true">Frenos</button>
|
<button class="chip is-active" data-chip="" aria-pressed="true">Todos</button>
|
||||||
<button class="chip" data-chip="motor" aria-pressed="false">Motor</button>
|
<span id="brandChips"><!-- loaded by catalog.js --></span>
|
||||||
<button class="chip" data-chip="suspension" aria-pressed="false">Suspensión</button>
|
|
||||||
<button class="chip" data-chip="electrico" aria-pressed="false">Eléctrico</button>
|
|
||||||
<button class="chip" data-chip="transmision" aria-pressed="false">Transmisión</button>
|
|
||||||
<button class="chip" data-chip="escape" aria-pressed="false">Escape</button>
|
|
||||||
<button class="chip" data-chip="carroceria" aria-pressed="false">Carrocería</button>
|
|
||||||
<button class="chip" data-chip="enfriamiento" aria-pressed="false">Enfriamiento</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user