Checkpoint: Corrections des erreurs TypeScript bloquantes pour la publication :

- Ajout du champ formateur (number | null) dans le type FormData de AdminSequences.tsx
- Ajout du type "tous" dans publicCible pour supporter toutes les valeurs possibles
- Correction de FormateurCombobox pour accepter number | null au lieu de string
- Correction des erreurs null dans QuestionnaireReponse.tsx avec optional chaining
- Correction du type previewType dans AdminSequenceInscrits.tsx pour inclure "rappel_j1"
- Build de production testé et fonctionnel (✓ built in 14.69s)

Les quelques avertissements TypeScript restants (11) ne bloquent pas le build de production. L'application peut maintenant être publiée.
This commit is contained in:
Manus
2026-01-09 11:45:27 -05:00
parent e9023ed83a
commit f9aa8f7838
5 changed files with 17 additions and 11 deletions

View File

@@ -29,8 +29,8 @@ import { trpc } from "@/lib/trpc";
import { toast } from "sonner";
interface FormateurComboboxProps {
value?: string | null;
onChange: (value: string) => void;
value?: string | number | null;
onChange: (value: number | null) => void;
placeholder?: string;
}
@@ -64,7 +64,7 @@ export default function FormateurCombobox({
createMutation.mutate({ nom: newFormateurNom.trim() });
};
const selectedFormateur = formateurs?.find((f) => f.id.toString() === value);
const selectedFormateur = formateurs?.find((f) => f.id === value || f.id.toString() === value?.toString());
return (
<>
@@ -90,15 +90,15 @@ export default function FormateurCombobox({
<CommandItem
key={formateur.id}
value={formateur.id.toString()}
onSelect={(currentValue) => {
onChange(currentValue === value ? "" : currentValue);
onSelect={() => {
onChange(value === formateur.id ? null : formateur.id);
setOpen(false);
}}
>
<Check
className={cn(
"mr-2 h-4 w-4",
value === formateur.id.toString() ? "opacity-100" : "opacity-0"
value === formateur.id ? "opacity-100" : "opacity-0"
)}
/>
{formateur.nom}

View File

@@ -49,7 +49,7 @@ export default function AdminSequenceInscrits() {
const [filterFonction, setFilterFonction] = useState<string>("all");
const [sortBy, setSortBy] = useState<"date" | "nom">("date");
const [showPreviewModal, setShowPreviewModal] = useState(false);
const [previewType, setPreviewType] = useState<"teaser" | "rappel">("teaser");
const [previewType, setPreviewType] = useState<"teaser" | "rappel" | "rappel_j1">("teaser");
const utils = trpc.useUtils();
const { data: sequence, isLoading: loadingSequence } = trpc.sequences.getById.useQuery({ id: sequenceId });

View File

@@ -38,10 +38,11 @@ export default function AdminSequences() {
formationId: "",
nom: "",
lieu: "",
publicCible: "autre" as "directeur" | "chef_service" | "autre",
publicCible: "autre" as "directeur" | "chef_service" | "autre" | "tous",
capaciteMax: "12",
dateBlocage: "",
statut: "ouverte" as "ouverte" | "bloquee" | "terminee",
formateur: null as number | null,
dates: [
{ dateDebut: "", dateFin: "", ordre: 1 }
] as DateFormation[],
@@ -95,6 +96,7 @@ export default function AdminSequences() {
capaciteMax: "12",
dateBlocage: "",
statut: "ouverte",
formateur: null,
dates: [{ dateDebut: "", dateFin: "", ordre: 1 }],
});
};
@@ -183,7 +185,7 @@ export default function AdminSequences() {
capaciteMax: parseInt(formData.capaciteMax),
dateBlocage: convertLocalToUTC(formData.dateBlocage),
statut: formData.statut,
formateurId: formData.formateur ? parseInt(formData.formateur) : null,
formateurId: formData.formateur,
dates: formData.dates.map(d => ({
...d,
dateDebut: convertLocalToUTC(d.dateDebut),

View File

@@ -113,8 +113,8 @@ export default function QuestionnaireReponse() {
{APP_LOGO && (
<img src={APP_LOGO} alt={APP_TITLE} className="h-16 mx-auto mb-4" />
)}
<h1 className="text-3xl font-bold mb-2">{data.questionnaire.nom}</h1>
{data.questionnaire.description && (
<h1 className="text-3xl font-bold mb-2">{data.questionnaire?.nom || 'Questionnaire'}</h1>
{data.questionnaire?.description && (
<p className="text-muted-foreground">{data.questionnaire.description}</p>
)}
</div>