M-CompteRendu - Compte rendu d'une opération lourde¶
Type : composant transverse de restitution, affiché à la fin d'une opération longue. Premier point d'application : la fin d'import (M-Import). Vocation à servir aussi la fin de dépôt (M-Lot) et la fin de réactivation d'un passage archivé. Persona principal : tous. C'est le moment où l'utilisateur décide s'il continue. Parcours couverts : P2 - Importer une nuit d'enregistrement, puis P4 - Préparer un lot prêt à déposer et P12 - Récupérer une nuit déposée sur VigieChiro (compte rendu de réactivation). Issue : #2358 (chantier #2350, lot 2).
Une opération lourde brasse plusieurs gigaoctets pendant plusieurs minutes, sans que l'utilisateur puisse rien vérifier par lui-même. Quand elle se termine, il a trois questions, et aucune n'appelle une liste :
| Ce qu'il se demande | Ce que le compte rendu montre |
|---|---|
| « Est-ce que ça s'est bien passé ? » | la part de ce qui est passé, la part de ce qui a été écarté |
| « Qu'est-ce que ça m'a coûté sur le disque ? » | le volume écrit, ventilé bruts / séquences |
| « Qu'est-ce que je fais maintenant ? » | l'action suivante, pas un bouton « Fermer » |
Ce composant n'ajoute presque aucune donnée. Le rapport d'import, le bilan de publication et le rapport de réactivation contiennent l'essentiel de ce qui est affiché ici (la seule exception est notée en fin de page). Ce qui change est la forme : des proportions à la place des puces, et une action à la place d'un acquittement.
La forme retenue : un résultat, le détail à la demande¶
Le compte rendu n'est pas un rapport. Un document à sections empilées repose la même exigence que les puces qu'il remplace : lire pour savoir si l'on peut continuer. Il tient donc en une bande dense d'environ 250 px, dans cet ordre de lecture :
- le verdict chiffré, lisible sans rien parcourir ;
- la barre du devenir, qui répond à « dans quelles proportions » ;
- le coût disque, en deux barres à échelle commune ;
- ce qui reste vrai et mérite attention ;
- l'action suivante.
Les noms des fichiers rejetés ne sont pas dans cette bande : la ligne de pied les résume par motif (« 8 rejetés : 6 déjà expansés, 2 en-tête illisible ») et un accès les déplie. C'est le seul détail qui coûte un geste, parce que c'est le seul dont la réponse aux trois questions ne dépend pas.
Une variante en deux colonnes (verdict à gauche, motifs et avertissements à droite) a été écartée : elle montre tout d'un coup, mais elle est plus large, plus haute - donc une modale plutôt qu'un panneau - et sa colonne de droite est vide dans le cas courant, celui d'un import sans rejet.
Maquette principale - fin d'import, avec rejets et avertissement¶
La preuve d'échelle fait partie de la maquette¶
Une barre qui ne respecte pas les quantités qu'elle représente est pire qu'un tableau : elle donne une vue fausse avec l'autorité du visuel. La maquette qui précédait celle-ci proclamait la règle et la violait : deux échelles différentes dans le même bloc (128 px/Go sur une barre, 94 sur l'autre), et une barre empilée dont le segment majoritaire occupait toute la largeur, les deux autres peints par-dessus. Les largeurs ci-dessus sont donc calculées, et leur vérification est publiée avec elles :
| Barre | Segments dessinés | Contrôle |
|---|---|---|
| Devenir (612 sur 840 px) | 583 → 800,2 px · 21 → 28,8 px · 8 → 11,0 px | somme 840,0 / 840 px |
| Lu (5,0 Go) | 441,2 px | 88,2 px/Go |
| Écrit (6,8 Go) | bruts 441,2 px · séquences 158,8 px | 88,2 px/Go, même échelle que « Lu » |
| Légende | 95,3 % + 3,4 % + 1,3 % | 100,0 % |
Les pourcentages sont arrondis au dixième et non à l'unité : à l'unité, cet import se lirait « 95 + 3 + 1 = 99 % », et un compte rendu qui ne fait pas 100 % laisse chercher le point manquant.
Annotations¶
- Titre et pastille (
lblTitre,badgeResultat) : l'opération, son objet, et le résultat chiffré. La pastille porte un libellé chiffré, jamais une couleur seule : une couleur ne se lit pas quand on ne la distingue pas. - Barre du devenir (
barreVentilation) : ventilation exhaustive de l'ensemble. La somme des segments fait le total, et le reliquat porte un nom. Un segment « autres » silencieux masque exactement ce que l'utilisateur cherchait. La légende chiffre chaque part en valeur et en pourcentage. - Barres de volume (
barresVolume) : « lu » et « écrit » partagent leur échelle, sans quoi la comparaison qu'elles invitent à faire est fausse. « Écrit » se ventile bruts / séquences, ce qui répond à la question du coût disque. - Ligne d'avertissement (
ligneAvertissements) : ce qui reste vrai à la fin de l'opération, distinct des erreurs. Un avertissement levé en cours de route et devenu faux n'a rien à faire dans un compte rendu final (#1488). - Pied (
boutonActionSuivante,lienMotifs) : l'action suivante à gauche, mise en avant ; le résumé des motifs de rejet à droite, avec son accès au détail. Le compte rendu ne se termine pas sur « Fermer » : il propose ce qu'on fait ensuite, parce que c'est la question réelle de l'utilisateur à cet instant. - Aucun texte d'exception brut n'est jamais l'unique message : une cause technique peut accompagner un message écrit pour un humain, elle ne peut pas le remplacer (#2076).
Variante - rien à signaler (le cas courant)¶
Un import sans rejet ni avertissement ne doit pas afficher de cadres vides. Les blocs qui n'ont rien à dire disparaissent ; la bande se referme sur l'essentiel et ne fait plus que 180 px.
Variante - opération en échec¶
La structure ne change pas : ce sont les proportions qui parlent. Le compte rendu dit ce qui a tout de même été fait, ce qui a échoué et pourquoi, puis propose la reprise plutôt qu'un acquittement.
Interactions clés¶
| Élément | Action |
|---|---|
| voir (résumé des motifs, en pied) | Déplie la liste des fichiers rejetés, groupés par motif |
| Survol d'un segment de barre | Infobulle : effectif, pourcentage, définition du segment |
| Action suivante (bouton primaire) | Enchaîne sur l'étape logique (ouvrir le passage, retenter, vérifier) |
| Opération sans rejet ni avertissement | Les blocs correspondants disparaissent, ils ne s'affichent pas vides |
| Opération en échec | Même structure, proportions inversées, reprise proposée |
Ce que le livré a précisé¶
La maquette a été écrite avant le code. Six points ont été tranchés en chemin, et ce sont eux qu'un lecteur doit connaître avant d'ajouter une sixième surface.
Le composant en sert cinq aujourd'hui : fin d'import de carte SD, fin de réactivation, publication des corrections, fin d'import Vigie-Chiro (#2651) et fin de dépôt (#2653). Les deux dernières ont été livrées par les suites de la clôture (#2802), qui ont aussi tranché ce que la bande ne porte pas : une synchronisation dont les rapports comptent des choses différentes (taxons, sites, nuits) n'a pas de ventilation à montrer - les mêler ferait une barre dont les segments ne mesurent pas la même chose.
0. La barre se dit à un lecteur d'écran. Le libellé de la ventilation (« Devenir des 140 lignes reçues ») était composé par les cinq traductions et affiché nulle part : ni rendu, ni testé, donc jamais confronté - l'une d'elles annonçait « le devenir de 140 observations » là où douze n'en étaient jamais devenues. Il n'est toujours pas affiché - la pastille dit déjà l'essentiel, et un compte rendu ne se répète pas - mais il est devenu le texte accessible de la barre, qui n'en avait aucun : son seul secours était une infobulle par part, qui suppose une souris (#2694).
1. Chaque mention porte sa sévérité. La maquette ne prévoyait qu'un bloc « avertissements ». La première capture de la réactivation a montré un triangle d'alerte devant « L'audio est de nouveau complet » et devant un indice explicitement annoncé non bloquant. Une mention porte donc son registre : coche pour une bonne nouvelle, « i » pour un fait de contexte, triangle pour ce sur quoi il faut revenir.
2. Le compte rendu textuel ne disparaît pas partout, et le critère est le consommateur. Là où une commande en ligne rend le même bilan (la réactivation), il reste. Là où la seule surface était l'écran (la publication des corrections), le chiffré le remplace.
3. Un bilan qui n'a rien à ventiler garde le textuel. Un passage reconstruit n'a pas subi de réactivation : une barre « 0 sur 30 » y ferait croire à une tentative qui a échoué.
4. La teinte de la seconde part d'un volume ne s'emploie pas dans une ventilation. Elle partage la couleur de la part retenue : « bruts + séquences » se lit comme un tout. Employée pour une catégorie distincte, elle fait lire un écart comme une réussite (constaté sur « sans ancrage », dans la publication).
5. La bande vit dans des largeurs très différentes : 900 px sous l'écran d'import, ~560 px dans une modale. La légende reflue, les intitulés s'enroulent, et le résumé des motifs assume de s'abréger puisque son contenu est à un clic. C'est le garde-fou anti-troncature des captures qui l'a imposé, dont une fois en intégration continue seulement : ses métriques de police diffèrent de neuf pixels par entrée.
Et la donnée que le lot devait ajouter est ajoutée : le volume lu sur la carte n'était mesuré
nulle part. Il ne l'a pas fallu calculer : le garde-fou d'espace disque parcourait déjà les originaux
pour décider, il jetait le chiffre. Il le rend (VolumesImport).
Notes pour l'implémentation¶
- Composant présentationnel pur dans
commun/view: il reçoit un modèle de compte rendu et l'affiche. Il ne va rien chercher, ne décide de rien, et n'appartient à aucune feature. - Un modèle distinct de
CompteRendu: celui-ci (ADR 0031) porte des phrases - titre, constats, détail par sujet - et sert déjà quatre écrans et la CLI. Le compte rendu chiffré porte des quantités : les deux coexistent, et une même surface peut montrer l'un puis l'autre. - Les règles tenues par le modèle, pas par la vigilance : une ventilation dont les segments ne font pas le total est refusée à la construction, ce qui contraint l'appelant à nommer le reliquat ; les largeurs se calculent depuis les quantités ; l'échelle des barres de volume est commune à l'ensemble.
- Blocs facultatifs : chaque bloc se masque quand il n'a rien à dire (cf. la variante « rien à signaler »).
- Petits segments : un segment minuscule reçoit une largeur minimale lisible et sa valeur en légende, jamais un arrondi silencieux à zéro.
- Prérequis de donnée, à livrer avec le branchement import : les octets écrits n'existent pas aujourd'hui.
RapportImportporte les comptes par statut,ResultatImportle nombre d'originaux et de séquences ; les barres de volume supposent d'ajouter cette mesure au moteur d'import. C'est la seule donnée que ce lot ajoute. - Thème sombre : aucune couleur de fond codée en dur hors feuille de style, pour que le composant survive au câblage de
DarkTheme.css(#1037). - Icônes :
FontIconIkonli, pas d'emoji (règle #700). - Forme d'insertion : panneau intégré sous l'écran d'origine pour l'import et le dépôt, qui gardent ainsi leur contexte ; la réactivation, déjà modale, y affiche la même bande.