Second Brain documentation

ADR 0036 – Vues contextuelles : une vue paramétrée par le nœud affiché

Accepté (2026-10-16, mode autonome)

← Toutes les décisions

ADR 0036 – Vues contextuelles : une vue paramétrée par le nœud affiché

Statut : Accepté (2026-10-16, mode autonome)

Contexte

Le jalon 2 prévoit des vues « paramétrées par le nœud courant, affichées sur les nœuds d’un type donné », dans le panneau de contexte à sections de la charte C3. Exemple : sur la fiche d’un projet, les tâches ouvertes de ce projet.

Décision

Format

name: taches-du-projet
context:
  aspects: [projet]        # fiches où la vue s'affiche : l'un des types (s'il y en a), tous les aspects
query:
  aspects: [tache]
  where: "tache.projet == node && tache.statut != 'fait'"
display:
  mode: list
  columns: [title, tache.statut, tache.echeance]
  • context (filtre de nœud : types, aspects) rend la vue contextuelle. context: {} l’affiche sur toutes les fiches.
  • node est un mot-clé du langage where. Il désigne l’identifiant du nœud courant et ne se compare (==, !=) qu’à une référence : un champ node-ref, ou parent. Hors d’une vue contextuelle, le chargeur le refuse.
  • parent est un nouveau champ du nœud, de nature référence : parent == node donne les enfants. Il est aussi affichable en colonne (identifiant, décrit dans nodes). Il ne se compare pas à un champ référence d’aspect : on compare chacun à node.
  • != traite l’absence comme une valeur (ADR 0028) : tache.projet != node retient aussi les tâches sans projet, et parent != node les racines.
  • Une vue contextuelle exige ?node= même si son where ne cite pas node : elle est conçue pour une fiche.
  • tache.projet == node profite de l’index GIN de node_aspect.data (condition data @> {projet: id} ajoutée), et parent == node de l’index sur parent_id.

Ce mot-clé remplace la syntaxe {{node.id}} envisagée dans le cahier. Il est typé et contrôlé au chargement comme le reste du langage, et ne crée pas de gabarit textuel à résoudre.

API

  • GET /api/views/{name}/results?node=<id> :
    • le paramètre est exigé par une vue contextuelle (400 node) et ignoré par une vue autonome ;
    • un nœud inexistant donne 404 (la corbeille est admise) ;
    • la réponse porte contextNode (titre et type).
  • GET /api/definitions/views expose context : le front choisit les vues à montrer sans requête supplémentaire.

Interface

  • Panneau de contexte : une section par vue contextuelle qui s’applique au nœud affiché, après « Sous-nœuds ». Elle montre au plus 10 lignes en liste compacte (ViewList, ADR 0030), avec « Tout voir » vers la page de la vue si le résultat est tronqué. La section est relue quand le nœud change ou est enregistré.
  • Page de la vue : /views/<nom>?node=<id>, avec le titre « Tâches du projet · Rénovation toiture 2027 » (lien vers le nœud).
  • Menu « Vue » : il ne liste que les vues autonomes, puisqu’une vue contextuelle s’ouvre depuis sa fiche.

Alternatives écartées

  • Gabarit {{node.id}} dans where : il faudrait résoudre un texte avant l’analyse. Le contrôle de type ne pourrait pas vérifier qu’on compare bien une référence, et une valeur mal formée deviendrait une erreur à l’exécution.
  • Sous-arbre complet (descendants) : il n’est pas demandé par les vues d’exemple, et parent == node couvre les enfants directs. Un opérateur descendant de pourra s’ajouter au langage si un besoin se présente.