diff --git a/web-ui/js/tbm.js b/web-ui/js/tbm.js index 5f5ad92..614e91a 100644 --- a/web-ui/js/tbm.js +++ b/web-ui/js/tbm.js @@ -2,11 +2,13 @@ // 전역 변수 let allSessions = []; +let todaySessions = []; let allWorkers = []; let allProjects = []; let allSafetyChecks = []; let currentSessionId = null; let selectedWorkers = new Set(); +let currentTab = 'tbm-input'; // 페이지 초기화 document.addEventListener('DOMContentLoaded', async () => { @@ -34,7 +36,7 @@ document.addEventListener('DOMContentLoaded', async () => { // 초기 데이터 로드 await loadInitialData(); - await loadTodayTbm(); + await loadTodayOnlyTbm(); }); // 이벤트 리스너 설정 @@ -81,7 +83,98 @@ async function loadInitialData() { } } -// 오늘 TBM 로드 +// ==================== 탭 전환 ==================== + +// 탭 전환 +function switchTbmTab(tabName) { + currentTab = tabName; + + // 탭 버튼 활성화 상태 변경 + document.querySelectorAll('.tab-btn').forEach(btn => { + if (btn.dataset.tab === tabName) { + btn.classList.add('active'); + } else { + btn.classList.remove('active'); + } + }); + + // 탭 컨텐츠 표시 변경 + document.querySelectorAll('.code-tab-content').forEach(content => { + content.classList.remove('active'); + }); + document.getElementById(`${tabName}-tab`).classList.add('active'); + + // 탭에 따라 데이터 로드 + if (tabName === 'tbm-input') { + loadTodayOnlyTbm(); + } else if (tabName === 'tbm-manage') { + const tbmDate = document.getElementById('tbmDate'); + if (tbmDate && tbmDate.value) { + loadTbmSessionsByDate(tbmDate.value); + } else { + loadTodayTbm(); + } + } +} +window.switchTbmTab = switchTbmTab; + +// ==================== TBM 입력 탭 ==================== + +// 오늘의 TBM만 로드 (TBM 입력 탭용) +async function loadTodayOnlyTbm() { + const today = new Date().toISOString().split('T')[0]; + + try { + const response = await window.apiCall(`/tbm/sessions/date/${today}`); + + if (response && response.success) { + todaySessions = response.data || []; + displayTodayTbmSessions(); + } else { + todaySessions = []; + displayTodayTbmSessions(); + } + } catch (error) { + console.error('❌ 오늘 TBM 조회 오류:', error); + showToast('오늘 TBM을 불러오는 중 오류가 발생했습니다.', 'error'); + todaySessions = []; + displayTodayTbmSessions(); + } +} +window.loadTodayOnlyTbm = loadTodayOnlyTbm; + +// 오늘의 TBM 세션 표시 +function displayTodayTbmSessions() { + const grid = document.getElementById('todayTbmGrid'); + const emptyState = document.getElementById('todayEmptyState'); + const todayTotalEl = document.getElementById('todayTotalSessions'); + const todayCompletedEl = document.getElementById('todayCompletedSessions'); + const todayActiveEl = document.getElementById('todayActiveSessions'); + + if (todaySessions.length === 0) { + grid.innerHTML = ''; + emptyState.style.display = 'flex'; + todayTotalEl.textContent = '0'; + todayCompletedEl.textContent = '0'; + todayActiveEl.textContent = '0'; + return; + } + + emptyState.style.display = 'none'; + + const completedCount = todaySessions.filter(s => s.status === 'completed').length; + const activeCount = todaySessions.filter(s => s.status === 'draft').length; + + todayTotalEl.textContent = todaySessions.length; + todayCompletedEl.textContent = completedCount; + todayActiveEl.textContent = activeCount; + + grid.innerHTML = todaySessions.map(session => createSessionCard(session)).join(''); +} + +// ==================== TBM 관리 탭 ==================== + +// 오늘 TBM 로드 (TBM 관리 탭용) async function loadTodayTbm() { const today = new Date().toISOString().split('T')[0]; document.getElementById('tbmDate').value = today; @@ -89,6 +182,28 @@ async function loadTodayTbm() { } window.loadTodayTbm = loadTodayTbm; +// 전체 TBM 로드 +async function loadAllTbm() { + try { + const response = await window.apiCall('/tbm/sessions'); + + if (response && response.success) { + allSessions = response.data || []; + document.getElementById('tbmDate').value = ''; + displayTbmSessions(); + } else { + allSessions = []; + displayTbmSessions(); + } + } catch (error) { + console.error('❌ 전체 TBM 조회 오류:', error); + showToast('전체 TBM을 불러오는 중 오류가 발생했습니다.', 'error'); + allSessions = []; + displayTbmSessions(); + } +} +window.loadAllTbm = loadAllTbm; + // 특정 날짜의 TBM 세션 목록 로드 async function loadTbmSessionsByDate(date) { try { @@ -109,7 +224,7 @@ async function loadTbmSessionsByDate(date) { } } -// TBM 세션 목록 표시 +// TBM 세션 목록 표시 (관리 탭용) function displayTbmSessions() { const grid = document.getElementById('tbmSessionsGrid'); const emptyState = document.getElementById('emptyState'); @@ -130,71 +245,74 @@ function displayTbmSessions() { totalSessionsEl.textContent = allSessions.length; completedSessionsEl.textContent = completedCount; - grid.innerHTML = allSessions.map(session => { - const statusBadge = { - 'draft': '진행중', - 'completed': '완료', - 'cancelled': '취소' - }[session.status] || ''; + grid.innerHTML = allSessions.map(session => createSessionCard(session)).join(''); +} - return ` -
- ${session.leader_job_type || ''} -
-+ ${session.session_date} | ${session.leader_job_type || ''} +
아침 안전 회의 및 팀 구성 관리