Checkpoint: Ajout de "Tous" dans la liste des publics cible pour les séquences. Modifications apportées :

 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.
This commit is contained in:
Manus Sandbox
2025-11-19 09:09:31 -05:00
parent 61d64c365b
commit b72a9c471c
10 changed files with 816 additions and 7 deletions

View File

@@ -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
}

View File

@@ -62,6 +62,7 @@ export default function AdminRapportPublicCible() {
const labels = { const labels = {
directeur: "Directeur", directeur: "Directeur",
chef_service: "Chef de service", chef_service: "Chef de service",
tous: "Tous",
autre: "Autre", autre: "Autre",
}; };
return labels[publicCible as keyof typeof labels] || "Autre"; return labels[publicCible as keyof typeof labels] || "Autre";
@@ -71,6 +72,7 @@ export default function AdminRapportPublicCible() {
const colors = { const colors = {
directeur: "bg-blue-100 text-blue-800", directeur: "bg-blue-100 text-blue-800",
chef_service: "bg-green-100 text-green-800", chef_service: "bg-green-100 text-green-800",
tous: "bg-purple-100 text-purple-800",
autre: "bg-gray-100 text-gray-800", autre: "bg-gray-100 text-gray-800",
}; };
return colors[publicCible as keyof typeof colors] || colors.autre; return colors[publicCible as keyof typeof colors] || colors.autre;

View File

@@ -21,6 +21,7 @@ export default function AdminSequenceInscrits() {
const colors = { const colors = {
directeur: "bg-blue-100 text-blue-800", directeur: "bg-blue-100 text-blue-800",
chef_service: "bg-green-100 text-green-800", chef_service: "bg-green-100 text-green-800",
tous: "bg-purple-100 text-purple-800",
autre: "bg-gray-100 text-gray-800", autre: "bg-gray-100 text-gray-800",
}; };
return colors[publicCible as keyof typeof colors] || colors.autre; return colors[publicCible as keyof typeof colors] || colors.autre;
@@ -30,6 +31,7 @@ export default function AdminSequenceInscrits() {
const labels = { const labels = {
directeur: "Directeur", directeur: "Directeur",
chef_service: "Chef de service", chef_service: "Chef de service",
tous: "Tous",
autre: "Autre", autre: "Autre",
}; };
return labels[publicCible as keyof typeof labels] || "Autre"; return labels[publicCible as keyof typeof labels] || "Autre";

View File

@@ -34,7 +34,7 @@ export default function AdminSequences() {
formationId: "", formationId: "",
nom: "", nom: "",
lieu: "", lieu: "",
publicCible: "autre" as "directeur" | "chef_service" | "autre", publicCible: "autre" as "directeur" | "chef_service" | "tous" | "autre",
capaciteMax: "12", capaciteMax: "12",
dateBlocage: "", dateBlocage: "",
statut: "ouverte" as "ouverte" | "bloquee" | "terminee", statut: "ouverte" as "ouverte" | "bloquee" | "terminee",
@@ -292,6 +292,7 @@ export default function AdminSequences() {
const colors = { const colors = {
directeur: "bg-blue-100 text-blue-800", directeur: "bg-blue-100 text-blue-800",
chef_service: "bg-green-100 text-green-800", chef_service: "bg-green-100 text-green-800",
tous: "bg-purple-100 text-purple-800",
autre: "bg-gray-100 text-gray-800", autre: "bg-gray-100 text-gray-800",
}; };
return colors[publicCible as keyof typeof colors] || colors.autre; return colors[publicCible as keyof typeof colors] || colors.autre;
@@ -301,6 +302,7 @@ export default function AdminSequences() {
const labels = { const labels = {
directeur: "Directeur", directeur: "Directeur",
chef_service: "Chef de service", chef_service: "Chef de service",
tous: "Tous",
autre: "Autre", autre: "Autre",
}; };
return labels[publicCible as keyof typeof labels] || "Autre"; return labels[publicCible as keyof typeof labels] || "Autre";
@@ -378,7 +380,7 @@ export default function AdminSequences() {
<Label htmlFor="publicCible">Public cible *</Label> <Label htmlFor="publicCible">Public cible *</Label>
<Select <Select
value={formData.publicCible} value={formData.publicCible}
onValueChange={(value: "directeur" | "chef_service" | "autre") => setFormData({ ...formData, publicCible: value })} onValueChange={(value: "directeur" | "chef_service" | "tous" | "autre") => setFormData({ ...formData, publicCible: value })}
> >
<SelectTrigger id="publicCible"> <SelectTrigger id="publicCible">
<SelectValue placeholder="Sélectionner le public cible" /> <SelectValue placeholder="Sélectionner le public cible" />
@@ -386,6 +388,7 @@ export default function AdminSequences() {
<SelectContent> <SelectContent>
<SelectItem value="directeur">Directeur</SelectItem> <SelectItem value="directeur">Directeur</SelectItem>
<SelectItem value="chef_service">Chef de service</SelectItem> <SelectItem value="chef_service">Chef de service</SelectItem>
<SelectItem value="tous">Tous</SelectItem>
<SelectItem value="autre">Autre</SelectItem> <SelectItem value="autre">Autre</SelectItem>
</SelectContent> </SelectContent>
</Select> </Select>

View File

@@ -68,12 +68,15 @@ export default function Inscription() {
const publicCibleMap: Record<string, string> = { const publicCibleMap: Record<string, string> = {
"directeur": "directeur", "directeur": "directeur",
"chef_service": "chef_service", "chef_service": "chef_service",
"tous": "tous",
"autre": "autre" "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" : 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" : const fonctionLabel = formData.fonction === "directeur" ? "Directeur" :
formData.fonction === "chef_service" ? "Chef de service" : "Autre"; formData.fonction === "chef_service" ? "Chef de service" : "Autre";
@@ -300,7 +303,7 @@ export default function Inscription() {
</div> </div>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<Users className="w-4 h-4" /> <Users className="w-4 h-4" />
<span>Public cible : {sequence.publicCible === "directeur" ? "Directeurs" : sequence.publicCible === "chef_service" ? "Chefs de service" : "Autre"}</span> <span>Public cible : {sequence.publicCible === "directeur" ? "Directeurs" : sequence.publicCible === "chef_service" ? "Chefs de service" : sequence.publicCible === "tous" ? "Tous" : "Autre"}</span>
</div> </div>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<Users className="w-4 h-4" /> <Users className="w-4 h-4" />

View File

@@ -0,0 +1 @@
ALTER TABLE `sequences` MODIFY COLUMN `publicCible` enum('directeur','chef_service','tous','autre') NOT NULL;

View File

@@ -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": {}
}
}

View File

@@ -106,6 +106,13 @@
"when": 1763560452219, "when": 1763560452219,
"tag": "0014_silky_mac_gargan", "tag": "0014_silky_mac_gargan",
"breakpoints": true "breakpoints": true
},
{
"idx": 15,
"version": "5",
"when": 1763561100930,
"tag": "0015_brainy_terrax",
"breakpoints": true
} }
] ]
} }

View File

@@ -71,8 +71,8 @@ export const sequences = mysqlTable("sequences", {
nom: varchar("nom", { length: 255 }).notNull(), nom: varchar("nom", { length: 255 }).notNull(),
/** Lieu de la formation */ /** Lieu de la formation */
lieu: varchar("lieu", { length: 500 }).notNull(), lieu: varchar("lieu", { length: 500 }).notNull(),
/** Public cible de la séquence (Directeur, Chef de service, Autre) */ /** Public cible de la séquence (Directeur, Chef de service, Tous, Autre) */
publicCible: mysqlEnum("publicCible", ["directeur", "chef_service", "autre"]).notNull(), publicCible: mysqlEnum("publicCible", ["directeur", "chef_service", "tous", "autre"]).notNull(),
/** Capacité maximale (12 par défaut) */ /** Capacité maximale (12 par défaut) */
capaciteMax: int("capaciteMax").default(12).notNull(), capaciteMax: int("capaciteMax").default(12).notNull(),
/** Date de blocage des inscriptions (J-15 avant la première date) */ /** Date de blocage des inscriptions (J-15 avant la première date) */

10
todo.md
View File

@@ -247,3 +247,13 @@
- [x] Vérifier les logs du serveur pour identifier l'erreur exacte (colonne openId manquante) - [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] Corriger le problème dans le code OAuth (ajout manuel des colonnes openId et loginMethod)
- [x] Tester l'authentification OAuth complète - [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