[go: up one dir, main page]

0% found this document useful (0 votes)
19 views7 pages

Navbar

The document contains JavaScript code for a responsive navigation bar and sidebar for a student management web application. It includes functions to manage active links, search functionality, and dropdown menus for user profiles and notifications. The Navbar component is designed to adapt based on the user's screen size and includes various menu items related to student activities.

Uploaded by

anasbarkhioui2
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
19 views7 pages

Navbar

The document contains JavaScript code for a responsive navigation bar and sidebar for a student management web application. It includes functions to manage active links, search functionality, and dropdown menus for user profiles and notifications. The Navbar component is designed to adapt based on the user's screen size and includes various menu items related to student activities.

Uploaded by

anasbarkhioui2
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 7

// Helper function to get current page name

const getCurrentPage = () => {


const path = window.location.pathname;
const page = path.substring(path.lastIndexOf('/') + 1);
// Remove .html or .php extension
return page.replace(/\.(html|php)$/, '') || 'index';
};

// Helper function to check if a link is active


const isActive = (pages) => {
const currentPage = getCurrentPage();
if (Array.isArray(pages)) {
return pages.some(page => page.replace(/\.(html|php)$/, '') ===
currentPage);
}
return pages.replace(/\.(html|php)$/, '') === currentPage;
}

// Helper function to get link classes


const getLinkClasses = (pages) => {
return isActive(pages)
? "text-primary-600 bg-primary-50"
: "text-gray-600 hover:text-primary-600 hover:bg-primary-50";
}

// Helper function to get icon classes


const getIconClasses = (pages) => {
return isActive(pages) ? "text-primary-500" : "text-gray-400 group-hover:text-
primary-500";
}

// Helper function to get mobile link classes


const getMobileLinkClasses = (pages) => {
return isActive(pages)
? "bg-primary-50 border-primary-500 text-primary-700"
: "border-transparent text-gray-600 hover:bg-gray-50 hover:border-gray-300
hover:text-gray-800";
}

export function Navbar(studentName = 'John Smith', studentId = '', studentInitials


= 'JS', filiere = 'Not Assigned') {
return `
<!-- Top Navigation -->
<nav class="bg-white shadow-sm fixed top-0 left-0 right-0 z-50">
<div class="max-w-full mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between h-16">
<div class="flex items-center gap-3">
<div class="block lg:hidden">
<button type="button" class="text-gray-500 hover:text-
gray-600 focus:outline-none focus:ring-2 focus:ring-primary-500" id="mobile-menu-
button">
<i class="fas fa-bars text-xl"></i>
</button>
</div>
<div class="flex items-center gap-2">
<div class="bg-primary-100 p-2 rounded-lg">
<i class="fas fa-graduation-cap text-primary-600
text-lg"></i>
</div>
<h1 class="text-xl font-bold text-gray-
900">EduStudent</h1>
</div>
</div>
<div class="flex items-center gap-4">
<!-- Search -->
<div class="hidden md:block relative">
<div class="relative">
<input type="text"
id="search-input"
class="bg-gray-50 rounded-lg pl-10 pr-4 py-2 w-
64 text-sm text-gray-900 placeholder-gray-500 border border-gray-300 focus:outline-
none focus:border-primary-500 focus:ring-1 focus:ring-primary-500"
placeholder="Search courses, assignments...">
<div class="absolute inset-y-0 left-0 pl-3 flex
items-center pointer-events-none">
<i class="fas fa-search text-gray-400"></i>
</div>
</div>
<!-- Search Results Dropdown -->
<div id="search-results" class="hidden absolute left-0
right-0 mt-2 bg-white rounded-md shadow-lg max-h-96 overflow-y-auto z-50">
<!-- Results will be populated here -->
</div>
</div>

<!-- Notifications -->


<div class="relative">
<a href="notifications.php" class="text-gray-500
hover:text-gray-600 focus:outline-none focus:ring-2 focus:ring-primary-500 rounded-
lg p-1 block">
<i class="fas fa-bell text-xl"></i>
<span class="absolute top-0 right-0 block h-2 w-2
rounded-full bg-red-500 ring-2 ring-white"></span>
</a>
</div>

<!-- Profile Dropdown -->


<div class="relative" id="profile-menu">
<button class="flex items-center gap-3 focus:outline-
none focus:ring-2 focus:ring-primary-500 rounded-lg p-1" id="profile-button">
<div class="h-9 w-9 rounded-full bg-primary-100
flex items-center justify-center text-primary-600 font-semibold">
${studentInitials}
</div>
<div class="hidden md:block text-right">
<div class="text-sm font-medium text-gray-
700">${studentName}</div>
<div class="text-xs text-primary-600">$
{filiere}</div>
</div>
<i class="fas fa-chevron-down text-gray-400 text-sm
hidden md:block"></i>
</button>
<!-- Profile Dropdown Menu -->
<div class="hidden absolute right-0 mt-2 w-48 rounded-
md shadow-lg bg-white ring-1 ring-black ring-opacity-5" id="profile-dropdown">
<div class="py-1" role="menu">
<div class="px-4 py-2 text-xs text-gray-500">
${filiere}
</div>
<div class="border-t border-gray-100"></div>
<a href="profile.html" class="block px-4 py-2
text-sm text-gray-700 hover:bg-gray-100" role="menuitem">
<i class="fas fa-user mr-2 text-gray-
400"></i>
Profile
</a>
<a href="settings.html" class="block px-4 py-2
text-sm text-gray-700 hover:bg-gray-100" role="menuitem">
<i class="fas fa-cog mr-2 text-gray-
400"></i>
Settings
</a>
<div class="border-t border-gray-100"></div>
<a href="logout.php" class="block px-4 py-2
text-sm text-red-600 hover:bg-gray-100" role="menuitem">
<i class="fas fa-sign-out-alt mr-2"></i>
Logout
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</nav>

<!-- Sidebar -->


<div class="w-64 bg-white border-r border-gray-200 fixed h-[calc(100vh-
4rem)] top-16 overflow-y-auto" id="sidebar">
<!-- Student Profile Card -->
<div class="p-4">
<div class="bg-gray-50 rounded-lg p-3 flex items-center gap-3
relative">
<div class="h-10 w-10 rounded-full bg-primary-100 flex items-
center justify-center text-primary-600 font-semibold">
${studentInitials}
</div>
<div>
<h2 class="text-sm font-medium text-gray-900">$
{studentName}</h2>
<p class="text-xs text-gray-500">${studentId ? `ID: $
{studentId}` : ''}</p>
</div>
<!-- Online Status Indicator -->
<div class="absolute bottom-3 left-11">
<div class="h-2.5 w-2.5 rounded-full bg-green-500 ring-2
ring-white"></div>
</div>
</div>
</div>

<!-- Navigation -->


<nav class="px-3 py-2">
<ul class="space-y-1">
<li>
<a href="index.html" class="nav-item $
{isActive('index.html') ? 'active' : ''}">
<i class="fas fa-home nav-icon"></i>
Dashboard
</a>
</li>
<li>
<a href="submissions.html" class="nav-item $
{isActive('submissions.html') ? 'active' : ''}">
<i class="fas fa-book nav-icon"></i>
Academics
</a>
</li>
<li>
<a href="attendance.html" class="nav-item $
{isActive('attendance.html') ? 'active' : ''}">
<i class="fas fa-calendar nav-icon"></i>
Attendance
</a>
</li>
<li>
<a href="quizzes.html" class="nav-item $
{isActive('quizzes.html') ? 'active' : ''}">
<i class="fas fa-clipboard-list nav-icon"></i>
Quizzes
</a>
</li>
<li>
<a href="payments.html" class="nav-item $
{isActive('payments.html') ? 'active' : ''}">
<i class="fas fa-credit-card nav-icon"></i>
Payments
</a>
</li>
<li>
<a href="messages.html" class="nav-item $
{isActive('messages.html') ? 'active' : ''}">
<i class="fas fa-comment-alt nav-icon"></i>
Messages
<span class="ml-auto bg-red-500 text-white text-xs
font-semibold px-2 py-0.5 rounded-full">3</span>
</a>
</li>
</ul>
</nav>

<!-- Settings Section -->


<div class="px-3 py-4 mt-6">
<h3 class="px-4 text-xs font-semibold text-gray-500 uppercase
tracking-wider mb-3">Settings</h3>
<nav>
<ul class="space-y-1">
<li>
<a href="profile.html" class="nav-item $
{isActive('profile.html') ? 'active' : ''}">
<i class="fas fa-user nav-icon"></i>
Profile Settings
</a>
</li>
<li>
<a href="notifications.php" class="nav-item $
{isActive('notifications.php') ? 'active' : ''}">
<i class="fas fa-bell nav-icon"></i>
Notifications
</a>
</li>
<li>
<a href="logout.php" class="nav-item">
<i class="fas fa-sign-out-alt nav-icon"></i>
Logout
</a>
</li>
</ul>
</nav>
</div>
</div>
`;
}

export function initNavbar() {


const mobileMenuButton = document.getElementById('mobile-menu-button');
const sidebar = document.getElementById('sidebar');
const profileButton = document.getElementById('profile-button');
const profileDropdown = document.getElementById('profile-dropdown');
const searchInput = document.getElementById('search-input');
const searchResults = document.getElementById('search-results');

// Navigation menu items


const menuItems = [
{ title: 'Dashboard', url: 'index.php', type: 'menu', icon: 'fa-home' },
{ title: 'Quizzes', url: 'quizzes.php', type: 'menu', icon: 'fa-clipboard-
list' },
{ title: 'Take Quiz', url: 'quizzes.php', type: 'sub', icon: 'fa-pen' },
{ title: 'Quiz History', url: 'quizzes.php', type: 'sub', icon: 'fa-
history' },
{ title: 'Academics', url: 'submissions.php', type: 'menu', icon: 'fa-book'
},
{ title: 'Courses', url: 'courses.php', type: 'sub', icon: 'fa-graduation-
cap' },
{ title: 'Assignments', url: 'assignments.php', type: 'sub', icon: 'fa-
tasks' },
{ title: 'Attendance', url: 'attendance.php', type: 'menu', icon: 'fa-
calendar' },
{ title: 'Payments', url: 'payments.php', type: 'menu', icon: 'fa-credit-
card' },
{ title: 'Payment History', url: 'payments.php?tab=history', type: 'sub',
icon: 'fa-history' },
{ title: 'Make Payment', url: 'payments.php?tab=new', type: 'sub', icon:
'fa-plus' },
{ title: 'Messages', url: 'messages.php', type: 'menu', icon: 'fa-comment-
alt' },
{ title: 'Profile Settings', url: 'profile.php', type: 'menu', icon: 'fa-
user' },
{ title: 'Notifications', url: 'notifications.php', type: 'menu', icon:
'fa-bell' }
];

// Search functionality
searchInput?.addEventListener('input', (e) => {
const query = e.target.value.trim().toLowerCase();
updateSearchResults(query);
});

// Handle Enter key press


searchInput?.addEventListener('keydown', (e) => {
if (e.key === 'Enter') {
const firstResult = menuItems.find(item =>

item.title.toLowerCase().includes(searchInput.value.trim().toLowerCase())
);
if (firstResult) {
window.location.href = firstResult.url;
}
}
});

function updateSearchResults(query) {
if (query.length > 0) {
// Filter menu items based on search query
const results = menuItems.filter(item =>
item.title.toLowerCase().includes(query)
);

// Display results
if (results.length > 0) {
searchResults.innerHTML = results.map(result => `
<a href="${result.url}" class="block px-4 py-2 text-sm text-
gray-700 hover:bg-gray-100">
<div class="flex items-center">
<i class="fas ${result.icon} mr-3 text-gray-400"></i>
<div>
<div class="font-medium">${result.title}</div>
<div class="text-xs text-gray-500">
${result.type === 'sub' ? 'Sub-menu' : 'Main
menu'}
</div>
</div>
</div>
</a>
`).join('');
searchResults.classList.remove('hidden');
} else {
searchResults.innerHTML = `
<div class="px-4 py-3 text-sm text-gray-500">
No results found
</div>
`;
searchResults.classList.remove('hidden');
}
} else {
searchResults.classList.add('hidden');
}
}

// Close search results when clicking outside


document.addEventListener('click', (e) => {
if (!searchInput?.contains(e.target) && !searchResults?.contains(e.target))
{
searchResults?.classList.add('hidden');
}
});

// Mobile menu toggle


mobileMenuButton?.addEventListener('click', () => {
sidebar.classList.toggle('hidden');
});

// Profile dropdown toggle


profileButton?.addEventListener('click', () => {
profileDropdown.classList.toggle('hidden');
});

// Close profile dropdown when clicking outside


document.addEventListener('click', (e) => {
if (!profileButton?.contains(e.target) && !
profileDropdown?.contains(e.target)) {
profileDropdown?.classList.add('hidden');
}
});

// Hide sidebar by default on mobile


if (window.innerWidth < 1024) {
sidebar?.classList.add('hidden');
}

// Handle window resize


window.addEventListener('resize', () => {
if (window.innerWidth >= 1024) {
sidebar?.classList.remove('hidden');
} else {
sidebar?.classList.add('hidden');
}
});
}

You might also like