const API_URL = "https://script.google.com/macros/s/AKfycbxg9k8zw-ES0m4CvEL2nNB3FAqWNbznxPBUoMAbZFnb2tdI2r0rRFAhwQ8bL4WH5Gcesw/exec"; const SLIDE_TIME = 12000; // 12 Seconds per slide const DATA_REFRESH = 300000; // 5 Minutes let slideIdx = 0; /** * Primary Data Fetching */ async function updateDashboard() { try { const response = await fetch(API_URL); if (!response.ok) throw new Error("Connection Error"); const data = await response.json(); // Safety Check: If Google Script threw an error if (data.error) { showError("Google Script: " + data.error); return; } renderProjects(data.projects); renderStats(data.projects); renderAnnouncements(data.announcements); renderCalendar(data.calendar); hideError(); } catch (err) { showError("Dashboard Error: " + err.message); } } /** * Renderers with Defensive Checks (The "Fix") */ function renderProjects(projectData) { const list = document.getElementById('p1-list'); // FIX: Check if data.projects AND data.projects.active exist if (projectData && projectData.active) { list.innerHTML = projectData.active.slice(0, 6).map(p => `
${p.type}
${p.name}
Status${p.progress}%
👤 ${p.owner} 📅 Due: ${p.due}
`).join(''); } else { list.innerHTML = "

No Active Projects

"; } } function renderStats(projectData) { const list = document.getElementById('p2-list'); if (projectData) { list.innerHTML = `

Completed

${projectData.completedCount || 0}

Still In Progress

${projectData.active ? projectData.active.length : 0}
`; } } function renderAnnouncements(ann) { const list = document.getElementById('p3-list'); if (ann && ann.length > 0) { list.innerHTML = ann.map(a => `
${a.date}

${a.title}

${a.content}

`).join(''); } else { list.innerHTML = "

No Current Announcements

"; } } function renderCalendar(cal) { const list = document.getElementById('p4-list'); if (cal && cal.length > 0) { list.innerHTML = cal.map(c => `
${c.isBirthday ? '🎂 BIRTHDAY' : '📅 EVENT'}

${c.title}

${c.start}
`).join(''); } else { list.innerHTML = "

No Events Scheduled

"; } } /** * Slide Rotation Logic */ function rotateSlides() { slideIdx = (slideIdx + 1) % 4; document.getElementById('slider').style.transform = `translateX(-${slideIdx * 100}vw)`; } /** * Error Handling UI */ function showError(msg) { const err = document.getElementById('error-display'); err.innerText = msg; err.classList.remove('hidden'); } function hideError() { document.getElementById('error-display').classList.add('hidden'); } // Initialize updateDashboard(); setInterval(updateDashboard, DATA_REFRESH); setInterval(rotateSlides, SLIDE_TIME);