Checkpoint: Ajout du champ "Fonction" (Directeur, Chef de service, Autre) dans la fiche apprenant : mise à jour du schéma de base de données, ajout dans les formulaires d'inscription et de gestion des apprenants, affichage dans le tableau des apprenants, et intégration dans tous les exports (Excel, PDF, feuille de présence).

This commit is contained in:
Manus Sandbox
2025-11-12 09:30:30 -05:00
parent 2e75838bed
commit 9d591b64ba
9 changed files with 543 additions and 4 deletions

View File

@@ -5,6 +5,7 @@ import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, D
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import { trpc } from "@/lib/trpc";
import { Plus, Pencil, Trash2, Search, SlidersHorizontal } from "lucide-react";
import { useState, useMemo } from "react";
@@ -20,6 +21,7 @@ export default function AdminApprenants() {
prenom: "",
email: "",
codeEtablissement: "",
fonction: "autre" as "directeur" | "chef_service" | "autre",
});
const utils = trpc.useUtils();
@@ -60,7 +62,7 @@ export default function AdminApprenants() {
});
const resetForm = () => {
setFormData({ nom: "", prenom: "", email: "", codeEtablissement: "" });
setFormData({ nom: "", prenom: "", email: "", codeEtablissement: "", fonction: "autre" });
setEditingId(null);
};
@@ -70,6 +72,7 @@ export default function AdminApprenants() {
prenom: apprenant.prenom,
email: apprenant.email,
codeEtablissement: apprenant.codeEtablissement,
fonction: apprenant.fonction || "autre",
});
setEditingId(apprenant.id);
setOpen(true);
@@ -179,6 +182,19 @@ export default function AdminApprenants() {
required
/>
</div>
<div className="space-y-2">
<Label htmlFor="fonction">Fonction *</Label>
<Select value={formData.fonction} onValueChange={(value: any) => setFormData({ ...formData, fonction: value })}>
<SelectTrigger id="fonction">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="directeur">Directeur</SelectItem>
<SelectItem value="chef_service">Chef de service</SelectItem>
<SelectItem value="autre">Autre</SelectItem>
</SelectContent>
</Select>
</div>
</div>
<DialogFooter>
<Button type="button" variant="outline" onClick={() => setOpen(false)}>
@@ -245,6 +261,7 @@ export default function AdminApprenants() {
<TableHead>Prénom</TableHead>
<TableHead>Email</TableHead>
<TableHead>Code établissement</TableHead>
<TableHead>Fonction</TableHead>
<TableHead className="text-right">Actions</TableHead>
</TableRow>
</TableHeader>
@@ -255,6 +272,10 @@ export default function AdminApprenants() {
<TableCell>{apprenant.prenom}</TableCell>
<TableCell>{apprenant.email}</TableCell>
<TableCell>{apprenant.codeEtablissement}</TableCell>
<TableCell>
{apprenant.fonction === "directeur" ? "Directeur" :
apprenant.fonction === "chef_service" ? "Chef de service" : "Autre"}
</TableCell>
<TableCell className="text-right">
<div className="flex justify-end gap-2">
<Button

View File

@@ -10,6 +10,7 @@ import { toast } from "sonner";
import { format } from "date-fns";
import { fr } from "date-fns/locale";
import { CheckCircle, XCircle, AlertCircle, Calendar, MapPin, Users } from "lucide-react";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import { APP_LOGO, APP_TITLE } from "@/const";
export default function Inscription() {
@@ -21,6 +22,7 @@ export default function Inscription() {
prenom: "",
email: "",
codeEtablissement: "",
fonction: "autre" as "directeur" | "chef_service" | "autre",
});
const [selectedSessionId, setSelectedSessionId] = useState<number | null>(null);
const [inscriptionSuccess, setInscriptionSuccess] = useState(false);
@@ -320,6 +322,19 @@ export default function Inscription() {
required
/>
</div>
<div className="space-y-2">
<Label htmlFor="fonction">Fonction *</Label>
<Select value={formData.fonction} onValueChange={(value: any) => setFormData({ ...formData, fonction: value })}>
<SelectTrigger id="fonction">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="directeur">Directeur</SelectItem>
<SelectItem value="chef_service">Chef de service</SelectItem>
<SelectItem value="autre">Autre</SelectItem>
</SelectContent>
</Select>
</div>
<div className="bg-amber-50 border border-amber-200 rounded-lg p-4">
<p className="text-sm text-amber-800">