Les coordonnées des bénévoles se voient enfin - #56
Merged
Merged
Conversation
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 <details> 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 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014SfQYBU4xXTeSEHKhHQXdD
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
La réponse à la question posée
Oui, les numéros sont bien enregistrés. La chaîne d'écriture est intacte de bout en bout : la route publique
/api/signupécritphone,getEventWithDetailsle charge, la page le passe au composant, l'export CSV le sort. Une inscription réelle de production porte bien son numéro.Le problème était entièrement à l'affichage, sous trois couches :
?onglet=benevoles)<details>repliétext-slate-400surbg-slate-50Qui cherchait un numéro concluait qu'il n'avait pas été enregistré.
L'incohérence de fond
Les réunions avaient reçu le bon traitement : téléphone affiché d'emblée, cliquable en
tel:. Les événements ne l'avaient jamais eu. Mêmes personnes, même besoin — joindre quelqu'un la veille — deux traitements opposés.Les événements sont maintenant alignés sur les réunions :
Au passage, sur les mêmes écrans
shrink-0et débordait de 115 px à 320 px de large ;coralde la maison.Deux fuites refermées
Trouvées en auditant ces écrans, toutes deux réelles :
list_event_signupsrenvoyait lecancelToken. L'outil MCP utilisaitsignups: true, donc toutes les colonnes. Un jeton d'annulation 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, commegetEventWithDetailsle fait déjà délibérément.getEventByShareTokenchargeait la ligne entière sur une route publique. Seulsignups.lengthest lu, mais la requête ramenait nom, e-mail, téléphone et jeton. Elle ne charge plus que l'identifiant. La règle de confidentialité n'existait qu'en commentaire ; elle est maintenant dans la requête.Vérifications
Sur une instance réelle, avec quatre inscrits couvrant les quatre cas (les deux coordonnées / téléphone seul / e-mail seul / aucune) :
tel:et 3mailto:fonctionnels ;npx tsc --noEmit,npx eslint src --max-warnings=0,npm run build: verts.Hors périmètre, signalé
Trois incohérences réelles trouvées pendant l'audit, non traitées ici parce qu'elles engagent un choix de comportement, pas un correctif d'affichage :
isNotNull(email)— un inscrit qui n'a laissé qu'un téléphone n'est jamais rappelé, alors que le réglage promet de « prévenir les inscrits » ;🤖 Generated with Claude Code
https://claude.ai/code/session_014SfQYBU4xXTeSEHKhHQXdD
Generated by Claude Code