Advertisement
oscarviedma

Código JavaScript Integración Google Drive - OV DIVI

Dec 13th, 2024 (edited)
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 8.91 KB | None | 0 0
  1. <script>
  2.   // Configuración de Google Drive
  3.   const FOLDER_ID = 'TU_ID_DE_CARPETA_DRIVE'';
  4.   const API_KEY = 'TU_API_KEY';
  5.   // Variables globales
  6.   let images = [];
  7.   let currentIndex = 0;
  8.   let currentPage = 1;
  9.   const imagesPerPage = 20; // Cambiar paginación
  10.  
  11.   // Función para mover el modal
  12.   function moveModal() {
  13.       const modal = document.getElementById('imageModal-gallery');
  14.       const mainArea = document.getElementById('et-main-area');
  15.      
  16.       if (modal && mainArea) {
  17.          mainArea.parentNode.insertBefore(modal, mainArea.nextSibling);
  18.       }
  19.   }
  20.  
  21.   // Función para renderizar el header de la galería
  22.   function renderGalleryHeader() {
  23.       const oldHeader = document.querySelector('.gallery-header');
  24.       if (oldHeader) {
  25.           oldHeader.remove();
  26.       }
  27.  
  28.       const header = document.createElement('div');
  29.       header.className = 'gallery-header';
  30.      
  31.       // Total de imágenes
  32.       const totalImages = document.createElement('div');
  33.       totalImages.className = 'total-images';
  34.       totalImages.innerText = `Total: ${images.length} imágenes`;
  35.      
  36.       // Selector de orden
  37.       const orderSelector = document.createElement('select');
  38.       orderSelector.className = 'order-selector';
  39.       orderSelector.innerHTML = `
  40.           <option value="recent">Más recientes</option>
  41.           <option value="oldest">Más antiguas</option>
  42.           <option value="az">A-Z</option>
  43.           <option value="za">Z-A</option>
  44.       `;
  45.      
  46.       orderSelector.addEventListener('change', (e) => {
  47.           sortImages(e.target.value);
  48.           currentPage = 1;
  49.           renderGallery();
  50.           renderPagination();
  51.           scrollToGalleryWithOffset();
  52.       });
  53.      
  54.       header.appendChild(totalImages);
  55.       header.appendChild(orderSelector);
  56.      
  57.       const gallery = document.getElementById('gallery');
  58.       gallery.parentNode.insertBefore(header, gallery);
  59.   }
  60.  
  61.   function sortImages(orderType) {
  62.       switch(orderType) {
  63.           case 'recent':
  64.               images.sort((a, b) => b.name.localeCompare(a.name));
  65.               break;
  66.           case 'oldest':
  67.               images.sort((a, b) => a.name.localeCompare(b.name));
  68.               break;
  69.           case 'az':
  70.               images.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
  71.               break;
  72.           case 'za':
  73.               images.sort((a, b) => b.name.toLowerCase().localeCompare(a.name.toLowerCase()));
  74.               break;
  75.       }
  76.   }
  77.  
  78.   // Función para obtener las imágenes de Google Drive
  79.   async function getImagesFromDrive() {
  80.     try {
  81.         let allImages = [];
  82.         let pageToken = '';
  83.        
  84.         do {
  85.             const url = `https://www.googleapis.com/drive/v3/files?q='${FOLDER_ID}'+in+parents&pageSize=1000&key=${API_KEY}&fields=nextPageToken,files(id,name,webContentLink,thumbnailLink,mimeType)${pageToken}`;
  86.             const response = await fetch(url);
  87.             const data = await response.json();
  88.            
  89.             const pageImages = data.files.filter(file =>
  90.                 file.mimeType && file.mimeType.startsWith('image/')
  91.            );
  92.             allImages = allImages.concat(pageImages);
  93.            
  94.             pageToken = data.nextPageToken ? `&pageToken=${data.nextPageToken}` : '';
  95.            
  96.         } while (pageToken);
  97.  
  98.         images = allImages;
  99.         renderGalleryHeader(); // Agregamos esto
  100.         renderGallery();
  101.         renderPagination();
  102.     } catch (error) {
  103.         console.error('Error al obtener las imágenes:', error);
  104.     }
  105.   }
  106.  
  107.   // Función para renderizar la galería
  108.   function renderGallery() {
  109.       const gallery = document.getElementById('gallery');
  110.       gallery.innerHTML = '';
  111.      
  112.       const startIndex = (currentPage - 1) * imagesPerPage;
  113.       const endIndex = Math.min(startIndex + imagesPerPage, images.length);
  114.      
  115.       for (let i = startIndex; i < endIndex; i++) {
  116.          const image = images[i];
  117.          const item = document.createElement('div');
  118.          item.className = 'gallery-item';
  119.          
  120.          const imageId = image.name.replace(/\.[^/.]+$/, "").replace(/\s+/g, '-').toLowerCase();
  121.          
  122.          item.innerHTML = `
  123.              <img src="${image.thumbnailLink.replace('=s220', '=s1000')}"
  124.                   alt="${image.name}"
  125.                   class="gallery-image-${imageId}">
  126.               <button class="download-btn download-btn-${imageId}"
  127.                      data-url="${image.webContentLink}"
  128.                      title="Descargar"></button>
  129.           `;
  130.           item.querySelector('img').addEventListener('click', () => openModal(i));
  131.           item.querySelector('.download-btn').addEventListener('click', (e) => {
  132.               e.stopPropagation();
  133.               downloadImage(image.webContentLink, image.name);
  134.           });
  135.           gallery.appendChild(item);
  136.       }
  137.   }
  138.  
  139. function scrollToGalleryWithOffset() {
  140.     const gallery = document.getElementById('gallery');
  141.     const galleryPosition = gallery.getBoundingClientRect().top + window.pageYOffset - 70;
  142.     window.scrollTo({
  143.         top: galleryPosition,
  144.         behavior: 'smooth'
  145.     });
  146. }
  147.  
  148. function renderPagination() {
  149.       // Eliminar paginación anterior si existe
  150.       const oldPagination = document.querySelector('.pagination');
  151.       if (oldPagination) {
  152.           oldPagination.remove();
  153.       }
  154.  
  155.       const totalPages = Math.ceil(images.length / imagesPerPage);
  156.       const paginationContainer = document.createElement('div');
  157.       paginationContainer.className = 'pagination';
  158.      
  159.       const prevButton = document.createElement('button');
  160.       prevButton.innerText = 'Anterior';
  161.       prevButton.className = 'pagination-btn';
  162.       prevButton.disabled = currentPage === 1;
  163.       prevButton.addEventListener('click', () => {
  164.           if (currentPage > 1) {
  165.               currentPage--;
  166.               renderGallery();
  167.               renderPagination();
  168.               scrollToGalleryWithOffset();
  169.           }
  170.       });
  171.      
  172.       const nextButton = document.createElement('button');
  173.       nextButton.innerText = 'Siguiente';
  174.       nextButton.className = 'pagination-btn';
  175.       nextButton.disabled = currentPage === totalPages;
  176.       nextButton.addEventListener('click', () => {
  177.           if (currentPage < totalPages) {
  178.              currentPage++;
  179.              renderGallery();
  180.              renderPagination();
  181.              scrollToGalleryWithOffset();
  182.          }
  183.      });
  184.      
  185.      const pageInfo = document.createElement('span');
  186.      pageInfo.className = 'page-info';
  187.      pageInfo.innerText = `Página ${currentPage} de ${totalPages}`;
  188.      
  189.      paginationContainer.appendChild(prevButton);
  190.      paginationContainer.appendChild(pageInfo);
  191.      paginationContainer.appendChild(nextButton);
  192.      
  193.      const gallery = document.getElementById('gallery');
  194.      gallery.parentNode.appendChild(paginationContainer);
  195.  }
  196.  
  197.  // Funciones del modal
  198.  const modal = document.getElementById('imageModal-gallery');
  199.  const modalImage = document.getElementById('modalImage-gallery');
  200.  
  201.  function openModal(index) {
  202.      currentIndex = index;
  203.      updateModalImage();
  204.      modal.style.display = 'block';
  205.  }
  206.  
  207.  function closeModal() {
  208.      modal.style.display = 'none';
  209.  }
  210.  
  211.  function updateModalImage() {
  212.      const imageUrl = images[currentIndex].thumbnailLink;
  213.      modalImage.src = imageUrl.replace('=s220', '=s1400');
  214.      modalImage.alt = images[currentIndex].name;
  215.  }
  216.  
  217.  function nextImage() {
  218.      currentIndex = (currentIndex + 1) % images.length;
  219.      updateModalImage();
  220.  }
  221.  
  222.  function prevImage() {
  223.      currentIndex = (currentIndex - 1 + images.length) % images.length;
  224.      updateModalImage();
  225.  }
  226.  
  227.  // Función para descargar imagen
  228.  async function downloadImage(url, filename) {
  229.      try {
  230.          window.location.href = url;
  231.      } catch (error) {
  232.          console.error('Error al descargar la imagen:', error);
  233.      }
  234.  }
  235.  
  236.  // Event Listeners
  237.  document.getElementById('closeModal-gallery').addEventListener('click', closeModal);
  238.  document.getElementById('prevBtn-gallery').addEventListener('click', prevImage);
  239.  document.getElementById('nextBtn-gallery').addEventListener('click', nextImage);
  240.  
  241.  // Cerrar modal al hacer clic en el overlay
  242.  modal.addEventListener('click', (e) => {
  243.       if (e.target === modal) {
  244.           closeModal();
  245.       }
  246.   });
  247.  
  248.   // Eventos de teclado
  249.   document.addEventListener('keydown', (e) => {
  250.       if (modal.style.display === 'block') {
  251.           if (e.key === 'Escape') closeModal();
  252.           if (e.key === 'ArrowRight') nextImage();
  253.           if (e.key === 'ArrowLeft') prevImage();
  254.       }
  255.   });
  256.  
  257.   // Inicializar la galería y mover el modal
  258.   document.addEventListener('DOMContentLoaded', () => {
  259.       moveModal();
  260.       getImagesFromDrive();
  261.   });
  262. </script>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement