187 lines
6.2 KiB
JavaScript
187 lines
6.2 KiB
JavaScript
// ✅ /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; |