Second Brain documentation

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)

← Toutes les décisions

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 langage where, contrôlée au chargement comme lui (champs, types, node dans 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. Sans column, 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 par cellClass ;
  • 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 blocking vers 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.
  • warn et success ont 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é.