fix: correction des redirections vers la login page

This commit is contained in:
Luc SORIGNET
2025-04-17 17:23:17 +02:00
parent f7666c894b
commit 2e0fe86c71
6 changed files with 44 additions and 48 deletions

View File

@ -30,7 +30,6 @@ import {
} from '@/utils/Url'; } from '@/utils/Url';
import { disconnect } from '@/app/actions/authAction'; import { disconnect } from '@/app/actions/authAction';
import { useSession } from 'next-auth/react';
import ProtectedRoute from '@/components/ProtectedRoute'; import ProtectedRoute from '@/components/ProtectedRoute';
import { getGravatarUrl } from '@/utils/gravatar'; import { getGravatarUrl } from '@/utils/gravatar';
import Footer from '@/components/Footer'; import Footer from '@/components/Footer';
@ -41,9 +40,8 @@ import { useEstablishment } from '@/context/EstablishmentContext';
export default function Layout({ children }) { export default function Layout({ children }) {
const t = useTranslations('sidebar'); const t = useTranslations('sidebar');
const [isSidebarOpen, setIsSidebarOpen] = useState(false); const [isSidebarOpen, setIsSidebarOpen] = useState(false);
const { data: session } = useSession();
const { const {
selectedEstablishmentId, setSelectedRoleId,
setSelectedEstablishmentId, setSelectedEstablishmentId,
profileRole, profileRole,
setProfileRole, setProfileRole,
@ -163,17 +161,17 @@ export default function Layout({ children }) {
currentPage={currentPage} currentPage={currentPage}
items={Object.values(sidebarItems)} items={Object.values(sidebarItems)}
onCloseMobile={toggleSidebar} onCloseMobile={toggleSidebar}
onEstablishmentChange={(establishmentId) => { onRoleChange={(roleId) => {
const parsedEstablishmentId = parseInt(establishmentId, 10); let parsedRoleId = parseInt(roleId, 10);
setSelectedEstablishmentId(parsedEstablishmentId); if (parsedRoleId === -1) {
let roleIndex = session.user.roles.findIndex( parsedRoleId = 0;
(role) => role.establishment__id === parsedEstablishmentId
);
if (roleIndex === -1) {
roleIndex = 0;
} }
const role = session.user.roles[roleIndex].role_type; const role = user.roles[parsedRoleId].role_type;
const establishmentId =
user.roles[parsedRoleId].establishment__id;
setProfileRole(role); setProfileRole(role);
setSelectedRoleId(parsedRoleId);
setSelectedEstablishmentId(establishmentId);
}} }}
/> />
</div> </div>

View File

@ -8,6 +8,7 @@ import { Search } from 'lucide-react';
import Popup from '@/components/Popup'; import Popup from '@/components/Popup';
import Loader from '@/components/Loader'; import Loader from '@/components/Loader';
import AlertWithModal from '@/components/AlertWithModal'; import AlertWithModal from '@/components/AlertWithModal';
import { useRouter } from 'next/navigation';
import DropdownMenu from '@/components/DropdownMenu'; import DropdownMenu from '@/components/DropdownMenu';
import { import {
MoreVertical, MoreVertical,
@ -112,6 +113,7 @@ export default function Page({ params: { locale } }) {
const [isOpenAddGuardian, setIsOpenAddGuardian] = useState(false); const [isOpenAddGuardian, setIsOpenAddGuardian] = useState(false);
const csrfToken = useCsrfToken(); const csrfToken = useCsrfToken();
const router = useRouter();
const { selectedEstablishmentId } = useEstablishment(); const { selectedEstablishmentId } = useEstablishment();
const openModal = () => { const openModal = () => {
@ -670,7 +672,9 @@ export default function Page({ params: { locale } }) {
{ {
icon: <Edit className="w-5 h-5 text-blue-500 hover:text-blue-700" />, icon: <Edit className="w-5 h-5 text-blue-500 hover:text-blue-700" />,
onClick: () => onClick: () =>
(window.location.href = `${FE_ADMIN_SUBSCRIPTIONS_EDIT_URL}?studentId=${row.student.id}&id=1`), router.push(
`${FE_ADMIN_SUBSCRIPTIONS_EDIT_URL}?studentId=${row.student.id}`
),
}, },
{ {
icon: ( icon: (
@ -688,7 +692,9 @@ export default function Page({ params: { locale } }) {
{ {
icon: <Edit className="w-5 h-5 text-blue-500 hover:text-blue-700" />, icon: <Edit className="w-5 h-5 text-blue-500 hover:text-blue-700" />,
onClick: () => onClick: () =>
(window.location.href = `${FE_ADMIN_SUBSCRIPTIONS_EDIT_URL}?studentId=${row.student.id}&id=1`), router.push(
`${FE_ADMIN_SUBSCRIPTIONS_EDIT_URL}?studentId=${row.student.id}`
),
}, },
], ],
3: [ 3: [
@ -697,7 +703,9 @@ export default function Page({ params: { locale } }) {
<CircleCheck className="w-5 h-5 text-green-500 hover:text-green-700" /> <CircleCheck className="w-5 h-5 text-green-500 hover:text-green-700" />
), ),
onClick: () => onClick: () =>
(window.location.href = `${FE_ADMIN_SUBSCRIPTIONS_VALIDATE_URL}?studentId=${row.student.id}&firstName=${row.student.first_name}&lastName=${row.student.last_name}&paymentMode=${row.registration_payment}&file=${row.registration_file}`), router.push(
`${FE_ADMIN_SUBSCRIPTIONS_VALIDATE_URL}?studentId=${row.student.id}&firstName=${row.student.first_name}&lastName=${row.student.last_name}&paymentMode=${row.registration_payment}&file=${row.registration_file}`
),
}, },
], ],
5: [ 5: [

View File

@ -14,13 +14,7 @@ export default function ParentHomePage() {
const [children, setChildren] = useState([]); const [children, setChildren] = useState([]);
const [userId, setUserId] = useState(null); const [userId, setUserId] = useState(null);
const [currentPage, setCurrentPage] = useState(1); const [currentPage, setCurrentPage] = useState(1);
const { const { user, selectedEstablishmentId } = useEstablishment();
user,
setProfileRole,
selectedEstablishmentId,
setSelectedEstablishmentId,
establishments,
} = useEstablishment();
const router = useRouter(); const router = useRouter();
@ -33,14 +27,6 @@ export default function ParentHomePage() {
}); });
}, [selectedEstablishmentId]); }, [selectedEstablishmentId]);
const handleEstablishmentChange = (e) => {
const establishmentId = parseInt(e.target.value, 10);
setSelectedEstablishmentId(establishmentId);
const role = establishments.find(
(est) => est.id === establishmentId
)?.role_type;
setProfileRole(role);
};
function handleEdit(eleveId) { function handleEdit(eleveId) {
// Logique pour éditer le dossier de l'élève // Logique pour éditer le dossier de l'élève
logger.debug(`Edit dossier for student id: ${eleveId}`); logger.debug(`Edit dossier for student id: ${eleveId}`);

View File

@ -4,24 +4,26 @@ import DropdownMenu from '@/components/DropdownMenu';
import { getRightStr } from '@/utils/rights'; import { getRightStr } from '@/utils/rights';
import { ChevronDown } from 'lucide-react'; // Import de l'icône import { ChevronDown } from 'lucide-react'; // Import de l'icône
const ProfileSelector = ({ onEstablishmentChange, className = '' }) => { const ProfileSelector = ({ onRoleChange, className = '' }) => {
const { const {
establishments, establishments,
selectedEstablishmentId, selectedRoleId,
setSelectedRoleId,
setSelectedEstablishmentId, setSelectedEstablishmentId,
setProfileRole, setProfileRole,
user,
} = useEstablishment(); } = useEstablishment();
const [dropdownOpen, setDropdownOpen] = useState(false); const [dropdownOpen, setDropdownOpen] = useState(false);
const handleEstablishmentChange = (establishmentId) => { const handleRoleChange = (roleId) => {
setSelectedEstablishmentId(establishmentId); // Pas bon quand on a plusieur role pour le même établissement
const role = establishments.find( setSelectedRoleId(roleId);
(est) => est.id === establishmentId const role = user.roles[roleId].role_type;
)?.role_type;
setProfileRole(role); setProfileRole(role);
const establishmentId = user.roles[roleId].establishment__id;
if (onEstablishmentChange) { setSelectedEstablishmentId(establishmentId);
onEstablishmentChange(establishmentId); if (onRoleChange) {
onRoleChange(roleId);
} }
setDropdownOpen(false); // Fermer le menu après sélection setDropdownOpen(false); // Fermer le menu après sélection
}; };
@ -36,7 +38,7 @@ const ProfileSelector = ({ onEstablishmentChange, className = '' }) => {
} }
const selectedEstablishment = establishments.find( const selectedEstablishment = establishments.find(
(est) => est.id === selectedEstablishmentId (est) => est.role_id === selectedRoleId
); );
return ( return (
@ -70,7 +72,7 @@ const ProfileSelector = ({ onEstablishmentChange, className = '' }) => {
<div className="text-sm text-gray-500">{establishment.name}</div> <div className="text-sm text-gray-500">{establishment.name}</div>
</div> </div>
), ),
onClick: () => handleEstablishmentChange(establishment.id), onClick: () => handleRoleChange(establishment.role_id),
}))} }))}
buttonClassName="w-full" buttonClassName="w-full"
menuClassName="absolute mt-2 w-full bg-white border border-gray-200 rounded shadow-lg z-10" menuClassName="absolute mt-2 w-full bg-white border border-gray-200 rounded shadow-lg z-10"

View File

@ -17,7 +17,7 @@ const SidebarItem = ({ icon: Icon, text, active, url, onClick }) => (
</div> </div>
); );
function Sidebar({ currentPage, items, onCloseMobile, onEstablishmentChange }) { function Sidebar({ currentPage, items, onCloseMobile, onRoleChange }) {
const router = useRouter(); const router = useRouter();
const [selectedItem, setSelectedItem] = useState(currentPage); const [selectedItem, setSelectedItem] = useState(currentPage);
@ -37,10 +37,7 @@ function Sidebar({ currentPage, items, onCloseMobile, onEstablishmentChange }) {
return ( return (
<div className="w-64 bg-white border-r h-full border-gray-200"> <div className="w-64 bg-white border-r h-full border-gray-200">
<div className="border-b border-gray-200 "> <div className="border-b border-gray-200 ">
<ProfileSelector <ProfileSelector onRoleChange={onRoleChange} className="border-none" />
onEstablishmentChange={onEstablishmentChange}
className="border-none"
/>
</div> </div>
<nav className="space-y-1 px-4 py-6"> <nav className="space-y-1 px-4 py-6">
{items.map((item) => ( {items.map((item) => (

View File

@ -5,6 +5,7 @@ const EstablishmentContext = createContext();
export const EstablishmentProvider = ({ children }) => { export const EstablishmentProvider = ({ children }) => {
const [selectedEstablishmentId, setSelectedEstablishmentId] = useState(null); const [selectedEstablishmentId, setSelectedEstablishmentId] = useState(null);
const [selectedRoleId, setSelectedRoleId] = useState(null);
const [profileRole, setProfileRole] = useState(null); const [profileRole, setProfileRole] = useState(null);
const [establishments, setEstablishments] = useState([]); const [establishments, setEstablishments] = useState([]);
const [user, setUser] = useState(null); const [user, setUser] = useState(null);
@ -14,9 +15,10 @@ export const EstablishmentProvider = ({ children }) => {
logger.debug('Establishments User= ', user); logger.debug('Establishments User= ', user);
// Au changement de l'utilisateur on sette par défaut le premier établissement // Au changement de l'utilisateur on sette par défaut le premier établissement
// et le premier rôle // et le premier rôle
const userEstablishments = user.roles.map((role) => ({ const userEstablishments = user.roles.map((role, i) => ({
id: role.establishment__id, id: role.establishment__id,
name: role.establishment__name, name: role.establishment__name,
role_id: i,
role_type: role.role_type, role_type: role.role_type,
})); }));
setEstablishments(userEstablishments); setEstablishments(userEstablishments);
@ -31,6 +33,7 @@ export const EstablishmentProvider = ({ children }) => {
setSelectedEstablishmentId(userEstablishments[roleIndexDefault].id); setSelectedEstablishmentId(userEstablishments[roleIndexDefault].id);
setProfileRole(userEstablishments[roleIndexDefault].role_type); setProfileRole(userEstablishments[roleIndexDefault].role_type);
} }
setSelectedRoleId(roleIndexDefault);
} }
}, [user]); }, [user]);
@ -39,6 +42,8 @@ export const EstablishmentProvider = ({ children }) => {
value={{ value={{
selectedEstablishmentId, selectedEstablishmentId,
setSelectedEstablishmentId, setSelectedEstablishmentId,
selectedRoleId,
setSelectedRoleId,
profileRole, profileRole,
setProfileRole, setProfileRole,
establishments, establishments,