Advertisement
oscarviedma

vCardRestaurante - Código Google Apps Script + Funcionalidad Menú - Actualizado

Aug 30th, 2024
821
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 21.87 KB | None | 0 0
  1. <div id="preloader" class="loadingio-spinner-rolling-zt8qwybayi">
  2.   <div class="ldio-pk6mhbe1fco">
  3.     <div></div>
  4.   </div>
  5. </div>
  6.  
  7. <section id="ov-listado-menu">
  8. <!-- Aquí es donde se cargará el contenido dinámico -->
  9. </section>
  10.  
  11. <script>
  12. // Función para actualizar la pestaña activa y hacer scroll horizontal según la posición de scroll
  13. function updateActiveTab() {
  14.   var tabLinks = document.querySelectorAll('#tabs a');
  15.   var sections = document.querySelectorAll('.titulo-seccion');
  16.   var scrollPosition = document.querySelector('.contenido').scrollTop;
  17.   var offset = -50;
  18.   sections.forEach(function(section, index) {
  19.     var sectionTop = section.offsetTop;
  20.     var sectionHeight = section.offsetHeight;
  21.     if (scrollPosition >= sectionTop - offset && scrollPosition < sectionTop + sectionHeight - offset) {
  22.      tabLinks.forEach(function(link) {
  23.        link.classList.remove('active');
  24.       });
  25.       tabLinks[index].classList.add('active');
  26.       // Hacer scroll horizontal para mostrar la pestaña activa
  27.       var tabsContainer = document.getElementById('tabs');
  28.       var activeTab = tabLinks[index];
  29.       var tabLeft = activeTab.offsetLeft;
  30.       var tabWidth = activeTab.offsetWidth;
  31.       var tabsWidth = tabsContainer.offsetWidth;
  32.       var tabsScrollLeft = tabsContainer.scrollLeft;
  33.       if (tabLeft < tabsScrollLeft) {
  34.        tabsContainer.scrollTo({
  35.          left: tabLeft,
  36.          behavior: 'smooth'
  37.        });
  38.      } else if (tabLeft + tabWidth > tabsScrollLeft + tabsWidth) {
  39.         tabsContainer.scrollTo({
  40.           left: tabLeft + tabWidth - tabsWidth,
  41.           behavior: 'smooth'
  42.         });
  43.       }
  44.     }
  45.   });
  46. }
  47.  
  48. // Función para mostrar el precargador
  49. function showPreloader() {
  50.   document.getElementById('preloader').style.display = 'block';
  51.   document.getElementById('ov-listado-menu').style.display = 'none';
  52. }
  53.  
  54. // Función para ocultar el precargador y mostrar el contenido
  55. function hidePreloader() {
  56.   document.getElementById('preloader').style.display = 'none';
  57.   document.getElementById('ov-listado-menu').style.display = 'block';
  58. }
  59.  
  60. // Mostrar el precargador al cargar la página
  61. showPreloader();
  62. var cartItems = [];
  63.  
  64. function formatNumber(number) {
  65.   return new Intl.NumberFormat('en-US', { // CAMBIAR FORMATO MONEDA
  66.     style: 'decimal',
  67.     minimumFractionDigits: 2,
  68.     maximumFractionDigits: 2
  69.   }).format(number);
  70. }
  71.   var currency = "USD"; // CAMBIAR MONEDA
  72.   var currencySymbol = "$"; // CAMBIAR SIMBOLO MONEDA
  73.   var appScriptUrl = 'https://script.google.com/macros/s/AKfycbx-lfA2Z1WuzGF3wpeYUKiXqZEXBmXnlePHSOBLHeNAbmXISWQD_UTwUcRNHV-EjExSZw/exec'; // INSERTAR URL APPSCRIPT
  74.   var whatsappNumber = '521234567890'; // INSERTAR NÚMERO WHATSAPP CON PREFIJO DE PAÍS
  75.  
  76.   // Función para generar el HTML del menú
  77.   function generateMenuHTML(menuData) {
  78.     var html = '';
  79.     var tabs = '';
  80.  
  81.     for (var section in menuData) {
  82.       var sectionId = section.toLowerCase().replace(/\s+/g, '-');
  83.       tabs += '<a href="#' + sectionId + '">' + section + '</a>\n';
  84.       html += '<h2 id="' + sectionId + '" class="titulo-seccion">' + section + '</h2>';
  85.  
  86.       menuData[section].forEach(function(dish) {
  87.         // Formatear el precio directamente aquí
  88.         var formattedPrice = parseFloat(dish.price).toLocaleString('es-PE', {
  89.           minimumFractionDigits: 2,
  90.           maximumFractionDigits: 2
  91.         });
  92.  
  93.         html += '<div class="card-menu" data-dish="' + encodeURIComponent(JSON.stringify(dish)) + '">' +
  94.           '<div class="img-cover">' +
  95.             '<img src="' + dish.image + '" alt="' + dish.name + '">' +
  96.           '</div>' +
  97.           '<div class="info-menu">' +
  98.             '<h3 class="titulo">' + dish.name + '</h3>' +
  99.             '<p class="descripcion">' + dish.description + '</p>' +  
  100.             '<p class="menu-precio">' + currencySymbol + ' ' + formattedPrice + ' ' + currency + '</p>' +
  101.           '</div>' +
  102.         '</div>';
  103.       });
  104.     }
  105.  
  106.     // Insertar las pestañas en el contenedor de pestañas
  107.     document.getElementById('tabs').innerHTML = tabs;
  108.  
  109.     return html;
  110.   }
  111.  
  112.   // Función para generar el HTML de las opciones extras
  113.   function generateOptionsHTML(options) {
  114.     var html = '';
  115.  
  116.     for (var optionTitle in options) {
  117.       html += '<div class="option-group">';
  118.       html += '<h4>' + optionTitle + '</h4>';
  119.  
  120.       options[optionTitle].forEach(function(option) {
  121.         var optionName = option.name;
  122.         var optionPrice = option.price;
  123.  
  124.         html += '<div class="option-item">';
  125.         html += '<input type="checkbox" id="' + optionName + '" value="' + optionPrice + '">';
  126.         html += '<label for="' + optionName + '">' + optionName + (optionPrice ? ' ' + currencySymbol + optionPrice : '') + '</label>';
  127.         html += '</div>';
  128.       });
  129.  
  130.       html += '</div>';
  131.     }
  132.  
  133.     return html;
  134.   }
  135.  
  136.   // Función para abrir el pop-up de detalles del producto
  137.   function openPopup(dish) {
  138.   var formattedPrice = formatNumber(parseFloat(dish.price));
  139.   var popupHtml = '<div class="popup">' +
  140.     '<div class="popup-content">' +
  141.       '<div class="popup-left">' +
  142.         '<img src="' + dish.image + '" alt="' + dish.name + '">' +
  143.       '</div>' +
  144.       '<div class="popup-right">' +
  145.         '<div class="popup-content-wrapper">' +
  146.           '<h3>' + dish.name + '</h3>' +
  147.           '<p>' + dish.description + '</p>' +
  148.           '<div class="options-container">' + generateOptionsHTML(dish.options) + '</div>' +
  149.         '</div>' +
  150.         '<div class="quantity-control-container">' +
  151.           '<div class="quantity-control">' +
  152.             '<button class="decrement-quantity">-</button>' +
  153.             '<input type="text" class="quantity" value="1" data-price="' + dish.price + '">' +
  154.             '<button class="increment-quantity">+</button>' +
  155.           '</div>' +
  156.           '<button class="agregar-al-carrito" data-dish="' + encodeURIComponent(JSON.stringify(dish)) + '">Agregar <span class="precio">' + currencySymbol + ' ' + formattedPrice + ' ' + currency + '</span></button>' +
  157.         '</div>' +
  158.       '</div>' +
  159.       '<i class="fas fa-times icono-cerrar"></i>' +
  160.     '</div>' +
  161.   '</div>';
  162.   document.body.insertAdjacentHTML('beforeend', popupHtml);
  163.   setTimeout(function() {
  164.     document.querySelector('.popup').classList.add('show');
  165.   }, 50);
  166.  
  167.   document.querySelectorAll('.option-item input[type="checkbox"], .quantity').forEach(input => {
  168.     input.addEventListener('change', updatePopupPrice);
  169.   });
  170.  
  171.   document.querySelector('.agregar-al-carrito').addEventListener('click', () => {
  172.     addToCart(JSON.parse(decodeURIComponent(document.querySelector('.agregar-al-carrito').getAttribute('data-dish'))));
  173.     closePopup();
  174.   });
  175.  
  176.   // Llamar a updatePopupPrice inmediatamente después de abrir el popup
  177.   updatePopupPrice();
  178. }
  179.  
  180. function updatePopupPrice() {
  181.   const dish = JSON.parse(decodeURIComponent(document.querySelector('.agregar-al-carrito').getAttribute('data-dish')));
  182.   const selectedOptions = Array.from(document.querySelectorAll('.option-item input[type="checkbox"]:checked'));
  183.   const quantity = parseInt(document.querySelector('.quantity').value);
  184.   let totalPrice = parseFloat(dish.price) * quantity;
  185.  
  186.   selectedOptions.forEach(option => {
  187.     const optionPrice = parseFloat(option.value) || 0;
  188.     totalPrice += optionPrice * quantity;
  189.   });
  190.  
  191.   document.querySelector('.popup .precio').textContent = currencySymbol + ' ' + formatNumber(totalPrice) + ' ' + currency;
  192. }
  193.  
  194.   // Función para cerrar el pop-up
  195.   function closePopup() {
  196.     var popup = document.querySelector('.popup');
  197.     if (popup) {
  198.       popup.classList.remove('show');
  199.       setTimeout(function() {
  200.         popup.remove();
  201.       }, 300);
  202.     }
  203.   }
  204.  
  205.   // Evento de clic para cerrar el pop-up al hacer clic en el overlay
  206.   document.addEventListener('click', function(e) {
  207.     if (e.target.classList.contains('increment-quantity') || e.target.classList.contains('decrement-quantity')) {
  208.       setTimeout(updatePopupPrice, 0);
  209.     }
  210.   });
  211.  
  212.   // Evento de teclado para cerrar los pop-ups con la tecla ESC
  213.   document.addEventListener('keydown', function(e) {
  214.     if (e.key === 'Escape') {
  215.       closePopup();
  216.     }
  217.   });
  218.  
  219.   // Función para añadir un producto al carrito
  220.   function addToCart(dish) {
  221.     var quantity = parseInt(document.querySelector('.quantity').value);
  222.     var selectedOptions = Array.from(document.querySelectorAll('.option-item input[type="checkbox"]:checked'));
  223.  
  224.     var dishWithOptions = {
  225.       ...dish,
  226.       quantity: quantity,
  227.       selectedOptions: selectedOptions.map(function(option) {
  228.         return {
  229.           name: option.nextElementSibling.textContent.split(' ' + currencySymbol)[0].trim(),
  230.           price: option.value
  231.         };
  232.       })
  233.     };
  234.  
  235.     cartItems.push(dishWithOptions);
  236.  
  237.     updateCartCount();
  238.     updateCartPopup();
  239.   }
  240.  
  241.   // Función para actualizar el contador del carrito
  242.   function updateCartCount() {
  243.     var cartCount = document.querySelector('.cart-count');
  244.     cartCount.textContent = cartItems.reduce(function(total, item) {
  245.       return total + item.quantity;
  246.     }, 0);
  247.   }
  248.  
  249.   // Función para actualizar el contenido del pop-up del carrito
  250.   function updateCartPopup() {
  251.     var cartPopup = document.querySelector('.cart-popup');
  252.     if (cartPopup) {
  253.       var cartList = cartPopup.querySelector('ul');
  254.       var cartTotal = calculateCartTotal(cartItems);
  255.         var listItems = cartItems.map(function(item) {
  256.       var optionsText = item.selectedOptions.map(function(option) {
  257.         return '- ' + option.name + ' ' + (option.price ? currencySymbol + formatNumber(parseFloat(option.price)) : '');
  258.       }).join('<br>');
  259.  
  260.       var itemTotal = calculateItemTotal(item);
  261.  
  262.       return '<li>' +
  263.         '<div class="cart-item">' +
  264.           '<img src="' + item.image + '" alt="' + item.name + '">' +
  265.           '<div class="cart-item-details">' +
  266.             '<h4>' + item.name + '</h4>' +
  267.             '<p class="list-cantidad">Cantidad: ' + item.quantity + '</p>' +
  268.             '<p class="list-precio">Precio base: ' + currencySymbol + formatNumber(parseFloat(item.price)) + ' ' + currency + '</p>' +
  269.             (optionsText ? '<p class="list-opciones"><b>Opciones:</b><br>' + optionsText + '</p>' : '') +
  270.             '<p class="list-item-total"><b>Total: ' + currencySymbol + formatNumber(itemTotal) + ' ' + currency + '</b></p>' +
  271.           '</div>' +
  272.           '<i class="fas fa-trash remove-item" data-dish="' + encodeURIComponent(JSON.stringify(item)) + '"></i>' +
  273.         '</div>' +
  274.       '</li>';
  275.     }).join('');
  276.       cartList.innerHTML = listItems;
  277.       cartPopup.querySelector('.cart-total').textContent = cartTotal;
  278.  
  279.       if (cartItems.length === 0) {
  280.         cartPopup.querySelector('.cart-empty').style.display = 'block';
  281.         cartPopup.querySelector('#complete-order').disabled = true;
  282.       } else {
  283.         cartPopup.querySelector('.cart-empty').style.display = 'none';
  284.         cartPopup.querySelector('#complete-order').disabled = false;
  285.       }
  286.     }
  287.   }
  288.  
  289.   // Función para calcular el total de cada item del carrito
  290.   function calculateItemTotal(item) {
  291.     var itemPrice = parseFloat(item.price);
  292.     item.selectedOptions.forEach(function(option) {
  293.       var optionPrice = parseFloat(option.price) || 0;
  294.       itemPrice += optionPrice;
  295.     });
  296.     return itemPrice * item.quantity;
  297.   }
  298.  
  299.   // Función para abrir el pop-up del carrito
  300.   function openCartPopup() {
  301.     var cartTotal = calculateCartTotal(cartItems);
  302.     var popupHtml = '<div class="popup">' +
  303.       '<div class="cart-popup">' +
  304.         '<div class="cart-content">' +
  305.           '<h2>Mi Pedido</h2>' +
  306.           '<ul></ul>' +
  307.           '<div class="cart-empty" style="display: ' + (cartItems.length === 0 ? 'block' : 'none') + '">El carrito está vacío.</div>' +
  308.         '</div>' +
  309.         '<div class="cart-actions">' +
  310.           '<div class="cart-total">Total: ' + cartTotal + '</div>' +
  311.           '<button class="empty-cart">Vaciar carrito</button>' +
  312.           '<button id="complete-order" ' + (cartItems.length === 0 ? 'disabled' : '') + '>Completar pedido</button>' +
  313.         '</div>' +
  314.         '<i class="fas fa-times icono-cerrar"></i>' +
  315.       '</div>' +
  316.     '</div>';
  317.    
  318.     document.body.insertAdjacentHTML('beforeend', popupHtml);
  319.     setTimeout(function() {
  320.       document.querySelector('.popup').classList.add('show');
  321.     }, 50);
  322.     updateCartPopup();
  323.   }
  324.  
  325.   // Función para eliminar un producto del carrito
  326.   function removeFromCart(dish) {
  327.     var index = cartItems.findIndex(function(item) {
  328.       return JSON.stringify(item) === JSON.stringify(dish);
  329.     });
  330.     if (index !== -1) {
  331.       cartItems.splice(index, 1);
  332.       updateCartCount();
  333.       updateCartPopup();
  334.     }
  335.   }
  336.  
  337.   // Función para vaciar el carrito
  338.   function emptyCart() {
  339.     cartItems = [];
  340.     updateCartCount();
  341.     var popup = document.querySelector('.popup');
  342.     if (popup) {
  343.       popup.classList.remove('show');
  344.       setTimeout(function() {
  345.         popup.remove();
  346.       }, 300);
  347.     }
  348.   }
  349.  
  350.   // Función para calcular el total del carrito
  351.   function calculateCartTotal(items) {
  352.   var total = 0;
  353.   items.forEach(function(item) {
  354.     var itemPrice = parseFloat(item.price);
  355.     item.selectedOptions.forEach(function(option) {
  356.       var optionPrice = parseFloat(option.price) || 0;
  357.       itemPrice += optionPrice;
  358.     });
  359.     total += itemPrice * item.quantity;
  360.   });
  361.   return 'Total Pedido: ' + currencySymbol + formatNumber(total) + ' ' + currency;
  362. }
  363.  
  364.   // Función para mostrar el formulario de información del pedido
  365.   function showOrderForm() {
  366.     var formHtml = '<div class="order-form">' +
  367.       '<a id="back-to-cart"><i class="fas fa-arrow-left"></i> Regresar al carrito</a>' +
  368.       '<h2>Completa tu pedido</h2>' +
  369.       '<form>' +
  370.         '<label for="name">Nombre:</label>' +
  371.         '<input type="text" id="name" required>' +
  372.         '<label for="delivery">Opciones de entrega:</label>' +
  373.         '<select id="delivery" required>' +
  374.           '<option value="">Selecciona una opción</option>' +
  375.           '<option value="Domicilio">Envío a domicilio</option>' +
  376.           '<option value="Local">Recoger en local</option>' +
  377.         '</select>' +
  378.         '<div id="address-field" style="display: none;">' +
  379.           '<label for="address">Dirección:</label>' +
  380.           '<textarea id="address" required></textarea>' +
  381.         '</div>' +
  382.         '<label for="payment">Formas de pago:</label>' +
  383.         '<select id="payment" required>' +
  384.           '<option value="">Selecciona una opción</option>' +
  385.           '<option value="Efectivo">Efectivo</option>' +
  386.           '<option value="Tarjeta">Tarjeta</option>' +
  387.         '</select>' +
  388.         '<label for="note">Nota adicional:</label>' +
  389.         '<textarea id="note"></textarea>' +
  390.         '<div class="terminos">' +
  391.           '<input type="checkbox" id="terms" required>' +
  392.           '<label for="terms">Acepto los <a href="#" target="_blank">términos y condiciones</a>.</label>' +
  393.         '</div>' +
  394.         '<button type="submit" id="submit-order"><i class="fab fa-whatsapp"></i> Enviar pedido</button>' +
  395.       '</form>' +
  396.     '</div>';
  397.  
  398.     var cartPopup = document.querySelector('.cart-popup');
  399.     var cartDetails = cartPopup.querySelector('.cart-content');
  400.     var cartActions = cartPopup.querySelector('.cart-actions');
  401.     cartDetails.style.display = 'none';
  402.     cartActions.style.display = 'none';
  403.     cartPopup.insertAdjacentHTML('beforeend', formHtml);
  404.     setTimeout(function() {
  405.       document.querySelector('.popup').classList.add('show');
  406.     }, 50);
  407.  
  408.     var backButton = document.getElementById('back-to-cart');
  409.       backButton.addEventListener('click', function(e) {
  410.         e.preventDefault();
  411.         var popup = document.querySelector('.popup');
  412.         popup.classList.remove('show');
  413.         setTimeout(function() {
  414.           var orderForm = document.querySelector('.order-form');
  415.           orderForm.remove();
  416.           cartDetails.style.display = 'block';
  417.           cartActions.style.display = 'block';
  418.           setTimeout(function() {
  419.             popup.classList.add('show');
  420.           }, 50);
  421.         }, 300);
  422.       });
  423.  
  424.     var deliverySelect = document.getElementById('delivery');
  425.     var addressField = document.getElementById('address-field');
  426.  
  427.     deliverySelect.addEventListener('change', function() {
  428.       if (deliverySelect.value === 'Domicilio') {
  429.         addressField.style.display = 'block';
  430.         addressField.querySelector('#address').required = true;
  431.       } else {
  432.         addressField.style.display = 'none';
  433.         addressField.querySelector('#address').required = false;
  434.       }
  435.     });
  436.   }
  437.  
  438.   // Evento de clic para los "card-menu"
  439.   document.addEventListener('click', function(e) {
  440.     if (e.target.closest('.card-menu')) {
  441.       var dish = JSON.parse(decodeURIComponent(e.target.closest('.card-menu').getAttribute('data-dish')));
  442.       openPopup(dish);
  443.     }
  444.   });
  445.  
  446.   // Evento de clic para el icono de cierre del pop-up
  447.   document.addEventListener('click', function(e) {
  448.     if (e.target.classList.contains('icono-cerrar')) {
  449.       closePopup();
  450.     }
  451.   });
  452.  
  453.   // Evento de clic para el icono del carrito
  454.   document.getElementById('cart-icon').addEventListener('click', function() {
  455.     openCartPopup();
  456.   });
  457.  
  458.   // Evento de clic para el botón "Completar pedido"
  459.   document.addEventListener('click', function(e) {
  460.     if (e.target.id === 'complete-order') {
  461.       if (cartItems.length === 0) {
  462.         alert('Para completar el pedido, debes agregar productos al carrito.');
  463.       } else {
  464.         var popup = document.querySelector('.popup');
  465.         popup.classList.remove('show');
  466.         setTimeout(function() {
  467.           showOrderForm();
  468.         }, 300);
  469.       }
  470.     }
  471.   });
  472.  
  473.   // Evento de clic para el icono de eliminar producto del carrito
  474.   document.addEventListener('click', function(e) {
  475.     if (e.target.classList.contains('remove-item')) {
  476.       var dish = JSON.parse(decodeURIComponent(e.target.getAttribute('data-dish')));
  477.       removeFromCart(dish);
  478.     }
  479.   });
  480.  
  481.   // Evento de clic para el botón "Vaciar carrito"
  482.   document.addEventListener('click', function(e) {
  483.     if (e.target.classList.contains('empty-cart')) {
  484.       emptyCart();
  485.     }
  486.   });
  487.  
  488.   // Evento de clic para los botones de incremento y decremento de cantidad
  489.   document.addEventListener('click', function(e) {
  490.     if (e.target.classList.contains('increment-quantity')) {
  491.       var quantityInput = e.target.previousElementSibling;
  492.       var currentQuantity = parseInt(quantityInput.value);
  493.       quantityInput.value = currentQuantity + 1;
  494.       updatePopupPrice();
  495.     } else if (e.target.classList.contains('decrement-quantity')) {
  496.       var quantityInput = e.target.nextElementSibling;
  497.       var currentQuantity = parseInt(quantityInput.value);
  498.       if (currentQuantity > 1) {
  499.         quantityInput.value = currentQuantity - 1;
  500.         updatePopupPrice();
  501.       }
  502.     }
  503.   });
  504.  
  505.   // Evento de envío del formulario de información del pedido
  506.   document.addEventListener('submit', function(e) {
  507.   if (e.target.closest('.order-form')) {
  508.     e.preventDefault();
  509.     var name = document.getElementById('name').value;
  510.     var delivery = document.getElementById('delivery').value;
  511.     var payment = document.getElementById('payment').value;
  512.     var note = document.getElementById('note').value;
  513.  
  514.     if (name === '' || delivery === '' || payment === '') {
  515.       alert('Por favor, completa todos los campos obligatorios del formulario.');
  516.       return;
  517.     }
  518.  
  519.     var addressField = document.getElementById('address');
  520.     var address = addressField.value;
  521.  
  522.     if (delivery === 'Domicilio' && address === '') {
  523.      alert('Por favor, ingresa tu dirección para el envío a domicilio.');
  524.       return;
  525.     }
  526.  
  527.     var message = '¡NUEVO PEDIDO!\n\n' +
  528.     `Nombre: ${name}\n` +
  529.     `Opciones de entrega: ${delivery}\n` +
  530.     (delivery === 'Domicilio' ? `Dirección: ${address}\n` : '') +
  531.     `Formas de pago: ${payment}\n` +
  532.     `Nota adicional: ${note}\n` +
  533.     'Productos:\n' +
  534.     cartItems.map(function(item) {
  535.       var formattedPrice = formatNumber(parseFloat(item.price));
  536.       var optionsText = item.selectedOptions.map(function(option) {
  537.         return '  - ' + option.name + (option.price ? ' ' + currencySymbol + formatNumber(parseFloat(option.price)) : '');
  538.       }).join('\n');
  539.       return `- ${item.name} (${item.quantity}) ${currencySymbol}${formattedPrice} ${currency}\n${optionsText}`;
  540.     }).join('\n\n') + '\n\n' +
  541.     calculateCartTotal(cartItems);
  542.  
  543.     var whatsappUrl = 'https://wa.me/' + whatsappNumber + '?text=' + encodeURIComponent(message);
  544.     window.open(whatsappUrl, '_blank');
  545.   }
  546. });
  547.  
  548.   // Hacer una solicitud GET a la URL de la aplicación web de Google Apps Script
  549.   fetch(appScriptUrl)
  550.   .then(response => response.json())
  551.   .then(data => {
  552.     // Llamar a la función para generar el HTML del menú con los datos obtenidos
  553.     document.getElementById('ov-listado-menu').innerHTML = generateMenuHTML(data);
  554.  
  555.    // Agregar evento de clic a las pestañas para el desplazamiento suave
  556.    var tabLinks = document.querySelectorAll('#tabs a');
  557.     tabLinks.forEach(function(link) {
  558.       link.addEventListener('click', function(e) {
  559.         e.preventDefault();
  560.         var target = document.querySelector(this.getAttribute('href'));
  561.         var contenido = document.querySelector('.contenido');
  562.         var targetPosition = target.offsetTop - contenido.offsetTop + 145;
  563.         contenido.scrollTo({
  564.           top: targetPosition,
  565.           behavior: 'smooth'
  566.         });
  567.       });
  568.     });
  569.  
  570.     // Agregar evento de scroll al contenedor ".contenido"
  571.     document.querySelector('.contenido').addEventListener('scroll', updateActiveTab);
  572.  
  573.     // Ocultar el precargador y mostrar el contenido
  574.     hidePreloader();
  575.   })
  576.   .catch(error => {
  577.     console.error('Error al obtener los datos:', error);
  578.   });
  579. </script>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement