ADR 0040 – Mise en forme conditionnelle des vues et dates relatives
Accepté (2026-10-16, mode autonome ; vague 1 validée par Aurélien le 2026-10-15)
ADR 0040 – Mise en forme conditionnelle des vues et dates relatives
Statut : Accepté (2026-10-16, mode autonome ; vague 1 validée par Aurélien le 2026-10-15)
Contexte
Aurélien veut voir d’un coup d’œil ce qui presse : retard en rouge, priorité haute en gras, tâche bloquée en gris. Il veut aussi des dates lisibles (« demain ») avec la date exacte au survol. La règle doit être déclarée dans le YAML de la vue, avec le langage where (ADR 0028).
Décision
Format
display:
styles:
- { when: "tache.echeance < today", style: danger, column: tache.echeance, label: En retard }
- { when: "tache.priorite == 'haute'", style: strong, label: Priorité haute }
- { when: "blocked", style: muted, label: Bloquée }
-
when: une condition du langagewhere, contrôlée au chargement comme lui (champs, types,nodedans une vue contextuelle). -
style: un ensemble fermé, rendu par la charte (sb-style-<style>) :danger: rouge d’erreur ;warn:--sb-warn;success:--sb-ok;muted:--sb-muted;strong: gras.
Aucune couleur libre : le contraste reste celui de la charte, en clair comme en sombre.
-
column(facultatif) : une colonne de la vue (contrôlé), dont seule la cellule est mise en forme. Sanscolumn, c’est toute la ligne. -
label(facultatif, recommandé) : le sens de la règle en mots (« En retard »). La couleur ne doit pas porter seule l’information (WCAG 1.4.1) : le libellé est lu par les lecteurs d’écran, en texte masqué après le titre de la ligne ou de la carte, et affiché en infobulle.
Calcul
Le serveur évalue chaque condition en SQL, dans la même requête que les lignes (un booléen par règle). La réponse donne :
- les règles, sans leurs conditions (
styles: style, colonne) ; - pour chaque ligne, les indices des règles vraies (
ViewRow.styles).
Le front ne réévalue rien. Après une écriture depuis la vue (édition en ligne, déplacement de carte), il relit la vue sans écran de chargement, pour que les styles suivent. Il pose les classes :
- table : ligne par
getRowClass, cellule parcellClass; - liste et kanban : sur la ligne ou la carte, et sur la valeur concernée dans les métadonnées.
Champ blocked
Le langage gagne le champ de nœud blocked (booléen). Sa règle est celle de la fiche et de l’arbre (ADR 0024, 0026, 0027), calculée en SQL :
- l’état d’un nœud est celui du premier aspect à workflow (ordre des noms, collation C) dont le champ d’état est renseigné ;
- cet état est « terminé » s’il fait partie des états finaux de ce workflow, « inconnu » si le workflow n’en déclare pas ;
- le nœud est bloqué s’il a un lien
blockingvers une cible hors corbeille dont l’état n’est pas terminé (un état inconnu ne bloque pas), et s’il n’est pas lui-même terminé.
blocked sert dans where, styles, le tri et les colonnes. Il ne sert pas au regroupement : groupBy et swimlaneBy n’acceptent, parmi les champs du nœud, que type.
Dates relatives
Dans les vues, une date s’affiche en relatif : « aujourd’hui », « demain », « dans 5 jours », « il y a 3 jours ». Une date-heure s’affiche « il y a 2 heures » dans les 24 h, puis en jours de calendrier, comme une date. La date exacte est en infobulle (title). Une date qui n’existe pas (30 février) reste affichée telle quelle.
Au-delà de 60 jours, la date reste en clair, car « dans 4 mois » serait trop vague. Le relatif se calcule dans le fuseau du navigateur, comme today côté serveur.
Alternatives écartées
- Couleurs libres dans le YAML : contraste non garanti, rendu incohérent entre clair et sombre.
- Évaluer les conditions dans le navigateur : il faudrait réécrire le langage en TypeScript et transmettre toutes les valeurs, y compris celles des colonnes masquées. Le SQL existe déjà.
Conséquences
- Le texte relatif est calculé à l’affichage : une page laissée ouverte après minuit garde « demain » jusqu’au prochain chargement.
warnetsuccessont un contraste d’environ 4,1:1 sur la couleur de survol des lignes : à réserver à du texte en gras ou doublé d’un libellé.