From 75fa224bd438688f1d66edf9838c05f78b1b35a5 Mon Sep 17 00:00:00 2001
From: Claude
Date: Sat, 19 Sep 2026 07:21:31 +0000
Subject: [PATCH] =?UTF-8?q?Les=20coordonn=C3=A9es=20des=20b=C3=A9n=C3=A9vo?=
=?UTF-8?q?les=20se=20voient=20enfin?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Les numéros de téléphone étaient bien enregistrés — la route publique
/api/signup les écrit, getEventWithDetails les charge, la page les passe
au composant, et le CSV les exporte. Une inscription réelle de production
porte bien son numéro. Mais à l'écran, ils étaient sous trois couches :
- un autre onglet (?onglet=benevoles), alors que l'aperçu n'affiche qu'un
compteur « N inscriptions » qui prouve que les gens sont là sans dire
qui ;
- un replié, « Voir les N personnes inscrites » ;
- une ligne en text-slate-400 sur bg-slate-50, mesurée à 2,45:1 pour un
seuil lisible de 4,5:1 — la moitié de ce qu'il faut.
Qui cherchait un numéro concluait qu'il n'avait pas été enregistré.
Les réunions, elles, avaient reçu le bon traitement : téléphone affiché
d'emblée, cliquable en tel:. Les événements sont désormais alignés
dessus, et le pli est supprimé :
- les inscrits s'affichent directement sous leur créneau ;
- téléphone et e-mail sur leur propre ligne, cliquables, à 7,24:1 ;
- « Aucune coordonnée laissée » quand la personne n'en a pas donné, au
lieu du silence ;
- cibles tactiles portées à 44 px, des deux côtés — c'est l'écran qu'on
consulte debout, la veille, pour joindre quelqu'un.
Au passage, sur les mêmes écrans : la barre d'actions d'un créneau était
en shrink-0 et débordait de 115 px à 320 px de large ; ses trois boutons,
l'état vide des créneaux, « Personne pour l'instant » et « Fiche
événement » étaient tous sous le seuil de contraste ; et les rouges
Tailwind par défaut passent au coral de la maison.
Deux fuites refermées, trouvées en auditant ces écrans :
- list_event_signups renvoyait `signups: true`, donc le cancelToken. Ce
n'est pas une donnée mais un pouvoir : qui le détient peut désinscrire
la personne sans être authentifié. L'outil énumère maintenant ses
colonnes, comme le fait déjà getEventWithDetails.
- getEventByShareToken, qui alimente une page PUBLIQUE, chargeait la
ligne d'inscription entière alors que seul son nombre est lu. Elle ne
charge plus que l'identifiant : la règle de confidentialité n'était
écrite qu'en commentaire, elle est maintenant dans la requête.
Vérifié sur une instance réelle, sur quatre inscrits couvrant les quatre
cas (les deux coordonnées, téléphone seul, e-mail seul, aucune) : tout
est visible sans aucun clic, plus aucun texte sous 4,5:1 sur les deux
onglets, plus aucune cible sous 44 px, et aucun débordement de 320 à
1920 px.
Co-Authored-By: Claude Opus 5
Claude-Session: https://claude.ai/code/session_014SfQYBU4xXTeSEHKhHQXdD
---
src/app/dashboard/events/[id]/page.tsx | 6 +-
src/components/slot-manager.tsx | 77 ++++++++++++++++++--------
src/lib/data.ts | 8 ++-
src/lib/mcp/register-core-tools.ts | 17 +++++-
4 files changed, 79 insertions(+), 29 deletions(-)
diff --git a/src/app/dashboard/events/[id]/page.tsx b/src/app/dashboard/events/[id]/page.tsx
index 925c99f..b5fbb3c 100644
--- a/src/app/dashboard/events/[id]/page.tsx
+++ b/src/app/dashboard/events/[id]/page.tsx
@@ -208,7 +208,7 @@ export default async function EventDetailPage({
>
{EVENT_STATUS_LABELS[event.status]}
-
+
Fiche événement
@@ -284,7 +284,7 @@ export default async function EventDetailPage({
{gens.length === 0 ? (
- Personne pour l’instant.
+ Personne pour l’instant.
) : (