Apparence
Bibliothèque ▸ Trames
/trames — la bibliothèque personnelle de cycles de travail d'un manager : des semaines de 7 jours, chaque jour assigné à un poste ou à un repos.
Prérequis communs : make seed-demo puis make seed-postes.
1. Consulter la bibliothèque de trames
Tickets : APAJH-119 · Rôle : Admin · Prérequis : make seed-demo, make seed-postes puis make seed-trames
Ouvrez Bibliothèque ▸ Trames dans le groupe Planning.
✅ Résultat attendu : la bibliothèque liste les trames du compte, avec leur nom et le nombre de semaines de leur cycle.
Couverture automatique : e2e/trames.spec.ts → « liste les trames de la bibliothèque ».
2. Créer une trame en assignant un poste existant à une case
Tickets : APAJH-119 · Rôle : Admin · Prérequis : make seed-demo puis make seed-postes
Cliquez sur Créer une trame et renseignez le Nom de la trame.
Cliquez sur une case du jour voulu, dans la Semaine 1.
Dans Choisir un poste existant, tapez un mot de la catégorie (« matin ») ou un horaire, puis cliquez sur le poste proposé.
Cliquez sur Enregistrer dans le panneau de la case.
✅ Résultat attendu : la recherche filtre la liste par catégorie ou par horaires, et la case affiche les horaires du poste choisi.
Cliquez sur Enregistrer (celui de l'éditeur de trame, en pied de page).
✅ Résultat attendu : la nouvelle trame apparaît dans la bibliothèque.
Couverture automatique : e2e/trames.spec.ts → « créer une trame en choisissant un poste existant ».
3. Créer un poste à la volée depuis une case, et l'enregistrer dans la bibliothèque
Tickets : APAJH-119 · Rôle : Admin · Prérequis : make seed-demo
Dans l'éditeur de trame, cliquez sur une case, puis, dans Entrer un poste manuellement, choisissez une Catégorie et renseignez les horaires.
Cochez Enregistrer comme nouveau poste, puis cliquez sur Appliquer ce créneau.
Cliquez sur Enregistrer dans le panneau de la case.
✅ Résultat attendu : la case affiche les horaires du poste ainsi créé, et le poste apparaît désormais aussi dans Bibliothèque ▸ Postes.
Couverture automatique : e2e/trames.spec.ts → « entrer un poste manuellement l'assigne à la case ».
3 bis. Appliquer un horaire manuel sans l'enregistrer comme poste
Tickets : APAJH-119 · Rôle : Admin · Prérequis : make seed-demo
Dans l'éditeur de trame, cliquez sur une case, renseignez des horaires dans Entrer un poste manuellement, sans cocher « Enregistrer comme nouveau poste ».
Cliquez sur Appliquer ce créneau, puis sur Enregistrer dans le panneau de la case.
✅ Résultat attendu : la case affiche l'horaire saisi, et aucun poste n'est créé — rien de nouveau n'apparaît dans Bibliothèque ▸ Postes.
Couverture automatique : e2e/trames.spec.ts → « un horaire manuel non sauvegardé s'applique sans créer de poste ».
4. Poser un repos ou un repos hebdomadaire sur une case
Tickets : APAJH-119 · Rôle : Admin · Prérequis : make seed-demo
Cliquez sur une case, puis sur Repos ou Repos hebdomadaire, puis sur Enregistrer dans le panneau de la case.
✅ Résultat attendu : la case affiche « Repos » ou « Repos hebdo. », sans qu'aucun poste ne lui soit associé.
Couverture automatique : e2e/trames.spec.ts → « poser un repos hebdomadaire sur une case ».
5. Ajouter et supprimer une semaine du cycle
Tickets : APAJH-119 · Rôle : Admin · Prérequis : make seed-demo
Dans l'éditeur de trame, observez la Semaine 1 : aucun bouton de suppression n'apparaît sur sa ligne.
✅ Résultat attendu : impossible de descendre en dessous d'une semaine — une trame a toujours au moins un cycle.
Cliquez sur Ajouter une semaine.
✅ Résultat attendu : une Semaine 2 apparaît, vide ; un bouton de suppression apparaît maintenant sur la Semaine 1.
Supprimez la Semaine 2.
✅ Résultat attendu : elle disparaît, et le bouton de suppression de la Semaine 1 disparaît à nouveau.
Couverture automatique : e2e/trames.spec.ts → « ajouter une semaine, puis la supprimer ».
6. Éditer une trame
Tickets : APAJH-119 · Rôle : Admin · Prérequis : make seed-demo, make seed-postes puis make seed-trames
Sur une trame existante, cliquez sur Éditer, changez le Nom de la trame, puis Enregistrer.
✅ Résultat attendu : un bandeau de confirmation (« Trame enregistrée ») apparaît en bas d'écran, et la carte affiche le nouveau nom. Ce bandeau confirme toute sauvegarde de trame, pas seulement celle qui enchaîne sur l'assistant de planification.
Couverture automatique : e2e/trames.spec.ts → « éditer une trame renomme la trame ».
7. Supprimer une trame
Tickets : APAJH-119 · Rôle : Admin · Prérequis : make seed-demo, make seed-postes puis make seed-trames
Cliquez sur l'icône de suppression d'une trame, puis Annuler.
✅ Résultat attendu : la trame reste dans la bibliothèque.
Recommencez et confirmez avec Supprimer.
✅ Résultat attendu : la trame disparaît de la bibliothèque.
Couverture automatique : e2e/trames.spec.ts → « supprimer une trame demande une confirmation ».
8. Consulter la bibliothèque sur téléphone
Tickets : APAJH-119 · Rôle : Admin · Prérequis : make seed-demo, make seed-postes puis make seed-trames
En 390 × 844, ouvrez
/trames.✅ Résultat attendu : la grille de cartes défile dans son cadre ; la page elle-même ne déborde pas.
Couverture automatique : e2e/trames.spec.ts → « mobile : la grille défile au lieu de déborder de la page ».
9. Affecter un deuxième poste à la même case (journée coupée)
Tickets : APAJH-244 · Rôle : Admin · Prérequis : make seed-demo puis make seed-postes
Cliquez sur une case déjà affectée à un poste (ou affectez-en un — voir le scénario 2).
Cliquez sur Ajouter un poste.
✅ Résultat attendu : un second bloc « Poste additionnel 1 » apparaît, avec sa propre recherche de poste et sa propre saisie manuelle.
Choisissez un second poste (existant, ou un horaire saisi manuellement), puis Enregistrer dans le panneau de la case.
✅ Résultat attendu : la case affiche désormais les horaires des deux postes, l'un sous l'autre.
Cliquez sur Enregistrer de l'éditeur de trame.
✅ Résultat attendu : la trame est sauvegardée avec ses deux cases sur le même jour. Un salarié planifié dessus voit la journée coupée en deux blocs sur
/planning.Un repos ne peut jamais partager une case avec un poste — choisir Repos/Repos hebdomadaire sur la première ligne fait disparaître le bouton Ajouter un poste et retire les lignes déjà ajoutées.
Couverture automatique : e2e/trames.spec.ts → « affecter un deuxième poste à la même case en fait une journée coupée ». backend/tests/ test_planning_calendar.py → test_a_split_trame_day_resolves_to_one_slot_per_case pour la résolution côté serveur.
10. Rouvrir une case déjà affectée montre ce qu'elle porte déjà
Tickets : APAJH-244 · Rôle : Admin · Prérequis : make seed-demo puis make seed-postes
Avant ce correctif, rouvrir une case déjà affectée montrait chaque champ vide — la recherche de poste, comme la saisie manuelle — alors que la case portait bien un poste ou un horaire. Rien n'était perdu à l'enregistrement (la valeur restait dans le brouillon tant qu'on ne touchait à rien), mais l'écran donnait l'impression que la case était vide et qu'il fallait tout ressaisir.
Affectez un poste de la bibliothèque à une case (scénario 2), enregistrez la case, puis enregistrez la trame.
Rouvrez la même case.
✅ Résultat attendu : le champ Choisir un poste existant affiche déjà le poste choisi — pas une recherche vide.
Sur une autre case, appliquez un horaire manuel sans l'enregistrer comme poste (scénario 3 bis), enregistrez, puis rouvrez cette case.
✅ Résultat attendu : la section Entrer un poste manuellement affiche déjà les horaires saisis.
Couverture automatique : e2e/trames.spec.ts → « rouvrir une case déjà affectée montre ce qu'elle porte déjà ».
11. Dupliquer une journée sur plusieurs jours du cycle
Tickets : APAJH-121 · Rôle : Manager n1, puis Manager n2 et Admin / RH · Prérequis : make seed-demo puis make seed-postes
Critère d'acceptation du ticket (à valider avec le client)
- « Étant donné un Manager N1, Admin RH, Manager N2, quand la fonctionnalité « Dupliquer une journée dans la trame » est utilisée, alors je veux dupliquer une journée dans la trame pour pouvoir l'affecter sur plusieurs jours. »
Créez une trame de deux semaines, posez un Repos sur le mardi de la semaine 1, puis ouvrez le lundi de la semaine 1 et choisissez un poste.
✅ Résultat attendu : sous les postes, la section Dupliquer sur d'autres jours montre chaque jour du cycle, semaine par semaine. Le lundi de la semaine 1 — le jour édité — est coché et ne peut pas être décoché. Le mardi de la semaine 1, qui porte déjà un repos, est marqué d'un point.
Cochez le mardi de la semaine 1 et le lundi de la semaine 2, puis Enregistrer.
✅ Résultat attendu : les trois jours affichent le même poste ; le repos du mardi a été remplacé. Les jours non cochés n'ont pas changé.
Rejouez l'étape 2 avec une journée coupée (deux postes, scénario 9).
✅ Résultat attendu : chaque jour coché reçoit les deux postes.
Cliquez sur Vérifier la trame, puis enregistrez-la.
✅ Résultat attendu : les jours dupliqués sont contrôlés comme s'ils avaient été saisis un par un — mêmes règles du référentiel (
Règles_Création_trames), mêmes alertes, par exemple un repos quotidien trop court entre une nuit dupliquée et le poste du lendemain.Avec Enregistrer et créer un planning, affectez la trame à un salarié, puis ouvrez Planning sur les semaines concernées.
✅ Résultat attendu : chaque jour dupliqué porte le poste dans la grille, comme un jour saisi à la main.
Rejouez les étapes 1 et 2 sur un téléphone, puis avec les profils Manager n2 et Admin / RH.
✅ Résultat attendu : même comportement, sans débordement horizontal du panneau.
Couverture automatique : e2e/trames.spec.ts → « dupliquer une journée sur d'autres jours du cycle », sur bureau et mobile, qui vérifie aussi les cases envoyées à l'enregistrement. Les étapes 3 à 5 restent manuelles : la duplication ne change ni le format d'une trame ni les règles, qui ont leurs propres tests (backend/tests/trames/).
12. Retrouver une trame en cours après une interruption
Tickets : APAJH-136 · Rôle : Manager n1 · Prérequis : make seed-demo puis make seed-postes
Critères d'acceptation du ticket
- « Étant donné une modification en cours, quand l'intervalle défini s'écoule, alors la sauvegarde se déclenche. »
- « Étant donné une interruption, quand l'utilisateur revient, alors les dernières modifications sont conservées. »
La sauvegarde se déclenche à chaque modification, sans attendre un intervalle. Elle écrit un brouillon dans le navigateur, pas la trame : la trame enregistrée, celle que lit le planning, ne change qu'au clic sur Enregistrer.
Cliquez sur Créer une trame, nommez-la et affectez un poste à une case.
✅ Résultat attendu : à côté d'Annuler, « Brouillon enregistré à 10h32 » apparaît dès la première modification et se met à jour à chacune.
Sans enregistrer, rechargez la page (ou fermez l'onglet et rouvrez l'application), puis cliquez de nouveau sur Créer une trame.
✅ Résultat attendu : la boîte Reprendre le brouillon ? indique depuis quand les modifications ont été conservées.
Cliquez sur Reprendre le brouillon.
✅ Résultat attendu : le nom et la case saisis à l'étape 1 sont de retour.
Enregistrez la trame, puis rouvrez Créer une trame.
✅ Résultat attendu : le formulaire est vide et rien n'est proposé — un brouillon enregistré n'est plus offert.
Éditez une trame existante, renommez-la, rechargez la page, rouvrez-la et choisissez Ignorer le brouillon.
✅ Résultat attendu : la trame s'ouvre telle qu'enregistrée ; rouverte ensuite, plus rien n'est proposé. Annuler dans l'éditeur abandonne de même le brouillon.
Rejouez les étapes 1 à 3 sur un téléphone, puis connectez-vous avec un autre compte sur le même navigateur et ouvrez la même trame.
✅ Résultat attendu : même comportement sur téléphone ; l'autre compte ne se voit proposer aucun brouillon.
Sur un poste A, modifiez une trame existante sans l'enregistrer. Sur un poste B (ou un autre navigateur), modifiez la même trame et enregistrez-la. Revenez sur A et rouvrez-la.
✅ Résultat attendu : la boîte Reprendre le brouillon ? précise que la trame a été enregistrée depuis, et que reprendre le brouillon remplacera ces modifications à l'enregistrement. Ignorer le brouillon ouvre la version enregistrée sur B.
Sur Planning, modifiez une journée (« Modifier la journée ») puis rechargez la page.
✅ Résultat attendu : la modification est toujours là. La grille du planning enregistre chaque geste au moment où il est validé : elle n'a pas de brouillon, et il n'y a pas d'étape de publication.
Couverture automatique : e2e/trames.spec.ts → « une trame en cours se retrouve après une interruption » (bureau et mobile), « ignorer le brouillon repart de la trame enregistrée », « annuler l'édition abandonne le brouillon », « un brouillon illisible est ignoré sans bloquer l'éditeur » (JSON cassé, semaine sans jours, cycle vide) et « un brouillon antérieur à un enregistrement le signale avant d'être repris » (étape 7, simulée). L'étape 6 (autre compte) et l'étape 8 restent manuelles ; l'enregistrement immédiat du planning est couvert par e2e/planning-modulation.api.spec.ts.
Points d'attention
- Un horaire manuel non enregistré n'est pas un poste. La case garde l'horaire tel qu'il a été saisi, mais ne référence aucun
Postede la bibliothèque — décochez « Enregistrer comme nouveau poste » pour un créneau ponctuel, sans polluer la bibliothèque d'un poste qui ne resservira jamais. - Pas de champ établissement ni métiers sur une trame : comme pour un poste, elle appartient à l'utilisateur, pas à un établissement — voir Trames.
- Le brouillon reste sur le poste où il a été écrit (APAJH-136) : il est gardé par le navigateur, pas par le serveur. Commencé sur un ordinateur, il n'est pas proposé sur un autre, ni dans une navigation privée qui refuse le stockage — l'éditeur l'affiche alors (« Sauvegarde automatique indisponible sur ce navigateur »).
- Un poste utilisé par une case ne peut pas être supprimé depuis Bibliothèque ▸ Postes tant que la case existe.