diff --git a/pos/static/js/catalog.js b/pos/static/js/catalog.js index a775fc0..b91c53b 100644 --- a/pos/static/js/catalog.js +++ b/pos/static/js/catalog.js @@ -1,5 +1,6 @@ // /home/Autopartes/pos/static/js/catalog.js // Catalog UI: browsable inventory with cart, barcode scanner, external lookup +// Aligned with design-system catalog.html IDs and class names. (function () { 'use strict'; @@ -10,99 +11,201 @@ const headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' }; + // ─── DOM refs (design-system IDs) ─── + const productGrid = document.getElementById('productGrid'); + const emptyState = document.getElementById('emptyState'); + const emptyTitle = document.getElementById('emptyStateTitle'); + const emptySubtitle = document.getElementById('emptyStateSubtitle'); + const searchInput = document.getElementById('inp-part'); + const partSearchBtn = document.getElementById('partSearchBtn'); + const cartSidebar = document.getElementById('cartSidebar'); + const cartOverlay = document.getElementById('cartOverlay'); + const cartItemsEl = document.getElementById('cartItems'); + const cartEmptyEl = document.getElementById('cartEmpty'); + const cartSubtotalEl = document.getElementById('cartSubtotal'); + const cartTaxEl = document.getElementById('cartTax'); + const cartTotalEl = document.getElementById('cartTotal'); + const cartBadge = document.getElementById('cartBadge'); + const checkoutBtn = document.getElementById('checkoutBtn'); + const paginationNav = document.querySelector('.pagination'); + // ─── State ─── let currentPage = 1; let currentFilters = {}; let cartItems = JSON.parse(localStorage.getItem('pos_cart') || '[]'); let barcodeBuffer = ''; let barcodeTimeout = null; + let catalogItemsMap = {}; // id -> item for cart lookup // ─── API helpers ─── async function apiFetch(url, opts) { - const resp = await fetch(url, Object.assign({ headers: headers }, opts || {})); - if (resp.status === 401) { localStorage.removeItem('pos_token'); window.location.href = '/pos/login'; return null; } - return resp.json(); + try { + var resp = await fetch(url, Object.assign({ headers: headers }, opts || {})); + if (resp.status === 401) { + localStorage.removeItem('pos_token'); + window.location.href = '/pos/login'; + return null; + } + return resp.json(); + } catch (e) { + console.error('API fetch error:', e); + return null; + } } // ─── Catalog loading ─── async function loadCatalog(page, filters) { currentPage = page || 1; currentFilters = filters || currentFilters; - const params = new URLSearchParams({ page: currentPage, per_page: 30 }); + var params = new URLSearchParams({ page: currentPage, per_page: 30 }); if (currentFilters.q) params.set('q', currentFilters.q); if (currentFilters.category) params.set('category', currentFilters.category); if (currentFilters.brand) params.set('brand', currentFilters.brand); if (currentFilters.vehicle_brand) params.set('vehicle_brand', currentFilters.vehicle_brand); - const data = await apiFetch(API + '/catalog/search?' + params.toString()); + var data = await apiFetch(API + '/catalog/search?' + params.toString()); if (!data) return; - renderGrid(data.data || []); + var items = data.data || []; + renderGrid(items); renderPagination(data.pagination || {}); - renderActiveFilters(); + updateResultsCount(data.pagination || {}); } function renderGrid(items) { - const grid = document.getElementById('catalogGrid'); + // Clear demo/hardcoded cards + productGrid.innerHTML = ''; + if (!items.length) { - grid.innerHTML = '
No se encontraron productos
Buscando en bodegas...
'; + alert('Buscando "' + pn + '" en bodegas Nexus...'); var data = await apiFetch(API + '/catalog/external-availability/' + encodeURIComponent(pn)); if (!data || !data.data || !data.data.length) { - results.innerHTML = 'No se encontraron resultados externos para "' + escHtml(pn) + '"
'; + alert('No se encontraron resultados externos para "' + pn + '"'); return; } - results.innerHTML = '