/* ===== Dashboard (대시보드) ===== */ const today = new Date().toISOString().substring(0, 10); function updateDateTime() { const now = new Date(); const days = ['일', '월', '화', '수', '목', '금', '토']; const h = String(now.getHours()).padStart(2, '0'); const m = String(now.getMinutes()).padStart(2, '0'); const el = document.getElementById('dateTimeDisplay'); if (el) el.textContent = `${now.getFullYear()}년 ${now.getMonth()+1}월 ${now.getDate()}일 (${days[now.getDay()]}) ${h}:${m}`; } async function loadDashboard() { updateDateTime(); const results = await Promise.allSettled([ api('/tbm/sessions/date/' + today).catch(() => ({ data: [] })), api('/equipments/repair-requests?status=pending').catch(() => ({ data: [] })), api('/attendance/daily-status?date=' + today).catch(() => ({ data: [] })), ]); const tbmData = results[0].status === 'fulfilled' ? results[0].value : { data: [] }; const repairData = results[1].status === 'fulfilled' ? results[1].value : { data: [] }; const attendData = results[2].status === 'fulfilled' ? results[2].value : { data: [] }; const tbmSessions = tbmData.data || []; const repairs = repairData.data || []; const attendList = Array.isArray(attendData.data) ? attendData.data : []; const checkedInCount = attendList.filter(d => d.status !== 'incomplete').length; // Stats document.getElementById('statTbm').textContent = tbmSessions.length; document.getElementById('statWorkers').textContent = checkedInCount; document.getElementById('statRepairs').textContent = repairs.length; document.getElementById('statNotifications').textContent = '-'; // TBM list renderTbmList(tbmSessions); renderNotificationPanel(); renderRepairList(repairs); } function renderTbmList(sessions) { const el = document.getElementById('tbmList'); if (!sessions.length) { el.innerHTML = '
금일 TBM이 없습니다
'; return; } el.innerHTML = sessions.slice(0, 5).map(s => { const workers = s.team_member_count || 0; return `알림은 사용자관리에서 확인하세요
알림 관리 바로가기대기 중인 수리 요청이 없습니다
'; return; } el.innerHTML = repairs.slice(0, 5).map(r => { return `