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:
2026-04-01 21:02:30 +00:00
parent 2848b4c181
commit 168a5df50a
2 changed files with 47 additions and 26 deletions

View File

@@ -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 = {

View File

@@ -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>