- 순찰/점검 기능 개선 (zone-detail 페이지 추가) - 출근/근태 시스템 개선 (연차 조회, 근무현황) - 작업분석 대분류 그룹화 및 마이그레이션 스크립트 - 모바일 네비게이션 UI 추가 - NAS 배포 도구 및 문서 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
67 lines
2.3 KiB
JavaScript
67 lines
2.3 KiB
JavaScript
// /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 = '<p>메뉴 로딩 실패</p>';
|
|
}
|
|
}); |