Files
TK-FB-Project/web-ui/js/load-sections.js

187 lines
6.2 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ✅ /js/load-sections.js - 확장 가능한 구조 (개선됨)
import { API, getAuthHeaders } from '/js/api-config.js';
// 역할별 섹션 매핑 (쉽게 추가/수정 가능)
const SECTION_MAP = {
'admin': '/components/sections/admin-sections.html',
'system': '/components/sections/admin-sections.html',
'leader': '/components/sections/leader-sections.html',
'group_leader': '/components/sections/leader-sections.html',
'support': '/components/sections/support-sections.html',
'support_team': '/components/sections/support-sections.html',
'user': '/components/sections/user-sections.html',
'worker': '/components/sections/user-sections.html'
};
// 공통 섹션 (모든 사용자에게 표시)
const COMMON_SECTIONS = '/components/sections/common-sections.html';
async function loadSections() {
try {
console.log('🔄 섹션 로딩 시작');
// 사용자 정보 확인
const token = localStorage.getItem('token');
if (!token) {
console.log('❌ 토큰 없음, 로그인 페이지로 이동');
window.location.href = '/index.html';
return;
}
let userInfo = { role: 'user', access_level: 'worker' };
try {
const payload = JSON.parse(atob(token.split('.')[1]));
userInfo = {
role: payload.role || 'user',
access_level: payload.access_level || 'worker'
};
console.log('👤 사용자 정보:', userInfo);
} catch (err) {
console.warn('⚠️ JWT 파싱 실패:', err);
}
// ✅ 컨테이너 찾기 - 더 안전한 방식
const possibleContainers = [
'#sections-container',
'#admin-sections',
'#user-sections',
'main[id$="-sections"]',
'#content-container main'
];
let container = null;
for (const selector of possibleContainers) {
container = document.querySelector(selector);
if (container) {
console.log(`✅ 컨테이너 발견: ${selector}`);
break;
}
}
if (!container) {
console.error('❌ 섹션 컨테이너를 찾을 수 없습니다');
return;
}
container.innerHTML = '<div class="loading">콘텐츠를 불러오는 중...</div>';
// 역할별 섹션 파일 결정 (수정된 버전)
console.log('🔍 사용자 정보 디버깅:');
console.log('- userInfo.role:', userInfo.role);
console.log('- userInfo.access_level:', userInfo.access_level);
// role이 없으므로 access_level을 우선 사용
const effectiveRole = userInfo.access_level || userInfo.role || 'user';
const sectionFile = SECTION_MAP[effectiveRole] || SECTION_MAP['user'];
console.log(`📄 실제 사용될 역할: ${effectiveRole}`);
console.log(`📄 로딩할 섹션 파일: ${sectionFile}`);
try {
// 1. 공통 섹션 로드 (있을 경우)
let commonHtml = '';
try {
console.log('📄 공통 섹션 로딩 시도');
const commonRes = await fetch(COMMON_SECTIONS);
if (commonRes.ok) {
commonHtml = await commonRes.text();
console.log('✅ 공통 섹션 로딩 성공');
}
} catch (e) {
console.log(' 공통 섹션 없음 (정상)');
}
// 2. 역할별 섹션 로드
console.log('📄 역할별 섹션 로딩 시도');
const res = await fetch(sectionFile);
if (!res.ok) {
throw new Error(`HTTP ${res.status}: 섹션 파일을 찾을 수 없습니다 (${sectionFile})`);
}
const roleHtml = await res.text();
console.log('✅ 역할별 섹션 로딩 성공');
// 3. 조합하여 표시
container.innerHTML = commonHtml + roleHtml;
console.log('✅ 섹션 HTML 렌더링 완료');
// 4. 추가 데이터 로드 (필요시)
await loadDynamicData(userInfo);
console.log('✅ 섹션 로딩 완료');
} catch (err) {
console.error('❌ 섹션 로드 실패:', err);
container.innerHTML = `
<div class="error-state">
<h3>❌ 콘텐츠를 불러올 수 없습니다</h3>
<p>오류: ${err.message}</p>
<p>잠시 후 다시 시도해주세요.</p>
<button onclick="location.reload()" class="btn btn-primary">🔄 새로고침</button>
</div>
`;
}
} catch (err) {
console.error('🔴 섹션 로딩 실패:', err);
}
}
// 동적 데이터 로드 (예: 대시보드 통계)
async function loadDynamicData(userInfo) {
console.log('📊 동적 데이터 로딩 시작');
// 오늘의 작업 현황
const todayStats = document.getElementById('today-stats');
if (todayStats) {
try {
const today = new Date().toISOString().split('T')[0];
const res = await fetch(`${API}/workreports?start=${today}&end=${today}`, {
headers: getAuthHeaders()
});
if (res.ok) {
const data = await res.json();
todayStats.innerHTML = `
<p>📝 오늘 등록된 작업: ${data.length}건</p>
<p>👥 참여 작업자: ${new Set(data.map(d => d.worker_id)).size}명</p>
`;
console.log('✅ 오늘 통계 로딩 완료');
}
} catch (e) {
console.error('❌ 통계 로드 실패:', e);
if (todayStats) {
todayStats.innerHTML = '<p>⚠️ 통계를 불러올 수 없습니다</p>';
}
}
}
// 빠른 링크 활성화
initializeQuickLinks(userInfo);
}
// 권한별 빠른 링크 표시/숨김
function initializeQuickLinks(userInfo) {
console.log('🔗 빠른 링크 초기화');
// 권한에 따라 특정 링크 숨기기
if (userInfo.role !== 'admin' && userInfo.access_level !== 'admin') {
document.querySelectorAll('.admin-only').forEach(el => {
el.style.display = 'none';
console.log('🔒 관리자 전용 링크 숨김');
});
}
if (userInfo.access_level !== 'group_leader') {
document.querySelectorAll('.leader-only').forEach(el => {
el.style.display = 'none';
console.log('🔒 그룹장 전용 링크 숨김');
});
}
console.log('✅ 빠른 링크 초기화 완료');
}
// 페이지 로드 시 실행
document.addEventListener('DOMContentLoaded', loadSections);
// 수동 새로고침 함수 (다른 곳에서 호출 가능)
window.refreshSections = loadSections;