mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-04-03 16:51:26 +00:00
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
57 lines
1.5 KiB
JavaScript
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;
|