Files
Autoparts-DB/pos/static/js/onboarding.min.js
consultoria-as 21959f1b37 FASE 7d: Lazy Loading + Minificación + Auto-serve minified
Cambios implementados:

1. Lazy loading de imágenes:
   - catalog.js: loading="lazy" decoding="async" en part cards y detail panel
   - inventory.js: lazy loading en imagen de detalle de item

2. Minificación de assets:
   - scripts/minify-assets.sh: minifica JS (terser) y CSS para POS y Dashboard
   - 25 archivos .min.js + 5 .min.css generados en pos/static/
   - 14 archivos .min.js + 8 .min.css generados en dashboard/

3. Nginx auto-serve minified:
   - try_files $1.min.js antes de servir .js original
   - try_files $1.min.css antes de servir .css original
   - Transparente para los templates HTML (cero cambios en HTML)

4. Cache warming script:
   - scripts/warm_vehicle_cache.py: pobla Redis con vehicle info por batches
   - Mitiga DISTINCT ON + 4 JOINs sobre 2B filas
   - Corre en background, procesa ~1.5M parts

Tests: 73/73 pasando
2026-04-27 08:34:24 +00:00

1 line
7.9 KiB
JavaScript

!function(){"use strict";if("true"!==localStorage.getItem("pos_onboarding_done")){var e,a,n=0,o={branchRenamed:!1,productCreated:!1,employeeCreated:!1},t=[function(){var e="";try{e=localStorage.getItem("pos_business_name")||""}catch(e){}var a=e||"tu negocio";return i("div",{className:"onb-step-enter"},[i("div",{className:"onb-icon"},["🚀"]),i("h2",{className:"onb-title"},"Bienvenido a Nexus POS"),i("p",{className:"onb-desc"},"Vamos a configurar "+a+" en unos minutos. Este asistente te guiara por los pasos esenciales para empezar a vender.")])},function(){var e=i("div",{className:"onb-step-enter"},[i("div",{className:"onb-icon"},["🏪"]),i("h2",{className:"onb-title"},"Tu Primera Sucursal"),i("p",{className:"onb-desc"},'Ya creamos la sucursal "Principal" para ti. Puedes renombrarla si quieres.')]),a=i("input",{className:"onb-input",type:"text",placeholder:"Principal",value:"Principal",id:"onb-branch-name"}),n=i("div",{className:"onb-error",id:"onb-branch-msg"});return e.appendChild(i("div",{className:"onb-form"},[i("div",{className:"onb-field"},[i("label",{className:"onb-label"},"Nombre de sucursal"),a,n])])),e},function(){var e=i("div",{className:"onb-step-enter"},[i("div",{className:"onb-icon"},["📦"]),i("h2",{className:"onb-title"},"Agrega Tu Primer Producto"),i("p",{className:"onb-desc"},"Registra una pieza para probar el sistema. Despues podras agregar mas desde Inventario.")]);if(o.productCreated)return e.appendChild(i("div",{className:"onb-success"},["✅ ","Producto creado exitosamente."])),e;var a=i("div",{className:"onb-error",id:"onb-product-msg"});return e.appendChild(i("div",{className:"onb-form"},[i("div",{className:"onb-field"},[i("label",{className:"onb-label"},"Numero de parte"),i("input",{className:"onb-input",type:"text",id:"onb-pn",placeholder:"Ej: FIL-ACE-001"})]),i("div",{className:"onb-field"},[i("label",{className:"onb-label"},"Nombre"),i("input",{className:"onb-input",type:"text",id:"onb-pname",placeholder:"Ej: Filtro de aceite"})]),i("div",{className:"onb-field"},[i("label",{className:"onb-label"},"Precio de venta ($)"),i("input",{className:"onb-input",type:"number",id:"onb-pprice",placeholder:"0.00",min:"0",step:"0.01"})]),i("div",{className:"onb-field"},[i("label",{className:"onb-label"},"Stock inicial"),i("input",{className:"onb-input",type:"number",id:"onb-pstock",placeholder:"0",min:"0",step:"1"})]),a])),e},function(){var e=i("div",{className:"onb-step-enter"},[i("div",{className:"onb-icon"},["👤"]),i("h2",{className:"onb-title"},"Crea Tu Primer Empleado"),i("p",{className:"onb-desc"},"Agrega un usuario para el punto de venta. El PIN se usara para iniciar turno.")]);if(o.employeeCreated)return e.appendChild(i("div",{className:"onb-success"},["✅ ","Empleado creado exitosamente."])),e;var a=i("div",{className:"onb-error",id:"onb-emp-msg"});return e.appendChild(i("div",{className:"onb-form"},[i("div",{className:"onb-field"},[i("label",{className:"onb-label"},"Nombre"),i("input",{className:"onb-input",type:"text",id:"onb-ename",placeholder:"Ej: Juan Perez"})]),i("div",{className:"onb-field"},[i("label",{className:"onb-label"},"PIN (4 digitos)"),i("input",{className:"onb-input",type:"password",id:"onb-epin",placeholder:"****",maxlength:"4"})]),i("div",{className:"onb-field"},[i("label",{className:"onb-label"},"Rol"),i("select",{className:"onb-select",id:"onb-erole"},[i("option",{value:"cashier"},"Cajero"),i("option",{value:"warehouse"},"Almacenista"),i("option",{value:"admin"},"Administrador"),i("option",{value:"accountant"},"Contador")])]),a])),e},function(){return i("div",{className:"onb-step-enter"},[i("div",{className:"onb-icon"},["✅"]),i("h2",{className:"onb-title"},"Listo! Tu Sistema Esta Configurado"),i("p",{className:"onb-desc"},"Ya puedes empezar a usar Nexus POS. Aqui tienes accesos rapidos:"),i("div",{className:"onb-links"},[i("a",{className:"onb-link-card",href:"/pos/catalog"},[i("span",{className:"onb-link-icon"},"📖"),"Catalogo"]),i("a",{className:"onb-link-card",href:"/pos/"},[i("span",{className:"onb-link-icon"},"💻"),"Punto de Venta"]),i("a",{className:"onb-link-card",href:"/pos/inventory"},[i("span",{className:"onb-link-icon"},"📦"),"Inventario"])])])}],s=[l,async function(){var e=document.getElementById("onb-branch-name");e&&e.value.trim()&&(o.branchRenamed=!0),l()},async function(){if(o.productCreated)l();else{var e=(document.getElementById("onb-pn")||{}).value||"",a=(document.getElementById("onb-pname")||{}).value||"",n=parseFloat((document.getElementById("onb-pprice")||{}).value)||0,t=parseInt((document.getElementById("onb-pstock")||{}).value)||0,s=document.getElementById("onb-product-msg");if(e.trim()&&a.trim())try{s&&(s.textContent=""),await r("/pos/api/inventory/items",{method:"POST",body:JSON.stringify({part_number:e.trim(),name:a.trim(),price_1:n,initial_stock:t})}),o.productCreated=!0,m(),setTimeout(l,800)}catch(e){s&&(s.textContent=e.message||"Error al crear producto.")}else s&&(s.textContent="Numero de parte y nombre son obligatorios.")}},async function(){if(o.employeeCreated)l();else{var e=(document.getElementById("onb-ename")||{}).value||"",a=(document.getElementById("onb-epin")||{}).value||"",n=(document.getElementById("onb-erole")||{}).value||"cashier",t=document.getElementById("onb-emp-msg");if(e.trim())if(!a||a.length<4)t&&(t.textContent="El PIN debe tener al menos 4 digitos.");else try{t&&(t.textContent=""),await r("/pos/api/config/employees",{method:"POST",body:JSON.stringify({name:e.trim(),pin:a,role:n})}),o.employeeCreated=!0,m(),setTimeout(l,800)}catch(e){t&&(t.textContent=e.message||"Error al crear empleado.")}else t&&(t.textContent="El nombre es obligatorio.")}},function(){c()}];"loading"===document.readyState?document.addEventListener("DOMContentLoaded",p):p()}function i(e,a,n){var o=document.createElement(e);return a&&Object.keys(a).forEach((function(e){"className"===e?o.className=a[e]:0===e.indexOf("on")?o.addEventListener(e.slice(2).toLowerCase(),a[e]):o.setAttribute(e,a[e])})),n&&(Array.isArray(n)||(n=[n]),n.forEach((function(e){"string"==typeof e?o.appendChild(document.createTextNode(e)):e&&o.appendChild(e)}))),o}async function r(e,a){var n=function(){try{return localStorage.getItem("pos_token")||""}catch(e){return""}}(),o={"Content-Type":"application/json"};n&&(o.Authorization="Bearer "+n);var t=await fetch(e,Object.assign({headers:o},a||{})),s=await t.json();if(!t.ok)throw new Error(s.error||"Error "+t.status);return s}function l(){n<4&&(n++,m())}function d(){l()}function c(){localStorage.setItem("pos_onboarding_done","true"),e&&e.parentNode&&(e.style.opacity="0",e.style.transition="opacity var(--duration-normal) var(--ease-in)",setTimeout((function(){e.parentNode.removeChild(e)}),250))}function m(){a.innerHTML="",a.appendChild(t[n]()),function(){var a=e.querySelector(".onboarding-footer");if(!a)return;a.innerHTML="";var t=i("div",{className:"onb-actions"});0===n?t.appendChild(i("span")):n<4?t.appendChild(i("button",{className:"onb-btn onb-btn--ghost",onClick:d},"Saltar")):t.appendChild(i("span"));var r=["Empezar","Siguiente","Guardar Producto","Guardar Empleado","Ir al Sistema"],l=i("button",{className:"onb-btn onb-btn--primary",onClick:s[n]},r[n]);2===n&&o.productCreated&&(l.textContent="Siguiente");3===n&&o.employeeCreated&&(l.textContent="Siguiente");t.appendChild(l),a.appendChild(t);for(var c=i("div",{className:"onb-progress"}),m=0;m<5;m++){var p="onb-dot";m===n?p+=" is-active":m<n&&(p+=" is-done"),c.appendChild(i("div",{className:p}))}if(a.appendChild(c),a.appendChild(i("div",{className:"onb-step-label"},n+1+" de 5")),4===n){var b=i("input",{type:"checkbox",id:"onb-dismiss-cb",checked:"checked"});a.appendChild(i("div",{className:"onb-dismiss-row"},[b,i("label",{for:"onb-dismiss-cb"},"No mostrar de nuevo")]))}}()}function p(){(e=i("div",{className:"onboarding-overlay"})).addEventListener("click",(function(a){a.target===e&&c()}));var n=i("div",{className:"onboarding-modal"});a=i("div",{className:"onboarding-body"});var o=i("div",{className:"onboarding-footer"});n.appendChild(a),n.appendChild(o),e.appendChild(n),document.body.appendChild(e),m()}}();