Un tutoriel, en données
Un tutoriel interactif guide l’utilisateur sur la vraie page, étape par étape. Ce chapitre ouvre l’étude de cas : ce qu’est un tuto pour le moteur (des données, pas du code), comment une étape désigne un élément de l’écran par un contrat de nom, comment un tuto choisit ses pages et son public, et comment une garde empêche ce contrat de se rompre sans bruit.
Précédemment. Le site est construit, vérifié, mis en production et copiable dans une sandbox. Toutes les parties précédentes ont décrit le projet par couches ; celle-ci suit une fonctionnalité de bout en bout.
Une étude de cas prend une fonctionnalité et la traverse de part en part : les types, les données, l’état, l’affichage, l’accessibilité, les vérifications, les tests. Celle-ci suit le moteur des tutoriels interactifs : un petit module (apps/web/src/features/tours/, six cents lignes de moteur, et un fichier par tuto) qui touche presque tout ce que les parties précédentes ont décrit.
Un tutoriel ne se lit pas : il se fait. Sur la vraie page, l’écran s’assombrit, seul l’élément de l’étape en cours reste éclairé et actif, une bulle dit quoi faire, et l’on passe à l’étape suivante en faisant l’action demandée — cliquer, taper, changer de page. Le premier tuto du projet guide un administrateur dans la création d’un post — une actualité du mur de l’accueil.
Un tuto est une donnée 📋#
Le moteur ne sait rien des actualités. Il sait lire une description de tuto, écrite en données : un objet par tuto, dans son propre fichier. Ajouter un tuto, c’est écrire des données, pas du code. Le type de cette description est le contrat entre les auteurs de tutos et le moteur :
tour.types.ts
Clique une étape pour mettre en évidence la zone correspondante dans le fichier complet.
// ⚠ Fichier introuvable : apps/web/src/features/tours/tour.types.ts// Il a été déplacé ou supprimé depuis la rédaction de ce chapitre.Le premier tuto#
definitions/admin.posts.create.ts
Clique une étape pour mettre en évidence la zone correspondante dans le fichier complet.
// ⚠ Fichier introuvable : apps/web/src/features/tours/definitions/admin.posts.create.ts// Il a été déplacé ou supprimé depuis la rédaction de ce chapitre.Le tuto crée un vrai article, en brouillon : il agit sur les vraies données, et le dit dans ses bulles (« vous pourrez supprimer l’article ensuite »). Un tuto qui publierait quelque chose, ou supprimerait, serait une autre affaire : il ne guiderait pas, il agirait à la place de l’utilisateur.
Des tutos partout#
Après ce premier tuto, seize autres ont suivi : pour les visiteurs et les membres, puis pour les administrateurs. Chacun a sa fiche, dans le guide du site ou dans la documentation des administrateurs, qui le lance par son identifiant :
Tuto | Public | Pages | Ce qu’il fait faire |
|---|---|---|---|
public.decouvrir-le-site | public | / | Repérer le menu des rubriques et l’accès au compte : quatre « Suivant », rien à cliquer. |
public.mot-de-passe-oublie | public | /auth/forgot-password | Taper son adresse ; le bouton d’envoi est montré, pas cliqué. |
membre.profil | member | /profil, puis /profil/edit | Les données, le droit à l’image, puis le formulaire d’édition ; rien n’est enregistré. |
membre.documents | member | /documents | La liste, puis la lecture d’un document — étapes facultatives : un membre peut n’en avoir aucun. |
membre.contacter-le-club | member | /contacts | Remplir le sujet et le message ; l’envoi reste au membre. |
admin.tableau-de-bord | admin | /dashboard | Repérer le panneau de contrôle et les raccourcis. |
admin.posts.create | admin | /dashboard/posts, puis …/create | Créer un post, en brouillon. |
admin.breaking-news.create | admin | /dashboard/breaking-news, puis …/create | Créer un flash info du ruban, en brouillon. |
admin.pages.publication | admin | /dashboard/pages | Éditer, publier : les boutons sont montrés, pas cliqués. |
admin.users.create | admin | /dashboard/users, puis …/create | Remplir la fiche d’un membre ; « Créer », qui lui envoie son mot de passe, reste à l’administrateur. |
admin.tickets.traiter | member | /dashboard/tickets, puis une demande | Trier, prendre en charge, répondre — rien n’est envoyé ; étapes facultatives si la boîte est vide. |
admin.groups.create | admin | /dashboard/groups, puis …/create | Nommer un groupe, son parent, son espace collaboratif ; « Créer » reste à l’administrateur. |
admin.disciplines.create | admin | /dashboard/disciplines, puis …/create | Le formulaire, partie par partie, jusqu’à « Enregistrer en brouillon » et « Publier », montrés. |
admin.courses.create | admin | /dashboard/courses, puis …/create | Le créneau et la page d’un cours, qui n’a pas de brouillon. |
admin.seminars.create | admin | /dashboard/seminars, puis …/create | Identité, rattachement, contenus, publication d’un stage. |
admin.seminars.seances | admin | la liste des stages, une fiche, son édition | Trois pages, deux étapes route : jusqu’à la section des séances. |
admin.events.create | admin | /dashboard/events, puis …/create | Identité, rattachement, contenu d’un évènement. |
Showing entries1to17entries
Une règle les tient tous : un tuto n’envoie rien que d’autres verraient, et ne fait rien d’irréversible. Il montre le bouton « Envoyer » d’une demande au club, il ne le clique pas : une demande partie arrive dans la boîte du bureau, avec un accusé de réception, et ne se rattrape plus. Les deux seuls tutos qui créent quelque chose — un post, un flash info du ruban — créent un brouillon que personne d’autre ne voit, et le disent.
Le public de « Traiter une demande » est member, pas admin : un membre d’un groupe responsable d’une catégorie (le support du site) traite les demandes sans être administrateur. Le public décide de qui se voit proposer le tuto ; c’est la page qui, elle, n’affiche la boîte qu’à ceux qui traitent une catégorie.
Deux mots se croisaient dans le projet : le code et cette documentation appellent « actualité » un post (Post, le mur « Actualités du club »), et le tableau de bord appelait aussi « Actualités » les messages du ruban (BreakingNews) — le panneau public s’intitulait même « Actualités du club », comme le mur. Écrire les tutos, qui citent l’interface mot pour mot, l’a rendu visible. Les messages du ruban s’appellent désormais flash info, partout où l’utilisateur les voit ; le tuto pilote, « Créer un post ».
Le registre réunit les tutos et répond à deux questions :
tour.registry.ts
Clique une étape pour mettre en évidence la zone correspondante dans le fichier complet.
// ⚠ Fichier introuvable : apps/web/src/features/tours/tour.registry.ts// Il a été déplacé ou supprimé depuis la rédaction de ce chapitre.Le public d’un tuto décide de ce qui est proposé, pas de ce qui est permis. Un membre qui forcerait le lancement d’un tuto d’administration arriverait sur des pages du tableau de bord, que le proxy et les procédures lui refusent (partie « Authentification et droits ») : le tuto n’ouvre aucun droit.
Un contrat de nom entre le tuto et la page#
Une étape désigne son élément par un nom, pas par sa position dans la page ni par sa classe CSS. L’élément porte ce nom dans un attribut data-tour :
Une classe CSS change avec le style, un texte avec la langue ou une reformulation, une position avec la mise en page : un tuto qui s’y accrocherait casserait à chaque retouche. data-tour ne sert qu’aux tutos ; il ne change rien à l’affichage, et dit à qui modifie le composant que quelqu’un dépend de ce nom (partie « Démarrer », chapitre « Façon de travailler »).
Les noms suivent la page et le rôle de l’élément (posts.list.create, posts.form.title) : on devine, en lisant le tuto, où se trouve chaque cible.
Un nom, deux éléments#
Le header a deux visages : la barre complète sur un grand écran, un bouton de menu sur un téléphone. Le tuto « Découvrir le site » ne connaît qu’un nom, header.nav ; les deux éléments le portent, et un seul s’affiche à la fois :
Le moteur prend le premier élément visible qui porte le nom (chapitre 2). Un même tuto se suit donc sur toutes les largeurs d’écran, sans une étape par mise en page.
Une garde pour le contrat#
Un contrat que rien ne vérifie finit rompu. Renommer l’attribut, déplacer le bouton dans un autre composant, retirer un tuto du registre : le code compile, le lint ne dit rien, et le tuto se bloque chez l’utilisateur — ou n’apparaît plus. scripts/check-tour-targets.mjs, lancé par pnpm check (partie « Qualité », chapitre « Les gardes maison »), cherche trois ruptures :
Rupture | Ce que verrait l’utilisateur | Ce que dit la garde |
|---|---|---|
Une étape vise un nom qu’aucun élément ne porte. | Le tuto s’arrête sur « Élément introuvable ». | Le fichier du tuto et la cible manquante. |
Une définition n’est pas importée par le registre. | Le tuto n’apparaît nulle part. | Le fichier de la définition et le registre. |
Une fiche de documentation lance un tuto qui n’existe pas. | « Tuto introuvable » à la place du bouton. | La fiche et l’identifiant inconnu. |
Showing entries1to3entries
Les deux dernières vérifications sont nées de la relecture de cette partie : la première seule protégeait les cibles, pas l’existence du tuto lui-même. La garde a été vérifiée comme un test (partie « Qualité ») : l’import retiré du registre, puis un identifiant mal orthographié dans une fiche, chacun a fait échouer pnpm check avec son message.
Récapitulatif#
Question | Réponse du projet |
|---|---|
Qu’est-ce qu’un tuto pour le moteur ? | Des données typées (Tour) : un public, des pages, une page de départ, des étapes. |
Comment une étape passe-t-elle ? | Par un clic, une saisie validée, une page atteinte, ou un « Suivant » : une union discriminée. |
Comment une étape désigne-t-elle un élément ? | Par un nom, porté par l’élément dans data-tour : un contrat entre le tuto et la page. |
Qui voit un tuto ? | Son public (public, membre, admin) sur ses pages ; cela décide de ce qui est proposé, jamais de ce qui est permis. |
Un même nom peut-il viser deux éléments ? | Oui : l’équivalent de chaque mise en page le porte, et le moteur prend celui qui est visible. |
Qu’est-ce qu’un tuto n’a pas le droit de faire ? | Envoyer ce que d’autres verraient, ou quoi que ce soit d’irréversible : il montre le bouton, l’utilisateur décide. |
Qu’est-ce qui protège le contrat ? | check-tour-targets : cibles présentes, tutos enregistrés, boutons de fiche valides. |
Showing entries1to7entries
À suivre#
Un tuto est une liste d’étapes. Le moteur doit la dérouler : se souvenir de l’étape en cours à travers plusieurs pages, trouver l’élément visé, assombrir le reste, et reconnaître l’action attendue.
Chapitre suivant : le moteur. Un état qui survit aux changements de page, un voile percé autour d’une cible qui bouge, et quatre façons de passer une étape.