// /js/load-sidebar.js import { getUser } from './auth.js'; /** * 사용자 역할에 따라 사이드바 메뉴 항목을 필터링합니다. * @param {Document} doc - 파싱된 HTML 문서 객체 * @param {string} userRole - 현재 사용자의 역할 */ function filterSidebarByRole(doc, userRole) { // 'system' 역할은 모든 메뉴를 볼 수 있으므로 필터링하지 않음 if (userRole === 'system') { return; } // 역할과 그에 해당하는 클래스 선택자 매핑 const roleClassMap = { admin: '.admin-only', leader: '.leader-only', user: '.user-only', // 또는 'worker-only' 등, sidebar.html에 정의된 클래스에 맞춰야 함 support: '.support-only' }; // 모든 역할 기반 선택자를 가져옴 const allRoleSelectors = Object.values(roleClassMap).join(', '); const allRoleElements = doc.querySelectorAll(allRoleSelectors); allRoleElements.forEach(el => { // 요소가 현재 사용자 역할에 해당하는 클래스를 가지고 있는지 확인 const userRoleSelector = roleClassMap[userRole]; if (!userRoleSelector || !el.matches(userRoleSelector)) { el.remove(); } }); } document.addEventListener('DOMContentLoaded', async () => { const sidebarContainer = document.getElementById('sidebar-container'); if (!sidebarContainer) return; const currentUser = getUser(); if (!currentUser) return; // 비로그인 상태면 사이드바를 로드하지 않음 try { const response = await fetch('/components/sidebar.html'); if (!response.ok) { throw new Error(`사이드바 파일을 불러올 수 없습니다: ${response.statusText}`); } const htmlText = await response.text(); // 1. 텍스트를 가상 DOM으로 파싱 const parser = new DOMParser(); const doc = parser.parseFromString(htmlText, 'text/html'); // 2. DOM에 삽입하기 *전*에 역할에 따라 메뉴 필터링 filterSidebarByRole(doc, currentUser.role); // 3. 수정 완료된 HTML을 실제 DOM에 삽입 sidebarContainer.innerHTML = doc.body.innerHTML; console.log('✅ 사이드바 로딩 및 필터링 완료'); } catch (error) { console.error('🔴 사이드바 로딩 실패:', error); sidebarContainer.innerHTML = '
메뉴 로딩 실패
'; } });