Sindbad~EG File Manager
<?php
// Get user access level
$userAccessLevel = getUserAccessLevel();
$isSuperUser = isSuperuser();
// Get modules from database with access control
$db = Database::getInstance()->getConnection();
// Query to get modules that user has access to based on their access level
if ($isSuperUser) {
// Superusers: Get all active modules where superuser access is enabled
$moduleQuery = "
SELECT DISTINCT
m.id,
m.module_name,
m.module_icon,
m.module_url,
m.display_order,
m.category,
m.is_active
FROM module_management m
INNER JOIN module_access_levels mal ON m.id = mal.module_id
WHERE m.is_active = 1
AND mal.access_level = 'superuser'
AND mal.is_enabled = 1
ORDER BY m.display_order, m.module_name
";
$modules = $db->query($moduleQuery)->fetchAll();
} else {
// Other users: Get only modules enabled for their specific access level
$moduleQuery = "
SELECT DISTINCT
m.id,
m.module_name,
m.module_icon,
m.module_url,
m.display_order,
m.category,
m.is_active
FROM module_management m
INNER JOIN module_access_levels mal ON m.id = mal.module_id
WHERE m.is_active = 1
AND mal.access_level = :access_level
AND mal.is_enabled = 1
ORDER BY m.display_order, m.module_name
";
$stmt = $db->prepare($moduleQuery);
$stmt->execute(['access_level' => $userAccessLevel]);
$modules = $stmt->fetchAll();
}
// Add static items (Home, Dashboard)
$staticMenuItems = [
['name' => 'Home', 'url' => '', 'icon' => 'home', 'category' => 'Navigation'],
['name' => 'Dashboard', 'url' => 'dashboard.php', 'icon' => 'tachometer-alt', 'category' => 'Navigation'],
];
// Define category display order
$categoryOrder = [
'Navigation',
'Core Management',
'General Management',
'User Management',
'Event Management',
'Communication',
'System',
'Reports'
];
// Group modules by category
$modulesByCategory = [];
foreach ($staticMenuItems as $item) {
$modulesByCategory[$item['category']][] = $item;
}
foreach ($modules as $module) {
$category = $module['category'] ?? 'General';
$modulesByCategory[$category][] = [
'name' => $module['module_name'],
'url' => $module['module_url'],
'icon' => $module['module_icon'],
'category' => $category
];
}
// Sort categories by defined order
$sortedModules = [];
foreach ($categoryOrder as $category) {
if (isset($modulesByCategory[$category])) {
$sortedModules[$category] = $modulesByCategory[$category];
}
}
// Add any remaining categories not in the order list
foreach ($modulesByCategory as $category => $items) {
if (!isset($sortedModules[$category])) {
$sortedModules[$category] = $items;
}
}
$modulesByCategory = $sortedModules;
?>
<!-- Sidebar -->
<aside id="sidebar" class="sidebar bg-white w-64 fixed inset-y-0 left-0 z-40 transform -translate-x-full md:translate-x-0 transition-transform duration-300 ease-in-out shadow-xl mt-16 overflow-y-auto">
<div class="p-4">
<h2 class="text-lg font-bold text-gray-800 mb-4 flex items-center">
<i class="fas fa-th-large mr-2 text-blue-500"></i>
Menu
</h2>
<nav class="space-y-1">
<?php foreach ($modulesByCategory as $category => $items): ?>
<?php if (!empty($items)): ?>
<!-- Category Header -->
<?php if ($category !== 'Navigation'): ?>
<div class="pt-4 pb-2">
<h3 class="px-4 text-xs font-semibold text-gray-400 uppercase tracking-wider">
<?php echo htmlspecialchars($category); ?>
</h3>
</div>
<?php endif; ?>
<!-- Module Items -->
<?php foreach ($items as $item): ?>
<a href="<?php echo BASE_URL . $item['url']; ?>"
class="flex items-center px-4 py-2.5 text-gray-700 hover:text-white rounded-lg transition group text-sm"
onmouseover="this.style.background='linear-gradient(135deg, #1E40AF 0%, #9333EA 100%)'; this.style.color='white';"
onmouseout="this.style.background=''; this.style.color='';">
<i class="fas fa-<?php echo htmlspecialchars($item['icon']); ?> mr-3 text-base w-5"></i>
<span class="font-medium"><?php echo htmlspecialchars($item['name']); ?></span>
</a>
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
<hr class="my-4">
<a href="<?php echo BASE_URL; ?>profile.php"
class="flex items-center px-4 py-2.5 text-gray-700 hover:bg-gradient-to-r hover:from-blue-500 hover:to-blue-600 hover:text-white rounded-lg transition text-sm">
<i class="fas fa-user-circle mr-3 text-base w-5"></i>
<span class="font-medium">My Profile</span>
</a>
<a href="<?php echo BASE_URL; ?>logout.php"
class="flex items-center px-4 py-2.5 text-red-600 hover:bg-red-50 rounded-lg transition text-sm">
<i class="fas fa-sign-out-alt mr-3 text-base w-5"></i>
<span class="font-medium">Logout</span>
</a>
</nav>
</div>
</aside>
<!-- Sidebar Overlay for mobile -->
<div id="sidebarOverlay" class="fixed inset-0 bg-black bg-opacity-50 z-30 hidden md:hidden"></div>
<script>
// Sidebar toggle for mobile
const sidebar = document.getElementById('sidebar');
const sidebarToggle = document.getElementById('sidebarToggle');
const sidebarOverlay = document.getElementById('sidebarOverlay');
if (sidebarToggle) {
sidebarToggle.addEventListener('click', function() {
sidebar.classList.toggle('-translate-x-full');
sidebarOverlay.classList.toggle('hidden');
});
}
if (sidebarOverlay) {
sidebarOverlay.addEventListener('click', function() {
sidebar.classList.add('-translate-x-full');
sidebarOverlay.classList.add('hidden');
});
}
// Close sidebar when clicking a link on mobile
const sidebarLinks = sidebar.querySelectorAll('a');
sidebarLinks.forEach(link => {
link.addEventListener('click', function() {
if (window.innerWidth < 768) {
sidebar.classList.add('-translate-x-full');
sidebarOverlay.classList.add('hidden');
}
});
});
</script>
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists