Refactor event fetching and display: Change event retrieval order to descending by date, enhance event data structure to include registration counts, and update UI components to reflect these changes for better user experience.

This commit is contained in:
Julien Froidefond
2025-12-09 21:55:42 +01:00
parent 50a2eaf109
commit 16b0437ecb
4 changed files with 54 additions and 11 deletions

View File

@@ -13,11 +13,39 @@ export async function GET() {
const events = await prisma.event.findMany({ const events = await prisma.event.findMany({
orderBy: { orderBy: {
date: "asc", date: "desc",
},
select: {
id: true,
date: true,
name: true,
description: true,
type: true,
status: true,
createdAt: true,
updatedAt: true,
_count: {
select: {
registrations: true,
},
},
}, },
}); });
return NextResponse.json(events); // Transformer les données pour inclure le nombre d'inscriptions
const eventsWithCount = events.map((event) => ({
id: event.id,
date: event.date,
name: event.name,
description: event.description,
type: event.type,
status: event.status,
createdAt: event.createdAt.toISOString(),
updatedAt: event.updatedAt.toISOString(),
registrationsCount: event._count.registrations,
}));
return NextResponse.json(eventsWithCount);
} catch (error) { } catch (error) {
console.error("Error fetching events:", error); console.error("Error fetching events:", error);
return NextResponse.json( return NextResponse.json(

View File

@@ -6,7 +6,7 @@ import { getBackgroundImage } from "@/lib/preferences";
export default async function EventsPage() { export default async function EventsPage() {
const events = await prisma.event.findMany({ const events = await prisma.event.findMany({
orderBy: { orderBy: {
date: "asc", date: "desc",
}, },
}); });

View File

@@ -11,6 +11,7 @@ interface Event {
status: "UPCOMING" | "LIVE" | "PAST"; status: "UPCOMING" | "LIVE" | "PAST";
createdAt: string; createdAt: string;
updatedAt: string; updatedAt: string;
registrationsCount?: number;
} }
interface EventFormData { interface EventFormData {
@@ -351,9 +352,15 @@ export default function EventManagement() {
<p className="text-gray-400 text-sm mb-2"> <p className="text-gray-400 text-sm mb-2">
{event.description} {event.description}
</p> </p>
<p className="text-gray-500 text-xs"> <div className="flex items-center gap-4 mt-2">
Date: {new Date(event.date).toLocaleDateString("fr-FR")} <p className="text-gray-500 text-xs">
</p> Date: {new Date(event.date).toLocaleDateString("fr-FR")}
</p>
<span className="px-2 py-1 bg-blue-900/30 border border-blue-500/50 text-blue-400 text-xs rounded">
{event.registrationsCount || 0} inscrit
{event.registrationsCount !== 1 ? "s" : ""}
</span>
</div>
</div> </div>
{!isCreating && !editingEvent && ( {!isCreating && !editingEvent && (
<div className="flex gap-2 ml-4"> <div className="flex gap-2 ml-4">

View File

@@ -84,11 +84,19 @@ export default function EventsPageSection({
const [error, setError] = useState<string>(""); const [error, setError] = useState<string>("");
const [currentMonth, setCurrentMonth] = useState(new Date()); const [currentMonth, setCurrentMonth] = useState(new Date());
// Séparer les événements // Séparer et trier les événements (du plus récent au plus ancien)
const upcomingEvents = events.filter( const upcomingEvents = events
(e) => e.status === "UPCOMING" || e.status === "LIVE" .filter((e) => e.status === "UPCOMING" || e.status === "LIVE")
); .sort((a, b) => {
const pastEvents = events.filter((e) => e.status === "PAST"); // Trier par date décroissante (du plus récent au plus ancien)
return b.date.localeCompare(a.date);
});
const pastEvents = events
.filter((e) => e.status === "PAST")
.sort((a, b) => {
// Trier par date décroissante (du plus récent au plus ancien)
return b.date.localeCompare(a.date);
});
// Créer un map des événements par date pour le calendrier // Créer un map des événements par date pour le calendrier
const eventsByDate: Record<string, Event[]> = {}; const eventsByDate: Record<string, Event[]> = {};