merge dev into features/notifications
This commit is contained in:
@@ -21,7 +21,7 @@ function IncompleteEvent() {
|
|||||||
<h2>Événements incomplets</h2>
|
<h2>Événements incomplets</h2>
|
||||||
<div className={styles.eventsContainer}>
|
<div className={styles.eventsContainer}>
|
||||||
{incompleteEvents.map((event, index) => (
|
{incompleteEvents.map((event, index) => (
|
||||||
<div key={index} className={`glassCard ${styles.eventCard}`}>
|
<div key={index} className={`glassBorder ${styles.eventCard}`}>
|
||||||
<h3>{event.title}</h3>
|
<h3>{event.title}</h3>
|
||||||
<ul className={styles.tasksList}>
|
<ul className={styles.tasksList}>
|
||||||
{event.tasks.map((task, taskIndex) => (
|
{event.tasks.map((task, taskIndex) => (
|
||||||
|
|||||||
@@ -28,21 +28,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.eventsContainer::-webkit-scrollbar {
|
.eventsContainer::-webkit-scrollbar {
|
||||||
height: 8px;
|
display: none;
|
||||||
}
|
|
||||||
|
|
||||||
.eventsContainer::-webkit-scrollbar-track {
|
|
||||||
background: rgba(0, 0, 0, 0.1);
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.eventsContainer::-webkit-scrollbar-thumb {
|
|
||||||
background: rgba(30, 96, 249, 0.5);
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.eventsContainer::-webkit-scrollbar-thumb:hover {
|
|
||||||
background: rgba(30, 96, 249, 0.7);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.eventCard {
|
.eventCard {
|
||||||
@@ -57,7 +43,6 @@
|
|||||||
opacity: 0;
|
opacity: 0;
|
||||||
transform: translateX(20px);
|
transform: translateX(20px);
|
||||||
animation: slideInEvent 1s ease forwards;
|
animation: slideInEvent 1s ease forwards;
|
||||||
|
|
||||||
flex-shrink: 1;
|
flex-shrink: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,6 +70,10 @@
|
|||||||
animation-delay: 0.5s;
|
animation-delay: 0.5s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.eventCard::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
.eventCard>h3 {
|
.eventCard>h3 {
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ function pendingMembers() {
|
|||||||
<h2>Membres en attente de validation</h2>
|
<h2>Membres en attente de validation</h2>
|
||||||
<div className={styles.membersContainer}>
|
<div className={styles.membersContainer}>
|
||||||
{pendingMembers.map((member, index) => (
|
{pendingMembers.map((member, index) => (
|
||||||
<div key={index} className={`glassCard ${styles.memberCard}`}>
|
<div key={index} className={`glassBorder ${styles.memberCard}`}>
|
||||||
<p>{member.name}</p>
|
<p>{member.name}</p>
|
||||||
<div className={styles.buttonGroup}>
|
<div className={styles.buttonGroup}>
|
||||||
<Button onClick={() => handleValidate(member.name)} variant="primary">
|
<Button onClick={() => handleValidate(member.name)} variant="primary">
|
||||||
|
|||||||
@@ -19,21 +19,7 @@
|
|||||||
|
|
||||||
|
|
||||||
.membersContainer::-webkit-scrollbar {
|
.membersContainer::-webkit-scrollbar {
|
||||||
width: 8px;
|
display: none;
|
||||||
}
|
|
||||||
|
|
||||||
.membersContainer::-webkit-scrollbar-track {
|
|
||||||
background: rgba(0, 0, 0, 0.1);
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.membersContainer::-webkit-scrollbar-thumb {
|
|
||||||
background: rgba(255, 0, 0, 0.5);
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.membersContainer::-webkit-scrollbar-thumb:hover {
|
|
||||||
background: rgba(125, 249, 30, 0.7);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.memberCard {
|
.memberCard {
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ function ParticipationChart() {
|
|||||||
return (
|
return (
|
||||||
<div className={`${styles.leftBlock} glassCard`}>
|
<div className={`${styles.leftBlock} glassCard`}>
|
||||||
<div className={styles.participationHeader}>
|
<div className={styles.participationHeader}>
|
||||||
<div className={`${styles.partiText} glassCard`}>
|
<div className={`${styles.partiText} glassBorder`}>
|
||||||
<label htmlFor={styles.months}>Taux de participation depuis :</label>
|
<label htmlFor={styles.months}>Taux de participation depuis :</label>
|
||||||
<div className={styles.formControl}>
|
<div className={styles.formControl}>
|
||||||
<FormControl className={styles.formDesign}>
|
<FormControl className={styles.formDesign}>
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ function Calendar({ events = [] }) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.glassCard}>
|
<div className={`${styles.glassCard} glassCard`}>
|
||||||
<div className={styles.calendarContainer}>
|
<div className={styles.calendarContainer}>
|
||||||
|
|
||||||
<div className={styles.calendarHeader}>
|
<div className={styles.calendarHeader}>
|
||||||
@@ -101,7 +101,7 @@ function Calendar({ events = [] }) {
|
|||||||
</table>
|
</table>
|
||||||
|
|
||||||
{selectedDay && (
|
{selectedDay && (
|
||||||
<div className={styles.eventBox}>
|
<div className={`${styles.eventBox} glassBorder`}>
|
||||||
<h3>Événements du {formatDateLetterJS(selectedDay.date)}</h3>
|
<h3>Événements du {formatDateLetterJS(selectedDay.date)}</h3>
|
||||||
|
|
||||||
{selectedDay.events.length > 0 ? (
|
{selectedDay.events.length > 0 ? (
|
||||||
|
|||||||
@@ -137,7 +137,7 @@
|
|||||||
|
|
||||||
.glassCard {
|
.glassCard {
|
||||||
width: 45%;
|
width: 45%;
|
||||||
max-height: 450px;
|
max-height: 100%;
|
||||||
margin: 16px 0 16px 0;
|
margin: 16px 0 16px 0;
|
||||||
padding: 10px 20px 10px 20px;
|
padding: 10px 20px 10px 20px;
|
||||||
height: fit-content;
|
height: fit-content;
|
||||||
|
|||||||
@@ -13,17 +13,17 @@ function EventList({ events }) {
|
|||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.glassCard}>
|
<div className={`${styles.glassCard} glassCard`}>
|
||||||
<h2>Liste des événements à venir</h2>
|
<h2>Liste des événements à venir</h2>
|
||||||
{sortedEvents.length > 0 ? (
|
{sortedEvents.length > 0 ? (
|
||||||
<ul className={styles.eventList}>
|
<ul className={styles.eventList}>
|
||||||
{sortedEvents.map((eventGroup, index) => (
|
{sortedEvents.map((eventGroup) => (
|
||||||
|
<li key={eventGroup.date} className={`${styles.eventGroup} glassBorder`}>
|
||||||
<li key={index} className={styles.eventGroup}>
|
|
||||||
<div className={styles.eventTitle}>
|
<div className={styles.eventTitle}>
|
||||||
<p className={styles.title}>{eventGroup.name}</p>
|
<p className={styles.title}>{eventGroup.name}</p>
|
||||||
<p>{formatDateLetter(eventGroup.start)} - {formatDateLetter(eventGroup.end)}</p>
|
<p>{formatDateLetter(eventGroup.start)}</p>
|
||||||
</div>
|
</div>
|
||||||
|
{/* TODO: Faire une liste déroulante pour ne plus afficher les tache */}
|
||||||
<ul className={styles.eventDetails}>
|
<ul className={styles.eventDetails}>
|
||||||
{eventGroup.tasks.map((task, i) => (
|
{eventGroup.tasks.map((task, i) => (
|
||||||
<li key={i} className={styles.eventTasks}>
|
<li key={i} className={styles.eventTasks}>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.glassCard {
|
.glassCard {
|
||||||
width: 45%;
|
width: 45%;
|
||||||
max-height: 450px;
|
max-height: 100%;
|
||||||
margin: 16px 0 16px 0;
|
margin: 16px 0 16px 0;
|
||||||
padding: 10px 20px 10px 20px;
|
padding: 10px 20px 10px 20px;
|
||||||
height: fit-content;
|
height: fit-content;
|
||||||
@@ -50,7 +50,7 @@ h2{
|
|||||||
}
|
}
|
||||||
|
|
||||||
.eventGroup{
|
.eventGroup{
|
||||||
margin: 16px 0 16px 0;
|
margin: 16px 0px 16px 0px;
|
||||||
padding: 10px 20px 10px 20px;
|
padding: 10px 20px 10px 20px;
|
||||||
border-radius: 20px;
|
border-radius: 20px;
|
||||||
border: none;
|
border: none;
|
||||||
|
|||||||
+22
-7
@@ -52,15 +52,30 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.glassCard {
|
.glassCard {
|
||||||
background: rgba(255, 255, 255, 0.2);
|
padding: 10px 20px 10px 20px;
|
||||||
backdrop-filter: blur(10px);
|
background: rgba(255, 255, 255, 0.54);
|
||||||
border-radius: 20px;
|
backdrop-filter: blur(3px);
|
||||||
padding: 15px;
|
-webkit-backdrop-filter: blur(3px);
|
||||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
border-radius: 20px;
|
||||||
border: 1px solid rgba(255, 255, 255, 0.3);
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1),
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, 0.3),
|
||||||
|
inset 0 -1px 0 rgba(255, 255, 255, 0.05),
|
||||||
|
inset 0 0 8px 4px rgba(255, 255, 255, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.glassBorder{
|
||||||
|
border-radius: 20px;
|
||||||
|
border: none;
|
||||||
|
background: rgba(255, 255, 255, 0.5);
|
||||||
|
box-shadow:
|
||||||
|
inset 1.25px 1.25px 1px rgba(255, 255, 255, 1),
|
||||||
|
inset -1.25px -1.25px 1px rgba(255, 255, 255, 1),
|
||||||
|
inset -0.25px 0.25px 1px rgba(0, 0, 0, 0.2),
|
||||||
|
inset 0.25px -0.25px 1px rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-size: 3.2em;
|
font-size: 3.2em;
|
||||||
line-height: 1.1;
|
line-height: 1.1;
|
||||||
|
|||||||
@@ -0,0 +1,70 @@
|
|||||||
|
import {useState} from "react";
|
||||||
|
import styles from "./eventDetail.module.css";
|
||||||
|
import { useParams } from "react-router";
|
||||||
|
|
||||||
|
|
||||||
|
function eventDetail() {
|
||||||
|
|
||||||
|
const params = useParams();
|
||||||
|
const id = params.id;
|
||||||
|
|
||||||
|
const [tasks, setTasks] = useState([
|
||||||
|
{ text: "Préparer les slides", registered: false },
|
||||||
|
{ text: "Réserver la salle", registered: false },
|
||||||
|
{ text: "Envoyer les invitations", registered: false },
|
||||||
|
{ text: "Tester la configuration technique", registered: false },
|
||||||
|
{ text: "Organiser le catering", registered: false },
|
||||||
|
]);
|
||||||
|
|
||||||
|
const event = {
|
||||||
|
title: "Conférence React 2025",
|
||||||
|
date: "27 Décembre 2025",
|
||||||
|
location: "Paris, France",
|
||||||
|
description: "azertyuiop azertyuiop azertyuiop azertyuiop azertyuiop azertyuiop azertyuiop azertyuiop azertyuiop azertyuiop azertyuiop azertyuiop"
|
||||||
|
};
|
||||||
|
|
||||||
|
const toggleRegister = (index) => {
|
||||||
|
setTasks((prevTasks) =>
|
||||||
|
prevTasks.map((task, i) =>
|
||||||
|
i === index
|
||||||
|
? { ...task, registered: !task.registered }
|
||||||
|
: task
|
||||||
|
)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={styles.allContent}>
|
||||||
|
<div className={`glassCard`}>
|
||||||
|
<div className={styles.textImage}>
|
||||||
|
<img src="/public/icons/theme/dark.svg" alt="Illustration événement" className={styles.eventImage}/>
|
||||||
|
<div className={styles.eventInfo}>
|
||||||
|
<h2>{event.title}</h2>
|
||||||
|
<p>Date: {event.date}</p>
|
||||||
|
<p>Lieu: {event.location}</p>
|
||||||
|
<p>Description: {event.description}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Tâches</h2>
|
||||||
|
<ul className={styles.tasks}>
|
||||||
|
{tasks.map((task, index) => (
|
||||||
|
<li style={{"--i": index}} key={index}>
|
||||||
|
<div className={styles.tasksButton}>
|
||||||
|
<span><strong>{task.text}</strong></span>
|
||||||
|
<button
|
||||||
|
className={styles.registerButton}
|
||||||
|
onClick={() => toggleRegister(index)}
|
||||||
|
>
|
||||||
|
{task.registered ? "Se désinscrire" : "S’inscrire"}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default eventDetail;
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
.allContent{
|
||||||
|
margin: 16px 0px 16px 0px;
|
||||||
|
align-self: center;
|
||||||
|
width: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.textImage {
|
||||||
|
display: flex;
|
||||||
|
gap: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eventImage {
|
||||||
|
width: 40%;
|
||||||
|
aspect-ratio: 16 / 9;
|
||||||
|
background-color: #e0e0e0;
|
||||||
|
border-radius: 16px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eventInfo {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eventInfo p {
|
||||||
|
white-space: normal;
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eventImage {
|
||||||
|
width: 40%;
|
||||||
|
height: 100%;
|
||||||
|
aspect-ratio: 16 / 9;
|
||||||
|
background-color: #e0e0e0;
|
||||||
|
border-radius: 16px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.registerButton {
|
||||||
|
margin-left: auto;
|
||||||
|
padding: 5px 10px;
|
||||||
|
border-radius: 12px;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
background: #019AFF;
|
||||||
|
color: white;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.registerButton:hover {
|
||||||
|
opacity: 0.85;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tasksButton {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tasks {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tasks li {
|
||||||
|
margin: 16px 0px 16px 0px;
|
||||||
|
padding: 10px 20px 10px 20px;
|
||||||
|
border-radius: 20px;
|
||||||
|
border: none;
|
||||||
|
background: transparent;
|
||||||
|
box-shadow:
|
||||||
|
inset 1.25px 1.25px 1px rgba(255, 255, 255, 1),
|
||||||
|
inset -1.25px -1.25px 1px rgba(255, 255, 255, 1),
|
||||||
|
inset -0.25px 0.25px 1px rgba(0, 0, 0, 0.2),
|
||||||
|
inset 0.25px -0.25px 1px rgba(0, 0, 0, 0.2);
|
||||||
|
opacity: 0;
|
||||||
|
animation: fadeInUp 0.6s ease-out forwards;
|
||||||
|
animation-delay: calc(var(--i) * 0.1s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeInUp {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(10px);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
+6
-1
@@ -10,6 +10,7 @@ import AdminPage from "./pages/Admin/AdminPage.jsx";
|
|||||||
import ValidationErrorPage from "./pages/waitValidationPage/ValidationErrorPage.jsx";
|
import ValidationErrorPage from "./pages/waitValidationPage/ValidationErrorPage.jsx";
|
||||||
import VolunteerProfilePage from "./pages/VolunteerProfile/VolunteerProfilePage.jsx";
|
import VolunteerProfilePage from "./pages/VolunteerProfile/VolunteerProfilePage.jsx";
|
||||||
import PageNotFound from "./pages/PageNotFound/PageNotFound.jsx";
|
import PageNotFound from "./pages/PageNotFound/PageNotFound.jsx";
|
||||||
|
import eventDetail from "./pages/eventDetail/eventDetail.jsx";
|
||||||
|
|
||||||
const router = createBrowserRouter([
|
const router = createBrowserRouter([
|
||||||
{
|
{
|
||||||
@@ -59,7 +60,11 @@ const router = createBrowserRouter([
|
|||||||
{
|
{
|
||||||
path: "/profile/:id",
|
path: "/profile/:id",
|
||||||
Component: VolunteerProfilePage,
|
Component: VolunteerProfilePage,
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
path: "/events/:id",
|
||||||
|
Component: eventDetail,
|
||||||
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|||||||
Reference in New Issue
Block a user