ролевая моделю доступа + загруженность по кафедрам и преподавателям + просморт расписания

This commit is contained in:
Zuev
2026-05-19 23:10:56 +03:00
parent f010ffc467
commit 91729cff7d
93 changed files with 4264 additions and 699 deletions

View File

@@ -4,7 +4,7 @@ import { startDropdownAutoObserver, initAllCustomDropdowns } from '../../js/drop
// Проверка авторизации
const token = localStorage.getItem('token');
const role = localStorage.getItem('role');
if (!token || role !== 'ADMIN') {
if (!token || !['ADMIN', 'EDUCATION_OFFICE'].includes(role)) {
window.location.href = '/';
}
@@ -27,6 +27,13 @@ const ROUTES = {
},
};
const ROLE_TABS = {
ADMIN: ['general', 'time-slots'],
EDUCATION_OFFICE: ['time-slots']
};
const allowedTabs = new Set(ROLE_TABS[role] || []);
const defaultTab = role === 'EDUCATION_OFFICE' ? 'time-slots' : 'general';
let currentTab = null;
// DOM-элементы
@@ -76,6 +83,7 @@ sidebarOverlay.addEventListener('click', () => {
// Навигация
navItems.forEach(item => {
item.hidden = !allowedTabs.has(item.dataset.tab);
item.addEventListener('click', (e) => {
e.preventDefault();
const tab = item.dataset.tab;
@@ -84,7 +92,7 @@ navItems.forEach(item => {
});
async function switchTab(tab) {
if (currentTab === tab || !ROUTES[tab]) return;
if (currentTab === tab || !ROUTES[tab] || !allowedTabs.has(tab)) return;
navItems.forEach(n => n.classList.remove('active'));
document.querySelector(`.nav-item[data-tab="${tab}"]`)?.classList.add('active');
@@ -114,4 +122,4 @@ async function switchTab(tab) {
}
// Вкладка по умолчанию
switchTab('general');
switchTab(defaultTab);