Planning et placement
Vérifié contre le produit le .
| Domaine | Planning & placement — la grille, les trois gestes de placement, le déplacement, l’anti-conflit, l’historique |
| Durée | ~15 min |
| Niveau | complet |
| Étiquette | manuel — glisser-déposer et redimensionnement sont des gestes au pointeur, non scriptables honnêtement |
Préparation
Section intitulée « Préparation »Socle A — le jeu de démonstration. Le montage est sur la préparation commune.
Compte : demo@delacroix.example (administrateur). Le scénario se joue aussi avec erin,
la planificatrice, sur le socle B — mais le socle A donne un emploi du temps dense, ce qui rend
les conflits observables.
État de départ : la grille de Planification affiche une semaine peuplée de séances planifiées Une occurrence réelle d'un cours, à une date, une heure et dans une salle données — ce qu'un étudiant lit dans son emploi du temps. , et le cours « Algorithmique — TD » n’a aucune séance placée.
1. La grille se lit
Section intitulée « 1. La grille se lit »| # | Action | Résultat attendu |
|---|---|---|
| 1.1 | Ouvrir Planification | une semaine dense ; l’axe des heures à gauche, une colonne par jour du lundi au samedi |
| 1.2 | Cliquer « Semaine suivante », puis « Aujourd’hui » | la grille change de semaine sans état de chargement visible |
| 1.3 | Ouvrir un bloc de séance | son infobulle donne l’enseignant, les horaires réels et la salle complète |
| 1.4 | Panneau de filtres → « Groupe », choisir une promotion | la grille se réduit à ses cours |
| 1.5 | Ajouter un filtre « Enseignant » | les deux filtres se croisent — l’intersection, pas l’union |
| 1.6 | Copier l’adresse, l’ouvrir dans un nouvel onglet | semaine et filtres sont restaurés |
| 1.7 | Remettre tous les filtres à « Tous » | la grille redevient dense |
2. Poser une séance — les trois chemins
Section intitulée « 2. Poser une séance — les trois chemins »| # | Action | Résultat attendu |
|---|---|---|
| 2.1 | « Créer un cours » → choisir « Algorithmique — TD » | le panneau rappelle l’enseignant, l’effectif et la durée |
| 2.2 | « Détecter les créneaux éligibles » | la grille se colore ; les compteurs annoncent les créneaux possibles et les exclus |
| 2.3 | Cliquer une cellule notée, puis « Placer ici », confirmer | « Séance créée en brouillon. » ; le bloc apparaît, contour pointillé |
| 2.4 | Cliquer une zone libre de la grille, hors de toute bande de trame | le dialogue « Placer le cours à horaire libre » s’ouvre, avec l’heure de début et la durée modifiables |
| 2.5 | Ajuster la durée à 45 minutes, valider | « Séance créée en brouillon. » ; le bloc fait bien 45 minutes |
| 2.6 | Glisser verticalement sur une zone libre | une bande en pointillés suit le geste ; au relâchement, le même dialogue s’ouvre avec la plage dessinée |
| 2.7 | Saisir une durée de 5 minutes | « La durée doit être comprise entre 15 et 480 minutes. » |
3. Déplacer, redimensionner, annuler
Section intitulée « 3. Déplacer, redimensionner, annuler »| # | Action | Résultat attendu |
|---|---|---|
| 3.1 | Glisser un bloc vers un autre créneau libre | un fantôme suit le pointeur avec « … /100 · … » — le score et la salle de la destination |
| 3.2 | Relâcher | le dialogue « Déplacer le cours » s’ouvre : origine et destination aux heures réelles, « Score : … → … », et la salle |
| 3.3 | Confirmer | « Séance déplacée. », avec une action « Annuler » dans le message |
| 3.4 | Cliquer « Annuler » | « Déplacement annulé — position précédente restaurée. » ; le bloc est revenu |
| 3.5 | Sur un cours récurrent, refaire un déplacement | le dialogue propose « Cette semaine seulement » ou « Toutes les occurrences à venir » |
| 3.6 | Tirer la poignée en bas d’un bloc | l’aperçu suit ; au relâchement, « Durée modifiée. » |
| 3.7 | « Historique » | le panneau « Historique des opérations » liste les gestes, du plus récent au plus ancien, avec leur type |
4. L’anti-conflit — rien ne s’écrase
Section intitulée « 4. L’anti-conflit — rien ne s’écrase »C’est le bloc décisif, et il remplace les vérifications qui passaient autrefois par l’interface de programmation faute d’écran : tout se joue désormais dans la grille.
| # | Action | Résultat attendu |
|---|---|---|
| 4.1 | Aller en semaine 2, basculer l’affichage sur Occupation | les plages occupées apparaissent avec leur motif ; B-201 mardi 09:45 en fait partie |
| 4.2 | Glisser une séance vers cette plage | le fantôme affiche « Destination impossible » |
| 4.3 | Relâcher malgré tout | « Salle occupée : B-201 · 09:45 – 11:15 » |
| 4.4 | Regarder la grille | elle n’a pas bougé — aucune écriture n’a eu lieu, rien n’est à défaire |
| 4.5 | Tenter de placer une séance sur un créneau où l’enseignant a déjà cours | « Enseignant déjà en cours : … · … – … » |
| 4.6 | Tenter de placer sur un créneau où le groupe a déjà cours | « Groupe déjà en cours : … · … – … » |
| 4.7 | Revenir en mode Heatmap et survoler une cellule hachurée | l’infobulle nomme la raison dominante de l’exclusion |
La réservation de B-201 n’apparaît pas comme un bloc sur la grille — seules les séances y figurent. C’est le mode Occupation qui la rend visible, et le refus qui la nomme.
5. Ce qu’une séance en brouillon occupe
Section intitulée « 5. Ce qu’une séance en brouillon occupe »| # | Action | Résultat attendu |
|---|---|---|
| 5.1 | Noter la salle et le créneau d’une séance posée au bloc 2 | — |
| 5.2 | Aller dans Réservation et chercher cette salle sur ce créneau | elle n’apparaît pas : un brouillon occupe déjà la salle |
| 5.3 | Ouvrir la fiche de cette salle, ajouter une indisponibilité couvrant le créneau | l’aperçu compte « 0 réservation(s) et 1 cours impactés » |
| 5.4 | Annuler l’indisponibilité, puis annuler la séance depuis la grille | la salle redevient disponible dans la recherche |
C’est l’unification session / réservation : une séance en brouillon, une séance publiée et une réservation confirmée occupent la salle de la même façon.
Pièges connus
Section intitulée « Pièges connus »- Aucune mise à jour optimiste. La grille ne change qu’après confirmation du serveur. Un refus laisse donc toujours un écran cohérent — mais un geste réussi paraît une fraction de seconde plus lent qu’ailleurs.
- Le pré-contrôle du geste est indicatif. Il peut annoncer une destination valable qui sera refusée à l’écriture, si un collègue est passé entre-temps. Seul l’enregistrement fait foi.
- La touche Alt désactive l’aimantation pendant un geste. Un placement qui « refuse de tomber juste » est souvent un aimant, pas un bug.
Les pièges transverses — environnement, authentification, fraîcheur des données — sont rassemblés sur Les pièges connus.
Traçabilité
Section intitulée « Traçabilité »| Ce qui est couvert | Story | Vue |
|---|---|---|
| Grille hebdomadaire, filtres, navigation | STORY-025 |
V10 |
| Panneau de création et détection | STORY-026 |
V11 |
| Glisser-déposer et déplacement | STORY-029 |
— |
| Placement à horaire libre, redimensionnement | STORY-005, STORY-006 |
— |
| Historique et annulation | STORY-030 |
— |
| Anti-conflit, occupation unifiée | STORY-013 |
— |
Couvert par les tests automatisés : apps/api/src/occupancy/course-placement.e2e.spec.ts,
apps/api/src/occupancy/free-placement.e2e.spec.ts,
apps/api/src/occupancy/session-move.e2e.spec.ts. Les refus de placement et les règles de
déplacement y sont couverts côté serveur ; aucun geste au pointeur ne l’est, et c’est la
raison d’être de ce scénario.
Checklist
Section intitulée « Checklist »- La grille affiche une semaine dense, navigation et filtres croisés fonctionnent
- Adresse copiée dans un nouvel onglet → semaine et filtres restaurés
- « Détecter les créneaux éligibles » → la grille se colore
- « Placer ici » → « Séance créée en brouillon. », bloc en pointillés
- Clic sur zone libre → « Placer le cours à horaire libre », durée modifiable
- Durée de 5 min → « La durée doit être comprise entre 15 et 480 minutes. »
- Glisser un bloc → fantôme avec score et salle, puis « Déplacer le cours »
- « Annuler » dans le message → « Déplacement annulé — position précédente restaurée. »
- Cours récurrent → choix « Cette semaine seulement » / « Toutes les occurrences à venir »
- Poignée de redimensionnement → « Durée modifiée. »
- « Historique » → les opérations listées, la plus récente en haut
- Mode Occupation, semaine 2 → B-201 mardi 09:45 est occupée
- Dépôt sur B-201 → « Salle occupée : B-201 · 09:45 – 11:15 » et la grille n’a pas bougé
- Conflit enseignant → « Enseignant déjà en cours : … »
- Une séance en brouillon retire la salle de la recherche de réservation
- Aperçu d’indisponibilité sur ce créneau → « 0 réservation(s) et 1 cours impactés »
Écrans concernés
Section intitulée « Écrans concernés »- Grille de planning et Placement d'une séance — les écrans principaux.
- Heatmap et score de créneau — les couleurs du bloc 2.
- Réservations et Détail d'une salle — les vérifications du bloc 5.