1// Importar la lista de todos los módulos desde el archivo main.js del buscador 2import { allModules } from "/SiteAssets/Buscador/assets/js/main.js"; 3 4// Objeto con iconos para tipos de archivo web y PDF 5const icons = { 6 web: `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="iconLink"> 7 <path stroke-linecap="round" stroke-linejoin="round" d="M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418" /> 8 </svg>`, 9 pdf: `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="iconLink"> 10 <path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" /> 11 </svg>`, 12}; 13 14// Función para eliminar el texto "/_api/" de las URLs 15function eliminarApiDeUrl(url) { 16 return url.replace("/_api/", "/"); 17} 18 19// Función para mostrar los resultados en un modal 20export function mostrarResultadosModal(resultados) { 21 currentPage = 1; // Reinicia la página al mostrar nuevos resultados 22 const resultadosCombinados = [ 23 ...resultados.buscador, 24 ...resultados.normatividad, 25 ...resultados.noticias, 26 ]; // Combinar resultados 27 displayData(currentPage, resultadosCombinados); // Mostrar datos en la página actual 28 renderPagination(resultadosCombinados); // Renderizar la paginación 29 30 const seccionesPortalWeb = document.getElementById("seccionesPortalWeb"); 31 seccionesPortalWeb.innerHTML = ""; 32 seccionesPortalWeb.innerHTML = 33 '<option value="">Seleccione una sección</option>'; // Corregido: Eliminado el espacio en blanco 34 35 // Agregar la opción "Sitio Principal" al selector 36 seccionesPortalWeb.innerHTML += `<option value="SitioPrincipal">Sitio Principal</option>`; 37 // Agregar la opción "Noticias" al selector 38 seccionesPortalWeb.innerHTML += `<option value="Noticias">Noticias</option>`; 39 40 // Iterar sobre todos los módulos y agregar opciones al selector 41 allModules.forEach((item) => { 42 // Evitar agregar la opción "Noticias" y la opción vacÃa 43 if (item === "") { 44 // No hacer nada, este módulo se maneja con "Sitio Principal" 45 } else if (item !== "/NuestraAlcaldia/SaladePrensa/") { 46 seccionesPortalWeb.innerHTML += `<option value="${item}">${separarPorMayusculas( 47 item 48 )}</option>`; 49 } 50 }); 51 52 // Agregar un event listener al selector para filtrar resultados por sección 53 seccionesPortalWeb.addEventListener("change", (e) => { 54 let arrayFilter; 55 if (e.target.value === "Noticias") { 56 // Si se selecciona "Noticias", filtrar los resultados para mostrar solo la sección "NuestraAlcaldia/SaladePrensa" 57 arrayFilter = resultadosCombinados.filter( 58 (link) => link.module === "/NuestraAlcaldia/SaladePrensa/" 59 ); 60 } else if (e.target.value === "SitioPrincipal") { 61 // Si se selecciona "Sitio Principal", filtrar los resultados que contienen "_api" en la URL 62 arrayFilter = resultadosCombinados.filter((link) => 63 link.url.includes("_api") 64 ); 65 } else { 66 arrayFilter = resultadosCombinados.filter( 67 (link) => link.module === e.target.value 68 ); 69 } 70 currentPage = 1; // Reiniciar la página al aplicar el filtro 71 displayData(currentPage, arrayFilter); 72 renderPagination(arrayFilter); 73 }); 74 75 abrirModal(); 76} 77 78function abrirModal() { 79 const modal = document.getElementById("ModalBuscador"); 80 modal.style.display = "flex"; // Mostrar el modal 81} 82 83// Función para cerrar el modal 84function cerrarModal() { 85 const modal = document.getElementById("ModalBuscador"); 86 modal.style.display = "none"; 87 document.querySelector("#search").value = ""; // Ocultar el modal 88} 89 90// Asignar evento de clic al botón "Cerrar" del modal 91const btnCerrarModal = document.querySelector( 92 "#ModalBuscador .modal__footer button" 93); 94btnCerrarModal.addEventListener("click", cerrarModal); 95 96// Función para pintar los enlaces de los resultados 97function paintLinks(resultados) { 98 const resultadosLista = document.getElementById("resultadosBusqueda"); 99 100 // Limpiar el contenido anterior 101 resultadosLista.innerHTML = ""; 102 103 // Reiniciar las clases de estilo 104 resultadosLista.classList.remove("!flex", "!justify-center"); 105 106 if (resultados.length > 0) { 107 resultados.forEach((result) => { 108 const spliturl = result.url.split("."); 109 const fileType = spliturl[spliturl.length - 1]; 110 const cleanUrl = eliminarApiDeUrl(result.url); // Eliminar /_api/ de la URL 111 const moduleName = 112 result.module === "/NuestraAlcaldia/SaladePrensa/" 113 ? "Noticias" 114 : result.module === "_api" || result.module === "" 115 ? "Sitio Principal" 116 : separarPorMayusculas(result.module); 117 118 // Agregar resultados a la lista 119 resultadosLista.innerHTML += `<li class="ListaResults"> 120 <div> 121 ${fileType === "pdf" ? icons.pdf : icons.web} 122 <a class="UrlBuscador" href="${cleanUrl}" target="__blank">${ 123 result.Title 124 ? result.Title.length > 50 125 ? shortText(result.Title, 40) 126 : result.Title 127 : cleanUrl 128 }</a> 129 </div> 130 <p class="moduloPagina">Sección: <span>${moduleName}</span></p> 131 </li>`; 132 });
133 } else { 134 // Si no hay resultados, agrega clases para centrar el mensaje 135 resultadosLista.classList.add("!flex", "!justify-center"); 136 resultadosLista.innerHTML += `<li class="ResultsnotFound"> 137 <img src="/SiteAssets/Buscador/assets/img/PAGINA_NO_ENCONTRADA.svg"/> 138 <span class="msnResultsNot">Resultados no encontrados</span> 139 </li>`; 140 } 141} 142 143 144// Función para acortar texto si es demasiado largo 145function shortText(texto, longitudMaxima) { 146 if (texto.length <= longitudMaxima) { 147 return texto; 148 } else { 149 return texto.substring(0, longitudMaxima) + "..."; 150 } 151} 152 153// Función para separar palabras por mayúsculas 154function separarPorMayusculas(palabra) { 155 let palabrasSeparadas = [palabra[0]]; 156 157 for (let i = 1; i < palabra.length; i++) { 158 if (palabra[i] === palabra[i].toUpperCase()) { 159 palabrasSeparadas.push(palabra[i]); 160 } else { 161 palabrasSeparadas[palabrasSeparadas.length - 1] += palabra[i]; 162 } 163 } 164 165 return palabrasSeparadas.join(" "); 166} 167 168// Definir el número de elementos por página y la página actual 169const itemsPerPage = 5; 170let currentPage = 1; 171 172// Función para mostrar datos en la página actual 173function displayData(page, resultados) { 174 const startIndex = (page - 1) * itemsPerPage; 175 const endIndex = startIndex + itemsPerPage; 176 const pageData = resultados.slice(startIndex, endIndex); 177 paintLinks(pageData); 178} 179 180// Función para renderizar la paginación 181function renderPagination(resultados) { 182 const pagination = document.getElementById("pagination"); 183 const pageCount = Math.ceil(resultados.length / itemsPerPage); 184 185 pagination.innerHTML = ""; 186 const maxPageButtons = 5; // Número máximo de botones de página que quieres mostrar 187 const startPage = Math.max(1, currentPage - Math.floor(maxPageButtons / 2)); 188 189 for ( 190 let i = startPage; 191 i <= Math.min(startPage + maxPageButtons - 1, pageCount); 192 i++ 193 ) { 194 const li = document.createElement("li"); 195 li.classList.add("page-item"); 196 const a = document.createElement("a"); 197 a.classList.add("page-link"); 198 a.href = "#"; 199 a.textContent = i; 200 li.appendChild(a); 201 202 a.addEventListener("click", (e) => { 203 e.preventDefault(); 204 currentPage = i; 205 displayData(currentPage, resultados); 206 renderPagination(resultados); 207 }); 208 209 if (i === currentPage) { 210 li.classList.add("active"); 211 } 212 213 pagination.appendChild(li); 214 } 215 216 // Agregar botones de flechas 217 if (currentPage > 1) { 218 const prevButton = document.createElement("li"); 219 prevButton.classList.add("page-item"); 220 const prevLink = document.createElement("a"); 221 prevLink.classList.add("page-link"); 222 prevLink.href = "#"; 223 prevLink.innerHTML = "«"; // Flecha izquierda 224 prevButton.appendChild(prevLink); 225 226 prevLink.addEventListener("click", (e) => { 227 e.preventDefault(); 228 currentPage--; 229 displayData(currentPage, resultados); 230 renderPagination(resultados); 231 }); 232 233 pagination.insertBefore(prevButton, pagination.firstChild); 234 } 235 236 if (currentPage < pageCount) { 237 const nextButton = document.createElement("li"); 238 nextButton.classList.add("page-item"); 239 const nextLink = document.createElement("a"); 240 nextLink.classList.add("page-link"); 241 nextLink.href = "#"; 242 nextLink.innerHTML = "»"; // Flecha derecha 243 nextButton.appendChild(nextLink); 244 245 nextLink.addEventListener("click", (e) => { 246 e.preventDefault(); 247 currentPage++; 248 displayData(currentPage, resultados); 249 renderPagination(resultados); 250 }); 251 252 pagination.appendChild(nextButton); 253 } 254}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.