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_name || '팀장 미지정'} -

-

- ${session.leader_job_type || ''} -

-
- ${statusBadge} +// TBM 세션 카드 생성 (공통) +function createSessionCard(session) { + const statusBadge = { + 'draft': '진행중', + 'completed': '완료', + 'cancelled': '취소' + }[session.status] || ''; + + return ` +
+
+
+

+ ${session.leader_name || '팀장 미지정'} +

+

+ ${session.session_date} | ${session.leader_job_type || ''} +

+ ${statusBadge} +
-
-
- 프로젝트 - ${session.project_name || '-'} -
-
- 작업 장소 - ${session.work_location || '-'} -
-
- 팀원 수 - ${session.team_member_count || 0}명 -
-
- 시작 시간 - ${session.start_time || '-'} -
+
+
+ 프로젝트 + ${session.project_name || '-'}
- - ${session.work_description ? ` -
- ${session.work_description} -
- ` : ''} - -
- ${session.status === 'draft' ? ` - - - - - ` : ''} +
+ 작업 장소 + ${session.work_location || '-'} +
+
+ 팀원 수 + ${session.team_member_count || 0}명 +
+
+ 시작 시간 + ${session.start_time || '-'}
- `; - }).join(''); + + ${session.work_description ? ` +
+ ${session.work_description} +
+ ` : ''} + +
+ ${session.status === 'draft' ? ` + + + + + ` : ''} +
+
+ `; } // 새 TBM 모달 열기 @@ -276,7 +394,11 @@ async function saveTbmSession() { const createdSessionId = response.data.session_id; // 목록 새로고침 - await loadTbmSessionsByDate(sessionData.session_date); + if (currentTab === 'tbm-input') { + await loadTodayOnlyTbm(); + } else { + await loadTbmSessionsByDate(sessionData.session_date); + } // 팀 구성 모달 열기 setTimeout(() => { @@ -423,8 +545,12 @@ async function saveTeamComposition() { closeTeamModal(); // 목록 새로고침 - const date = document.getElementById('tbmDate').value; - await loadTbmSessionsByDate(date); + if (currentTab === 'tbm-input') { + await loadTodayOnlyTbm(); + } else { + const date = document.getElementById('tbmDate').value; + await loadTbmSessionsByDate(date); + } } else { throw new Error(response.message || '저장에 실패했습니다.'); } @@ -577,8 +703,12 @@ async function completeTbmSession() { closeCompleteModal(); // 목록 새로고침 - const date = document.getElementById('tbmDate').value; - await loadTbmSessionsByDate(date); + if (currentTab === 'tbm-input') { + await loadTodayOnlyTbm(); + } else { + const date = document.getElementById('tbmDate').value; + await loadTbmSessionsByDate(date); + } } else { throw new Error(response.message || '완료 처리에 실패했습니다.'); } diff --git a/web-ui/pages/work/tbm.html b/web-ui/pages/work/tbm.html index c458644..ddf9b3c 100644 --- a/web-ui/pages/work/tbm.html +++ b/web-ui/pages/work/tbm.html @@ -23,52 +23,117 @@

🛠️ - TBM (Tool Box Meeting) 관리 + TBM (Tool Box Meeting)

아침 안전 회의 및 팀 구성 관리

-
- - - +
+
- -
-
-

TBM 세션 목록

-
+ +
+ + +
+ + +
+
+
+

+ 🌅 + 오늘의 TBM +

+
+ +
+
+ +
+ + 📋 + 오늘 등록 0개 + + + + 완료 0개 + + + + 진행중 0개 + +
+ +
+ +
+ + + +
+
+ + +
+
+
+

+ 📚 + 전체 TBM 기록 +

+
+ + + +
+
+ +
📋0 - + 완료 0
-
-
- -
+
+ +
- -