ролевая моделю доступа + загруженность по кафедрам и преподавателям + просморт расписания
This commit is contained in:
@@ -72,6 +72,10 @@
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.nav-item[hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.nav-item::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user