/* =================================================================================================================== INICIO: permite cambiar la opacidad de los iconos si el ratón pasa por encima. =================================================================================================================== */ const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]') const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl)) /* =================================================================================================================== BUSCADOR: permite el resize del/de los iframe(s), evita scroll interno. Cada origen apunta a SU iframe. Si en el futuro se añade otro buscador embebido, basta con añadir una línea nueva a IFRAME_POR_ORIGEN (no tocar las que ya existen). =================================================================================================================== */ const IFRAME_POR_ORIGEN = { 'https://projectes.ice.upc.edu': 'miIframe', // proyecto ya existente, sin tocar 'https://formacio.ice.upc.edu': 'iframeOfertaFormativa' // nuevo: Oferta Formativa }; window.addEventListener('message', (event) => { const iframeId = IFRAME_POR_ORIGEN[event.origin]; if (!iframeId) return; // mensaje de un origen que no reconocemos: se ignora if (event.data && event.data.iframeCercadorAltura) { const iframe = document.getElementById(iframeId); if (iframe) iframe.style.height = event.data.iframeCercadorAltura + 'px'; } }); /* =================================================================================================================== BUSCADOR: permite cambiar la url del/de los iframe(s) según la URL de la página al cargar. FIX: antes solo se comprobaba una vez en DOMContentLoaded. Si el iframe se insertaba en el DOM después de ese evento (p.ej. navegación sin caché, carga más lenta de recursos), el parámetro de búsqueda se perdía. Ahora usamos un MutationObserver que espera a que cada iframe aparezca en el DOM (sin límite de tiempo fijo) y aplica el query string en cuanto lo encuentra, tanto si ya estaba como si se inserta más tarde. =================================================================================================================== */ (() => { const queryString = window.location.search; if (!queryString) return; const pendingIds = new Set(Object.values(IFRAME_POR_ORIGEN)); const applyQueryToIframe = (iframe) => { try { const iframeUrl = new URL(iframe.src, window.location.href); iframeUrl.search = queryString; iframe.src = iframeUrl.toString(); } catch (err) { console.warn('No se ha podido actualizar el src del iframe', iframe, err); } }; const tryApplyAll = () => { pendingIds.forEach((id) => { const iframe = document.getElementById(id); if (iframe) { applyQueryToIframe(iframe); pendingIds.delete(id); } }); if (pendingIds.size === 0) { observer.disconnect(); } }; const observer = new MutationObserver(() => { tryApplyAll(); }); // Intento inmediato por si el iframe ya está presente (caso rápido / reload con caché). tryApplyAll(); // Si queda algún iframe por encontrar, observamos el DOM hasta que aparezca. if (pendingIds.size > 0) { observer.observe(document.documentElement, { childList: true, subtree: true }); // Salvaguarda: dejamos de observar tras 15s para no quedarnos escuchando indefinidamente // si por lo que sea el iframe nunca llega a insertarse. setTimeout(() => observer.disconnect(), 15000); } })(); /* =================================================================================================================== BUSCADOR: cambia la url de la pagina en funcion de la busqueda del iframe. No depende de ningún id ni origen concreto: sirve igual para cualquier buscador embebido. =================================================================================================================== */ window.addEventListener('message', e => { if (typeof e.data?.iframeCercadorQuery === 'string') { const query = e.data.iframeCercadorQuery const url = window.location.pathname + (query ? '?' + query : '') history.replaceState(null, '', url) } })