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:
@@ -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(
|
||||||
|
|||||||
@@ -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",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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[]> = {};
|
||||||
|
|||||||
Reference in New Issue
Block a user