Update event types in EventManagement and EventsPageSection components: Replace existing event types with new categories (ATELIER, KATA, PRESENTATION, LEARNING_HOUR) to better reflect current offerings. Adjust related functions and seed data to ensure consistency across the application.

This commit is contained in:
Julien Froidefond
2025-12-10 05:48:23 +01:00
parent a69613a232
commit a6c329ff15
8 changed files with 56 additions and 55 deletions

View File

@@ -8,7 +8,7 @@ interface Event {
date: string;
name: string;
description: string;
type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION" | "CODE_KATA";
type: "ATELIER" | "KATA" | "PRESENTATION" | "LEARNING_HOUR";
status: "UPCOMING" | "LIVE" | "PAST";
room?: string | null;
time?: string | null;
@@ -22,31 +22,28 @@ interface EventFormData {
date: string;
name: string;
description: string;
type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION" | "CODE_KATA";
type: "ATELIER" | "KATA" | "PRESENTATION" | "LEARNING_HOUR";
room?: string;
time?: string;
maxPlaces?: number;
}
const eventTypes: Event["type"][] = [
"SUMMIT",
"LAUNCH",
"FESTIVAL",
"COMPETITION",
"CODE_KATA",
"ATELIER",
"KATA",
"PRESENTATION",
"LEARNING_HOUR",
];
const getEventTypeLabel = (type: Event["type"]) => {
switch (type) {
case "SUMMIT":
return "Sommet";
case "LAUNCH":
return "Lancement";
case "FESTIVAL":
return "Festival";
case "COMPETITION":
return "Compétition";
case "CODE_KATA":
return "Code Kata";
case "ATELIER":
return "Atelier";
case "KATA":
return "Kata";
case "PRESENTATION":
return "Présentation";
case "LEARNING_HOUR":
return "Learning Hour";
default:
return type;
}
@@ -75,7 +72,7 @@ export default function EventManagement() {
date: "",
name: "",
description: "",
type: "SUMMIT",
type: "ATELIER",
room: "",
time: "",
maxPlaces: undefined,
@@ -106,7 +103,7 @@ export default function EventManagement() {
date: "",
name: "",
description: "",
type: "SUMMIT",
type: "ATELIER",
room: "",
time: "",
maxPlaces: undefined,
@@ -157,7 +154,7 @@ export default function EventManagement() {
date: "",
name: "",
description: "",
type: "SUMMIT",
type: "ATELIER",
room: "",
time: "",
maxPlaces: undefined,
@@ -203,7 +200,7 @@ export default function EventManagement() {
date: "",
name: "",
description: "",
type: "SUMMIT",
type: "ATELIER",
room: "",
time: "",
maxPlaces: undefined,

View File

@@ -10,7 +10,7 @@ interface Event {
date: string | Date;
name: string;
description: string;
type: "SUMMIT" | "LAUNCH" | "FESTIVAL" | "COMPETITION" | "CODE_KATA";
type: "ATELIER" | "KATA" | "PRESENTATION" | "LEARNING_HOUR";
room?: string | null;
time?: string | null;
maxPlaces?: number | null;
@@ -24,15 +24,13 @@ interface EventsPageSectionProps {
const getEventTypeColor = (type: Event["type"]) => {
switch (type) {
case "SUMMIT":
case "ATELIER":
return "from-blue-600 to-cyan-500";
case "LAUNCH":
case "KATA":
return "from-yellow-600 to-amber-500";
case "PRESENTATION":
return "from-purple-600 to-pink-500";
case "FESTIVAL":
return "from-pixel-gold to-orange-500";
case "COMPETITION":
return "from-red-600 to-orange-500";
case "CODE_KATA":
case "LEARNING_HOUR":
return "from-green-600 to-emerald-500";
default:
return "from-gray-600 to-gray-500";
@@ -41,16 +39,14 @@ const getEventTypeColor = (type: Event["type"]) => {
const getEventTypeLabel = (type: Event["type"]) => {
switch (type) {
case "SUMMIT":
return "Sommet";
case "LAUNCH":
return "Lancement";
case "FESTIVAL":
return "Festival";
case "COMPETITION":
return "Compétition";
case "CODE_KATA":
return "Code Kata";
case "ATELIER":
return "Atelier";
case "KATA":
return "Kata";
case "PRESENTATION":
return "Présentation";
case "LEARNING_HOUR":
return "Learning Hour";
default:
return type;
}

View File

@@ -18,11 +18,10 @@ export type Role = (typeof Role)[keyof typeof Role]
export const EventType = {
SUMMIT: 'SUMMIT',
LAUNCH: 'LAUNCH',
FESTIVAL: 'FESTIVAL',
COMPETITION: 'COMPETITION',
CODE_KATA: 'CODE_KATA'
ATELIER: 'ATELIER',
KATA: 'KATA',
PRESENTATION: 'PRESENTATION',
LEARNING_HOUR: 'LEARNING_HOUR'
} as const
export type EventType = (typeof EventType)[keyof typeof EventType]

View File

@@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = {
"clientVersion": "7.1.0",
"engineVersion": "ab635e6b9d606fa5c8fb8b1a7f909c3c3c1c98ba",
"activeProvider": "sqlite",
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"./generated/prisma\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n}\n\nenum Role {\n USER\n ADMIN\n}\n\nenum EventType {\n SUMMIT\n LAUNCH\n FESTIVAL\n COMPETITION\n CODE_KATA\n}\n\nenum CharacterClass {\n WARRIOR\n MAGE\n ROGUE\n RANGER\n PALADIN\n ENGINEER\n MERCHANT\n SCHOLAR\n BERSERKER\n NECROMANCER\n}\n\nmodel User {\n id String @id @default(cuid())\n email String @unique\n password String\n username String @unique\n role Role @default(USER)\n score Int @default(0)\n level Int @default(1)\n hp Int @default(1000)\n maxHp Int @default(1000)\n xp Int @default(0)\n maxXp Int @default(5000)\n avatar String?\n bio String?\n characterClass CharacterClass?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n preferences UserPreferences?\n eventRegistrations EventRegistration[]\n\n @@index([score])\n @@index([email])\n}\n\nmodel UserPreferences {\n id String @id @default(cuid())\n userId String @unique\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n // Background images for each page\n homeBackground String?\n eventsBackground String?\n leaderboardBackground String?\n\n // Other UI preferences can be added here\n theme String? @default(\"default\")\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Event {\n id String @id @default(cuid())\n date DateTime\n name String\n description String\n type EventType\n room String?\n time String?\n maxPlaces Int?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n registrations EventRegistration[]\n\n @@index([date])\n}\n\nmodel EventRegistration {\n id String @id @default(cuid())\n userId String\n eventId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n\n @@unique([userId, eventId])\n @@index([userId])\n @@index([eventId])\n}\n\nmodel SitePreferences {\n id String @id @default(\"global\")\n homeBackground String?\n eventsBackground String?\n leaderboardBackground String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n",
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"./generated/prisma\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n}\n\nenum Role {\n USER\n ADMIN\n}\n\nenum EventType {\n ATELIER\n KATA\n PRESENTATION\n LEARNING_HOUR\n}\n\nenum CharacterClass {\n WARRIOR\n MAGE\n ROGUE\n RANGER\n PALADIN\n ENGINEER\n MERCHANT\n SCHOLAR\n BERSERKER\n NECROMANCER\n}\n\nmodel User {\n id String @id @default(cuid())\n email String @unique\n password String\n username String @unique\n role Role @default(USER)\n score Int @default(0)\n level Int @default(1)\n hp Int @default(1000)\n maxHp Int @default(1000)\n xp Int @default(0)\n maxXp Int @default(5000)\n avatar String?\n bio String?\n characterClass CharacterClass?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n preferences UserPreferences?\n eventRegistrations EventRegistration[]\n\n @@index([score])\n @@index([email])\n}\n\nmodel UserPreferences {\n id String @id @default(cuid())\n userId String @unique\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n // Background images for each page\n homeBackground String?\n eventsBackground String?\n leaderboardBackground String?\n\n // Other UI preferences can be added here\n theme String? @default(\"default\")\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Event {\n id String @id @default(cuid())\n date DateTime\n name String\n description String\n type EventType\n room String?\n time String?\n maxPlaces Int?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n registrations EventRegistration[]\n\n @@index([date])\n}\n\nmodel EventRegistration {\n id String @id @default(cuid())\n userId String\n eventId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n\n @@unique([userId, eventId])\n @@index([userId])\n @@index([eventId])\n}\n\nmodel SitePreferences {\n id String @id @default(\"global\")\n homeBackground String?\n eventsBackground String?\n leaderboardBackground String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n",
"runtimeDataModel": {
"models": {},
"enums": {},

View File

@@ -0,0 +1,3 @@
-- Mettre à jour les types d'événements existants
UPDATE "Event" SET "type" = 'KATA' WHERE "type" = 'CODE_KATA';
UPDATE "Event" SET "type" = 'KATA' WHERE "type" IN ('SUMMIT', 'LAUNCH', 'FESTIVAL', 'COMPETITION');

View File

@@ -0,0 +1,7 @@
-- Mettre à jour les types d'événements existants
-- CODE_KATA devient KATA
UPDATE "Event" SET "type" = 'KATA' WHERE "type" = 'CODE_KATA';
-- Les autres types (SUMMIT, LAUNCH, FESTIVAL, COMPETITION) seront remplacés par KATA par défaut
UPDATE "Event" SET "type" = 'KATA' WHERE "type" IN ('SUMMIT', 'LAUNCH', 'FESTIVAL', 'COMPETITION');

View File

@@ -16,11 +16,10 @@ enum Role {
}
enum EventType {
SUMMIT
LAUNCH
FESTIVAL
COMPETITION
CODE_KATA
ATELIER
KATA
PRESENTATION
LEARNING_HOUR
}
enum CharacterClass {

View File

@@ -151,7 +151,7 @@ async function main() {
name: "Builder pattern : construction et refactoring",
description:
"Lors de cet atelier, nous utiliserons le design pattern Builder pour structurer pas à pas la création d'objets complexes… sans transformer notre code en film digne de Red Is Dead.\n\nVous découvrirez comment ce pattern permet de découpler proprement la logique de construction, d'améliorer la lisibilité et de faciliter l'évolution du code — notamment lors de phases de refactoring où les responsabilités se mélangent plus vite que la foule au Palais des Festivals.\n\nL'objectif : poser les fondations pour introduire un vrai modèle, sans rien casser du comportement existant.\n\nQue vous souhaitiez renforcer vos compétences en conception, préparer votre prochain refactoring, ou simplement coder avec plus de style que Serge Karamazov dansant la carioca, venez construire avec nous.",
type: EventType.CODE_KATA,
type: EventType.KATA,
room: "Nautilus",
time: "11h-12h",
maxPlaces: 25,
@@ -161,7 +161,7 @@ async function main() {
name: "Monoids everywhere ?",
description:
"Nous manipulons tous, au quotidien, des données que nous devons combiner : additionner des montants, calculer des moyennes, regrouper des résultats, agréger des indicateurs. Pourtant, derrière ces opérations, se cachent souvent des règles implicites, des exceptions, amenant une complexité qui rend le code difficile à comprendre et à faire évoluer.\n\nLes monoids permettent d'aborder ces problématiques avec une grille de lecture claire et structurante. Ils reposent sur une idée simple : pour agréger correctement des valeurs, il faut savoir comment elles se combinent et définir ce qui représente une valeur neutre.\n\nCet atelier propose une approche progressive pour comprendre comment ce concept peut transformer la manière de modéliser et de concevoir des comportements métier. Nous découvrirons comment les monoids aident à réduire la charge cognitive et à rendre le code plus cohérent avec l'intention métier.",
type: EventType.CODE_KATA,
type: EventType.LEARNING_HOUR,
room: "Nautilus",
time: "11h-12h",
maxPlaces: 25,
@@ -171,7 +171,7 @@ async function main() {
name: "Naming as a Process",
description:
"Rech. proj. pr proj. priv. self-dem.brt. poss. S'adr.à l'hôt. MART.\n\nBien sûr, S'adr.à l'hôt. MART. et plus si affinités, c'est plus humain… mais pas forcément plus compréhensible : on a beau lire et relire le contenu de la méthode, on est quasiment sûr que son nom, il bluffe !\n\nFaut-il pour autant laisser de mauvais noms tromper 1000 fois 1000 personnes ?\n\nDans cette nouvelle session, nous appliquerons Naming as a Process, une méthode de refactoring progressive centrée sur le nommage.\n\nObjectif : faire émerger la logique métier à travers des noms clairs, précis et alignés avec l'intention réelle du code. Au fil des étapes, nous transformerons un bloc obscur en fonctions lisibles, maintenables et prêtes à danser la carioca.\n\nPrenez un chewing-gum, ouvrez votre IDE, et venez explorer un moyen simple de refactorer vers un code plus respectueux des principes S, puis O, D, I et L ...",
type: EventType.CODE_KATA,
type: EventType.LEARNING_HOUR,
room: "Nautilus",
time: "11h-12h",
maxPlaces: 25,
@@ -181,7 +181,7 @@ async function main() {
name: "The Rule Design Pattern",
description:
"Les ateliers d'Event Storming permettent de faire émerger des Policies : des règles métier qui traduisent comment le système réagit à un événement ou déclenche une action. Sur le papier, tout est clair — mais au moment de coder, ces règles se diluent souvent dans des if/else, des services surchargés ou des comportements implicites.\n\nLe design pattern Rule offre une façon concrète de ramener ces Policies au cœur du code, sous une forme explicite, modulaire et testable. Chaque règle devient un objet du domaine, capable de dire si elle s'applique et d'exécuter sa logique, en respectant les invariants du modèle.\n\nCe pattern facilite la traduction du langage métier en code exécutable : les règles deviennent lisibles, combinables et extensibles en limitant la complexité.\n\nEn explorant le Rule Pattern, nous découvrirons ainsi comment faire vivre les Policies dans notre code, au service d'un modèle plus riche, plus compréhensible, et mieux aligné avec la connaissance du métier.",
type: EventType.CODE_KATA,
type: EventType.KATA,
room: "Nautilus",
time: "11h-12h",
maxPlaces: 25,
@@ -191,7 +191,7 @@ async function main() {
name: "Wrap refactoring techniques",
description:
"Lorsque le code commence à vieillir, il arrive qu'une méthode ou une classe devienne trop risquée à modifier directement : effets de bord, dépendances invisibles, tests manquants... le moindre changement entraîne des régressions.\n\nLes Wrap Techniques offrent une approche sûre et progressive : plutôt que de changer directement le code existant, on l'enveloppe dans une nouvelle abstraction ou une nouvelle méthode. On peut alors introduire de la logique ou un nouveau comportement, en changeant le contrat initial, sans casser les tests.\n\nDurant cette session nous verrons comment et quand utiliser ces techniques et nous en explorerons leurs bénéfices : isolation du risque, refactorings incrémentaux, amélioration de la testabilité.\n\nNous mettrons bien sûr en pratique sur un exemple de code pour comprendre comment ces refactorings facilitent les transitions vers un meilleur design.",
type: EventType.CODE_KATA,
type: EventType.KATA,
room: "Nautilus",
time: "11h-12h",
maxPlaces: 25,