calendar_today

miércoles, 23 de septiembre de 2026

2 actividades

schedule 2
08:00
09:00

Acto de apertura

location_on Presencial
09:15
10:15

Taller 1

location_on Presencial
'); win.document.close(); } // ====== DELETE CONFIRMATION (managers) ====== function confirmDelete(activityId, activityTitle) { if (confirm('¿Estás seguro de que quieres eliminar la actividad "' + activityTitle + '"?\n\nEsta acción no se puede deshacer.')) { document.getElementById('deleteActivityId').value = activityId; document.getElementById('deleteForm').submit(); } } // ====== CSRF HELPER ====== function getCookie(name) { let cookieValue = null; if (document.cookie && document.cookie !== '') { const cookies = document.cookie.split(';'); for (let i = 0; i < cookies.length; i++) { const cookie = cookies[i].trim(); if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } // ====== FAVORITES ====== async function toggleFavorite(btn) { const activityId = btn.getAttribute('data-activity-id'); const icon = btn.querySelector('.material-symbols-outlined'); const isFav = icon && icon.innerText.trim() === 'star'; if (icon) icon.innerText = isFav ? 'star_border' : 'star'; btn.classList.toggle('active', !isFav); try { const csrftoken = getCookie('csrftoken'); const res = await fetch('/events/actividad-favoritos/', { method: isFav ? 'DELETE' : 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', 'X-CSRFToken': csrftoken }, body: JSON.stringify({ actividad: activityId }) }); if (!res.ok) { if (icon) icon.innerText = isFav ? 'star' : 'star_border'; btn.classList.toggle('active', isFav); } } catch (e) { console.error('Favorito API error', e); if (icon) icon.innerText = isFav ? 'star' : 'star_border'; btn.classList.toggle('active', isFav); } } // ====== LIKES (localStorage-based) ====== function toggleLike(chipOrElem) { const chip = chipOrElem.classList && chipOrElem.classList.contains('like-chip') ? chipOrElem : chipOrElem.closest('.like-chip'); if (!chip) return; const activityId = chip.getAttribute('data-activity-id'); const countKey = 'liked_activity_count_' + activityId; const meKey = 'liked_activity_by_me_' + activityId; const likedByMe = localStorage.getItem(meKey) === '1'; let count = parseInt(localStorage.getItem(countKey) || '0', 10) || 0; if (likedByMe) { localStorage.removeItem(meKey); count = Math.max(0, count - 1); } else { localStorage.setItem(meKey, '1'); count = count + 1; } localStorage.setItem(countKey, String(count)); const countEl = chip.querySelector('.like-count'); if (countEl) countEl.innerText = count; const heartIcon = chip.querySelector('.material-symbols-outlined'); if (localStorage.getItem(meKey) === '1') { chip.classList.add('liked'); if (heartIcon) heartIcon.innerText = 'favorite'; } else { chip.classList.remove('liked'); if (heartIcon) heartIcon.innerText = 'favorite_border'; } } function initLikes() { document.querySelectorAll('.like-chip').forEach(chip => { const activityId = chip.getAttribute('data-activity-id'); const count = parseInt(localStorage.getItem('liked_activity_count_' + activityId) || '0', 10) || 0; const likedByMe = localStorage.getItem('liked_activity_by_me_' + activityId) === '1'; const countEl = chip.querySelector('.like-count'); if (countEl) countEl.innerText = count; const heartIcon = chip.querySelector('.material-symbols-outlined'); if (likedByMe) { chip.classList.add('liked'); if (heartIcon) heartIcon.innerText = 'favorite'; } }); } // Close modals on Escape document.addEventListener('keydown', (e) => { if (e.key === 'Escape') { closeSpeakerModal(); closeQrModal(); } }); // Close modals on overlay click document.querySelectorAll('.modal-overlay').forEach(overlay => { overlay.addEventListener('click', (e) => { if (e.target === overlay) { overlay.classList.add('hidden'); overlay.classList.remove('flex'); } }); }); document.addEventListener('DOMContentLoaded', initLikes);