From b72a9c471caf3854befe38b63d7f5a09922773eb Mon Sep 17 00:00:00 2001 From: Manus Sandbox Date: Wed, 19 Nov 2025 09:09:31 -0500 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Ajout=20de=20"Tous"=20dans=20la?= =?UTF-8?q?=20liste=20des=20publics=20cible=20pour=20les=20s=C3=A9quences.?= =?UTF-8?q?=20Modifications=20apport=C3=A9es=20:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✅ Base de données : enum publicCible mis à jour avec la valeur "tous" ✅ Frontend mis à jour dans 4 fichiers : - AdminSequences.tsx : ajout de "tous" dans les types TypeScript, options de sélection et badges (couleur violet) - AdminSequenceInscrits.tsx : ajout de "tous" dans les fonctions de labels et badges - AdminRapportPublicCible.tsx : ajout de "tous" dans les fonctions de labels et badges - Inscription.tsx : ajout de "tous" dans le mapping, l'affichage et la logique d'alerte (pas d'alerte si public cible = "Tous") Les séquences peuvent maintenant être créées avec le public cible "Tous", ce qui permet de cibler tous les profils sans distinction. --- .manus/db/db-query-1763561120018.json | 9 + client/src/pages/AdminRapportPublicCible.tsx | 2 + client/src/pages/AdminSequenceInscrits.tsx | 2 + client/src/pages/AdminSequences.tsx | 7 +- client/src/pages/Inscription.tsx | 9 +- drizzle/0015_brainy_terrax.sql | 1 + drizzle/meta/0015_snapshot.json | 772 +++++++++++++++++++ drizzle/meta/_journal.json | 7 + drizzle/schema.ts | 4 +- todo.md | 10 + 10 files changed, 816 insertions(+), 7 deletions(-) create mode 100644 .manus/db/db-query-1763561120018.json create mode 100644 drizzle/0015_brainy_terrax.sql create mode 100644 drizzle/meta/0015_snapshot.json diff --git a/.manus/db/db-query-1763561120018.json b/.manus/db/db-query-1763561120018.json new file mode 100644 index 0000000..64acd60 --- /dev/null +++ b/.manus/db/db-query-1763561120018.json @@ -0,0 +1,9 @@ +{ + "query": "ALTER TABLE sequences MODIFY COLUMN publicCible ENUM('directeur', 'chef_service', 'tous', 'autre') NOT NULL", + "command": "mysql --batch --raw --column-names --default-character-set=utf8mb4 --host gateway02.us-east-1.prod.aws.tidbcloud.com --port 4000 --user 4CrrYuB5tme73Qo.root --database 7PAT67UmWoxv8vwp8Bbcv6 --execute ALTER TABLE sequences MODIFY COLUMN publicCible ENUM('directeur', 'chef_service', 'tous', 'autre') NOT NULL", + "rows": [], + "messages": [], + "stdout": "", + "stderr": "", + "execution_time_ms": 594 +} \ No newline at end of file diff --git a/client/src/pages/AdminRapportPublicCible.tsx b/client/src/pages/AdminRapportPublicCible.tsx index 8bdae16..56d093d 100644 --- a/client/src/pages/AdminRapportPublicCible.tsx +++ b/client/src/pages/AdminRapportPublicCible.tsx @@ -62,6 +62,7 @@ export default function AdminRapportPublicCible() { const labels = { directeur: "Directeur", chef_service: "Chef de service", + tous: "Tous", autre: "Autre", }; return labels[publicCible as keyof typeof labels] || "Autre"; @@ -71,6 +72,7 @@ export default function AdminRapportPublicCible() { const colors = { directeur: "bg-blue-100 text-blue-800", chef_service: "bg-green-100 text-green-800", + tous: "bg-purple-100 text-purple-800", autre: "bg-gray-100 text-gray-800", }; return colors[publicCible as keyof typeof colors] || colors.autre; diff --git a/client/src/pages/AdminSequenceInscrits.tsx b/client/src/pages/AdminSequenceInscrits.tsx index 91ffc1a..21a5fd7 100644 --- a/client/src/pages/AdminSequenceInscrits.tsx +++ b/client/src/pages/AdminSequenceInscrits.tsx @@ -21,6 +21,7 @@ export default function AdminSequenceInscrits() { const colors = { directeur: "bg-blue-100 text-blue-800", chef_service: "bg-green-100 text-green-800", + tous: "bg-purple-100 text-purple-800", autre: "bg-gray-100 text-gray-800", }; return colors[publicCible as keyof typeof colors] || colors.autre; @@ -30,6 +31,7 @@ export default function AdminSequenceInscrits() { const labels = { directeur: "Directeur", chef_service: "Chef de service", + tous: "Tous", autre: "Autre", }; return labels[publicCible as keyof typeof labels] || "Autre"; diff --git a/client/src/pages/AdminSequences.tsx b/client/src/pages/AdminSequences.tsx index d5c5e2a..80558eb 100644 --- a/client/src/pages/AdminSequences.tsx +++ b/client/src/pages/AdminSequences.tsx @@ -34,7 +34,7 @@ export default function AdminSequences() { formationId: "", nom: "", lieu: "", - publicCible: "autre" as "directeur" | "chef_service" | "autre", + publicCible: "autre" as "directeur" | "chef_service" | "tous" | "autre", capaciteMax: "12", dateBlocage: "", statut: "ouverte" as "ouverte" | "bloquee" | "terminee", @@ -292,6 +292,7 @@ export default function AdminSequences() { const colors = { directeur: "bg-blue-100 text-blue-800", chef_service: "bg-green-100 text-green-800", + tous: "bg-purple-100 text-purple-800", autre: "bg-gray-100 text-gray-800", }; return colors[publicCible as keyof typeof colors] || colors.autre; @@ -301,6 +302,7 @@ export default function AdminSequences() { const labels = { directeur: "Directeur", chef_service: "Chef de service", + tous: "Tous", autre: "Autre", }; return labels[publicCible as keyof typeof labels] || "Autre"; @@ -378,7 +380,7 @@ export default function AdminSequences() { diff --git a/client/src/pages/Inscription.tsx b/client/src/pages/Inscription.tsx index 8a4c033..f26ff9a 100644 --- a/client/src/pages/Inscription.tsx +++ b/client/src/pages/Inscription.tsx @@ -68,12 +68,15 @@ export default function Inscription() { const publicCibleMap: Record = { "directeur": "directeur", "chef_service": "chef_service", + "tous": "tous", "autre": "autre" }; - if (publicCibleMap[selectedSequence.publicCible] !== formData.fonction) { + // Si le public cible est "tous", ne pas afficher d'alerte + if (selectedSequence.publicCible !== "tous" && publicCibleMap[selectedSequence.publicCible] !== formData.fonction) { const publicCibleLabel = selectedSequence.publicCible === "directeur" ? "Directeurs" : - selectedSequence.publicCible === "chef_service" ? "Chefs de service" : "Autre"; + selectedSequence.publicCible === "chef_service" ? "Chefs de service" : + selectedSequence.publicCible === "tous" ? "Tous" : "Autre"; const fonctionLabel = formData.fonction === "directeur" ? "Directeur" : formData.fonction === "chef_service" ? "Chef de service" : "Autre"; @@ -300,7 +303,7 @@ export default function Inscription() {
- Public cible : {sequence.publicCible === "directeur" ? "Directeurs" : sequence.publicCible === "chef_service" ? "Chefs de service" : "Autre"} + Public cible : {sequence.publicCible === "directeur" ? "Directeurs" : sequence.publicCible === "chef_service" ? "Chefs de service" : sequence.publicCible === "tous" ? "Tous" : "Autre"}
diff --git a/drizzle/0015_brainy_terrax.sql b/drizzle/0015_brainy_terrax.sql new file mode 100644 index 0000000..ee7dfa1 --- /dev/null +++ b/drizzle/0015_brainy_terrax.sql @@ -0,0 +1 @@ +ALTER TABLE `sequences` MODIFY COLUMN `publicCible` enum('directeur','chef_service','tous','autre') NOT NULL; \ No newline at end of file diff --git a/drizzle/meta/0015_snapshot.json b/drizzle/meta/0015_snapshot.json new file mode 100644 index 0000000..705acd7 --- /dev/null +++ b/drizzle/meta/0015_snapshot.json @@ -0,0 +1,772 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "227aca0a-a830-4a26-9bd7-edca209e040b", + "prevId": "ed024a5d-e1f8-452d-aa76-cab1195187c1", + "tables": { + "apprenants": { + "name": "apprenants", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "nom": { + "name": "nom", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "prenom": { + "name": "prenom", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(320)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "codeEtablissement": { + "name": "codeEtablissement", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "fonction": { + "name": "fonction", + "type": "enum('directeur','chef_service','autre')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "apprenants_id": { + "name": "apprenants_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "apprenants_email_unique": { + "name": "apprenants_email_unique", + "columns": [ + "email" + ] + } + }, + "checkConstraint": {} + }, + "datesFormation": { + "name": "datesFormation", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "sequenceId": { + "name": "sequenceId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "dateDebut": { + "name": "dateDebut", + "type": "datetime", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "dateFin": { + "name": "dateFin", + "type": "datetime", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ordre": { + "name": "ordre", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "datesFormation_id": { + "name": "datesFormation_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "emailConfig": { + "name": "emailConfig", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "provider": { + "name": "provider", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'resend'" + }, + "apiKey": { + "name": "apiKey", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "fromEmail": { + "name": "fromEmail", + "type": "varchar(320)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "fromName": { + "name": "fromName", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'Formation Manager Itinova'" + }, + "mode": { + "name": "mode", + "type": "enum('simulation','production')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'simulation'" + }, + "domainVerified": { + "name": "domainVerified", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "active": { + "name": "active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "emailConfig_id": { + "name": "emailConfig_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "emailTemplates": { + "name": "emailTemplates", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "type": { + "name": "type", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "logoUrl": { + "name": "logoUrl", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "primaryColor": { + "name": "primaryColor", + "type": "varchar(7)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'#2563eb'" + }, + "headerBgColor": { + "name": "headerBgColor", + "type": "varchar(7)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'#2563eb'" + }, + "headerTextColor": { + "name": "headerTextColor", + "type": "varchar(7)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'#ffffff'" + }, + "headerTitle": { + "name": "headerTitle", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'Formation Manager Itinova'" + }, + "footerText": { + "name": "footerText", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "active": { + "name": "active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "emailTemplates_id": { + "name": "emailTemplates_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "emailTemplates_type_unique": { + "name": "emailTemplates_type_unique", + "columns": [ + "type" + ] + } + }, + "checkConstraint": {} + }, + "formations": { + "name": "formations", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "nom": { + "name": "nom", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "lienUnique": { + "name": "lienUnique", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "actif": { + "name": "actif", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "formations_id": { + "name": "formations_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "formations_lienUnique_unique": { + "name": "formations_lienUnique_unique", + "columns": [ + "lienUnique" + ] + } + }, + "checkConstraint": {} + }, + "inscriptions": { + "name": "inscriptions", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "apprenantId": { + "name": "apprenantId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sequenceId": { + "name": "sequenceId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "statut": { + "name": "statut", + "type": "enum('confirmee','liste_attente','annulee')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "dateInscription": { + "name": "dateInscription", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "inscriptions_id": { + "name": "inscriptions_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "passwordResetTokens": { + "name": "passwordResetTokens", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "userId": { + "name": "userId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "used": { + "name": "used", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "passwordResetTokens_id": { + "name": "passwordResetTokens_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "passwordResetTokens_token_unique": { + "name": "passwordResetTokens_token_unique", + "columns": [ + "token" + ] + } + }, + "checkConstraint": {} + }, + "sequences": { + "name": "sequences", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "formationId": { + "name": "formationId", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "nom": { + "name": "nom", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "lieu": { + "name": "lieu", + "type": "varchar(500)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "publicCible": { + "name": "publicCible", + "type": "enum('directeur','chef_service','tous','autre')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "capaciteMax": { + "name": "capaciteMax", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 12 + }, + "dateBlocage": { + "name": "dateBlocage", + "type": "datetime", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "statut": { + "name": "statut", + "type": "enum('ouverte','bloquee','terminee')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'ouverte'" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "sequences_id": { + "name": "sequences_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "openId": { + "name": "openId", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(320)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "loginMethod": { + "name": "loginMethod", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "enum('user','admin')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'user'" + }, + "isActive": { + "name": "isActive", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "lastSignedIn": { + "name": "lastSignedIn", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "users_id": { + "name": "users_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + } + }, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "tables": {}, + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 4227293..9f24461 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -106,6 +106,13 @@ "when": 1763560452219, "tag": "0014_silky_mac_gargan", "breakpoints": true + }, + { + "idx": 15, + "version": "5", + "when": 1763561100930, + "tag": "0015_brainy_terrax", + "breakpoints": true } ] } \ No newline at end of file diff --git a/drizzle/schema.ts b/drizzle/schema.ts index e2c073e..714a000 100644 --- a/drizzle/schema.ts +++ b/drizzle/schema.ts @@ -71,8 +71,8 @@ export const sequences = mysqlTable("sequences", { nom: varchar("nom", { length: 255 }).notNull(), /** Lieu de la formation */ lieu: varchar("lieu", { length: 500 }).notNull(), - /** Public cible de la séquence (Directeur, Chef de service, Autre) */ - publicCible: mysqlEnum("publicCible", ["directeur", "chef_service", "autre"]).notNull(), + /** Public cible de la séquence (Directeur, Chef de service, Tous, Autre) */ + publicCible: mysqlEnum("publicCible", ["directeur", "chef_service", "tous", "autre"]).notNull(), /** Capacité maximale (12 par défaut) */ capaciteMax: int("capaciteMax").default(12).notNull(), /** Date de blocage des inscriptions (J-15 avant la première date) */ diff --git a/todo.md b/todo.md index 8b81176..2a6a466 100644 --- a/todo.md +++ b/todo.md @@ -247,3 +247,13 @@ - [x] Vérifier les logs du serveur pour identifier l'erreur exacte (colonne openId manquante) - [x] Corriger le problème dans le code OAuth (ajout manuel des colonnes openId et loginMethod) - [x] Tester l'authentification OAuth complète + +## Ajout "Tous" dans les publics cible + +- [x] Localiser où la liste des publics cible est définie dans le code +- [x] Ajouter "Tous" dans la liste des publics cible (schéma DB + frontend) +- [x] Mettre à jour AdminSequences.tsx (types, options, badges violet) +- [x] Mettre à jour AdminSequenceInscrits.tsx (labels et badges) +- [x] Mettre à jour AdminRapportPublicCible.tsx (labels et badges) +- [x] Mettre à jour Inscription.tsx (mapping, affichage, logique d'alerte) +- [x] Tester l'affichage dans le formulaire de création/édition de séquence