Enhance event model and management: Add new fields for room, time, and maxPlaces to the Event model in Prisma schema. Update API routes and UI components to support these fields, improving event details and user interaction in event management and registration processes.

This commit is contained in:
Julien Froidefond
2025-12-10 05:27:35 +01:00
parent fb5c8c1466
commit fdd860c456
13 changed files with 564 additions and 22 deletions

View File

@@ -7,8 +7,11 @@ interface Event {
date: string;
name: string;
description: string;
type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION";
type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION" | "CODE_KATA";
status: "UPCOMING" | "LIVE" | "PAST";
room?: string | null;
time?: string | null;
maxPlaces?: number | null;
createdAt: string;
updatedAt: string;
registrationsCount?: number;
@@ -18,8 +21,11 @@ interface EventFormData {
date: string;
name: string;
description: string;
type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION";
type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION" | "CODE_KATA";
status: "UPCOMING" | "LIVE" | "PAST";
room?: string;
time?: string;
maxPlaces?: number;
}
const eventTypes: Event["type"][] = [
@@ -27,6 +33,7 @@ const eventTypes: Event["type"][] = [
"LAUNCH",
"FESTIVAL",
"COMPETITION",
"CODE_KATA",
];
const eventStatuses: Event["status"][] = ["UPCOMING", "LIVE", "PAST"];
@@ -40,6 +47,8 @@ const getEventTypeLabel = (type: Event["type"]) => {
return "Festival";
case "COMPETITION":
return "Compétition";
case "CODE_KATA":
return "Code Kata";
default:
return type;
}
@@ -70,6 +79,9 @@ export default function EventManagement() {
description: "",
type: "SUMMIT",
status: "UPCOMING",
room: "",
time: "",
maxPlaces: undefined,
});
useEffect(() => {
@@ -99,6 +111,9 @@ export default function EventManagement() {
description: "",
type: "SUMMIT",
status: "UPCOMING",
room: "",
time: "",
maxPlaces: undefined,
});
};
@@ -111,6 +126,9 @@ export default function EventManagement() {
description: event.description,
type: event.type,
status: event.status,
room: event.room || "",
time: event.time || "",
maxPlaces: event.maxPlaces || undefined,
});
};
@@ -146,6 +164,9 @@ export default function EventManagement() {
description: "",
type: "SUMMIT",
status: "UPCOMING",
room: "",
time: "",
maxPlaces: undefined,
});
} else {
const error = await response?.json();
@@ -190,6 +211,9 @@ export default function EventManagement() {
description: "",
type: "SUMMIT",
status: "UPCOMING",
room: "",
time: "",
maxPlaces: undefined,
});
};
@@ -298,6 +322,55 @@ export default function EventManagement() {
</select>
</div>
</div>
<div className="grid grid-cols-3 gap-4">
<div>
<label className="block text-sm text-gray-300 mb-1">
Salle
</label>
<input
type="text"
value={formData.room || ""}
onChange={(e) =>
setFormData({ ...formData, room: e.target.value })
}
placeholder="Ex: Nautilus"
className="w-full px-3 py-2 bg-black/60 border border-pixel-gold/30 rounded text-white text-sm"
/>
</div>
<div>
<label className="block text-sm text-gray-300 mb-1">
Heure
</label>
<input
type="text"
value={formData.time || ""}
onChange={(e) =>
setFormData({ ...formData, time: e.target.value })
}
placeholder="Ex: 11h-12h"
className="w-full px-3 py-2 bg-black/60 border border-pixel-gold/30 rounded text-white text-sm"
/>
</div>
<div>
<label className="block text-sm text-gray-300 mb-1">
Places max
</label>
<input
type="number"
value={formData.maxPlaces || ""}
onChange={(e) =>
setFormData({
...formData,
maxPlaces: e.target.value
? parseInt(e.target.value)
: undefined,
})
}
placeholder="Ex: 25"
className="w-full px-3 py-2 bg-black/60 border border-pixel-gold/30 rounded text-white text-sm"
/>
</div>
</div>
<div className="flex gap-2">
<button
onClick={handleSave}
@@ -352,10 +425,25 @@ export default function EventManagement() {
<p className="text-gray-400 text-sm mb-2">
{event.description}
</p>
<div className="flex items-center gap-4 mt-2">
<div className="flex flex-wrap items-center gap-4 mt-2">
<p className="text-gray-500 text-xs">
Date: {new Date(event.date).toLocaleDateString("fr-FR")}
</p>
{event.room && (
<p className="text-gray-500 text-xs">
📍 Salle: {event.room}
</p>
)}
{event.time && (
<p className="text-gray-500 text-xs">
🕐 Heure: {event.time}
</p>
)}
{event.maxPlaces && (
<p className="text-gray-500 text-xs">
👥 Places: {event.maxPlaces}
</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" : ""}