Advertisement
oscarviedma

Funcionalidad JavaScript Taxi Directorio - OV

Dec 23rd, 2024
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.09 KB | None | 0 0
  1. function taxistas_shortcode() {
  2. ob_start();
  3. ?>
  4. <script>
  5. let currentPage = 1;
  6. const itemsPerPage = 6;
  7. let allTaxistas = [];
  8. let filteredTaxistas = [];
  9.  
  10. function showError(message) {
  11. const errorDiv = document.getElementById('error-message');
  12. errorDiv.textContent = message;
  13. errorDiv.style.display = 'block';
  14. setTimeout(() => {
  15. errorDiv.style.display = 'none';
  16. }, 5000);
  17. }
  18.  
  19. function showLoading(show) {
  20. document.getElementById('loadingSpinner').style.display = show ? 'flex' : 'none';
  21. document.getElementById('taxiList').style.display = show ? 'none' : 'grid';
  22. }
  23.  
  24. function createTaxiCard(taxista) {
  25. const card = document.createElement('div');
  26. card.className = 'taxi-card';
  27.  
  28. const whatsappMsg = encodeURIComponent(`Hola ${taxista.nombre}, me gustaría solicitar un viaje. ¿Está disponible en este momento?`);
  29. const imageUrl = taxista.foto && taxista.foto.length > 0
  30. ? taxista.foto[0].url
  31. : '/api/placeholder/400/320';
  32.  
  33. card.innerHTML = `
  34. <img src="${imageUrl}" alt="Foto de ${taxista.nombre}" class="taxi-image">
  35. <div class="taxi-content">
  36. <div class="taxi-header">
  37. <div class="taxi-name">${taxista.nombre}</div>
  38. <span class="status-badge status-${taxista.estado}">
  39. <i class="fas fa-${taxista.estado === 'ocupado' ? 'times-circle' : 'check-circle'}"></i>
  40. ${taxista.estado === 'ocupado' ? 'Ocupado' : 'Disponible'}
  41. </span>
  42. </div>
  43. <div class="taxi-details">
  44. <div><i class="fas fa-taxi"></i> Unidad: ${taxista.unidad}</div>
  45. <div><i class="fas fa-map-marker-alt"></i> Zona: ${taxista.zona}</div>
  46. </div>
  47. <div class="contact-buttons">
  48. ${taxista.telefono ? `
  49. <a href="tel:${taxista.telefono}"
  50. class="contact-button phone-button"
  51. title="Llamar">
  52. <i class="fas fa-phone"></i>
  53. Llamar
  54. </a>
  55. <a href="https://wa.me/${taxista.telefono}?text=${whatsappMsg}"
  56. class="contact-button whatsapp-button"
  57. target="_blank">
  58. <i class="fab fa-whatsapp"></i>
  59. WhatsApp
  60. </a>
  61. ` : ''}
  62. </div>
  63. </div>
  64. `;
  65.  
  66. return card;
  67. }
  68.  
  69. function updatePagination() {
  70. const totalPages = Math.ceil(filteredTaxistas.length / itemsPerPage);
  71. document.getElementById('prevPage').disabled = currentPage === 1;
  72. document.getElementById('nextPage').disabled = currentPage === totalPages;
  73. document.getElementById('pageInfo').textContent = `Página ${currentPage} de ${totalPages}`;
  74. }
  75.  
  76. function applyFilters() {
  77. const searchTerm = document.getElementById('searchInput').value.toLowerCase();
  78. const statusFilter = document.getElementById('filterStatus').value;
  79.  
  80. filteredTaxistas = allTaxistas.filter(taxista => {
  81. const matchesSearch = (
  82. taxista.nombre.toLowerCase().includes(searchTerm) ||
  83. taxista.unidad.toLowerCase().includes(searchTerm) ||
  84. taxista.zona.toLowerCase().includes(searchTerm)
  85. );
  86.  
  87. const matchesStatus = statusFilter === 'todos' || taxista.estado === statusFilter;
  88.  
  89. return matchesSearch && matchesStatus;
  90. });
  91.  
  92. currentPage = 1;
  93. displayTaxistas();
  94. }
  95.  
  96. function displayTaxistas() {
  97. const taxiList = document.getElementById('taxiList');
  98. taxiList.innerHTML = '';
  99.  
  100. const start = (currentPage - 1) * itemsPerPage;
  101. const end = start + itemsPerPage;
  102. const pageItems = filteredTaxistas.slice(start, end);
  103.  
  104. if (pageItems.length === 0) {
  105. taxiList.innerHTML = `
  106. <div style="grid-column: 1/-1; text-align: center; padding: 50px; color: #666;">
  107. <i class="fas fa-search" style="font-size: 48px; margin-bottom: 20px;"></i>
  108. <p>No se encontraron taxistas que coincidan con tu búsqueda.</p>
  109. </div>
  110. `;
  111. } else {
  112. pageItems.forEach(taxista => {
  113. const card = createTaxiCard(taxista);
  114. taxiList.appendChild(card);
  115. });
  116. }
  117.  
  118. updatePagination();
  119. document.getElementById('taxiCount').textContent = filteredTaxistas.length;
  120. }
  121.  
  122. function shuffleArray(array) {
  123. for (let i = array.length - 1; i > 0; i--) {
  124. const j = Math.floor(Math.random() * (i + 1));
  125. [array[i], array[j]] = [array[j], array[i]];
  126. }
  127. return array;
  128. }
  129.  
  130. async function loadTaxistas() {
  131. showLoading(true);
  132. try {
  133. const response = await fetch('<?php echo admin_url('admin-ajax.php'); ?>?action=get_taxistas_data');
  134.  
  135. if (!response.ok) {
  136. throw new Error(`HTTP error! status: ${response.status}`);
  137. }
  138.  
  139. const result = await response.json();
  140.  
  141. if (!result.success) {
  142. throw new Error(result.data || 'Error al cargar los datos');
  143. }
  144.  
  145. const data = result.data;
  146.  
  147. if (!data.records || data.records.length === 0) {
  148. showError('No se encontraron registros');
  149. return;
  150. }
  151.  
  152. // Convertir records a array y mezclar aleatoriamente
  153. allTaxistas = shuffleArray(data.records.map(record => ({
  154. id: record.id,
  155. nombre: record.fields.Nombre || 'Sin nombre',
  156. unidad: record.fields.Unidad || 'Sin unidad',
  157. telefono: record.fields.Telefono || '',
  158. zona: record.fields.Zona || 'Sin zona',
  159. estado: record.fields.Estado || 'disponible',
  160. foto: record.fields.Foto
  161. })));
  162.  
  163. filteredTaxistas = [...allTaxistas];
  164. displayTaxistas();
  165.  
  166. } catch (error) {
  167. showError('Error al cargar los datos: ' + error.message);
  168. console.error('Error completo:', error);
  169. } finally {
  170. showLoading(false);
  171. }
  172. }
  173.  
  174. // Event Listeners
  175. document.getElementById('searchInput').addEventListener('input', applyFilters);
  176. document.getElementById('filterStatus').addEventListener('change', applyFilters);
  177. document.getElementById('sortSelect').addEventListener('change', function(e) {
  178. const sortField = e.target.value;
  179. filteredTaxistas.sort((a, b) => a[sortField].localeCompare(b[sortField]));
  180. displayTaxistas();
  181. });
  182.  
  183. document.getElementById('prevPage').addEventListener('click', function() {
  184. if (currentPage > 1) {
  185. currentPage--;
  186. displayTaxistas();
  187. }
  188. });
  189.  
  190. document.getElementById('nextPage').addEventListener('click', function() {
  191. const totalPages = Math.ceil(filteredTaxistas.length / itemsPerPage);
  192. if (currentPage < totalPages) {
  193. currentPage++;
  194. displayTaxistas();
  195. }
  196. });
  197.  
  198. // Iniciar la aplicación
  199. loadTaxistas();
  200. </script>
  201. <?php
  202. return ob_get_clean();
  203. }
  204. add_shortcode('taxistas', 'taxistas_shortcode');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement