Ir al contenido
// ======================================================== // RECONSTRUCCIÓN BLINDADA DE BOTONES Y SELECTOR MAYORISTA // ======================================================== (function() { function forzarEstructuraMayorista() { // Buscamos todas las tarjetas de producto en el Home (snippets/carruseles) const tarjetas = document.querySelectorAll('.o_carousel_product_card, .oe_product_cart'); tarjetas.forEach(function(tarjeta) { // Si ya le inyectamos nuestro contenedor, la salteamos para no duplicar if (tarjeta.querySelector('.coti-mayorista-wrapper')) return; // Buscamos la sección de información o el título para colgarnos de ahí const infoText = tarjeta.querySelector('.o_wsale_product_information_text') || tarjeta.querySelector('.o_wsale_product_information'); if (infoText) { // Creamos un contenedor limpio para nuestra lógica const wrapper = document.createElement('div'); wrapper.className = 'coti-mayorista-wrapper mt-2 pt-2 border-top w-100'; // 1. Intentamos recuperar el ID del producto (Odoo suele dejarlo en un input oculto) const hiddenInput = tarjeta.querySelector('input[name="product-id"], input[name="product_id"]'); const prodId = hiddenInput ? (hiddenInput.getAttribute('data-product-id') || hiddenInput.value) : ''; // 2. Armamos el HTML del Selector de Cantidad (+ / -) y el Botón de Compra wrapper.innerHTML = `
`; // 3. Lo inyectamos al final del bloque de texto de la tarjeta infoText.appendChild(wrapper); // 4. Le damos vida al botón para que mande la cantidad correcta y mute a "Agregado" const botonAgregar = wrapper.querySelector('.coti-add-btn'); botonAgregar.addEventListener('click', function(e) { e.preventDefault(); e.stopPropagation(); const inputCantidad = wrapper.querySelector('.coti-input'); const cantidad = inputCantidad.value || 1; // Buscamos si Odoo tiene un botón nativo oculto para simular el click, // o le seteamos el atributo de cantidad al que acabamos de crear para el controlador nativo const nativeBtn = tarjeta.querySelector('.js_add_cart'); if (nativeBtn) { const nativeInput = tarjeta.querySelector('input[name="add_qty"]'); if (nativeInput) nativeInput.value = cantidad; nativeBtn.setAttribute('data-quantity', cantidad); nativeBtn.click(); } else { // Si Odoo barrió el botón nativo, le pasamos los datos a nuestro evento botonAgregar.setAttribute('data-quantity', cantidad); // Trigger estándar de Odoo para añadir al carro por mutación de atributos botonAgregar.classList.add('js_add_cart'); botonAgregar.click(); botonAgregar.classList.remove('js_add_cart'); } // Efecto visual instantáneo de éxito: "Agregado ✅" botonAgregar.className = 'btn btn-success btn-sm w-100 d-flex align-items-center justify-content-center gap-2'; botonAgregar.style.backgroundColor = '#28a745'; botonAgregar.style.borderColor = '#28a745'; botonAgregar.innerHTML = 'Agregado'; // Deshabilitamos temporalmente para evitar doble click accidental botonAgregar.disabled = true; setTimeout(() => { botonAgregar.className = 'btn btn-primary btn-sm w-100 coti-add-btn d-flex align-items-center justify-content-center gap-2'; botonAgregar.style.backgroundColor = ''; botonAgregar.style.borderColor = ''; botonAgregar.innerHTML = 'Agregar al carrito'; botonAgregar.disabled = false; inputCantidad.value = 1; }, 2000); }); } }); } // Ejecución continua cada 500ms para ganarle a la carga asrincrónica del Home setInterval(forzarEstructuraMayorista, 500); })();