Corrige la grille des besoins : postes manquants au-delà du premier

Chaque cellule de la grille (label de poste, en-têtes, créneaux, cases
vides) recevait sa position via l'ordre d'émission des enfants, en
comptant sur le fait que chaque ligne totalise exactement le nombre de
tranches de 30 min d'un jour pour que l'auto-flow CSS reste aligné. Un
poste dont les créneaux ne tombaient pas exactement sur ce total (deux
créneaux adjacents mais non alignés sur 30 min, courant depuis la
création de créneaux à la main) décalait tous les postes suivants —
leur nom de poste n'apparaissait plus sur la bonne ligne.

Chaque cellule reçoit maintenant sa position de grille explicitement
(gridColumn/gridRow calculés), immunisé contre ce genre de décalage :
l'anomalie d'un poste reste locale à sa propre ligne.

Nouveau test de non-régression (scripts/smoke.tsx:checkGridLayout) :
inspecte les gridRow réellement rendus plutôt que la simple absence de
crash — un décalage CSS n'est pas détectable par un rendu SSR ordinaire.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
AdamThomas
2026-09-28 19:04:38 +02:00
co-authored by Claude Sonnet 5
parent 5f80f167c8
commit 8b9c0ac498
3 changed files with 170 additions and 31 deletions
+17 -6
View File
@@ -463,12 +463,22 @@ temps : une colonne = 30 min, bornée par jour à la plage réellement utilisée
(du créneau le plus matinal au plus tardif, arrondi à la demi-heure
englobante — pas les 24 h complètes). Les créneaux gardent des horaires
libres (`ShiftCreate`, § 2) ; ils sont replacés dans cette grille fixe en
fusionnant les cases qu'ils couvrent (`gridColumn: span N`), arrondis à la
tranche englobante s'ils ne tombent pas pile sur un multiple de 30 min
(`buildTimeGrid` / `placeInTimeGrid` dans `frontend/src/lib/planning.ts`).
Largeur adaptative par jour (`columnWidthPx`, en fonction du nombre de
tranches) : peu de tranches ⇒ colonnes larges, beaucoup ⇒ largeur compacte
avec défilement horizontal — jamais de colonnes étroites par défaut.
fusionnant les cases qu'ils couvrent, arrondis à la tranche englobante s'ils
ne tombent pas pile sur un multiple de 30 min (`buildTimeGrid` /
`placeInTimeGrid` dans `frontend/src/lib/planning.ts`). **Chaque cellule
reçoit sa position de grille explicitement** (`gridColumn`/`gridRow`
calculés dans `GrillePage.tsx`, pas seulement `gridColumn: span N`) : un
poste dont les créneaux ne totalisent pas exactement le nombre de tranches
d'un jour (deux créneaux adjacents mais non alignés sur 30 min, désormais
courant depuis la création à la main) ne doit jamais décaler les lignes
suivantes — bug corrigé une fois (postes manquants au-delà du premier), un
positionnement implicite (auto-flow) recréerait la même classe de bug.
Vérifié par `scripts/smoke.tsx:checkGridLayout` (inspecte les `grid-row`
rendus, pas seulement l'absence de crash — un décalage CSS n'est pas visible
dans un simple rendu SSR). Largeur adaptative par jour (`columnWidthPx`, en
fonction du nombre de tranches) : peu de tranches ⇒ colonnes larges, beaucoup
⇒ largeur compacte avec défilement horizontal — jamais de colonnes étroites
par défaut.
La « Vue bénévoles » (`VolunteerViewPage.tsx`) reste sur l'ancien modèle,
distinct : une colonne par **créneau** (signature `starts_at`/`ends_at`)
plutôt qu'un axe temporel continu (`buildLattice` / `LatticeColumn`), plus
@@ -664,6 +674,7 @@ Aucune dépendance locale requise hors Docker.
| 25 | Formulaire public : photo recadrée en carré côté navigateur avant l'envoi, aperçu agrandi ; personnalisation de la page (logo, texte d'introduction) depuis l'écran de configuration (`/inscriptions`) | à valider |
| 26 | Feuilles de poste : programmation du jour (horaires des artistes, tous postes confondus) sous le référent | à valider |
| 27 | Formulaire public : encart de paiement de la cotisation via Yapla (lien externe configurable), affiché sous la case correspondante | à valider |
| 28 | Correctif grille des besoins : positionnement explicite (`gridColumn`/`gridRow`) de chaque cellule — un poste aux créneaux non alignés sur 30 min ne décale plus les postes suivants (noms de poste manquants au-delà du premier) | à valider |
**Reste hors périmètre** (modèle prêt à les accueillir) : SMS, constructeur
de formulaire, pointage sur site, IA. Frontend : squelette + 6 écrans +