Files
n3wt-school/Front-End/src/components/Sidebar.js
Luc SORIGNET 4248a589c5 feat(frontend): refonte mobile planning et ameliorations suivi pedagogique [#NEWTS-4]
Fonction PWA et ajout du responsive design

Planning mobile :
- Nouvelle vue DayView avec bandeau semaine scrollable, date picker natif et navigation integree
- ScheduleNavigation converti en drawer overlay sur mobile, sidebar fixe sur desktop
- Suppression double barre navigation mobile, controles deplaces dans DayView
- Date picker natif via label+input sur mobile

Suivi pedagogique :
- Refactorisation page grades avec composant Table partage
- Colonnes stats par periode, absences, actions (Fiche + Evaluer)
- Lien cliquable sur la classe vers SchoolClassManagement

feat(backend): ajout associated_class_id dans StudentByRFCreationSerializer [#NEWTS-4]

UI global :
- Remplacement fleches texte par icones Lucide ChevronDown/ChevronRight
- Pagination conditionnelle sur tous les tableaux plats
- Layout responsive mobile : cartes separees fond transparent
- Table.js : pagination optionnelle, wrapper md uniquement
2026-03-16 12:27:06 +01:00

57 lines
1.5 KiB
JavaScript

'use client';
import React, { useState, useEffect } from 'react';
import { useRouter } from 'next/navigation';
import ProfileSelector from '@/components/ProfileSelector';
const SidebarItem = ({ icon: Icon, text, active, url, onClick }) => (
<div
onClick={onClick}
className={`flex items-center gap-3 px-2 py-2 rounded-md cursor-pointer hover:bg-emerald-100 ${
active ? 'bg-emerald-50 text-emerald-600' : 'text-gray-600'
}`}
>
<Icon size={20} />
<span>{text}</span>
</div>
);
function Sidebar({ currentPage, items, onCloseMobile }) {
const router = useRouter();
const [selectedItem, setSelectedItem] = useState(currentPage);
useEffect(() => {
setSelectedItem(currentPage);
}, [currentPage]);
const handleItemClick = (url) => {
setSelectedItem(url);
router.push(url);
if (onCloseMobile) {
onCloseMobile();
}
};
return (
<div className="w-64 bg-stone-50 border-r h-full border-gray-200">
<div className="border-b border-gray-200 hidden md:block">
<ProfileSelector className="border-none h-24" />
</div>
<nav className="space-y-1 px-4 py-6">
{items.map((item) => (
<SidebarItem
key={item.id}
icon={item.icon}
text={item.name}
active={item.id === selectedItem}
url={item.url}
onClick={() => handleItemClick(item.url)}
/>
))}
</nav>
</div>
);
}
export default Sidebar;